diff --git a/BUILD.gn b/BUILD.gn
index b3f49d3..1957140 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -13,7 +13,7 @@
     testonly = true
   }
   deps = [
-    ":runtime_kernel",
+    ":runtime",
   ]
 }
 
@@ -34,6 +34,11 @@
 }
 
 group("runtime") {
+  import("runtime/runtime_args.gni")
+
+  target_supports_aot = dart_target_arch == "arm" ||
+                        dart_target_arch == "arm64" || dart_target_arch == "x64"
+
   if (targetting_fuchsia) {
     # Fuchsia has run_vm_tests marked testonly.
     testonly = true
@@ -45,21 +50,6 @@
     "runtime/bin:run_vm_tests",
     "runtime/bin:sample_extension",
     "runtime/bin:test_extension",
-  ]
-}
-
-group("runtime_kernel") {
-  import("runtime/runtime_args.gni")
-
-  target_supports_aot = dart_target_arch == "arm" ||
-                        dart_target_arch == "arm64" || dart_target_arch == "x64"
-
-  if (targetting_fuchsia) {
-    # Fuchsia has run_vm_tests marked testonly.
-    testonly = true
-  }
-  deps = [
-    ":runtime",
     "runtime/vm:kernel_platform_files($host_toolchain)",
 
     # TODO(rmacnak): Link this into 'dart'.
@@ -72,6 +62,12 @@
   }
 }
 
+group("runtime_kernel") {
+  deps = [
+    ":runtime",
+  ]
+}
+
 group("runtime_precompiled") {
   deps = [
     "runtime/bin:dart_bootstrap($host_toolchain)",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index beb9682..1287ea8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,21 +1,65 @@
-## 2.0.0-dev.XX.0
-(Add new changes here, and they will be copied to the
- change section for the next dev version)
+## 2.0.0-dev.64.0
 
 ### Language
 
-#### Strong Mode
+* Numerous corner case bugs around return statements in synchronous and
+asynchronous functions fixed.  Specifically:
+  * Issues [31887][issue 31887], [32881][issue 32881]. Future flattening should
+    not be recursive.
+  * Issues [30638][issue 30638], [32233][issue 32233]. Incorrect downcast errors
+    with `FutureOr`
+  * Issue [32233][issue 32233]. Errors when returning `FutureOr`
+  * Issue [33218][issue 33218]. Returns in functions with void related types
+  * Issue [31278][issue 31278]. Incorrect hint on empty returns in async
+    functions
+* An empty `return;` in an async function with return type `Future<Object>` will
+    not report an error.
+* `return exp;` where `exp` has type `void` in an async function is now an error
+unless the return type of the function is `void` or `dynamic`.
+* Mixed return statements of the form `return;` and `return exp;` are now
+allowed when `exp` has type `void`.
+
+[issue 31887]: https://github.com/dart-lang/sdk/issues/31887
+[issue 30638]: https://github.com/dart-lang/sdk/issues/30638
+[issue 32233]: https://github.com/dart-lang/sdk/issues/32233
+[issue 32881]: https://github.com/dart-lang/sdk/issues/32881
+[issue 33218]: https://github.com/dart-lang/sdk/issues/33218
+[issue 31278]: https://github.com/dart-lang/sdk/issues/31278
 
 ### Dart VM
 
+* The Dart VM now runs programs by default with Dart 2.0 semantics. The flag
+  `--preview-dart-2` is not available anymore.
+
+* A new flag `--no-preview-dart-2` has been added, this flag can be used
+  to revert to Dart 1.0 semantics. The flag is temporary and only meant to
+  help users in the migration process. The flag will go away in a future dev
+  release, when we no longer support Dart 1.0.
+
 ### Tool Changes
 
-#### Pub
+#### Dart2js
 
-#### Other Tools
+* Dart2js now compiles programs by default with Dart 2.0 semantics. Apps are
+  expected to be bigger than before, because Dart 2.0 has many more implicit
+  checks (similar to the `--checked` flag in Dart 1.0). Other relevant flags:
+
+  * `--omit-implicit-checks`: is a flag that removes most of the extra implicit
+    checks. Only use this if you have enough test coverage to know that the app
+    will work well without the checks. If a check would have failed and it is
+    omitted, your app may crash or behave in unexpected ways.
+
+  * `--no-preview-dart-2`: a temporary flag to revert to Dart 1.0. This flag is
+    temporary and only meant to help users in the migration process. The flag
+    will go away in a future dev release, when we no longer support Dart 1.0.
 
 ### Core library changes
 
+* `dart:core`
+  * `int.parse` on the VM no longer accepts unsigned hexadecimal numbers
+    greater than or equal to 2**63 when not prefixed by `0x`.
+    (SDK issue [32858](https://github.com/dart-lang/sdk/issues/32858))
+
 ## 2.0.0-dev.63.0
 
 ### Tool Changes
@@ -28,7 +72,7 @@
 
 ### Language
 
-Inference chooses `void` when combining `Object` or `dynamic` and `void` ([issue
+* Inference chooses `void` when combining `Object` or `dynamic` and `void` ([issue
 3341]).  When combining with other top types, inference now prefers `void`.  So
 for example, given:
 
diff --git a/DEPS b/DEPS
index 94230ce..ae550dd 100644
--- a/DEPS
+++ b/DEPS
@@ -94,7 +94,7 @@
   "intl_tag": "0.15.2",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.6",
-  "linter_tag": "0.1.53",
+  "linter_tag": "0.1.54",
   "logging_tag": "0.11.3+1",
   "markdown_tag": "2.0.0",
   "matcher_tag": "0.12.1+4",
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index aa78dff..9ab7861 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -58,6 +58,9 @@
 % - Specify configurable imports.
 % - Specify the dynamic type of the Iterable/Future/Stream returned from
 %   invocations of functions marked sync*/async/async*.
+% - Add appendix listing the major differences between 64-bit integers
+%   and JavaScript integers.
+% - Remove appendix on naming conventions.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -397,7 +400,7 @@
 \commentary{
 A consequence of these rules is that it is possible to hide a type with a method or variable.
 Naming conventions usually prevent such abuses.
-Nevertheless,the following program is legal:
+Nevertheless, the following program is legal:
 }
 
 \begin{dartCode}
@@ -9276,7 +9279,18 @@
 It is a static warning if the referenced part declaration $p$ names a library other than the current library as the library to which $p$ belongs.
 
 \LMHash{}
-It's a compile-time error if the same library contains two part directives with the same URI.
+Let $L$ be a library.
+It is a compile-time error if $L$ contains two part directives with the same URI.
+Furthermore,
+let $L_1$ be $L$ or any library which is directly or indirectly imported by $L$,
+and let $L_2$ be any library distinct from $L_1$ which is directly or indirectly imported by $L$
+(\ref{imports}).
+It is a compile-time error if $L_1$ and $L_2$ both contain a part directive with the same URI.
+
+\commentary{
+In particular, it is an error to use the same part twice in the same program
+(\ref{scripts}).
+}
 
 
 \subsection{Scripts}
@@ -10457,28 +10471,40 @@
 }
 
 
-\section*{Appendix: Naming Conventions}
-\LMLabel{namingConventions}
+\section*{Appendix: Integer Implementations}
+\LMLabel{integerImplementations}
 
 \commentary{
-The following naming conventions are customary in Dart programs.
+The \code{int} type represents integers.
+The specification is written with 64-bit two's complement integers as the
+intended implementation, but when Dart is compiled to JavaScript,
+the implementation of \code{int} will instead use the JavaScript
+number type.
+
+This introduces a number of differencs:
 \begin{itemize}
-\item The names of compile-time constant variables never use lower case letters.
-If they consist of multiple words, those words are separated by underscores.
-Examples: PI, I\_AM\_A\_CONSTANT.
-\item The names of functions (including getters, setters, methods and local or library functions) and non-constant variables begin with a lowercase letter.
-If the name consists of multiple words, each word (except the first) begins with an uppercase letter.
-No other uppercase letters are used.
-Examples: camlCase, dart4TheWorld
-\item The names of types (including classes and type aliases) begin with an upper case letter.
-If the name consists of multiple words, each word begins with an uppercase letter.
-No other uppercase letters are used.
-Examples: CamlCase, Dart4TheWorld.
-\item The names of type variables are short (preferably single letter).
-Examples: T, S, K, V , E.
-\item The names of libraries or library prefixes never use upper case letters.
-If they consist of multiple words, those words are separated by underscores.
-Example: my\_favorite\_library.
+\item Valid values of JavaScript \code{int} are any
+IEEE-754 64-bit floating point number with no fractional part.
+This includes positive and negative {\em infinity},
+which can be reached by overflowing
+(integer division by zero is still not allowed).
+Otherwise valid integer literals (including any leading minus sign)
+that represent invalid JavaScript \code{int} values
+cannot be compiled to JavaScript.
+Operations on integers may lose precision since 64-bit floating point numbers
+are limited to 53 significant bits.
+\item JavaScript \code{int} instances also implement \code{double},
+and integer-valued \code{double} instances also implement \code{int}.
+The \code{int} and \code{double} class are still separate subclasses of the
+class \code{num}, but {\em instances} of either class that represent an integer,
+act as if they are actually instances of a common subclass implementing both
+\code{int} and \code{double}. Fractional numbers only implement \code{double}.
+\item Bitwise operations on integers (and, or, xor, negate and shifts)
+all truncate the operands to 32-bit values.
+\item The \code{identical} method cannot distinguish the values $0.0$ and $-0.0$,
+and it cannot recognize any {\em NaN} value as identical to itself.
+For efficiency, the \code{identical} operation uses the JavaScript \code{===}
+operator.
 \end{itemize}
 }
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index eb9db41..2163483 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -372,7 +372,8 @@
         new PluginWatcher(resourceProvider, pluginManager);
 
     defaultContextOptions.generateImplicitErrors = false;
-    defaultContextOptions.useFastaParser = options.useCFE;
+    defaultContextOptions.useFastaParser =
+        options.useCFE || options.useFastaParser;
     defaultContextOptions.previewDart2 = options.previewDart2;
 
     {
@@ -1189,6 +1190,11 @@
    * Whether to enable the Dart 2.0 Common Front End implementation.
    */
   bool useCFE = false;
+
+  /**
+   * Whether to enable parsing via the Fasta parser.
+   */
+  bool useFastaParser = false;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/collections.dart b/pkg/analysis_server/lib/src/collections.dart
index 6c88a04..afde613 100644
--- a/pkg/analysis_server/lib/src/collections.dart
+++ b/pkg/analysis_server/lib/src/collections.dart
@@ -3,20 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /**
- * Returns the concatenation of the input [iterables].
- *
- * The returned iterable is a lazily-evaluated view on the input iterables.
- */
-Iterable<E> concat<E>(Iterable<Iterable<E>> iterables) =>
-    iterables.expand((x) => x);
-
-/**
- * Returns the concatenation of the input [iterables] as a [List].
- */
-List<E> concatToList<E>(Iterable<Iterable<E>> iterables) =>
-    concat(iterables).toList();
-
-/**
  * Returns the given [list] if it is not empty, or `null` otherwise.
  */
 List<E> nullIfEmpty<E>(List<E> list) {
@@ -29,23 +15,6 @@
   return list;
 }
 
-/// A pair of values.
-class Pair<E, F> {
-  final E first;
-  final F last;
-
-  Pair(this.first, this.last);
-
-  int get hashCode => first.hashCode ^ last.hashCode;
-
-  bool operator ==(other) {
-    if (other is! Pair) return false;
-    return other.first == first && other.last == last;
-  }
-
-  String toString() => '($first, $last)';
-}
-
 /**
  * A container that remembers the last `n` items added to it.
  *
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 6a4a0ff..f634061 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -49,11 +49,6 @@
       new RecentBuffer<CompletionPerformance>(performanceListMaxLength);
 
   /**
-   * Performance for the last priority change event.
-   */
-  CompletionPerformance computeCachePerformance;
-
-  /**
    * The current request being processed or `null` if none.
    */
   CompletionRequestImpl _currentRequest;
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
index 3862078..eedb605 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
@@ -9,7 +9,7 @@
  * A concrete implementation of [OccurrencesCollector].
  */
 class OccurrencesCollectorImpl implements OccurrencesCollector {
-  Map<protocol.Element, protocol.Occurrences> elementOccurrences =
+  final Map<protocol.Element, protocol.Occurrences> elementOccurrences =
       <protocol.Element, protocol.Occurrences>{};
 
   List<protocol.Occurrences> get allOccurrences {
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 2857e67..e80dadc 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -593,11 +593,13 @@
     List<RefactoringKind> kinds = <RefactoringKind>[];
     // Check nodes.
     {
-      var unit = await server.getResolvedCompilationUnit(file);
-      var analysisSession = server.getAnalysisDriver(file)?.currentSession;
-      if (unit != null && analysisSession != null) {
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
+        // TODO(scheglov) Update other refactorings to use ResolveResult.
+        var unit = analysisResult.unit;
         // Try EXTRACT_LOCAL_VARIABLE.
-        if (new ExtractLocalRefactoring(unit, offset, length).isAvailable()) {
+        if (new ExtractLocalRefactoring(analysisResult, offset, length)
+            .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE);
         }
         // Try EXTRACT_METHOD.
@@ -608,7 +610,7 @@
         }
         // Try EXTRACT_WIDGETS.
         if (new ExtractWidgetRefactoring(
-                searchEngine, analysisSession, unit, offset, length)
+                searchEngine, analysisResult.session, unit, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_WIDGET);
         }
@@ -939,9 +941,10 @@
       }
     }
     if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
-      CompilationUnit unit = await server.getResolvedCompilationUnit(file);
-      if (unit != null) {
-        refactoring = new ExtractLocalRefactoring(unit, offset, length);
+      var analysisResult = await server.getAnalysisResult(file);
+      if (analysisResult != null) {
+        refactoring =
+            new ExtractLocalRefactoring(analysisResult, offset, length);
         feedback = new ExtractLocalVariableFeedback(
             <String>[], <int>[], <int>[],
             coveringExpressionOffsets: <int>[],
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
index 6a96170..996f97a 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
@@ -35,7 +35,7 @@
   /**
    * A table mapping analysis drivers to information related to the driver.
    */
-  Map<AnalysisDriver, _DriverInfo> _driverInfo =
+  final Map<AnalysisDriver, _DriverInfo> _driverInfo =
       <AnalysisDriver, _DriverInfo>{};
 
   /**
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 40b71ad..65eee55 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -18,7 +18,7 @@
 class TypeHierarchyComputer {
   final SearchEngine _searchEngine;
 
-  Element _pivotElement;
+  final Element _pivotElement;
   LibraryElement _pivotLibrary;
   ElementKind _pivotKind;
   String _pivotName;
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index af6e262..d452c44 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -263,6 +263,11 @@
   static const String USE_CFE = "use-cfe";
 
   /**
+   * Whether to enable parsing via the Fasta parser.
+   */
+  static const String USE_FASTA_PARSER = "use-fasta-parser";
+
+  /**
    * The instrumentation server that is to be used by the analysis server.
    */
   InstrumentationServer instrumentationServer;
@@ -313,6 +318,7 @@
       analysisServerOptions.previewDart2 = true;
     }
     analysisServerOptions.useCFE = results[USE_CFE];
+    analysisServerOptions.useFastaParser = results[USE_FASTA_PARSER];
 
     telemetry.Analytics analytics = telemetry.createAnalyticsInstance(
         'UA-26406144-29', 'analysis-server',
@@ -537,6 +543,8 @@
     parser.addFlag(PREVIEW_DART2, help: "Enable the Dart 2.0 preview");
     parser.addFlag(USE_CFE,
         help: "Enable the Dart 2.0 Common Front End implementation");
+    parser.addFlag(USE_FASTA_PARSER,
+        help: "Whether to enable parsing via the Fasta parser");
 
     return parser;
   }
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index 6acfe4e..c5cff7d 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -29,8 +29,8 @@
   @override
   void handleGetRequest(HttpRequest request) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
-    response.headers.contentType = ContentType.TEXT;
+    response.statusCode = HttpStatus.notFound;
+    response.headers.contentType = ContentType.text;
     response.write(message);
     response.close();
   }
@@ -146,7 +146,7 @@
     httpServer.listen((HttpRequest request) async {
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
-      List<String> updateValues = request.headers[HttpHeaders.UPGRADE];
+      List<String> updateValues = request.headers[HttpHeaders.upgradeHeader];
       if (request.method == 'GET') {
         await _handleGetRequest(request);
       } else if (updateValues != null &&
@@ -154,8 +154,8 @@
         // We no longer support serving analysis server communications over
         // WebSocket connections.
         HttpResponse response = request.response;
-        response.statusCode = HttpStatus.NOT_FOUND;
-        response.headers.contentType = ContentType.TEXT;
+        response.statusCode = HttpStatus.notFound;
+        response.headers.contentType = ContentType.text;
         response.write(
             'WebSocket connections not supported (${request.uri.path}).');
         response.close();
@@ -171,8 +171,8 @@
    */
   void _returnUnknownRequest(HttpRequest request) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
-    response.headers.contentType = ContentType.TEXT;
+    response.statusCode = HttpStatus.notFound;
+    response.headers.contentType = ContentType.text;
     response.write('Not found');
     response.close();
   }
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 c47f71a..7a97f72 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -481,6 +481,7 @@
       await _addFix_createClass();
     }
     if (errorCode == StaticTypeWarningCode.UNDEFINED_FUNCTION) {
+      await _addFix_createClass();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withType();
       await _addFix_undefinedFunction_useSimilar();
@@ -494,6 +495,7 @@
     }
     if (errorCode == HintCode.UNDEFINED_METHOD ||
         errorCode == StaticTypeWarningCode.UNDEFINED_METHOD) {
+      await _addFix_createClass();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withType();
       await _addFix_undefinedMethod_useSimilar();
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 4199f27..49cd58e 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -39,7 +39,7 @@
 class StatementAnalyzer extends SelectionAnalyzer {
   final CompilationUnit unit;
 
-  RefactoringStatus _status = new RefactoringStatus();
+  final RefactoringStatus _status = new RefactoringStatus();
 
   StatementAnalyzer(this.unit, SourceRange selection) : super(selection);
 
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index d5bd83e..247729dd 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -1399,32 +1399,6 @@
  */
 class TokenUtils {
   /**
-   * Return the first token in the list of [tokens] representing the given
-   * [keyword], or `null` if there is no such token.
-   */
-  static Token findKeywordToken(List<Token> tokens, Keyword keyword) {
-    for (Token token in tokens) {
-      if (token.keyword == keyword) {
-        return token;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return the first [Token] with given [TokenType], may be <code>null</code> if not
-   *         found.
-   */
-  static Token findToken(List<Token> tokens, TokenType type) {
-    for (Token token in tokens) {
-      if (token.type == type) {
-        return token;
-      }
-    }
-    return null;
-  }
-
-  /**
    * @return [Token]s of the given Dart source, not <code>null</code>, may be empty if no
    *         tokens or some exception happens.
    */
@@ -1442,13 +1416,6 @@
       return [];
     }
   }
-
-  /**
-   * @return <code>true</code> if given [Token]s contain only single [Token] with given
-   *         [TokenType].
-   */
-  static bool hasOnly(List<Token> tokens, TokenType type) =>
-      tokens.length == 1 && tokens[0].type == type;
 }
 
 class _CollectReferencedUnprefixedNames extends RecursiveAstVisitor {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 011ce65..bfbb2d1 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -30,11 +31,9 @@
  */
 class ExtractLocalRefactoringImpl extends RefactoringImpl
     implements ExtractLocalRefactoring {
-  final CompilationUnit unit;
+  final ResolveResult resolveResult;
   final int selectionOffset;
   final int selectionLength;
-  CompilationUnitElement unitElement;
-  String file;
   SourceRange selectionRange;
   CorrectionUtils utils;
 
@@ -55,16 +54,20 @@
   Set<String> excludedVariableNames = new Set<String>();
 
   ExtractLocalRefactoringImpl(
-      this.unit, this.selectionOffset, this.selectionLength) {
-    unitElement = unit.element;
+      this.resolveResult, this.selectionOffset, this.selectionLength) {
     selectionRange = new SourceRange(selectionOffset, selectionLength);
-    utils = new CorrectionUtils(unit);
-    file = unitElement.source.fullName;
+    utils = new CorrectionUtils(unit, buffer: resolveResult.content);
   }
 
+  String get file => resolveResult.path;
+
   @override
   String get refactoringName => 'Extract Local Variable';
 
+  CompilationUnit get unit => resolveResult.unit;
+
+  CompilationUnitElement get unitElement => unit.element;
+
   String get _declarationKeyword {
     if (_isPartOfConstantExpression(rootExpression)) {
       return "const";
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index dc7777c..a93e45b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -20,6 +20,7 @@
 import 'package:analysis_server/src/services/refactoring/rename_local.dart';
 import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
 import 'package:analysis_server/src/services/search/search_engine.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/dart/element/element.dart';
@@ -65,11 +66,8 @@
   /**
    * Returns a new [ExtractLocalRefactoring] instance.
    */
-  factory ExtractLocalRefactoring(
-      CompilationUnit unit, int selectionOffset, int selectionLength) {
-    return new ExtractLocalRefactoringImpl(
-        unit, selectionOffset, selectionLength);
-  }
+  factory ExtractLocalRefactoring(ResolveResult resolveResult,
+      int selectionOffset, int selectionLength) = ExtractLocalRefactoringImpl;
 
   /**
    * The lengths of the expressions that cover the specified selection,
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index d13e0de..f9c7e06 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -156,22 +156,22 @@
       for (Page page in pages) {
         if (page.path == path) {
           HttpResponse response = request.response;
-          response.headers.contentType = ContentType.HTML;
+          response.headers.contentType = ContentType.html;
           response.write(await page.generate(request.uri.queryParameters));
           response.close();
           return;
         }
       }
 
-      await respond(request, createUnknownPage(path), HttpStatus.NOT_FOUND);
+      await respond(request, createUnknownPage(path), HttpStatus.notFound);
     } catch (e, st) {
       try {
         await respond(request, createExceptionPage('$e', st),
-            HttpStatus.INTERNAL_SERVER_ERROR);
+            HttpStatus.internalServerError);
       } catch (e, st) {
         HttpResponse response = request.response;
-        response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
-        response.headers.contentType = ContentType.TEXT;
+        response.statusCode = HttpStatus.internalServerError;
+        response.headers.contentType = ContentType.text;
         response.write('$e\n\n$st');
         response.close();
       }
@@ -179,19 +179,19 @@
   }
 
   Future<Null> respond(HttpRequest request, Page page,
-      [int code = HttpStatus.OK]) async {
+      [int code = HttpStatus.ok]) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     HttpResponse response = request.response;
     response.statusCode = code;
-    response.headers.contentType = ContentType.HTML;
+    response.headers.contentType = ContentType.html;
     response.write(await page.generate(request.uri.queryParameters));
     response.close();
   }
 
   void respondRedirect(HttpRequest request, String pathFragment) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.MOVED_TEMPORARILY;
+    response.statusCode = HttpStatus.movedTemporarily;
     response.redirect(request.uri.resolve(pathFragment));
   }
 }
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 165760f..355a0e9 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -48,7 +48,7 @@
       });
 
       // TODO(scheglov): Restore similar test coverage when the front-end API
-      // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
+      // allows it.  See https://github.com/dart-lang/sdk/issues/33520.
       // test('$benchmarkId-use-cfe', () {
       //   ProcessResult r = Process.runSync(
       //     Platform.resolvedExecutable,
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index a69de4a..f7974b4 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisErrorIntegrationTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisErrorIntegrationTest_UseCFE);
+    defineReflectiveTests(AnalysisErrorIntegrationTest_UseCFE);
   });
 }
 
@@ -109,14 +107,20 @@
 
   @override
   @failingTest
+  test_detect_simple_error() {
+    return super.test_detect_simple_error();
+  }
+
+  @override
+  @failingTest
   test_super_mixins_disabled() {
     // Disabling super mixins is not supported in the new FE.
     return super.test_super_mixins_disabled();
   }
 
   @override
+  @failingTest
   test_super_mixins_enabled() {
-    // This does pass with the new FE.
     return super.test_super_mixins_enabled();
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index b106bf0..981e904 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetErrorsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetErrorsTest_UseCFE);
+    defineReflectiveTests(GetErrorsTest_UseCFE);
   });
 }
 
@@ -42,4 +40,10 @@
 class GetErrorsTest_UseCFE extends GetErrorsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_getErrors() {
+    return super.test_getErrors();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index 08f8e52..7a10b8a 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -15,9 +15,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest_UseCFE);
+    defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest_UseCFE);
   });
 }
 
@@ -147,4 +145,16 @@
     extends AnalysisGetImportedElementsIntegrationTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_getImportedElements_none() {
+    return super.test_getImportedElements_none();
+  }
+
+  @failingTest
+  @override
+  test_getImportedElements_some() {
+    return super.test_getImportedElements_some();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index a9d7bb7..96995ae 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -75,4 +75,10 @@
   @override
   @failingTest
   test_navigation() => super.test_navigation();
+
+  @override
+  @failingTest
+  test_navigation_no_result() {
+    fail('This test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index d217042..ae9649d 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -87,4 +87,22 @@
 class LintIntegrationTest_UseCFE extends LintIntegrationTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_no_lints_when_not_specified() {
+    return super.test_no_lints_when_not_specified();
+  }
+
+  @override
+  @failingTest
+  test_simple_lint_newOptionsFile() {
+    return super.test_simple_lint_newOptionsFile();
+  }
+
+  @override
+  @failingTest
+  test_simple_lint_oldOptionsFile() {
+    return super.test_simple_lint_oldOptionsFile();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index 7054ac4..eeda63a 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OccurrencesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OccurrencesTest_UseCFE);
+    defineReflectiveTests(OccurrencesTest_UseCFE);
   });
 }
 
@@ -73,4 +71,10 @@
 class OccurrencesTest_UseCFE extends OccurrencesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_occurrences() {
+    return super.test_occurrences();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index 0952955..6192813 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OutlineTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OutlineTest_UseCFE);
+    defineReflectiveTests(OutlineTest_UseCFE);
   });
 }
 
@@ -77,4 +75,10 @@
 class OutlineTest_UseCFE extends OutlineTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_outline() {
+    return super.test_outline();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 39c4bb4..2cfb696 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -126,4 +126,10 @@
 class OverridesTest_UseCFE extends OverridesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_overrides() {
+    return super.test_overrides();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index 4411cc6..5cca2f0 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetAnalysisRootsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
+    defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
   });
 }
 
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index 2ee347d..0cb0424 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -55,4 +55,10 @@
 class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_reanalyze_concurrent() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 319a4a4..27a4c81 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -44,4 +44,10 @@
 class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_reanalyze() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index f9ebcb0..dfbbe69 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -36,4 +36,10 @@
 class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    return super.test_options();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index c75655b..bbd07a0 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -46,4 +46,10 @@
 class SetGeneralSubscriptionsTest_UseCFE extends SetGeneralSubscriptionsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index 7d86706..64aeb6d 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -34,4 +34,10 @@
 class SetPriorityFilesTest_UseCFE extends SetPriorityFilesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index 02dcd05..c1fcead 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -36,4 +36,10 @@
 class SetSubscriptionsTest_UseCFE extends SetSubscriptionsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_subscriptions() {
+    return super.test_subscriptions();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index 55e1e84..2c084a5 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateContentTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(UpdateContentTest_UseCFE);
+    defineReflectiveTests(UpdateContentTest_UseCFE);
   });
 }
 
@@ -112,4 +110,16 @@
 class UpdateContentTest_UseCFE extends UpdateContentTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_updateContent() {
+    return super.test_updateContent();
+  }
+
+  @failingTest
+  @override
+  test_updateContent_multipleAdds() {
+    return super.test_updateContent_multipleAdds();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index dbdc7fa..b5087a9 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetSuggestionsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetSuggestionsTest_UseCFE);
+    defineReflectiveTests(GetSuggestionsTest_UseCFE);
   });
 }
 
@@ -123,4 +121,22 @@
 class GetSuggestionsTest_UseCFE extends GetSuggestionsTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_getSuggestions() {
+    return super.test_getSuggestions();
+  }
+
+  @override
+  @failingTest
+  test_getSuggestions_onlyOverlay() {
+    return super.test_getSuggestions_onlyOverlay();
+  }
+
+  @override
+  @failingTest
+  test_getSuggestions_onlyOverlay_noWait() {
+    return super.test_getSuggestions_onlyOverlay_noWait();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
index 0d359f6..260ab07 100644
--- a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
@@ -41,4 +41,10 @@
 class GetAvailableRefactoringsTest_UseCFE extends GetAvailableRefactoringsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_has_refactorings() {
+    return super.test_has_refactorings();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
index c0e52b7..6fd7413 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -70,4 +70,10 @@
   @override
   @failingTest
   Future test_has_fixes() => super.test_has_fixes();
+
+  @failingTest
+  @override
+  test_no_fixes() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index 842e443..7d7faba 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetPostfixCompletionTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetPostfixCompletionTest_UseCFE);
+    defineReflectiveTests(GetPostfixCompletionTest_UseCFE);
   });
 }
 
@@ -58,4 +56,10 @@
 class GetPostfixCompletionTest_UseCFE extends GetPostfixCompletionTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_postfix_completion() {
+    return super.test_postfix_completion();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/import_elements_test.dart b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
index da142fc..e565a1e 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -144,4 +144,22 @@
     extends AnalysisGetImportElementsIntegrationTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_importElements_definingUnit() {
+    return super.test_importElements_definingUnit();
+  }
+
+  @failingTest
+  @override
+  test_importElements_noEdits() {
+    return super.test_importElements_noEdits();
+  }
+
+  @failingTest
+  @override
+  test_importElements_part() {
+    return super.test_importElements_part();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
index 02025b9..4dbf569 100644
--- a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
+++ b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IsPostfixCompletionApplicableTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(IsPostfixCompletionApplicableTest_UseCFE);
+    defineReflectiveTests(IsPostfixCompletionApplicableTest_UseCFE);
   });
 }
 
@@ -48,4 +46,10 @@
     extends IsPostfixCompletionApplicableTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_is_postfix_completion_applicable() {
+    return super.test_is_postfix_completion_applicable();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
index 6bb94c5..a9009c7 100644
--- a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
+++ b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListPostfixCompletionTemplatesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ListPostfixCompletionTemplatesTest_UseCFE);
+    defineReflectiveTests(ListPostfixCompletionTemplatesTest_UseCFE);
   });
 }
 
@@ -48,4 +46,10 @@
     extends ListPostfixCompletionTemplatesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_list_postfix_completion_templates() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index 3a9f686..a30d913 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OrganizeDirectivesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OrganizeDirectivesTest_UseCFE);
+    defineReflectiveTests(OrganizeDirectivesTest_UseCFE);
   });
 }
 
@@ -82,4 +80,22 @@
 class OrganizeDirectivesTest_UseCFE extends OrganizeDirectivesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_organize_directives() {
+    return super.test_organize_directives();
+  }
+
+  @failingTest
+  @override
+  test_organize_directives_no_changes() {
+    return super.test_organize_directives_no_changes();
+  }
+
+  @failingTest
+  @override
+  test_organize_directives_with_errors() {
+    return super.test_organize_directives_with_errors();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index 3cf0e19..07904fd 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -47,4 +47,10 @@
 class DeleteContextTest_UseCFE extends DeleteContextTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_delete() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index 9990a23..d0c886c 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -44,4 +44,10 @@
 class MapUriTest_UseCFE extends MapUriTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_mapUri() {
+    fail('Test crashes with CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index 823ac4d..234fd49 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -43,4 +43,10 @@
 class GetKytheEntriesTest_UseCFE extends GetKytheEntriesTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_getKytheEntries() {
+    return super.test_getKytheEntries();
+  }
 }
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 3b7e1a0..4f1cdd7 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindElementReferencesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(FindElementReferencesTest_UseCFE);
+    defineReflectiveTests(FindElementReferencesTest_UseCFE);
   });
 }
 
@@ -81,6 +79,12 @@
 
   @override
   @failingTest
+  test_badTarget() {
+    fail('Test times out with CFE.');
+  }
+
+  @override
+  @failingTest
   // TODO(devoncarew): 'NoSuchMethodError: The getter 'source' was called on null'
   Future test_findReferences() => new Future.error('failing test');
 }
diff --git a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
index 28a8828..bdab78a 100644
--- a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindMemberDeclarationsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(FindMemberDeclarationsTest_UseCFE);
+    defineReflectiveTests(FindMemberDeclarationsTest_UseCFE);
   });
 }
 
@@ -57,4 +55,10 @@
 class FindMemberDeclarationsTest_UseCFE extends FindMemberDeclarationsTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_findMemberDeclarations() {
+    fail('Test times out with CFE.');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index de8e9b7..231aa4f 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(StatusTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StatusTest_UseCFE);
+    defineReflectiveTests(StatusTest_UseCFE);
   });
 }
 
@@ -56,4 +54,10 @@
 class StatusTest_UseCFE extends StatusTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_status() {
+    fail('This test crashes CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index 97527b1..418189d 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -711,9 +711,6 @@
     } else if (servicesPort != null) {
       arguments.add('--enable-vm-service=$servicesPort');
     }
-    if (Platform.packageRoot != null) {
-      arguments.add('--package-root=${Platform.packageRoot}');
-    }
     if (Platform.packageConfig != null) {
       arguments.add('--packages=${Platform.packageConfig}');
     }
@@ -741,9 +738,6 @@
     if (useCFE) {
       arguments.add('--use-cfe');
     }
-    // TODO(devoncarew): We could experiment with instead launching the analysis
-    // server in a separate isolate. This would make it easier to debug the
-    // integration tests, and would likely speed up the tests as well.
     _process = await Process.start(dartBinary, arguments);
     _process.exitCode.then((int code) {
       if (code != 0) {
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 2a4974a..9845594 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -95,11 +95,6 @@
     expect(resultCode, expected);
   }
 
-  assertNoFix(FixKind kind) async {
-    AnalysisError error = await _findErrorToFix();
-    await _assertNoFix(kind, error);
-  }
-
   assertHasFixAllFix(ErrorCode errorCode, FixKind kind, String expected,
       {String target}) async {
     AnalysisError error = await _findErrorToFixOfType(errorCode);
@@ -121,6 +116,11 @@
     expect(resultCode, expected);
   }
 
+  assertNoFix(FixKind kind) async {
+    AnalysisError error = await _findErrorToFix();
+    await _assertNoFix(kind, error);
+  }
+
   List<LinkedEditSuggestion> expectedSuggestions(
       LinkedEditSuggestionKind kind, List<String> values) {
     return values.map((value) {
@@ -139,8 +139,8 @@
   Future<Fix> _assertHasFix(FixKind kind, AnalysisError error,
       {bool hasFixAllFix: false}) async {
     if (hasFixAllFix && !kind.canBeAppliedTogether()) {
-      fail(
-          'Expected to find and return fix-all FixKind for $kind, but kind.canBeAppliedTogether is ${kind.canBeAppliedTogether}');
+      fail('Expected to find and return fix-all FixKind for $kind, '
+          'but kind.canBeAppliedTogether is ${kind.canBeAppliedTogether}');
     }
 
     // Compute the fixes for this AnalysisError
@@ -148,35 +148,39 @@
 
     // If hasFixAllFix is false, assert that none of the fixes are a fix-all fix
     if (!hasFixAllFix) {
-      for (Fix f in fixes) {
-        if (f.isFixAllFix()) {
-          fail("The boolean hasFixAllFix is false, but such a fix was found in "
-              "the computed set of fixes: $fixes, error: $error.");
+      for (Fix fix in fixes) {
+        if (fix.isFixAllFix()) {
+          fail('The boolean hasFixAllFix is false, but such a fix was found '
+              'in the computed set of fixes: $fixes, error: $error.');
         }
       }
     }
     // If hasFixAllFix is true, assert that there exists such a fix in the list
     else {
       bool foundFixAllFix = false;
-      for (Fix f in fixes) {
-        if (f.isFixAllFix()) {
+      for (Fix fix in fixes) {
+        if (fix.isFixAllFix()) {
           foundFixAllFix = true;
           break;
         }
       }
       if (!foundFixAllFix) {
-        fail("The boolean hasFixAllFix is true, but no fix-all fix was found "
-            "in the computed set of fixes: $fixes, error: $error.");
+        fail('The boolean hasFixAllFix is true, but no fix-all fix was found '
+            'in the computed set of fixes: $fixes, error: $error.');
       }
     }
 
     Fix foundFix = null;
     if (!hasFixAllFix) {
-      foundFix =
-          fixes.firstWhere((fix) => fix.kind == kind && !fix.isFixAllFix());
+      foundFix = fixes.firstWhere(
+        (fix) => fix.kind == kind && !fix.isFixAllFix(),
+        orElse: () => null,
+      );
     } else {
-      foundFix =
-          fixes.lastWhere((fix) => fix.kind == kind && fix.isFixAllFix());
+      foundFix = fixes.lastWhere(
+        (fix) => fix.kind == kind && fix.isFixAllFix(),
+        orElse: () => null,
+      );
     }
     if (foundFix == null) {
       fail('Expected to find fix $kind in\n${fixes.join('\n')}, hasFixAllFix = '
@@ -2104,6 +2108,44 @@
     _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
   }
 
+  test_createClass_instanceCreation_withoutNew_fromFunction() async {
+    await resolveTestUnit('''
+main() {
+  Test ();
+}
+''');
+    await assertHasFix(DartFixKind.CREATE_CLASS, '''
+main() {
+  Test ();
+}
+
+class Test {
+}
+''');
+    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
+  }
+
+  test_createClass_instanceCreation_withoutNew_fromMethod() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    Test ();
+  }
+}
+''');
+    await assertHasFix(DartFixKind.CREATE_CLASS, '''
+class A {
+  main() {
+    Test ();
+  }
+}
+
+class Test {
+}
+''');
+    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
+  }
+
   test_createClass_itemOfList() async {
     await resolveTestUnit('''
 main() {
@@ -5476,36 +5518,6 @@
 ''');
   }
 
-  test_removeUnusedImport_anotherImportOnLine() async {
-    await resolveTestUnit('''
-import 'dart:math'; import 'dart:async';
-
-main() {
-  Future f;
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
-import 'dart:async';
-
-main() {
-  Future f;
-}
-''');
-  }
-
-  test_removeUnusedImport_severalLines() async {
-    await resolveTestUnit('''
-import
-  'dart:math';
-main() {
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
-main() {
-}
-''');
-  }
-
   test_removeUnusedImport_all() async {
     await resolveTestUnit('''
 import 'dart:math';
@@ -5571,6 +5583,36 @@
 ''');
   }
 
+  test_removeUnusedImport_anotherImportOnLine() async {
+    await resolveTestUnit('''
+import 'dart:math'; import 'dart:async';
+
+main() {
+  Future f;
+}
+''');
+    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
+import 'dart:async';
+
+main() {
+  Future f;
+}
+''');
+  }
+
+  test_removeUnusedImport_severalLines() async {
+    await resolveTestUnit('''
+import
+  'dart:math';
+main() {
+}
+''');
+    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
+main() {
+}
+''');
+  }
+
   test_replaceVarWithDynamic() async {
     errorFilter = (AnalysisError error) {
       return error.errorCode == ParserErrorCode.VAR_AS_TYPE_NAME;
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
index c6f022e..8eb5778 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -1302,7 +1302,8 @@
   }
 
   void _createRefactoring(int offset, int length) {
-    refactoring = new ExtractLocalRefactoring(testUnit, offset, length);
+    refactoring =
+        new ExtractLocalRefactoring(testAnalysisResult, offset, length);
     refactoring.name = 'res';
   }
 
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index 8f7f3a3..0beb104 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -648,9 +648,6 @@
     } else if (servicesPort != null) {
       arguments.add('--enable-vm-service=$servicesPort');
     }
-    if (Platform.packageRoot != null) {
-      arguments.add('--package-root=${Platform.packageRoot}');
-    }
     if (Platform.packageConfig != null) {
       arguments.add('--packages=${Platform.packageConfig}');
     }
diff --git a/pkg/analysis_server/tool/instrumentation/server.dart b/pkg/analysis_server/tool/instrumentation/server.dart
index 64f77bb..558cac1 100644
--- a/pkg/analysis_server/tool/instrumentation/server.dart
+++ b/pkg/analysis_server/tool/instrumentation/server.dart
@@ -102,7 +102,9 @@
    */
   void serveHttp(int port) {
     _server = HttpServer.bind(InternetAddress.loopbackIPv4, port);
-    _server.then(_handleServer).catchError((_) {/* Ignore errors. */});
+    _server.then(_handleServer).catchError((_) {
+      /* Ignore errors. */
+    });
   }
 
   /**
@@ -127,7 +129,7 @@
       return;
     } catch (exception, stackTrace) {
       HttpResponse response = request.response;
-      response.statusCode = HttpStatus.OK;
+      response.statusCode = HttpStatus.ok;
       response.headers.contentType = _htmlContent;
       StringBuffer buffer = new StringBuffer();
       buffer.write('<p><b>Exception while composing page:</b></p>');
@@ -141,7 +143,7 @@
     }
 
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.OK;
+    response.statusCode = HttpStatus.ok;
     response.headers.contentType = _htmlContent;
     response.write(buffer.toString());
     response.close();
@@ -176,11 +178,11 @@
    */
   void _returnUnknownRequest(HttpRequest request) {
     HttpResponse response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
+    response.statusCode = HttpStatus.notFound;
     response.headers.contentType =
         new ContentType("text", "html", charset: "utf-8");
-    response.write(
-        '<html><head></head><body><h3>Page not found: "${request.uri.path}".</h3></body></html>');
+    response.write('<html><head></head><body><h3>Page not found: "${request.uri
+            .path}".</h3></body></html>');
     response.close();
   }
 
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
new file mode 100644
index 0000000..bc5e6c5
--- /dev/null
+++ b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:meta/meta.dart';
+
+/// A collection of analysis contexts.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class AnalysisContextCollection {
+  /// Initialize a newly created collection of analysis contexts that can
+  /// analyze the files that are included by the list of [includedPaths].
+  ///
+  /// All paths must be absolute and normalized.
+  ///
+  /// If a [resourceProvider] is given, then it will be used to access the file
+  /// system, otherwise the default resource provider will be used.
+  factory AnalysisContextCollection({
+    @required List<String> includedPaths,
+    ResourceProvider resourceProvider,
+  }) = AnalysisContextCollectionImpl;
+
+  /// Return the existing [AnalysisContext] that should be used to analyze
+  /// the given [path], or throw [StateError] if the [path] is not analyzed
+  /// in any of the created analysis contexts.
+  AnalysisContext contextFor(String path);
+}
diff --git a/pkg/analyzer/lib/file_system/overlay_file_system.dart b/pkg/analyzer/lib/file_system/overlay_file_system.dart
new file mode 100644
index 0000000..666e5722
--- /dev/null
+++ b/pkg/analyzer/lib/file_system/overlay_file_system.dart
@@ -0,0 +1,422 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/source_resource.dart';
+import 'package:meta/meta.dart';
+import 'package:path/path.dart' as pathos;
+import 'package:watcher/watcher.dart';
+
+/**
+ * A resource provider that allows clients to overlay the file system provided
+ * by a base resource provider. These overlays allow both the contents and
+ * modification stamps of files to be different than what the base resource
+ * provider would report.
+ *
+ * This provider does not report watch events when overlays are added, modified
+ * or removed.
+ */
+class OverlayResourceProvider implements ResourceProvider {
+  /**
+   * The underlying resource provider used to access files and folders that
+   * do not have an overlay.
+   */
+  final ResourceProvider baseProvider;
+
+  /**
+   * A map from the paths of files for which there is an overlay to the contents
+   * of the files.
+   */
+  final Map<String, String> _overlayContent = <String, String>{};
+
+  /**
+   * A map from the paths of files for which there is an overlay to the
+   * modification stamps of the files.
+   */
+  final Map<String, int> _overlayModificationStamps = <String, int>{};
+
+  /**
+   * Initialize a newly created resource provider to represent an overlay on the
+   * given [baseProvider].
+   */
+  OverlayResourceProvider(this.baseProvider);
+
+  @override
+  pathos.Context get pathContext => baseProvider.pathContext;
+
+  @override
+  File getFile(String path) =>
+      new _OverlayFile(this, baseProvider.getFile(path));
+
+  @override
+  Folder getFolder(String path) =>
+      new _OverlayFolder(this, baseProvider.getFolder(path));
+
+  @override
+  Future<List<int>> getModificationTimes(List<Source> sources) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    return sources.map((source) {
+      String path = source.fullName;
+      return _overlayModificationStamps[path] ??
+          baseProvider.getFile(path).modificationStamp;
+    }).toList();
+  }
+
+  @override
+  Resource getResource(String path) {
+    return new _OverlayResource._from(this, baseProvider.getResource(path));
+  }
+
+  @override
+  Folder getStateLocation(String pluginId) =>
+      new _OverlayFolder(this, baseProvider.getStateLocation(pluginId));
+
+  /**
+   * Remove any overlay of the file at the given [path]. The state of the file
+   * in the base resource provider will not be affected.
+   */
+  bool removeOverlay(String path) {
+    bool hadOverlay = _overlayContent.containsKey(path);
+    _overlayContent.remove(path);
+    _overlayModificationStamps.remove(path);
+    return hadOverlay;
+  }
+
+  /**
+   * Overlay the content of the file at the given [path]. The file will appear
+   * to have the given [content] and [modificationStamp] even if the file is
+   * modified in the base resource provider.
+   */
+  void setOverlay(String path,
+      {@required String content, @required int modificationStamp}) {
+    if (content == null) {
+      throw new ArgumentError(
+          'OverlayResourceProvider.setOverlay: content cannot be null');
+    } else if (modificationStamp == null) {
+      throw new ArgumentError(
+          'OverlayResourceProvider.setOverlay: modificationStamp cannot be null');
+    }
+    _overlayContent[path] = content;
+    _overlayModificationStamps[path] = modificationStamp;
+  }
+
+  /**
+   * Copy any overlay for the file at the [oldPath] to be an overlay for the
+   * file with the [newPath].
+   */
+  void _copyOverlay(String oldPath, String newPath) {
+    if (_hasOverlay(oldPath)) {
+      _overlayContent[newPath] = _overlayContent[oldPath];
+      _overlayModificationStamps[newPath] = _overlayModificationStamps[oldPath];
+    }
+  }
+
+  /**
+   * Return the content of the overlay of the file at the given [path], or
+   * `null` if there is no overlay for the specified file.
+   */
+  String _getOverlayContent(String path) {
+    return _overlayContent[path];
+  }
+
+  /**
+   * Return the modification stamp of the overlay of the file at the given
+   * [path], or `null` if there is no overlay for the specified file.
+   */
+  int _getOverlayModificationStamp(String path) {
+    return _overlayModificationStamps[path];
+  }
+
+  /**
+   * Return `true` if there is an overlay associated with the file at the given
+   * [path].
+   */
+  bool _hasOverlay(String path) => _overlayContent.containsKey(path);
+
+  /**
+   * Return the paths of all of the overlaid files that are immediate children
+   * of the given [folder].
+   */
+  Iterable<String> _overlaysInFolder(Folder folder) {
+    String folderPath = folder.path;
+    return _overlayContent.keys
+        .where((path) => pathContext.dirname(path) == folderPath);
+  }
+}
+
+/**
+ * A file from an [OverlayResourceProvider].
+ */
+class _OverlayFile extends _OverlayResource implements File {
+  /**
+   * Initialize a newly created file to have the given [provider] and to
+   * correspond to the given [file] from the provider's base resource provider.
+   */
+  _OverlayFile(OverlayResourceProvider provider, File file)
+      : super(provider, file);
+
+  @override
+  Stream<WatchEvent> get changes => _file.changes;
+
+  @override
+  bool get exists => _provider._hasOverlay(path) || _resource.exists;
+
+  @override
+  int get lengthSync {
+    String content = _provider._getOverlayContent(path);
+    if (content != null) {
+      return content.length;
+    }
+    return _file.lengthSync;
+  }
+
+  @override
+  int get modificationStamp {
+    int stamp = _provider._getOverlayModificationStamp(path);
+    if (stamp != null) {
+      return stamp;
+    }
+    return _file.modificationStamp;
+  }
+
+  /**
+   * Return the file from the base resource provider that corresponds to this
+   * folder.
+   */
+  File get _file => _resource as File;
+
+  @override
+  File copyTo(Folder parentFolder) {
+    String newPath = _provider.pathContext.join(parentFolder.path, shortName);
+    _provider._copyOverlay(path, newPath);
+    if (_file.exists) {
+      if (parentFolder is _OverlayFolder) {
+        return new _OverlayFile(_provider, _file.copyTo(parentFolder._folder));
+      }
+      return new _OverlayFile(_provider, _file.copyTo(parentFolder));
+    } else {
+      return new _OverlayFile(
+          _provider, _provider.baseProvider.getFile(newPath));
+    }
+  }
+
+  @override
+  Source createSource([Uri uri]) =>
+      new FileSource(this, uri ?? _provider.pathContext.toUri(path));
+
+  @override
+  void delete() {
+    bool hadOverlay = _provider.removeOverlay(path);
+    if (_resource.exists) {
+      _resource.delete();
+    } else if (!hadOverlay) {
+      throw new FileSystemException(path, 'does not exist');
+    }
+  }
+
+  @override
+  List<int> readAsBytesSync() {
+    String content = _provider._getOverlayContent(path);
+    if (content != null) {
+      return content.codeUnits;
+    }
+    return _file.readAsBytesSync();
+  }
+
+  @override
+  String readAsStringSync() {
+    String content = _provider._getOverlayContent(path);
+    if (content != null) {
+      return content;
+    }
+    return _file.readAsStringSync();
+  }
+
+  @override
+  File renameSync(String newPath) {
+    File newFile = _file.renameSync(newPath);
+    if (_provider._hasOverlay(path)) {
+      _provider.setOverlay(newPath,
+          content: _provider._getOverlayContent(path),
+          modificationStamp: _provider._getOverlayModificationStamp(path));
+      _provider.removeOverlay(path);
+    }
+    return new _OverlayFile(_provider, newFile);
+  }
+
+  @override
+  void writeAsBytesSync(List<int> bytes) {
+    writeAsStringSync(new String.fromCharCodes(bytes));
+  }
+
+  @override
+  void writeAsStringSync(String content) {
+    if (_provider._hasOverlay(path)) {
+      throw new FileSystemException(
+          path, 'Cannot write a file with an overlay');
+    }
+    _file.writeAsStringSync(content);
+  }
+}
+
+/**
+ * A folder from an [OverlayResourceProvider].
+ */
+class _OverlayFolder extends _OverlayResource implements Folder {
+  /**
+   * Initialize a newly created folder to have the given [provider] and to
+   * correspond to the given [folder] from the provider's base resource
+   * provider.
+   */
+  _OverlayFolder(OverlayResourceProvider provider, Folder folder)
+      : super(provider, folder);
+
+  @override
+  Stream<WatchEvent> get changes => _folder.changes;
+
+  @override
+  bool get exists => _resource.exists;
+
+  /**
+   * Return the folder from the base resource provider that corresponds to this
+   * folder.
+   */
+  Folder get _folder => _resource as Folder;
+
+  @override
+  String canonicalizePath(String relPath) {
+    pathos.Context context = _provider.pathContext;
+    relPath = context.normalize(relPath);
+    String childPath = context.join(path, relPath);
+    childPath = context.normalize(childPath);
+    return childPath;
+  }
+
+  @override
+  bool contains(String path) => _folder.contains(path);
+
+  @override
+  Folder copyTo(Folder parentFolder) {
+    Folder destination = parentFolder.getChildAssumingFolder(shortName);
+    destination.create();
+    for (Resource child in getChildren()) {
+      child.copyTo(destination);
+    }
+    return destination;
+  }
+
+  @override
+  void create() {
+    _folder.create();
+  }
+
+  @override
+  Resource getChild(String relPath) =>
+      new _OverlayResource._from(_provider, _folder.getChild(relPath));
+
+  @override
+  File getChildAssumingFile(String relPath) =>
+      new _OverlayFile(_provider, _folder.getChildAssumingFile(relPath));
+
+  @override
+  Folder getChildAssumingFolder(String relPath) =>
+      new _OverlayFolder(_provider, _folder.getChildAssumingFolder(relPath));
+
+  @override
+  List<Resource> getChildren() {
+    List<Resource> children = _folder
+        .getChildren()
+        .map((child) => new _OverlayResource._from(_provider, child))
+        .toList();
+    for (String overlayPath in _provider._overlaysInFolder(this)) {
+      children.add(_provider.getFile(overlayPath));
+    }
+    return children;
+  }
+}
+
+/**
+ * The base class for resources from an [OverlayResourceProvider].
+ */
+abstract class _OverlayResource implements Resource {
+  /**
+   * The resource provider associated with this resource.
+   */
+  final OverlayResourceProvider _provider;
+
+  /**
+   * The resource from the provider's base provider that corresponds to this
+   * resource.
+   */
+  final Resource _resource;
+
+  /**
+   * Initialize a newly created instance of a resource to have the given
+   * [_provider] and to represent the [_resource] from the provider's base
+   * resource provider.
+   */
+  _OverlayResource(this._provider, this._resource);
+
+  /**
+   * Return an instance of the subclass of this class corresponding to the given
+   * [resource] that is associated with the given [provider].
+   */
+  factory _OverlayResource._from(
+      OverlayResourceProvider provider, Resource resource) {
+    if (resource is Folder) {
+      return new _OverlayFolder(provider, resource);
+    } else if (resource is File) {
+      return new _OverlayFile(provider, resource);
+    }
+    throw new ArgumentError('Unknown resource type: ${resource.runtimeType}');
+  }
+
+  @override
+  int get hashCode => path.hashCode;
+
+  @override
+  Folder get parent {
+    Folder parent = _resource.parent;
+    if (parent == null) {
+      return null;
+    }
+    return new _OverlayFolder(_provider, parent);
+  }
+
+  @override
+  String get path => _resource.path;
+
+  @override
+  String get shortName => _resource.shortName;
+
+  @override
+  bool operator ==(other) {
+    if (runtimeType != other.runtimeType) {
+      return false;
+    }
+    return path == other.path;
+  }
+
+  @override
+  void delete() {
+    _resource.delete();
+  }
+
+  @override
+  bool isOrContains(String path) {
+    return _resource.isOrContains(path);
+  }
+
+  @override
+  Resource resolveSymbolicLinksSync() => new _OverlayResource._from(
+      _provider, _resource.resolveSymbolicLinksSync());
+
+  @override
+  Uri toUri() => _resource.toUri();
+}
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 263d250..a0a3140 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -27,7 +27,6 @@
 const String implicitCastsFlag = 'implicit-casts';
 const String lintsFlag = 'lints';
 const String noImplicitDynamicFlag = 'no-implicit-dynamic';
-const String packageDefaultAnalysisOptions = 'package-default-analysis-options';
 const String packageRootOption = 'package-root';
 const String packagesOption = 'packages';
 const String sdkPathOption = 'dart-sdk';
@@ -94,11 +93,6 @@
   builderOptions.defaultPackageFilePath = args[packagesOption];
   builderOptions.defaultPackagesDirectoryPath = args[packageRootOption];
   //
-  // Flags.
-  //
-  builderOptions.packageDefaultAnalysisOptions =
-      args[packageDefaultAnalysisOptions];
-  //
   // Analysis options.
   //
   AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
@@ -200,17 +194,6 @@
       help: 'Define environment variables. For example, "-Dfoo=bar" defines an '
           'environment variable named "foo" whose value is "bar".',
       hide: hide);
-  parser.addFlag(packageDefaultAnalysisOptions,
-      help: 'If an analysis options file is not explicitly specified '
-          'via the "--$analysisOptionsFileOption" option\n'
-          'and an analysis options file cannot be found '
-          'in the project directory or any parent directory,\n'
-          'then look for analysis options in the following locations:\n'
-          '- $flutterAnalysisOptionsPath\n'
-          '- $bazelAnalysisOptionsPath',
-      defaultsTo: true,
-      negatable: true,
-      hide: hide);
   parser.addOption(packagesOption,
       help: 'The path to the package resolution configuration file, which '
           'supplies a mapping of package names\nto paths. This option cannot be '
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index e967809..e346ba6 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -452,28 +452,26 @@
         verbose('Exception: $e\n  when loading ${optionsFile.path}');
       }
     } else {
-      // Search for the default analysis options
-      // unless explicitly directed not to do so.
+      // Search for the default analysis options.
+      // TODO(danrubel) determine if bazel or gn project depends upon flutter
       Source source;
-      if (builderOptions.packageDefaultAnalysisOptions) {
-        // TODO(danrubel) determine if bazel or gn project depends upon flutter
-        if (workspace.hasFlutterDependency) {
-          source = sourceFactory.forUri(flutterAnalysisOptionsPath);
-        }
-        if (source == null || !source.exists()) {
-          source = sourceFactory.forUri(bazelAnalysisOptionsPath);
-        }
-        if (source != null && source.exists()) {
-          try {
-            optionMap = optionsProvider.getOptionsFromSource(source);
-            if (contextRoot != null) {
-              contextRoot.optionsFilePath = source.fullName;
-            }
-            verbose('Loaded analysis options from ${source.fullName}');
-          } catch (e) {
-            // Ignore exceptions thrown while trying to load the options file.
-            verbose('Exception: $e\n  when loading ${source.fullName}');
+      if (workspace.hasFlutterDependency) {
+        source = sourceFactory.forUri(flutterAnalysisOptionsPath);
+      }
+      if (source == null || !source.exists()) {
+        source = sourceFactory.forUri(bazelAnalysisOptionsPath);
+      }
+
+      if (source != null && source.exists()) {
+        try {
+          optionMap = optionsProvider.getOptionsFromSource(source);
+          if (contextRoot != null) {
+            contextRoot.optionsFilePath = source.fullName;
           }
+          verbose('Loaded analysis options from ${source.fullName}');
+        } catch (e) {
+          // Ignore exceptions thrown while trying to load the options file.
+          verbose('Exception: $e\n  when loading ${source.fullName}');
         }
       }
     }
@@ -693,11 +691,6 @@
   String defaultPackagesDirectoryPath;
 
   /**
-   * Allow Flutter and bazel default analysis options to be used.
-   */
-  bool packageDefaultAnalysisOptions = true;
-
-  /**
    * Initialize a newly created set of options
    */
   ContextBuilderOptions();
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
new file mode 100644
index 0000000..428a48c
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -0,0 +1,78 @@
+// 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/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/context_builder.dart';
+import 'package:analyzer/dart/analysis/context_locator.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:meta/meta.dart';
+
+/// An implementation of [AnalysisContextCollection].
+class AnalysisContextCollectionImpl implements AnalysisContextCollection {
+  /// The resource provider used to access the file system.
+  final ResourceProvider resourceProvider;
+
+  /// The list of analysis contexts.
+  final List<AnalysisContext> contexts = [];
+
+  /// Initialize a newly created analysis context manager.
+  AnalysisContextCollectionImpl({
+    @required List<String> includedPaths,
+    ResourceProvider resourceProvider,
+    String sdkPath,
+  }) : resourceProvider =
+            resourceProvider ?? PhysicalResourceProvider.INSTANCE {
+    _throwIfAnyNotAbsoluteNormalizedPath(includedPaths);
+    if (sdkPath != null) {
+      _throwIfNotAbsoluteNormalizedPath(sdkPath);
+    }
+
+    var contextLocator = new ContextLocator(
+      resourceProvider: this.resourceProvider,
+    );
+    var roots = contextLocator.locateRoots(includedPaths: includedPaths);
+    for (var root in roots) {
+      var contextBuilder = new ContextBuilder(
+        resourceProvider: this.resourceProvider,
+      );
+      var context = contextBuilder.createContext(
+        contextRoot: root,
+        sdkPath: sdkPath,
+      );
+      contexts.add(context);
+    }
+  }
+
+  @override
+  AnalysisContext contextFor(String path) {
+    _throwIfNotAbsoluteNormalizedPath(path);
+
+    for (var context in contexts) {
+      if (context.contextRoot.isAnalyzed(path)) {
+        return context;
+      }
+    }
+
+    throw new StateError('Unable to find the context to $path');
+  }
+
+  /// Check every element with [_throwIfNotAbsoluteNormalizedPath].
+  void _throwIfAnyNotAbsoluteNormalizedPath(List<String> paths) {
+    for (var path in paths) {
+      _throwIfNotAbsoluteNormalizedPath(path);
+    }
+  }
+
+  /// The driver supports only absolute normalized paths, this method is used
+  /// to validate any input paths to prevent errors later.
+  void _throwIfNotAbsoluteNormalizedPath(String path) {
+    var pathContext = resourceProvider.pathContext;
+    if (!pathContext.isAbsolute(path) || pathContext.normalize(path) != path) {
+      throw new ArgumentError(
+          'Only absolute normalized paths are supported: $path');
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_root.dart b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
index 463b9f6..349da1b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_root.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
@@ -103,7 +103,7 @@
     }
     for (String excludedPath in excludedPaths) {
       if (context.isAbsolute(excludedPath)) {
-        if (context.isWithin(excludedPath, path)) {
+        if (path == excludedPath || context.isWithin(excludedPath, path)) {
           return true;
         }
       } else {
@@ -127,7 +127,7 @@
   bool _isIncluded(String path) {
     Context context = resourceProvider.pathContext;
     for (String includedPath in includedPaths) {
-      if (context.isWithin(includedPath, path)) {
+      if (path == includedPath || context.isWithin(includedPath, path)) {
         return true;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 8cfdda3..ff4bb12 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -4,6 +4,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/kernel_metadata.dart';
+import 'package:analyzer/src/fasta/resolution_storer.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -26,6 +27,7 @@
 import 'package:front_end/src/fasta/source/stack_listener.dart';
 import 'package:front_end/src/fasta/target_implementation.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
+import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:front_end/src/fasta/uri_translator_impl.dart';
 import 'package:kernel/class_hierarchy.dart';
@@ -39,31 +41,7 @@
 
 /// Resolution information in a single function body.
 class CollectedResolution {
-  /// The list of local declarations stored by body builders while
-  /// compiling the library.
-  final List<TreeNode> kernelDeclarations = [];
-
-  /// The list of references to local or external stored by body builders
-  /// while compiling the library.
-  final List<Node> kernelReferences = [];
-
-  /// The list of types stored by body builders while compiling the library.
-  final List<DartType> kernelTypes = [];
-
-  /// File offsets corresponding to the declarations in [kernelDeclarations].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> declarationOffsets = [];
-
-  /// File offsets corresponding to the objects in [kernelReferences].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> referenceOffsets = [];
-
-  /// File offsets corresponding to the types in [kernelTypes].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> typeOffsets = [];
+  final Map<int, ResolutionData<DartType, int, Node, int>> kernelData = {};
 }
 
 /// The compilation result for a single file.
@@ -399,7 +377,9 @@
 
   StackListener createListener(
       ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
-      [Scope formalParameterScope]) {
+      [Scope formalParameterScope,
+      TypeInferenceListener<int, int, Node, int> listener]) {
+    ResolutionStorer<int, int, Node, int> storer;
     var fileResolutions = _resolutions[builder.fileUri];
     if (fileResolutions == null) {
       fileResolutions = <CollectedResolution>[];
@@ -407,8 +387,9 @@
     }
     var resolution = new CollectedResolution();
     fileResolutions.add(resolution);
+    storer = new ResolutionStorer<int, int, Node, int>(resolution.kernelData);
     return super.createListener(
-        builder, memberScope, isInstanceMember, formalParameterScope);
+        builder, memberScope, isInstanceMember, formalParameterScope, storer);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index a9090d2..c58b12b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -21,7 +20,6 @@
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/pending_error.dart';
 import 'package:analyzer/src/fasta/error_converter.dart';
@@ -32,7 +30,6 @@
 import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/kernel/resynthesize.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart';
@@ -452,10 +449,10 @@
   /// Create a new [ResolutionApplier] for the given front-end [resolution].
   /// The [context] element is used to associate synthetic elements and access
   /// type parameters from the enclosing scopes.
-  ResolutionApplier _createResolutionApplier(
-      ElementImpl context, CollectedResolution resolution) {
-    return new _ResolutionApplierContext(
-            _resynthesizer, _typeProvider, _libraryElement, resolution, context)
+  ResolutionApplier _createResolutionApplier(ElementImpl context,
+      CollectedResolution resolution, Map<int, AstNode> localDeclarations) {
+    return new _ResolutionApplierContext(_resynthesizer, _typeProvider,
+            _libraryElement, resolution, context, localDeclarations)
         .applier;
   }
 
@@ -738,24 +735,26 @@
     }
   }
 
-  void _resolveFile2(
-      FileState file, CompilationUnit unit, _ResolutionProvider resolutions) {
+  void _resolveFile2(FileState file, CompilationUnitImpl unit,
+      _ResolutionProvider resolutions) {
     CompilationUnitElement unitElement = unit.element;
     new DeclarationResolver(enableKernelDriver: true, applyKernelTypes: true)
         .resolve(unit, unitElement);
 
-    if (_libraryElement.context.analysisOptions.previewDart2) {
-      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
-          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
-    }
+    // TODO(paulberry): need to find a better way to do this.
+    // See dartbug.com/33506.
+//    if (_libraryElement.context.analysisOptions.previewDart2) {
+//      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
+//          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
+//    }
 
     for (var declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
         if (declaration.metadata.isNotEmpty) {
           var resolution = resolutions.next();
-          var applier = _createResolutionApplier(null, resolution);
+          var applier = _createResolutionApplier(
+              null, resolution, unit.localDeclarations);
           applier.applyToAnnotations(declaration);
-          applier.checkDone();
         }
         for (var member in declaration.members) {
           if (member is ConstructorDeclaration) {
@@ -774,31 +773,31 @@
               // TODO(scheglov) Add support for type parameterized redirects.
             } else {
               var resolution = resolutions.next();
-              var applier = _createResolutionApplier(context, resolution);
+              var applier = _createResolutionApplier(
+                  context, resolution, unit.localDeclarations);
               member.initializers.accept(applier);
               member.parameters.accept(applier);
               member.body.accept(applier);
               applier.applyToAnnotations(member);
-              applier.checkDone();
             }
           } else if (member is FieldDeclaration) {
             List<VariableDeclaration> fields = member.fields.variables;
             var context = fields[0].element as ElementImpl;
             var resolution = resolutions.next();
-            var applier = _createResolutionApplier(context, resolution);
+            var applier = _createResolutionApplier(
+                context, resolution, unit.localDeclarations);
             for (var field in fields.reversed) {
               field.initializer?.accept(applier);
             }
             applier.applyToAnnotations(member);
-            applier.checkDone();
           } else if (member is MethodDeclaration) {
             ExecutableElementImpl context = member.element;
             var resolution = resolutions.next();
-            var applier = _createResolutionApplier(context, resolution);
+            var applier = _createResolutionApplier(
+                context, resolution, unit.localDeclarations);
             member.parameters?.accept(applier);
             member.body.accept(applier);
             applier.applyToAnnotations(member);
-            applier.checkDone();
           } else {
             throw new StateError('(${declaration.runtimeType}) $declaration');
           }
@@ -810,11 +809,11 @@
       } else if (declaration is FunctionDeclaration) {
         var context = declaration.element as ExecutableElementImpl;
         var resolution = resolutions.next();
-        var applier = _createResolutionApplier(context, resolution);
+        var applier = _createResolutionApplier(
+            context, resolution, unit.localDeclarations);
         declaration.functionExpression.parameters?.accept(applier);
         declaration.functionExpression.body.accept(applier);
         applier.applyToAnnotations(declaration);
-        applier.checkDone();
       } else if (declaration is FunctionTypeAlias) {
         // No bodies to resolve.
       } else if (declaration is GenericTypeAlias) {
@@ -823,12 +822,12 @@
         List<VariableDeclaration> variables = declaration.variables.variables;
         var context = variables[0].element as ElementImpl;
         var resolution = resolutions.next();
-        var applier = _createResolutionApplier(context, resolution);
+        var applier = _createResolutionApplier(
+            context, resolution, unit.localDeclarations);
         for (var variable in variables.reversed) {
           variable.initializer?.accept(applier);
         }
         applier.applyToAnnotations(declaration);
-        applier.checkDone();
       } else {
         throw new StateError('(${declaration.runtimeType}) $declaration');
       }
@@ -1039,6 +1038,7 @@
   final TypeProvider typeProvider;
   final LibraryElement libraryElement;
   final CollectedResolution resolution;
+  final Map<int, AstNode> localDeclarations;
 
   @override
   ClassElement enclosingClassElement;
@@ -1046,17 +1046,15 @@
   List<ElementImpl> contextStack = [];
   ElementImpl context;
 
-  List<Element> declaredElements = [];
-  Map<kernel.TreeNode, Element> declarationToElement = new HashMap.identity();
-  Map<FunctionElementImpl, kernel.TreeNode> functionElementToDeclaration =
-      new HashMap.identity();
-  Map<ParameterElementImpl, kernel.VariableDeclaration>
-      parameterElementToDeclaration = new HashMap.identity();
-
   ResolutionApplier applier;
 
-  _ResolutionApplierContext(this.resynthesizer, this.typeProvider,
-      this.libraryElement, this.resolution, this.context) {
+  _ResolutionApplierContext(
+      this.resynthesizer,
+      this.typeProvider,
+      this.libraryElement,
+      this.resolution,
+      this.context,
+      this.localDeclarations) {
     for (Element element = context;
         element != null;
         element = element.enclosingElement) {
@@ -1066,108 +1064,30 @@
       }
     }
 
-    // Convert local declarations into elements.
-    for (var declaredNode in resolution.kernelDeclarations) {
-      translateKernelDeclaration(declaredNode);
-    }
-
     // Convert referenced nodes into elements.
-    List<Element> referencedElements = [];
-    for (var referencedNode in resolution.kernelReferences) {
-      Element element;
-      if (referencedNode is kernel.VariableDeclaration) {
-        kernel.TreeNode parent = referencedNode.parent;
-        if (parent is kernel.Statement) {
-          element = declarationToElement[referencedNode];
-        } else {
-          assert(parent is kernel.FunctionNode || parent is kernel.Catch);
-          // Might be a parameter of a local function.
-          element = declarationToElement[referencedNode];
-          // If no element, then it is a parameter of the context executable.
-          if (element == null) {
-            ExecutableElementImpl contextExecutable = context;
-            for (var parameter in contextExecutable.parameters) {
-              if (parameter.name == referencedNode.name) {
-                element = parameter;
-                break;
-              }
-            }
-          }
-        }
-        assert(element != null);
-      } else if (referencedNode is kernel.NamedNode) {
-        element = resynthesizer
-            .getElementFromCanonicalName(referencedNode.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.DynamicType) {
-        element = DynamicElementImpl.instance;
-      } else if (referencedNode is kernel.FunctionType) {
-        element = resynthesizer
-            .getElementFromCanonicalName(referencedNode.typedef.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.InterfaceType) {
-        element = resynthesizer.getElementFromCanonicalName(
-            referencedNode.classNode.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.MemberGetterNode) {
-        if (referencedNode.member == null) {
-          element = null;
-        } else {
-          var memberElement = resynthesizer
-              .getElementFromCanonicalName(referencedNode.member.canonicalName);
-          assert(memberElement != null);
-          if (memberElement is PropertyInducingElementImpl) {
-            element = memberElement.getter;
-            assert(element != null);
-          } else {
-            element = memberElement;
-          }
-        }
-      } else if (referencedNode is kernel.MemberSetterNode) {
-        if (referencedNode.member == null) {
-          element = null;
-        } else {
-          var memberElement = resynthesizer
-              .getElementFromCanonicalName(referencedNode.member.canonicalName);
-          assert(memberElement != null);
-          if (memberElement is PropertyInducingElementImpl) {
-            element = memberElement.setter;
-            assert(element != null);
-          } else {
-            element = memberElement;
-          }
-        }
-      } else if (referencedNode is kernel.ImportPrefixNode) {
-        assert(referencedNode.name != null);
-        for (var import in libraryElement.imports) {
-          if (import.prefix?.name == referencedNode.name) {
-            element = import.prefix;
-            break;
-          }
-        }
-        assert(element != null);
-      } else if (referencedNode is kernel.NullNode) {
-        element = null;
-      } else if (referencedNode == null) {
-        // This will occur if an identifier could not be resolved, such as a
-        // reference to a member when the target has type `dynamic`.
-        element = null;
-      } else {
-        throw new UnimplementedError(
-            'Declaration: (${referencedNode.runtimeType}) $referencedNode');
-      }
-      referencedElements.add(element);
+    Map<int, kernel.ResolutionData<DartType, Element, Element, PrefixElement>>
+        convertedData = {};
+    for (var location in resolution.kernelData.keys) {
+      var data = resolution.kernelData[location];
+      convertedData[location] = new kernel.ResolutionData(
+          argumentTypes: data.argumentTypes == null
+              ? null
+              : data.argumentTypes.map(translateType).toList(),
+          combiner: _translateReference(data.combiner),
+          declaration: _translateDeclaration(data.declaration),
+          inferredType: translateType(data.inferredType),
+          invokeType: translateType(data.invokeType),
+          isExplicitCall: data.isExplicitCall,
+          isImplicitCall: data.isImplicitCall,
+          isWriteReference: data.isWriteReference,
+          literalType: translateType(data.literalType),
+          prefixInfo: _translatePrefixInfo(data.prefixInfo),
+          reference: _translateReference(data.reference,
+              isWriteReference: data.isWriteReference),
+          writeContext: translateType(data.writeContext));
     }
 
-    applier = new ValidatingResolutionApplier(
-        libraryElement,
-        this,
-        declaredElements,
-        referencedElements,
-        resolution.kernelTypes,
-        resolution.declarationOffsets,
-        resolution.referenceOffsets,
-        resolution.typeOffsets);
+    applier = new ResolutionApplier(libraryElement, this, convertedData);
   }
 
   @override
@@ -1188,28 +1108,6 @@
     // The function is the new resolution context.
     contextStack.add(context);
     context = element;
-
-    var declaration = functionElementToDeclaration[element];
-
-    // Get the declaration kernel type.
-    kernel.FunctionType kernelType;
-    if (declaration is kernel.VariableDeclaration) {
-      kernelType = declaration.type;
-    } else if (declaration is kernel.FunctionExpression) {
-      kernelType = declaration.function.functionType;
-    } else {
-      throw new StateError('(${declaration.runtimeType}) $declaration');
-    }
-
-    element.returnType = resynthesizer.getType(context, kernelType.returnType);
-
-    for (var parameter in element.parameters) {
-      ParameterElementImpl parameterImpl = parameter;
-      var kernelParameter = parameterElementToDeclaration[parameter];
-      parameterImpl.type = resynthesizer.getType(context, kernelParameter.type);
-    }
-
-    element.type = new FunctionTypeImpl(element);
   }
 
   @override
@@ -1218,43 +1116,62 @@
     context = contextStack.removeLast();
   }
 
-  /// Translate the given [declaration].
-  void translateKernelDeclaration(kernel.TreeNode declaration) {
-    if (declaration is kernel.VariableDeclaration) {
-      kernel.TreeNode functionDeclaration = declaration.parent;
-      if (functionDeclaration is kernel.FunctionDeclaration) {
-        var element =
-            new FunctionElementImpl(declaration.name, declaration.fileOffset);
-        functionElementToDeclaration[element] = declaration;
-        _addFormalParameters(element, functionDeclaration.function);
-        declaredElements.add(element);
-        declarationToElement[declaration] = element;
-      } else {
-        // TODO(scheglov) Do we need ConstLocalVariableElementImpl?
-        var element = new LocalVariableElementImpl(
-            declaration.name, declaration.fileOffset);
-        declaredElements.add(element);
-        declarationToElement[declaration] = element;
-      }
-    } else if (declaration is kernel.FunctionExpression) {
-      var element = new FunctionElementImpl('', declaration.fileOffset);
-      functionElementToDeclaration[element] = declaration;
-      _addFormalParameters(element, declaration.function);
-      declaredElements.add(element);
-      declarationToElement[declaration] = element;
+  Element _translateDeclaration(int declarationOffset) {
+    if (declarationOffset == null) return null;
+    var declaration = localDeclarations[declarationOffset];
+    Element element;
+    if (declaration is VariableDeclaration) {
+      element = declaration.element;
+    } else if (declaration is FormalParameter) {
+      element = declaration.element;
+    } else if (declaration is DeclaredSimpleIdentifier) {
+      element = declaration.staticElement;
+    } else if (declaration is FunctionDeclaration) {
+      element = declaration.element;
+    } else {
+      throw new UnimplementedError('${declaration.runtimeType}');
+    }
+    assert(element != null);
+    return element;
+  }
+
+  PrefixElement _translatePrefixInfo(int importIndex) {
+    if (importIndex == null) return null;
+    return libraryElement.imports[importIndex].prefix;
+  }
+
+  Element _translateReference(kernel.Node referencedNode,
+      {bool isWriteReference = false}) {
+    if (referencedNode == null) return null;
+    Element element;
+    if (referencedNode is kernel.NamedNode) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.canonicalName);
+    } else if (referencedNode is kernel.FunctionType) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.typedef.canonicalName);
+      assert(element != null);
+    } else if (referencedNode is kernel.InterfaceType) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.classNode.canonicalName);
+      assert(element != null);
     } else {
       throw new UnimplementedError(
-          'Declaration: (${declaration.runtimeType}) $declaration');
+          'TODO(paulberry): ${referencedNode.runtimeType}');
+    }
+    if (element is PropertyInducingElement) {
+      return isWriteReference ? element.setter : element.getter;
+    } else {
+      return element;
     }
   }
 
   @override
   DartType translateType(kernel.DartType kernelType) {
-    if (kernelType is kernel.NullType) {
-      return null;
-    } else if (kernelType is kernel.IndexAssignNullFunctionType) {
+    if (kernelType == null) {
       return null;
     } else if (kernelType is kernel.TypeArgumentsDartType) {
+      // TODO(paulberry): get rid of this case
       List<kernel.DartType> kernelTypes = kernelType.types;
       var types = new List<DartType>(kernelTypes.length);
       for (var i = 0; i < kernelTypes.length; i++) {
@@ -1265,54 +1182,6 @@
       return resynthesizer.getType(context, kernelType);
     }
   }
-
-  /// Add formal parameters defined in the [kernelFunction] to the [element].
-  void _addFormalParameters(
-      FunctionElementImpl element, kernel.FunctionNode kernelFunction) {
-    // Set type parameters.
-    {
-      var astParameters = <TypeParameterElement>[];
-      for (var kernelParameter in kernelFunction.typeParameters) {
-        var astParameter = new TypeParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.type = new TypeParameterTypeImpl(astParameter);
-        // TODO(scheglov) remember mapping to set bounds later
-        astParameters.add(astParameter);
-      }
-      element.typeParameters = astParameters;
-    }
-
-    // Set formal parameters.
-    {
-      var astParameters = <ParameterElement>[];
-
-      // Add positional parameters
-      var kernelPositionalParameters = kernelFunction.positionalParameters;
-      for (var i = 0; i < kernelPositionalParameters.length; i++) {
-        var kernelParameter = kernelPositionalParameters[i];
-        var astParameter = new ParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.parameterKind = i < kernelFunction.requiredParameterCount
-            ? ParameterKind.REQUIRED
-            : ParameterKind.POSITIONAL;
-        astParameters.add(astParameter);
-        declarationToElement[kernelParameter] = astParameter;
-        parameterElementToDeclaration[astParameter] = kernelParameter;
-      }
-
-      // Add named parameters.
-      for (var kernelParameter in kernelFunction.namedParameters) {
-        var astParameter = new ParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.parameterKind = ParameterKind.NAMED;
-        astParameters.add(astParameter);
-        declarationToElement[kernelParameter] = astParameter;
-        parameterElementToDeclaration[astParameter] = kernelParameter;
-      }
-
-      element.parameters = astParameters;
-    }
-  }
 }
 
 /// [Iterator] like object that provides [CollectedResolution]s.
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 59dcb83..e017334 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -767,12 +767,13 @@
  * Container that keeps track of file owners.
  */
 class SearchedFiles {
-  final Map<String, Search> owners = {};
+  final Map<Uri, Search> owners = {};
 
   bool add(String path, Search search) {
-    var owner = owners[path];
+    var file = search._driver.fsState.getFileForPath(path);
+    var owner = owners[file.uri];
     if (owner == null) {
-      owners[path] = search;
+      owners[file.uri] = search;
       return true;
     }
     return identical(owner, search);
@@ -780,7 +781,7 @@
 
   void ownAdded(Search search) {
     for (var path in search._driver.addedFiles) {
-      owners[path] = search;
+      add(path, search);
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 265a55c..457bb8e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -2424,6 +2424,8 @@
   @override
   LineInfo lineInfo;
 
+  Map<int, AstNode> localDeclarations;
+
   /**
    * Initialize a newly created compilation unit to have the given directives
    * and declarations. The [scriptTag] can be `null` if there is no script tag
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index e0101c1..8fde0c3 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -1182,6 +1182,7 @@
     _visitChildren(holder, node);
 
     FunctionElementImpl element = new FunctionElementImpl.forNode(node.name);
+    element.type = new FunctionTypeImpl(element);
     _setCodeRange(element, node);
     setElementDocumentationComment(element, node);
     element.metadata = _createElementAnnotations(node.metadata);
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index d9d126a..8514e4f 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1447,9 +1447,13 @@
 
   @override
   DartType flattenFutures(TypeSystem typeSystem) {
-    // Implement the case: "If T = Future<S> then flatten(T) = flatten(S)."
-    if (isDartAsyncFuture && typeArguments.isNotEmpty) {
-      return typeArguments[0].flattenFutures(typeSystem);
+    // Implement the cases:
+    //  - "If T = FutureOr<S> then flatten(T) = S."
+    //  - "If T = Future<S> then flatten(T) = S."
+    if (isDartAsyncFutureOr || isDartAsyncFuture) {
+      return typeArguments.isNotEmpty
+          ? typeArguments[0]
+          : DynamicTypeImpl.instance;
     }
 
     // Implement the case: "Otherwise if T <: Future then let S be a type
diff --git a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
index f37feab..c007f79 100644
--- a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
+++ b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
@@ -30,6 +30,55 @@
   Expression buildSimpleRead() => generator.buildSimpleRead();
 }
 
+class AnalyzerDelayedAssignmentGenerator extends AnalyzerExpressionGenerator
+    with fasta.DelayedAssignment<Expression, Statement, Arguments> {
+  final Token token;
+  final fasta.Generator<Expression, Statement, Arguments> generator;
+  final String assignmentOperator;
+  final Expression value;
+
+  AnalyzerDelayedAssignmentGenerator(
+      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      AstFactory astFactory,
+      this.token,
+      this.generator,
+      this.assignmentOperator,
+      this.value)
+      : super(helper, astFactory);
+
+  @override
+  Expression buildSimpleRead() => astFactory.assignmentExpression(
+      generator.buildSimpleRead(), token, value);
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
+}
+
+class AnalyzerDelayedPostfixIncrementGenerator
+    extends AnalyzerExpressionGenerator
+    with fasta.DelayedPostfixIncrement<Expression, Statement, Arguments> {
+  final Token token;
+  final fasta.Generator<Expression, Statement, Arguments> generator;
+  final kernel.Name binaryOperator;
+  final kernel.Procedure interfaceTarget;
+
+  AnalyzerDelayedPostfixIncrementGenerator(
+      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      AstFactory astFactory,
+      this.token,
+      this.generator,
+      this.binaryOperator,
+      this.interfaceTarget)
+      : super(helper, astFactory);
+
+  @override
+  Expression buildSimpleRead() =>
+      astFactory.postfixExpression(generator.buildSimpleRead(), token);
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
+}
+
 abstract class AnalyzerExpressionGenerator
     implements fasta.Generator<Expression, Statement, Arguments> {
   final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index ce8de6c..b34a4c1 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -62,6 +62,7 @@
   ScriptTag scriptTag;
   final List<Directive> directives = <Directive>[];
   final List<CompilationUnitMember> declarations = <CompilationUnitMember>[];
+  final localDeclarations = <int, AstNode>{};
 
   @override
   final Uri uri;
@@ -206,7 +207,7 @@
 
     if (interpolationCount == 0) {
       Token token = pop();
-      String value = unescapeString(token.lexeme);
+      String value = unescapeString(token.lexeme, token, this);
       push(ast.simpleStringLiteral(token, value));
     } else {
       List<Object> parts = popTypedList(1 + interpolationCount * 2);
@@ -215,7 +216,7 @@
       Quote quote = analyzeQuote(first.lexeme);
       List<InterpolationElement> elements = <InterpolationElement>[];
       elements.add(ast.interpolationString(
-          first, unescapeFirstStringPart(first.lexeme, quote)));
+          first, unescapeFirstStringPart(first.lexeme, quote, first, this)));
       for (int i = 1; i < parts.length - 1; i++) {
         var part = parts[i];
         if (part is Token) {
@@ -228,7 +229,7 @@
         }
       }
       elements.add(ast.interpolationString(
-          last, unescapeLastStringPart(last.lexeme, quote)));
+          last, unescapeLastStringPart(last.lexeme, quote, last, this)));
       push(ast.stringInterpolation(elements));
     }
   }
@@ -500,7 +501,7 @@
         identical(token.kind, HEXADECIMAL_TOKEN));
     debugEvent("LiteralInt");
 
-    push(ast.integerLiteral(token, int.parse(token.lexeme)));
+    push(ast.integerLiteral(token, int.tryParse(token.lexeme)));
   }
 
   void handleExpressionFunctionBody(Token arrowToken, Token semicolon) {
@@ -626,7 +627,15 @@
     Expression initializer = pop();
     SimpleIdentifier identifier = pop();
     // TODO(ahe): Don't push initializers, instead install them.
-    push(ast.variableDeclaration(identifier, assignmentOperator, initializer));
+    push(_makeVariableDeclaration(identifier, assignmentOperator, initializer));
+  }
+
+  VariableDeclaration _makeVariableDeclaration(
+      SimpleIdentifier name, Token equals, Expression initializer) {
+    var variableDeclaration =
+        ast.variableDeclaration(name, equals, initializer);
+    localDeclarations[name.offset] = variableDeclaration;
+    return variableDeclaration;
   }
 
   @override
@@ -668,7 +677,7 @@
     if (node is VariableDeclaration) {
       variable = node;
     } else if (node is SimpleIdentifier) {
-      variable = ast.variableDeclaration(node, null, null);
+      variable = _makeVariableDeclaration(node, null, null);
     } else {
       unhandled("${node.runtimeType}", "identifier", nameToken.charOffset, uri);
     }
@@ -1206,6 +1215,7 @@
       parameter = ast.defaultFormalParameter(node, ParameterKind.NAMED,
           defaultValue.separator, defaultValue.value);
     }
+    localDeclarations[nameToken.offset] = parameter;
     push(parameter);
   }
 
@@ -1351,9 +1361,11 @@
       List<FormalParameter> catchParameters = catchParameterList.parameters;
       if (catchParameters.length > 0) {
         exception = catchParameters[0].identifier;
+        localDeclarations[exception.offset] = exception;
       }
       if (catchParameters.length > 1) {
         stackTrace = catchParameters[1].identifier;
+        localDeclarations[stackTrace.offset] = stackTrace;
       }
     }
     push(ast.catchClause(
@@ -2011,7 +2023,7 @@
     debugEvent("NoFieldInitializer");
 
     SimpleIdentifier name = pop();
-    push(ast.variableDeclaration(name, null, null));
+    push(_makeVariableDeclaration(name, null, null));
   }
 
   @override
@@ -2088,7 +2100,7 @@
 
     Expression initializer = pop();
     SimpleIdentifier name = pop();
-    push(ast.variableDeclaration(name, assignment, initializer));
+    push(_makeVariableDeclaration(name, assignment, initializer));
   }
 
   @override
@@ -2122,8 +2134,10 @@
     List<Annotation> metadata = pop(NullValue.Metadata);
     FunctionExpression functionExpression =
         ast.functionExpression(typeParameters, parameters, body);
-    push(ast.functionDeclarationStatement(ast.functionDeclaration(
-        null, metadata, null, returnType, null, name, functionExpression)));
+    var functionDeclaration = ast.functionDeclaration(
+        null, metadata, null, returnType, null, name, functionExpression);
+    localDeclarations[name.offset] = functionDeclaration;
+    push(ast.functionDeclarationStatement(functionDeclaration));
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index 2a7ab90..436b733 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -192,8 +192,8 @@
       Generator<Expression, Statement, Arguments> generator,
       Expression value,
       String assignmentOperator) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
+    return new AnalyzerDelayedAssignmentGenerator(
+        helper, astFactory, token, generator, assignmentOperator, value);
   }
 
   @override
@@ -203,8 +203,8 @@
       Generator<Expression, Statement, Arguments> generator,
       kernel.Name binaryOperator,
       kernel.Procedure interfaceTarget) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
+    return new AnalyzerDelayedPostfixIncrementGenerator(
+        helper, astFactory, token, generator, binaryOperator, interfaceTarget);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index acfe8432..17763f1 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -349,6 +349,10 @@
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_CAST_NEW_EXPR, offset, length);
         return;
+      case "INVALID_CODE_POINT":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.INVALID_CODE_POINT, offset, length, ['\\u{...}']);
+        return;
       case "INVALID_CONSTRUCTOR_NAME":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, offset, length);
@@ -357,6 +361,10 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE, offset, length);
         return;
+      case "INVALID_HEX_ESCAPE":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.INVALID_HEX_ESCAPE, offset, length);
+        return;
       case "INVALID_METHOD_OVERRIDE":
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_METHOD_OVERRIDE, offset, length);
@@ -373,6 +381,10 @@
         _reportByCode(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, message,
             offset, length);
         return;
+      case "INVALID_UNICODE_ESCAPE":
+        errorReporter?.reportErrorForOffset(
+            ParserErrorCode.INVALID_UNICODE_ESCAPE, offset, length);
+        return;
       case "LIBRARY_DIRECTIVE_NOT_FIRST":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, offset, length);
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 4d2414f..5aa09cd 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -21,48 +21,18 @@
   final LibraryElement _enclosingLibraryElement;
   final TypeContext _typeContext;
 
-  final List<Element> _declaredElements;
-  int _declaredElementIndex = 0;
-
-  final List<Element> _referencedElements;
-  int _referencedElementIndex = 0;
-
-  final List<kernel.DartType> _types;
-  int _typeIndex = 0;
+  final Map<int, ResolutionData<DartType, Element, Element, PrefixElement>>
+      _data;
 
   /// The current label scope. Each [Block] adds a new one.
   _LabelScope _labelScope = new _LabelScope(null);
 
-  /// Indicates whether we are applying resolution to an annotation.
-  ///
-  /// When this field is `true`, [PropertyInducingElement]s should be replaced
-  /// with corresponding getters.
-  bool _inAnnotation = false;
-
-  ResolutionApplier(this._enclosingLibraryElement, this._typeContext,
-      this._declaredElements, this._referencedElements, this._types);
+  ResolutionApplier(
+      this._enclosingLibraryElement, this._typeContext, this._data);
 
   /// Apply resolution to annotations of the given [node].
   void applyToAnnotations(AnnotatedNode node) {
-    _inAnnotation = true;
     node.metadata.accept(this);
-    _inAnnotation = false;
-  }
-
-  /// Verifies that all types passed to the constructor have been applied.
-  void checkDone() {
-    if (_declaredElementIndex != _declaredElements.length) {
-      throw new StateError('Some declarations were not consumed, starting at '
-          '${_declaredElements[_declaredElementIndex]}');
-    }
-    if (_referencedElementIndex != _referencedElements.length) {
-      throw new StateError('Some references were not consumed, starting at '
-          '${_referencedElements[_referencedElementIndex]}');
-    }
-    if (_typeIndex != _types.length) {
-      throw new StateError(
-          'Some types were not consumed, starting at ${_types[_typeIndex]}');
-    }
   }
 
   @override
@@ -74,24 +44,33 @@
   @override
   void visitAnnotation(Annotation node) {
     SimpleIdentifier constructorName = node.constructorName;
+    SyntacticEntity entity;
+    if (constructorName != null) {
+      entity = constructorName;
+    } else {
+      var name = node.name;
+      if (name is PrefixedIdentifier) {
+        entity = name.identifier;
+      } else {
+        entity = name;
+      }
+    }
+    var data = _get(entity);
 
-    // Peek forward and check if the next element is a PrefixElement.
     SimpleIdentifier topEntity;
-    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
+    if (data.prefixInfo != null) {
       PrefixedIdentifier prefixedIdentifier = node.name;
 
       SimpleIdentifier prefix = prefixedIdentifier.prefix;
-      PrefixElement prefixElement = _getReferenceFor(prefix);
-      _getTypeFor(prefix); // prefix type
-      prefix.staticElement = prefixElement;
+      prefix.staticElement = data.prefixInfo;
 
       topEntity = prefixedIdentifier.identifier;
     } else {
       topEntity = node.name;
     }
 
-    Element element = _getReferenceFor(topEntity);
-    DartType type = _getTypeFor(topEntity);
+    Element element = data.reference;
+    DartType type = data.inferredType;
     node.element = element;
 
     if (element is ConstructorElement) {
@@ -117,12 +96,24 @@
     }
   }
 
+  ResolutionData<DartType, Element, Element, PrefixElement> _get(
+      SyntacticEntity entity,
+      {bool failIfAbsent: true}) {
+    int entityOffset = entity.offset;
+    var data = _data[entityOffset];
+    if (failIfAbsent && data == null) {
+      throw new StateError('No data for $entity at $entityOffset');
+    }
+    return data;
+  }
+
   @override
   void visitAsExpression(AsExpression node) {
     node.expression.accept(this);
+    var data = _get(node.asOperator);
     applyToTypeAnnotation(
-        _enclosingLibraryElement, _getTypeFor(node.asOperator), node.type);
-    node.staticType = _getTypeFor(node.asOperator);
+        _enclosingLibraryElement, data.literalType, node.type);
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -131,33 +122,27 @@
     node.rightHandSide.accept(this);
 
     SyntacticEntity entity = _getAssignmentEntity(node.leftHandSide);
-    node.staticElement = _getReferenceFor(entity);
-    node.staticType = _getTypeFor(entity);
+    var data = _get(entity);
+    node.staticElement = data.combiner;
+    node.staticType = data.inferredType;
   }
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
     node.leftOperand.accept(this);
 
+    var data = _get(node.operator);
     TokenType operatorType = node.operator.type;
     if (operatorType != TokenType.QUESTION_QUESTION &&
         operatorType != TokenType.AMPERSAND_AMPERSAND &&
         operatorType != TokenType.BAR_BAR) {
-      node.staticElement = _getReferenceFor(node.operator);
-      _getTypeFor(node.operator); // callee type
-      _getTypeFor(node.operator); // invocation type
-      _getTypeFor(node.operator); // type arguments
+      node.staticElement = data.reference;
     }
 
     // Record the return type of the expression.
-    node.staticType = _getTypeFor(node.operator);
+    node.staticType = data.inferredType;
 
     node.rightOperand.accept(this);
-
-    // Skip the synthetic Not for `!=`.
-    if (operatorType == TokenType.BANG_EQ) {
-      _getTypeFor(null, synthetic: true);
-    }
   }
 
   @override
@@ -184,7 +169,7 @@
 
   @override
   void visitCatchClause(CatchClause node) {
-    DartType guardType = _getTypeFor(node.onKeyword ?? node.catchKeyword);
+    DartType guardType = _get(node.onKeyword ?? node.catchKeyword).literalType;
     if (node.exceptionType != null) {
       applyToTypeAnnotation(
           _enclosingLibraryElement, guardType, node.exceptionType);
@@ -192,8 +177,8 @@
 
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
-      LocalVariableElementImpl element = _getDeclarationFor(exception);
-      DartType type = _getTypeFor(exception);
+      LocalVariableElementImpl element = exception.staticElement;
+      DartType type = _get(exception).literalType;
       element.type = type;
       exception.staticElement = element;
       exception.staticType = type;
@@ -201,8 +186,8 @@
 
     SimpleIdentifier stackTrace = node.stackTraceParameter;
     if (stackTrace != null) {
-      LocalVariableElementImpl element = _getDeclarationFor(stackTrace);
-      DartType type = _getTypeFor(stackTrace);
+      LocalVariableElementImpl element = stackTrace.staticElement;
+      DartType type = _get(stackTrace).literalType;
       element.type = type;
       stackTrace.staticElement = element;
       stackTrace.staticType = type;
@@ -216,12 +201,14 @@
     node.condition.accept(this);
     node.thenExpression.accept(this);
     node.elseExpression.accept(this);
-    node.staticType = _getTypeFor(node.question);
+    node.staticType = _get(node.question).inferredType;
   }
 
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    FieldElement fieldElement = _getReferenceFor(node.equals);
+    var element = _get(node.equals).reference;
+    FieldElement fieldElement =
+        element is PropertyAccessorElement ? element.variable : null;
     node.fieldName.staticElement = fieldElement;
     node.fieldName.staticType = fieldElement.type;
 
@@ -240,7 +227,7 @@
   @override
   void visitExpression(Expression node) {
     visitNode(node);
-    node.staticType = _getTypeFor(node);
+    node.staticType = _get(node).inferredType;
   }
 
   @override
@@ -249,7 +236,7 @@
     if (loopVariable != null) {
       SimpleIdentifier identifier = loopVariable.identifier;
 
-      DartType type = _getTypeFor(identifier);
+      DartType type = _get(identifier).inferredType;
       identifier.staticType = type;
 
       if (loopVariable.type != null) {
@@ -257,15 +244,14 @@
             _enclosingLibraryElement, type, loopVariable.type);
       }
 
-      VariableElementImpl element = _getDeclarationFor(identifier);
+      VariableElementImpl element = identifier.staticElement;
       if (element != null) {
         _typeContext.encloseVariable(element);
         identifier.staticElement = element;
         element.type = type;
       }
     } else {
-      node.identifier.staticElement = _getReferenceFor(node.identifier);
-      node.identifier.staticType = _getTypeFor(node.identifier);
+      node.identifier.accept(this);
     }
     node.iterable.accept(this);
     node.body.accept(this);
@@ -275,10 +261,7 @@
   void visitFormalParameterList(FormalParameterList parameterList) {
     for (var parameter in parameterList.parameters) {
       if (parameter is DefaultFormalParameter) {
-        if (parameter.defaultValue == null) {
-          // Consume the Null type, for the implicit default value.
-          _getTypeFor(null, synthetic: true);
-        } else {
+        if (parameter.defaultValue != null) {
           parameter.defaultValue.accept(this);
         }
       }
@@ -293,13 +276,11 @@
     // Apply resolution to default values.
     parameterList.accept(this);
 
-    FunctionElementImpl element = _getDeclarationFor(node);
+    FunctionElementImpl element = node.element;
     _typeContext.enterLocalFunction(element);
 
-    if (node.returnType != null && element != null) {
-      applyToTypeAnnotation(
-          _enclosingLibraryElement, element.returnType, node.returnType);
-    }
+    functionExpression.body?.accept(this);
+    _storeFunctionType(_get(node).inferredType, element);
 
     // Associate the elements with the nodes.
     if (element != null) {
@@ -319,11 +300,12 @@
         }
       }
 
+      applyToTypeAnnotation(
+          _enclosingLibraryElement, element.returnType, node.returnType);
       applyParameters(
           _enclosingLibraryElement, element.parameters, parameterList);
     }
 
-    functionExpression.body?.accept(this);
     _typeContext.exitLocalFunction(element);
   }
 
@@ -331,9 +313,15 @@
   void visitFunctionExpression(FunctionExpression node) {
     FormalParameterList parameterList = node.parameters;
 
-    FunctionElementImpl element = _getDeclarationFor(node);
+    FunctionElementImpl element = node.element;
     _typeContext.enterLocalFunction(element);
 
+    // Apply resolution to default values.
+    parameterList.accept(this);
+
+    node.body.accept(this);
+    _storeFunctionType(_get(node).inferredType, element);
+
     // Associate the elements with the nodes.
     if (element != null) {
       node.element = element;
@@ -342,28 +330,45 @@
           _enclosingLibraryElement, element.parameters, parameterList);
     }
 
-    // Apply resolution to default values.
-    parameterList.accept(this);
-
-    node.body.accept(this);
     _typeContext.exitLocalFunction(element);
   }
 
+  void _storeFunctionType(DartType type, FunctionElementImpl element) {
+    if (type is FunctionType && element != null) {
+      element.returnType = type.returnType;
+      int normalParameterIndex = 0;
+      int optionalParameterIndex = 0;
+      for (ParameterElementImpl parameter in element.parameters) {
+        if (parameter.isNamed) {
+          parameter.type = type.namedParameterTypes[parameter.name];
+        } else if (normalParameterIndex < type.normalParameterTypes.length) {
+          parameter.type = type.normalParameterTypes[normalParameterIndex++];
+        } else if (optionalParameterIndex <
+            type.optionalParameterTypes.length) {
+          parameter.type =
+              type.optionalParameterTypes[optionalParameterIndex++];
+        }
+      }
+    }
+  }
+
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.function.accept(this);
 
-    DartType invokeType = _getTypeFor(node.argumentList);
+    var data = _get(node.argumentList);
+    DartType invokeType = data.invokeType;
     node.staticInvokeType = invokeType;
 
-    DartType typeArgumentsDartType = _getTypeFor(node.argumentList);
-    if (node.typeArguments != null &&
-        typeArgumentsDartType is TypeArgumentsDartType) {
-      _applyTypeArgumentsToList(_enclosingLibraryElement, typeArgumentsDartType,
+    List<DartType> typeArguments = data.argumentTypes;
+    if (node.typeArguments != null && typeArguments is TypeArgumentsDartType) {
+      _applyTypeArgumentsToList(
+          _enclosingLibraryElement,
+          new TypeArgumentsDartType(typeArguments),
           node.typeArguments.arguments);
     }
 
-    DartType resultType = _getTypeFor(node.argumentList);
+    DartType resultType = data.inferredType;
     node.staticType = resultType;
 
     node.argumentList.accept(this);
@@ -374,7 +379,8 @@
     node.target.accept(this);
 
     DartType targetType = node.target.staticType;
-    MethodElement element = _getReferenceFor(node.leftBracket);
+    var data = _get(node.leftBracket);
+    MethodElement element = data.reference;
 
     // Convert the raw element into a member.
     if (targetType is InterfaceType) {
@@ -382,11 +388,7 @@
       node.staticElement = member;
     }
 
-    _getTypeFor(node.leftBracket); // callee type
-    _getTypeFor(node.leftBracket); // invoke type
-    _getTypeFor(node.leftBracket); // type arguments
-
-    node.staticType = _getTypeFor(node.leftBracket);
+    node.staticType = data.inferredType;
 
     node.index.accept(this);
   }
@@ -394,19 +396,12 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
+    var data = _get(constructorName);
 
-    // Peek forward and check if the next element is a PrefixElement.
-    PrefixElement prefix;
-    AstNode constructorEntity = constructorName;
-    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
-      PrefixedIdentifier typeIdentifier = constructorName.type.name;
-      prefix = _getReferenceFor(typeIdentifier.prefix);
-      _getTypeFor(typeIdentifier.prefix); // prefix type
-      constructorEntity = typeIdentifier.identifier;
-    }
+    PrefixElement prefix = data.prefixInfo;
 
-    ConstructorElement constructor = _getReferenceFor(constructorEntity);
-    DartType type = _getTypeFor(constructorEntity);
+    ConstructorElement constructor = data.reference;
+    DartType type = data.inferredType;
 
     applyConstructorElement(
         _enclosingLibraryElement, prefix, constructor, type, constructorName);
@@ -422,9 +417,10 @@
   @override
   void visitIsExpression(IsExpression node) {
     node.expression.accept(this);
+    var data = _get(node.isOperator);
     applyToTypeAnnotation(
-        _enclosingLibraryElement, _getTypeFor(node.isOperator), node.type);
-    node.staticType = _getTypeFor(node.isOperator);
+        _enclosingLibraryElement, data.literalType, node.type);
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -439,7 +435,7 @@
   @override
   void visitListLiteral(ListLiteral node) {
     node.elements.accept(this);
-    DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
+    DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
     if (node.typeArguments != null) {
       _applyTypeArgumentsToList(
@@ -450,7 +446,7 @@
   @override
   void visitMapLiteral(MapLiteral node) {
     node.entries.accept(this);
-    DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
+    DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
     if (node.typeArguments != null) {
       _applyTypeArgumentsToList(
@@ -464,11 +460,19 @@
 
     ArgumentList argumentList = node.argumentList;
 
-    Element invokeElement = _getReferenceFor(node.methodName);
-    _getTypeFor(node.methodName); // static element type
-    DartType invokeType = _getTypeFor(argumentList);
-    DartType typeArgumentsDartType = _getTypeFor(argumentList);
-    DartType resultType = _getTypeFor(argumentList);
+    var data = _get(argumentList);
+    Element invokeElement;
+    if (data.isImplicitCall) {
+      if (node.methodName != null) {
+        node.methodName.accept(this);
+        invokeElement = node.methodName.staticElement;
+      }
+    } else {
+      invokeElement = data.reference;
+    }
+    DartType invokeType = data.invokeType;
+    List<DartType> typeArguments = data.argumentTypes;
+    DartType resultType = data.inferredType;
 
     if (invokeElement is PropertyInducingElement) {
       PropertyInducingElement property = invokeElement;
@@ -480,16 +484,19 @@
 
     if (node.methodName.name == 'call' && invokeElement == null) {
       // Don't resolve explicit call() invocation of function types.
+    } else if (_get(node.methodName, failIfAbsent: false) != null) {
+      node.methodName.accept(this);
     } else {
       node.methodName.staticElement = invokeElement;
       node.methodName.staticType = invokeType;
     }
 
     if (invokeType is FunctionType) {
-      if (node.typeArguments != null &&
-          typeArgumentsDartType is TypeArgumentsDartType) {
-        _applyTypeArgumentsToList(_enclosingLibraryElement,
-            typeArgumentsDartType, node.typeArguments.arguments);
+      if (node.typeArguments != null && typeArguments != null) {
+        _applyTypeArgumentsToList(
+            _enclosingLibraryElement,
+            new TypeArgumentsDartType(typeArguments),
+            node.typeArguments.arguments);
       }
     }
 
@@ -523,8 +530,9 @@
   void visitPostfixExpression(PostfixExpression node) {
     node.operand.accept(this);
     SyntacticEntity entity = _getAssignmentEntity(node.operand);
-    node.staticElement = _getReferenceFor(entity);
-    node.staticType = _getTypeFor(entity);
+    var data = _get(entity);
+    node.staticElement = data.combiner;
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -542,20 +550,19 @@
       // ++v;
       // This is an assignment, it is associated with the operand.
       SyntacticEntity entity = _getAssignmentEntity(node.operand);
-      node.staticElement = _getReferenceFor(entity);
-      node.staticType = _getTypeFor(entity);
+      var data = _get(entity);
+      node.staticElement = data.combiner;
+      node.staticType = data.inferredType;
     } else if (tokenType == TokenType.BANG) {
       // !boolExpression;
-      node.staticType = _getTypeFor(node);
+      node.staticType = _get(node).inferredType;
     } else {
       // ~v;
       // This is a method invocation, it is associated with the operator.
       SyntacticEntity entity = node.operator;
-      node.staticElement = _getReferenceFor(entity);
-      _getTypeFor(entity); // The static function type of the operator.
-      _getTypeFor(entity); // The invoke function type of the operator.
-      _getTypeFor(entity); // The type arguments (empty).
-      node.staticType = _getTypeFor(entity);
+      var data = _get(entity);
+      node.staticElement = data.reference;
+      node.staticType = data.inferredType;
     }
   }
 
@@ -571,7 +578,7 @@
       RedirectingConstructorInvocation node) {
     SimpleIdentifier constructorName = node.constructorName;
 
-    ConstructorElement element = _getReferenceFor(constructorName ?? node);
+    ConstructorElement element = _get(constructorName ?? node).reference;
     node.staticElement = element;
     constructorName?.staticElement = element;
 
@@ -582,18 +589,24 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    node.staticElement = _getReferenceFor(node);
-    super.visitSimpleIdentifier(node);
+    var data = _get(node);
+    if (data.prefixInfo != null) {
+      node.staticElement = data.prefixInfo;
+    } else if (data.declaration != null) {
+      node.staticElement = data.declaration;
+    } else if (data.reference != null) {
+      node.staticElement = data.reference;
+    } else {
+      node.staticElement = null;
+    }
+    node.staticType =
+        data.isWriteReference ? data.writeContext : data.inferredType;
   }
 
   @override
   void visitStringInterpolation(StringInterpolation node) {
     for (var element in node.elements) {
-      if (element is InterpolationString) {
-        if (element.value.isNotEmpty) {
-          _getTypeFor(element);
-        }
-      } else if (element is InterpolationExpression) {
+      if (element is InterpolationExpression) {
         element.expression.accept(this);
       }
     }
@@ -630,11 +643,6 @@
   }
 
   @override
-  void visitTypeAnnotation(TypeAnnotation node) {
-    applyToTypeAnnotation(_enclosingLibraryElement, _getTypeFor(node), node);
-  }
-
-  @override
   void visitVariableDeclaration(VariableDeclaration node) {
     AstNode parent = node.parent;
     if (parent is VariableDeclarationList &&
@@ -642,10 +650,10 @@
             parent.parent is FieldDeclaration)) {
       // Don't visit the name; resolution for it will come from the outline.
     } else {
-      DartType type = _getTypeFor(node.name);
+      DartType type = _get(node.name).inferredType;
       node.name.staticType = type;
 
-      VariableElementImpl element = _getDeclarationFor(node.name);
+      VariableElementImpl element = node.name.staticElement;
       if (element != null) {
         _typeContext.encloseVariable(element);
         node.name.staticElement = element;
@@ -703,33 +711,6 @@
     }
   }
 
-  /// Return the element associated with the declaration represented by the
-  /// given [node].
-  Element _getDeclarationFor(AstNode node) {
-    return _declaredElements[_declaredElementIndex++];
-  }
-
-  /// Return the element associated with the reference represented by the
-  /// given [entity].
-  Element _getReferenceFor(SyntacticEntity entity) {
-    Element element = _referencedElements[_referencedElementIndex++];
-    if (_inAnnotation && element is PropertyInducingElement) {
-      return element.getter;
-    }
-    return element;
-  }
-
-  /// Return the type associated with the given [entity].
-  ///
-  /// If [synthetic] is `true`, the [entity] must be `null` and the type is
-  /// an implicit type, e.g. the type of the absent default values of an
-  /// optional parameter (i.e. [Null]).
-  DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
-    assert(!synthetic || entity == null);
-    kernel.DartType kernelType = _types[_typeIndex++];
-    return _typeContext.translateType(kernelType);
-  }
-
   /// Apply resolution to named arguments of the [argumentList].
   void _resolveNamedArguments(
       ArgumentList argumentList, List<ParameterElement> parameters) {
@@ -973,107 +954,6 @@
   DartType translateType(kernel.DartType kernelType);
 }
 
-/// Visitor that applies resolution data from the front end (obtained via
-/// [ResolutionStorer]) to an analyzer AST, and also checks file offsets to
-/// verify that the types are applied to the correct subexpressions.
-class ValidatingResolutionApplier extends ResolutionApplier {
-  /// The offset that is used when the actual offset is not know.
-  /// The applier should not validate this offset.
-  static const UNKNOWN_OFFSET = -2;
-
-  /// Indicates whether debug messages should be printed.
-  static const bool _debug = false;
-
-  final List<int> _declaredElementOffsets;
-  final List<int> _referencedElementOffsets;
-  final List<int> _typeOffsets;
-
-  ValidatingResolutionApplier(
-      LibraryElement enclosingLibraryElement,
-      TypeContext typeContext,
-      List<Element> declaredElements,
-      List<Element> referencedElements,
-      List<kernel.DartType> types,
-      this._declaredElementOffsets,
-      this._referencedElementOffsets,
-      this._typeOffsets)
-      : super(enclosingLibraryElement, typeContext, declaredElements,
-            referencedElements, types);
-
-  @override
-  void checkDone() {
-    if (_declaredElementIndex != _declaredElements.length) {
-      throw new StateError('Some declarations were not consumed, starting at '
-          'offset ${_declaredElementOffsets[_declaredElementIndex]}');
-    }
-    if (_referencedElementIndex != _referencedElements.length) {
-      throw new StateError('Some references were not consumed, starting at '
-          'offset ${_referencedElementOffsets[_referencedElementIndex]}');
-    }
-    if (_typeIndex != _types.length) {
-      throw new StateError('Some types were not consumed, starting at offset '
-          '${_typeOffsets[_typeIndex]}');
-    }
-  }
-
-  @override
-  Element _getDeclarationFor(AstNode node) {
-    int nodeOffset = node.offset;
-    if (_debug) {
-      print('Getting declaration element for $node at $nodeOffset');
-    }
-    if (_declaredElementIndex >= _declaredElements.length) {
-      throw new StateError(
-          'No declaration information for $node at $nodeOffset');
-    }
-    int elementOffset = _declaredElementOffsets[_declaredElementIndex];
-    if (nodeOffset != elementOffset) {
-      throw new StateError(
-          'Expected element declaration for analyzer offset $nodeOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-    return super._getDeclarationFor(node);
-  }
-
-  @override
-  Element _getReferenceFor(SyntacticEntity entity) {
-    int entityOffset = entity.offset;
-    if (_debug) {
-      print('Getting reference element for $entity at $entityOffset');
-    }
-    if (_referencedElementIndex >= _referencedElements.length) {
-      throw new StateError(
-          'No reference information for $entity at $entityOffset');
-    }
-    int elementOffset = _referencedElementOffsets[_referencedElementIndex];
-    if (elementOffset != UNKNOWN_OFFSET && entityOffset != elementOffset) {
-      throw new StateError(
-          'Expected element reference for analyzer offset $entityOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-    return super._getReferenceFor(entity);
-  }
-
-  @override
-  DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
-    var entityOffset = synthetic ? -1 : entity.offset;
-    if (_debug) {
-      print('Getting type for $entity at $entityOffset');
-    }
-    if (_typeIndex >= _types.length) {
-      throw new StateError('No type information for $entity at $entityOffset');
-    }
-    int typeOffset = _typeOffsets[_typeIndex];
-    if (typeOffset != UNKNOWN_OFFSET &&
-        entity != null &&
-        entityOffset != typeOffset) {
-      throw new StateError('Expected a type for $entity at $entityOffset; '
-          'got one for kernel offset $typeOffset');
-    }
-    return super._getTypeFor(entity);
-  }
-}
-
 /// The hierarchical scope for labels.
 class _LabelScope {
   final _LabelScope parent;
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 454fc62..ebdd2cc 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -3,679 +3,421 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/fasta/resolution_applier.dart';
-import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
+import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
 
-/// The reference to the import prefix with the [name].
-class ImportPrefixNode implements TreeNode {
-  final String name;
+class ResolutionData<Type, Declaration, Reference, PrefixInfo> {
+  final List<Type> argumentTypes;
+  final Reference combiner;
+  final Declaration declaration;
+  final Type inferredType;
+  final Type invokeType;
+  final bool isExplicitCall;
+  final bool isImplicitCall;
+  final bool isWriteReference;
+  final Type literalType;
+  final PrefixInfo prefixInfo;
+  final Reference reference;
+  final Type writeContext;
 
-  ImportPrefixNode(this.name);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(prefix-$name)';
-  }
-}
-
-/// The type of [DartType] node that is used as a marker for using `null`
-/// as the [FunctionType] for index assignment.
-class IndexAssignNullFunctionType implements DartType {
-  const IndexAssignNullFunctionType();
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return 'IndexAssignNullFunctionType';
-  }
-}
-
-/// Type inference listener that records inferred types and file offsets for
-/// later use by [ValidatingResolutionApplier].
-class InstrumentedResolutionStorer extends ResolutionStorer {
-  /// Indicates whether debug messages should be printed.
-  static const bool _debug = false;
-
-  final List<int> _declarationOffsets;
-  final List<int> _referenceOffsets;
-  final List<int> _typeOffsets;
-
-  final List<int> _deferredReferenceOffsets = [];
-  final List<int> _deferredTypeOffsets = [];
-
-  InstrumentedResolutionStorer(
-      List<TreeNode> declarations,
-      List<Node> references,
-      List<DartType> types,
-      this._declarationOffsets,
-      this._referenceOffsets,
-      this._typeOffsets)
-      : super(declarations, references, types);
-
-  @override
-  void _deferReference(int offset) {
-    super._deferReference(offset);
-    if (_debug) {
-      _deferredReferenceOffsets.add(offset);
-    }
-  }
-
-  @override
-  void _deferType(int offset) {
-    super._deferType(offset);
-    if (_debug) {
-      _deferredTypeOffsets.add(offset);
-    }
-  }
-
-  @override
-  void _recordDeclaration(TreeNode declaration, int offset) {
-    if (_debug) {
-      print('Recording declaration of $declaration for offset $offset');
-    }
-    _declarationOffsets.add(offset);
-    super._recordDeclaration(declaration, offset);
-  }
-
-  @override
-  int _recordReference(Node target, int offset) {
-    if (_debug) {
-      print('Recording reference to $target for offset $offset');
-    }
-    _referenceOffsets.add(offset);
-    return super._recordReference(target, offset);
-  }
-
-  @override
-  int _recordType(DartType type, int offset) {
-    if (_debug) {
-      print('Recording type $type for offset $offset');
-    }
-    assert(_types.length == _typeOffsets.length);
-    _typeOffsets.add(offset);
-    return super._recordType(type, offset);
-  }
-
-  @override
-  void _replaceReference(Node reference) {
-    if (_debug) {
-      int offset = _deferredReferenceOffsets.removeLast();
-      print('Replacing reference $reference for offset $offset');
-    }
-    super._replaceReference(reference);
-  }
-
-  @override
-  void _replaceType(DartType type, [int newOffset = -1]) {
-    if (newOffset != -1) {
-      _typeOffsets[_deferredTypeSlots.last] = newOffset;
-    }
-    if (_debug) {
-      if (newOffset != -1) {
-        _deferredTypeOffsets.removeLast();
-        _deferredTypeOffsets.add(newOffset);
-      }
-      int offset = _deferredTypeOffsets.removeLast();
-      print('Replacing type $type for offset $offset');
-    }
-    super._replaceType(type, newOffset);
-  }
-}
-
-/// A reference to the getter represented by the [member].
-/// The [member] might be either a getter itself, or a field.
-class MemberGetterNode implements TreeNode {
-  /// The member representing the getter, or `null` if the getter could not be
-  /// resolved.
-  final Member member;
-
-  MemberGetterNode(this.member);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '$member.getter';
-  }
-}
-
-/// A reference to the setter represented by the [member].
-/// The [member] might be either a setter itself, or a field.
-class MemberSetterNode implements TreeNode {
-  /// The member representing the setter, or `null` if the setter could not be
-  /// resolved.
-  final Member member;
-
-  MemberSetterNode(this.member);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '$member.setter';
-  }
-}
-
-/// The type of [TreeNode] node that is used as a marker for `null`.
-class NullNode implements TreeNode {
-  final String kind;
-
-  const NullNode(this.kind);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(null-$kind)';
-  }
-}
-
-/// The type of [DartType] node that is used as a marker for `null`.
-///
-/// It is used for import prefix identifiers, which are resolved to elements,
-/// but don't have any types.
-class NullType implements DartType {
-  const NullType();
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(null-type)';
-  }
+  ResolutionData(
+      {this.argumentTypes,
+      this.combiner,
+      this.declaration,
+      this.inferredType,
+      this.invokeType,
+      this.isExplicitCall = false,
+      this.isImplicitCall = false,
+      this.isWriteReference = false,
+      this.literalType,
+      this.prefixInfo,
+      this.reference,
+      this.writeContext});
 }
 
 /// Type inference listener that records inferred types for later use by
 /// [ResolutionApplier].
-class ResolutionStorer {
-  /// The offset that is used when the actual offset is not know.
-  /// The consumer of information should not validate this offset.
-  static const UNKNOWN_OFFSET = -2;
+class ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
+    extends TypeInferenceListener<Location, Declaration, Reference,
+        PrefixInfo> {
+  final Map<Location,
+      ResolutionData<DartType, Declaration, Reference, PrefixInfo>> _data;
 
-  final List<TreeNode> _declarations;
-  final List<Node> _references;
-  final List<DartType> _types;
+  final _stack = <Function>[];
 
-  /// Indices into [_references] which need to be filled in later.
-  final _deferredReferenceSlots = <int>[];
+  ResolutionStorer(this._data);
 
-  /// Indices into [_types] which need to be filled in later.
-  final _deferredTypeSlots = <int>[];
-
-  ResolutionStorer(this._declarations, this._references, this._types);
-
-  void asExpressionExit(AsExpression expression, DartType inferredType) {
-    _recordType(expression.type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+  void _store(Location location,
+      {List<DartType> argumentTypes,
+      Reference combiner,
+      Declaration declaration,
+      DartType inferredType,
+      DartType invokeType,
+      bool isExplicitCall = false,
+      bool isImplicitCall = false,
+      bool isWriteReference = false,
+      DartType literalType,
+      PrefixInfo prefixInfo,
+      Reference reference,
+      bool replace = false,
+      DartType writeContext}) {
+    if (!replace && _data.containsKey(location)) {
+      throw new StateError('Data already stored for offset $location');
+    }
+    _data[location] = new ResolutionData(
+        argumentTypes: argumentTypes,
+        combiner: combiner,
+        declaration: declaration,
+        inferredType: inferredType,
+        invokeType: invokeType,
+        isExplicitCall: isExplicitCall,
+        isImplicitCall: isImplicitCall,
+        isWriteReference: isWriteReference,
+        literalType: literalType,
+        prefixInfo: prefixInfo,
+        reference: reference,
+        writeContext: writeContext);
   }
 
-  void cascadeExpressionExit(Let expression, DartType inferredType) {
+  void _unstore(Location location) {
+    _data.remove(location) == null;
+  }
+
+  @override
+  void asExpressionExit(Location location, DartType inferredType) {
+    _store(location, literalType: inferredType, inferredType: inferredType);
+  }
+
+  @override
+  void cascadeExpressionExit(Location location, DartType inferredType) {
     // Overridden so that the type of the expression will not be recorded. We
     // don't need to record the type because the type is always the same as the
     // type of the target, and we don't have the appropriate offset so we can't
     // correctly apply the type even if we recorded it.
   }
 
-  void catchStatementEnter(Catch node) {
-    _recordType(node.guard, node.fileOffset);
+  @override
+  void catchStatementEnter(
+      Location location,
+      DartType guardType,
+      Location exceptionLocation,
+      DartType exceptionType,
+      Location stackTraceLocation,
+      DartType stackTraceType) {
+    _store(location, literalType: guardType);
 
-    VariableDeclaration exception = node.exception;
-    if (exception != null) {
-      _recordDeclaration(exception, exception.fileOffset);
-      _recordType(exception.type, exception.fileOffset);
+    if (exceptionLocation != null) {
+      _store(exceptionLocation, literalType: exceptionType);
     }
 
-    VariableDeclaration stackTrace = node.stackTrace;
-    if (stackTrace != null) {
-      _recordDeclaration(stackTrace, stackTrace.fileOffset);
-      _recordType(stackTrace.type, stackTrace.fileOffset);
+    if (stackTraceLocation != null) {
+      _store(stackTraceLocation, literalType: stackTraceType);
     }
   }
 
-  void constructorInvocationEnter(InvocationExpression expression,
-      String prefixName, DartType typeContext) {
-    _recordImportPrefix(prefixName);
-    _deferReference(expression.fileOffset);
-    _deferType(expression.fileOffset);
+  @override
+  void constructorInvocationEnter(Location location, DartType typeContext) {
+    _push((Reference expressionTarget, DartType inferredType) {
+      // A class reference may have already been stored at this location by
+      // storeClassReference.  We want to replace it with a constructor
+      // reference.
+      _unstore(location);
+      _store(location, inferredType: inferredType, reference: expressionTarget);
+    });
   }
 
+  @override
   void constructorInvocationExit(
-      InvocationExpression expression, DartType inferredType) {
-    _replaceType(inferredType);
-    if (expression is ConstructorInvocation) {
-      _replaceReference(expression.target);
-    } else if (expression is StaticInvocation) {
-      _replaceReference(expression.target);
-    } else {
-      throw new UnimplementedError('${expression.runtimeType}');
-    }
+      Location location, Reference expressionTarget, DartType inferredType) {
+    _pop()(expressionTarget, inferredType);
   }
 
-  void fieldInitializerEnter(FieldInitializer initializer) {
-    _recordReference(initializer.field, initializer.fileOffset);
+  @override
+  void fieldInitializerEnter(Location location, Reference initializerField) {
+    _store(location, reference: initializerField);
   }
 
-  /// Verifies that all deferred work has been completed.
   void finished() {
-    assert(_deferredTypeSlots.isEmpty);
+    assert(_stack.isEmpty);
   }
 
-  void forInStatementEnter(ForInStatement statement,
-      VariableDeclaration variable, Expression write) {
-    if (variable != null) {
-      _deferType(variable.fileOffset);
-      _recordDeclaration(variable, variable.fileOffset);
-    } else {
-      if (write is VariableSet) {
-        _recordReference(write.variable, write.fileOffset);
-        _recordType(write.variable.type, write.fileOffset);
-      } else if (write is PropertySet) {
-        Field field = write.interfaceTarget;
-        _recordReference(new MemberSetterNode(field), write.fileOffset);
-        _recordType(field.type, write.fileOffset);
-      } else if (write is StaticSet) {
-        Field field = write.target;
-        _recordReference(new MemberSetterNode(field), write.fileOffset);
-        _recordType(field.type, write.fileOffset);
+  @override
+  void forInStatementEnter(
+      Location location,
+      Location variableLocation,
+      Location writeLocation,
+      DartType writeType,
+      Declaration writeVariable,
+      Reference writeTarget) {
+    _push((DartType variableType) {
+      if (variableLocation != null) {
+        _store(variableLocation, inferredType: variableType);
       } else {
-        throw new UnimplementedError('(${write.runtimeType}) $write');
+        if (writeVariable != null) {
+          _store(writeLocation,
+              declaration: writeVariable, inferredType: writeType);
+        } else {
+          _store(writeLocation,
+              reference: writeTarget,
+              isWriteReference: true,
+              writeContext: writeType);
+        }
       }
-    }
+    });
   }
 
+  @override
   void forInStatementExit(
-      ForInStatement statement, VariableDeclaration variable) {
-    if (variable != null) {
-      _replaceType(variable.type);
-    }
+      Location location, bool variablePresent, DartType variableType) {
+    _pop()(variableType);
   }
 
-  void functionDeclarationEnter(FunctionDeclaration statement) {
-    _recordDeclaration(statement.variable, statement.fileOffset);
-  }
-
-  void functionExpressionEnter(
-      FunctionExpression expression, DartType typeContext) {
-    _recordDeclaration(expression, expression.fileOffset);
-  }
-
-  void functionExpressionExit(
-      FunctionExpression expression, DartType inferredType) {
-    // We don't need to record the inferred type.
-    // It is already set in the function declaration.
-  }
-
+  @override
   void genericExpressionEnter(
-      String expressionType, Expression expression, DartType typeContext) {}
+      String expressionType, Location location, DartType typeContext) {
+    super.genericExpressionEnter(expressionType, location, typeContext);
+  }
 
+  @override
   void genericExpressionExit(
-      String expressionType, Expression expression, DartType inferredType) {
-    _recordType(inferredType, expression.fileOffset);
+      String expressionType, Location location, DartType inferredType) {
+    _store(location, inferredType: inferredType);
+    super.genericExpressionExit(expressionType, location, inferredType);
   }
 
-  void ifNullBeforeRhs(Expression expression) {
-    _deferType(expression.fileOffset);
+  @override
+  void functionDeclarationExit(Location location, FunctionType inferredType) {
+    _store(location, inferredType: inferredType);
   }
 
-  void ifNullExit(Expression expression, DartType inferredType) {
-    _replaceType(inferredType);
+  @override
+  void nullLiteralExit(
+      Location location, bool isSynthetic, DartType inferredType) {
+    if (isSynthetic) return null;
+    super.nullLiteralExit(location, isSynthetic, inferredType);
   }
 
-  void indexAssignAfterReceiver(Expression write, DartType typeContext) {
-    _deferReference(write.fileOffset);
-    _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
-    _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
-    _recordType(new TypeArgumentsDartType(<DartType>[]), write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void indexAssignExit(Location location, Reference writeMember,
+      Reference combiner, DartType inferredType) {
+    _store(location,
+        reference: writeMember, inferredType: inferredType, combiner: combiner);
   }
 
-  void indexAssignExit(Expression expression, Expression write,
-      Member writeMember, Procedure combiner, DartType inferredType) {
-    _replaceReference(writeMember);
-    _replaceType(inferredType);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
-  void isExpressionExit(IsExpression expression, DartType inferredType) {
-    _recordType(expression.type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+  @override
+  void isExpressionExit(
+      Location location, DartType testedType, DartType inferredType) {
+    _store(location, literalType: testedType, inferredType: inferredType);
   }
 
   void isNotExpressionExit(
-      Not expression, DartType type, DartType inferredType) {
-    _recordType(type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+      Location location, DartType type, DartType inferredType) {
+    _store(location, literalType: type, inferredType: inferredType);
   }
 
-  void logicalExpressionBeforeRhs(LogicalExpression expression) {
-    _deferType(expression.fileOffset);
-  }
-
-  void logicalExpressionExit(
-      LogicalExpression expression, DartType inferredType) {
-    _replaceType(inferredType);
-  }
-
-  void methodInvocationBeforeArgs(Expression expression, bool isImplicitCall) {
-    if (!isImplicitCall) {
-      // When the invocation target is `VariableGet`, we record the target
-      // before arguments. To ensure this order for method invocations, we
-      // first record `null`, and then replace it on exit.
-      _deferReference(expression.fileOffset);
-      _deferType(expression.fileOffset); // callee type
-    }
-    _deferType(expression.fileOffset); // invoke type
-    _deferType(expression.fileOffset); // type arguments
-    _deferType(expression.fileOffset); // result type
-  }
-
+  @override
   void methodInvocationExit(
-      Expression expression,
-      Arguments arguments,
+      Location resultOffset,
+      List<DartType> argumentsTypes,
       bool isImplicitCall,
-      Member interfaceMember,
+      Reference interfaceMember,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    int resultOffset = arguments.fileOffset != -1
-        ? arguments.fileOffset
-        : expression.fileOffset;
-    _replaceType(inferredType, resultOffset);
-    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
-
     FunctionType invokeType = substitution == null
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType, resultOffset);
 
-    if (!isImplicitCall) {
-      interfaceMember = _getRealTarget(interfaceMember);
-      _replaceReference(interfaceMember);
-      _replaceType(const NullType()); // callee type
-    }
+    _store(resultOffset,
+        inferredType: inferredType,
+        argumentTypes: argumentsTypes,
+        invokeType: invokeType,
+        isImplicitCall: isImplicitCall,
+        reference: interfaceMember);
+
+    super.genericExpressionExit("methodInvocation", resultOffset, inferredType);
   }
 
+  @override
   void methodInvocationExitCall(
-      Expression expression,
-      Arguments arguments,
+      Location resultOffset,
+      List<DartType> argumentsTypes,
       bool isImplicitCall,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    int resultOffset = arguments.fileOffset != -1
-        ? arguments.fileOffset
-        : expression.fileOffset;
-    _replaceType(inferredType, resultOffset);
-    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
-
     FunctionType invokeType = substitution == null
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType, resultOffset);
 
-    if (!isImplicitCall) {
-      _replaceReference(const NullNode('explicit-call'));
-      _replaceType(const NullType()); // callee type
-    }
+    _store(resultOffset,
+        inferredType: inferredType,
+        argumentTypes: argumentsTypes,
+        invokeType: invokeType,
+        isImplicitCall: isImplicitCall);
+
+    super.genericExpressionExit("methodInvocation", resultOffset, inferredType);
   }
 
-  void propertyAssignEnter(
-      Expression expression, Expression write, DartType typeContext) {
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void propertyAssignExit(Location location, Reference writeMember,
+      DartType writeContext, Reference combiner, DartType inferredType) {
+    _store(location,
+        isWriteReference: true,
+        reference: writeMember,
+        writeContext: writeContext,
+        combiner: combiner,
+        inferredType: inferredType);
   }
 
-  void propertyAssignExit(
-      Expression expression,
-      Expression write,
-      Member writeMember,
-      DartType writeContext,
-      Procedure combiner,
-      DartType inferredType) {
-    writeMember = _getRealTarget(writeMember);
-    _replaceReference(new MemberSetterNode(writeMember));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
+  @override
   void propertyGetExit(
-      Expression expression, Member member, DartType inferredType) {
-    _recordReference(new MemberGetterNode(member), expression.fileOffset);
+      Location location, Reference member, DartType inferredType) {
+    _store(location, reference: member, inferredType: inferredType);
   }
 
-  void propertyGetExitCall(Expression expression, DartType inferredType) {
-    _recordReference(const NullNode('explicit-call'), expression.fileOffset);
-    _recordType(const NullType(), expression.fileOffset);
+  @override
+  void propertyGetExitCall(Location location, DartType inferredType) {
+    _store(location, isExplicitCall: true);
   }
 
-  void redirectingInitializerEnter(RedirectingInitializer initializer) {
-    _recordReference(initializer.target, initializer.fileOffset);
+  @override
+  void redirectingInitializerEnter(
+      Location location, Reference initializerTarget) {
+    _store(location, reference: initializerTarget);
   }
 
-  void staticAssignEnter(
-      Expression expression,
-      String prefixName,
-      int targetOffset,
-      Class targetClass,
-      Expression write,
-      DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
-
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void staticAssignEnter(Location location, DartType typeContext) {
+    _push((Reference writeMember, DartType writeContext, Reference combiner,
+        DartType inferredType) {
+      _store(location,
+          reference: writeMember,
+          isWriteReference: true,
+          writeContext: writeContext,
+          combiner: combiner,
+          inferredType: inferredType);
+    });
   }
 
-  void staticAssignExit(
-      Expression expression,
-      Expression write,
-      Member writeMember,
-      DartType writeContext,
-      Procedure combiner,
-      DartType inferredType) {
-    _replaceReference(new MemberSetterNode(writeMember));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
+  @override
+  void staticAssignExit(Location location, Reference writeMember,
+      DartType writeContext, Reference combiner, DartType inferredType) {
+    _pop()(writeMember, writeContext, combiner, inferredType);
   }
 
-  void staticGetEnter(StaticGet expression, String prefixName, int targetOffset,
-      Class targetClass, DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
+  @override
+  void staticGetEnter(Location location, DartType typeContext) {
+    _push(
+        (Location location, Reference expressionTarget, DartType inferredType) {
+      _store(location, reference: expressionTarget, inferredType: inferredType);
+    });
   }
 
-  void staticGetExit(StaticGet expression, DartType inferredType) {
-    _recordReference(
-        new MemberGetterNode(expression.target), expression.fileOffset);
+  @override
+  void staticGetExit(
+      Location location, Reference expressionTarget, DartType inferredType) {
+    _pop()(location, expressionTarget, inferredType);
   }
 
-  void staticInvocationEnter(StaticInvocation expression, String prefixName,
-      int targetOffset, Class targetClass, DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
-    // When the invocation target is `VariableGet`, we record the target
-    // before arguments. To ensure this order for method invocations, we
-    // first record `null`, and then replace it on exit.
-    _deferReference(expression.fileOffset);
-    // We are visiting a static invocation like: f(args), and we haven't visited
-    // args yet.
-    //
-    // The analyzer AST will expect a type for f at this point.  (It can't wait
-    // until later, because for all it knows, f is a method on `this`, and
-    // methods need a type for f at this point--see comments in
-    // [methodInvocationBeforeArgs]).  But the type isn't known yet (because it
-    // may depend on type inference based on arguments).
-    //
-    // So we add a `null` to our list of types; we'll update it with the actual
-    // type later.
-    _deferType(expression.fileOffset); // callee type
-    _deferType(expression.arguments.fileOffset); // invoke type
-    _deferType(expression.arguments.fileOffset); // type arguments
-    _deferType(expression.arguments.fileOffset); // result type
+  @override
+  void staticInvocationEnter(Location location,
+      Location expressionArgumentsLocation, DartType typeContext) {
+    _push((Reference expressionTarget,
+        List<DartType> expressionArgumentsTypes,
+        FunctionType calleeType,
+        Substitution substitution,
+        DartType inferredType) {
+      FunctionType invokeType = substitution == null
+          ? calleeType
+          : substitution.substituteType(calleeType.withoutTypeParameters);
+      _store(expressionArgumentsLocation,
+          invokeType: invokeType,
+          argumentTypes: expressionArgumentsTypes,
+          reference: expressionTarget,
+          inferredType: inferredType);
+    });
   }
 
+  @override
   void staticInvocationExit(
-      StaticInvocation expression,
+      Location location,
+      Reference expressionTarget,
+      List<DartType> expressionArgumentsTypes,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    _replaceType(inferredType);
-    _replaceReference(expression.target);
-    _replaceType(new TypeArgumentsDartType(expression.arguments.types));
-    FunctionType invokeType = substitution == null
-        ? calleeType
-        : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType);
-    _replaceType(const NullType()); // callee type
+    _pop()(expressionTarget, expressionArgumentsTypes, calleeType, substitution,
+        inferredType);
   }
 
-  void stringConcatenationExit(
-      StringConcatenation expression, DartType inferredType) {
+  @override
+  void stringConcatenationExit(Location location, DartType inferredType) {
     // We don't need the type - we already know that it is String.
     // Moreover, the file offset for StringConcatenation is `-1`.
   }
 
-  void thisExpressionExit(ThisExpression expression, DartType inferredType) {}
+  @override
+  void thisExpressionExit(Location location, DartType inferredType) {}
 
-  void typeLiteralEnter(@override TypeLiteral expression, String prefixName,
-      DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
+  @override
+  void typeLiteralEnter(Location location, DartType typeContext) {
+    _push((Reference expressionType, DartType inferredType) {
+      _store(location, reference: expressionType, inferredType: inferredType);
+    });
   }
 
-  void typeLiteralExit(TypeLiteral expression, DartType inferredType) {
-    _recordReference(expression.type, expression.fileOffset);
+  void typeLiteralExit(
+      Location location, Reference expressionType, DartType inferredType) {
+    _pop()(expressionType, inferredType);
   }
 
-  void variableAssignEnter(
-      Expression expression, DartType typeContext, Expression write) {
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void variableAssignExit(Location location, DartType writeContext,
+      Declaration writeVariable, Reference combiner, DartType inferredType) {
+    _store(location,
+        declaration: writeVariable,
+        isWriteReference: true,
+        writeContext: writeContext,
+        combiner: combiner,
+        inferredType: inferredType);
   }
 
-  void variableAssignExit(Expression expression, DartType writeContext,
-      Expression write, Procedure combiner, DartType inferredType) {
-    _replaceReference(write is VariableSet
-        ? write.variable
-        : const NullNode('writable-variable'));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
-  void variableDeclarationEnter(VariableDeclaration statement) {
-    _recordDeclaration(statement, statement.fileOffset);
-    _deferType(statement.fileOffset);
-  }
-
+  @override
   void variableDeclarationExit(
-      VariableDeclaration statement, DartType inferredType) {
-    _replaceType(statement.type);
+      Location location, DartType statementType, DartType inferredType) {
+    _store(location, literalType: statementType, inferredType: inferredType);
   }
 
-  void variableGetExit(VariableGet expression, DartType inferredType) {
-    /// Return `true` if the given [variable] declaration occurs in a let
-    /// expression that is, or is part of, a cascade expression.
-    bool isInCascade(VariableDeclaration variable) {
-      TreeNode ancestor = variable.parent;
-      while (ancestor is Let) {
-        if (ancestor is ShadowCascadeExpression) {
-          return true;
-        }
-        ancestor = ancestor.parent;
-      }
-      return false;
-    }
-
-    VariableDeclaration variable = expression.variable;
-    if (isInCascade(variable)) {
+  @override
+  void variableGetExit(Location location, bool isInCascade,
+      Declaration expressionVariable, DartType inferredType) {
+    if (isInCascade) {
       return;
     }
-    _recordReference(variable, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+    _store(location,
+        declaration: expressionVariable, inferredType: inferredType);
   }
 
-  /// Record `null` as the reference at the given [offset], and put the current
-  /// slot into the [_deferredReferenceSlots] stack.
-  void _deferReference(int offset) {
-    int slot = _recordReference(null, offset);
-    _deferredReferenceSlots.add(slot);
+  void _push(Function f) {
+    _stack.add(f);
   }
 
-  /// Record `null` as the type at the given [offset], and put the current
-  /// slot into the [_deferredTypeSlots] stack.
-  void _deferType(int offset) {
-    int slot = _recordType(null, offset);
-    _deferredTypeSlots.add(slot);
+  Function _pop() {
+    return _stack.removeLast();
   }
 
-  void _recordDeclaration(TreeNode declaration, int offset) {
-    _declarations.add(declaration);
+  @override
+  void storePrefixInfo(Location location, PrefixInfo prefixInfo) {
+    _store(location, prefixInfo: prefixInfo);
   }
 
-  /// If the [prefixName] is not `null` record the reference to it.
-  void _recordImportPrefix(String prefixName) {
-    if (prefixName != null) {
-      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
-      _recordType(const NullType(), UNKNOWN_OFFSET);
-    }
-  }
-
-  int _recordReference(Node target, int offset) {
-    int slot = _references.length;
-    _references.add(target);
-    return slot;
-  }
-
-  int _recordType(DartType type, int offset) {
-    int slot = _types.length;
-    _types.add(type);
-    return slot;
-  }
-
-  void _replaceReference(Node reference) {
-    int slot = _deferredReferenceSlots.removeLast();
-    _references[slot] = reference;
-  }
-
-  void _replaceType(DartType type, [int newOffset = -1]) {
-    int slot = _deferredTypeSlots.removeLast();
-    _types[slot] = type;
-  }
-
-  /// If the [member] is a forwarding stub, return the target it forwards to.
-  /// Otherwise return the given [member].
-  static Member _getRealTarget(Member member) {
-    if (member is Procedure && member.isForwardingStub) {
-      return member.forwardingStubInterfaceTarget;
-    }
-    return member;
+  @override
+  void storeClassReference(
+      Location location, Reference reference, DartType rawType) {
+    // TODO(paulberry): would it be better to use literalType?
+    _store(location, reference: reference, inferredType: rawType);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 27e5169..ba1885e 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -91,10 +91,7 @@
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     if (_isBodyToCreateElementsFor(node)) {
       _walker.consumeLocalElements();
-      // With kernel local elements are created in resolution applier.
-      if (!_applyKernelTypes) {
-        node.accept(_walker.elementBuilder);
-      }
+      node.accept(_walker.elementBuilder);
       return null;
     } else {
       return super.visitBlockFunctionBody(node);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 86a305f..204542e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -209,24 +209,6 @@
    */
   ClassElementImpl _enclosingClass;
 
-  ClassElement get enclosingClass => _enclosingClass;
-
-  /**
-   * For consumers of error verification as a library, (currently just the
-   * angular plugin), expose a setter that can make the errors reported more
-   * accurate when dangling code snippets are being resolved from a class
-   * context. Note that this setter is very defensive for potential misuse; it
-   * should not be modified in the middle of visiting a tree and requires an
-   * analyzer-provided Impl instance to work.
-   */
-  set enclosingClass(ClassElement classElement) {
-    assert(classElement is ClassElementImpl);
-    assert(_enclosingClass == null);
-    assert(_enclosingEnum == null);
-    assert(_enclosingFunction == null);
-    _enclosingClass = classElement;
-  }
-
   /**
    * The enum containing the AST nodes being visited, or `null` if we are not
    * in the scope of an enum.
@@ -345,6 +327,24 @@
     _options = _currentLibrary.context.analysisOptions;
   }
 
+  ClassElement get enclosingClass => _enclosingClass;
+
+  /**
+   * For consumers of error verification as a library, (currently just the
+   * angular plugin), expose a setter that can make the errors reported more
+   * accurate when dangling code snippets are being resolved from a class
+   * context. Note that this setter is very defensive for potential misuse; it
+   * should not be modified in the middle of visiting a tree and requires an
+   * analyzer-provided Impl instance to work.
+   */
+  set enclosingClass(ClassElement classElement) {
+    assert(classElement is ClassElementImpl);
+    assert(_enclosingClass == null);
+    assert(_enclosingEnum == null);
+    assert(_enclosingFunction == null);
+    _enclosingClass = classElement;
+  }
+
   @override
   Object visitAnnotation(Annotation node) {
     _checkForInvalidAnnotationFromDeferredLibrary(node);
@@ -1619,6 +1619,57 @@
   }
 
   /**
+   * Check that return statements without expressions are not in a generative
+   * constructor and the return type is not assignable to `null`; that is, we
+   * don't have `return;` if the enclosing method has a non-void containing
+   * return type.
+   *
+   * See [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR],
+   * [StaticWarningCode.RETURN_WITHOUT_VALUE], and
+   * [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
+   */
+  void _checkForAllEmptyReturnStatementErrorCodes(
+      ReturnStatement statement, DartType expectedReturnType) {
+    if (_inGenerator) {
+      return;
+    }
+    if (_options.strongMode) {
+      var returnType = _inAsync
+          ? expectedReturnType.flattenFutures(_typeSystem)
+          : expectedReturnType;
+      if (returnType.isDynamic ||
+          returnType.isDartCoreNull ||
+          returnType.isVoid) {
+        return;
+      }
+    } else {
+      // TODO(leafp): Delete this non-strong path
+      if (_inAsync) {
+        if (expectedReturnType.isDynamic || expectedReturnType.isVoid) {
+          return;
+        }
+        if (expectedReturnType is InterfaceType &&
+            expectedReturnType.isDartAsyncFuture) {
+          DartType futureArgument = expectedReturnType.typeArguments[0];
+          if (futureArgument.isDynamic ||
+              futureArgument.isDartCoreNull ||
+              futureArgument.isVoid ||
+              futureArgument.isObject) {
+            return;
+          }
+        }
+      } else if (expectedReturnType.isDynamic || expectedReturnType.isVoid) {
+        return;
+      }
+    }
+    // If we reach here, this is an invalid return
+    _hasReturnWithoutValue = true;
+    _errorReporter.reportErrorForNode(
+        StaticWarningCode.RETURN_WITHOUT_VALUE, statement);
+    return;
+  }
+
+  /**
    * Verify that the given [constructor] declaration does not violate any of the
    * error codes relating to the initialization of fields in the enclosing
    * class.
@@ -2307,7 +2358,8 @@
    *
    * Check that return statements without expressions are not in a generative
    * constructor and the return type is not assignable to `null`; that is, we
-   * don't have `return;` if the enclosing method has a return type.
+   * don't have `return;` if the enclosing method has a non-void containing
+   * return type.
    *
    * Check that the return type matches the type of the declared return type in
    * the enclosing method or function.
@@ -2322,6 +2374,7 @@
         ? DynamicTypeImpl.instance
         : functionType.returnType;
     Expression returnExpression = statement.expression;
+
     // RETURN_IN_GENERATIVE_CONSTRUCTOR
     bool isGenerativeConstructor(ExecutableElement element) =>
         element is ConstructorElement && !element.isFactory;
@@ -2336,34 +2389,7 @@
     }
     // RETURN_WITHOUT_VALUE
     if (returnExpression == null) {
-      if (_inGenerator) {
-        return;
-      } else if (_inAsync) {
-        if (expectedReturnType.isDynamic || expectedReturnType.isVoid) {
-          return;
-        }
-        if (expectedReturnType is InterfaceType &&
-            expectedReturnType.isDartAsyncFuture) {
-          DartType futureArgument = expectedReturnType.typeArguments[0];
-          if (futureArgument.isDynamic ||
-              futureArgument.isDartCoreNull ||
-              futureArgument.isVoid ||
-              futureArgument.isObject) {
-            return;
-          }
-        }
-      } else if (expectedReturnType.isDynamic ||
-          expectedReturnType.isVoid ||
-          (expectedReturnType.isDartCoreNull && _options.strongMode)) {
-        // TODO(leafp): Empty returns shouldn't be allowed for Null in strong
-        // mode either once we allow void as a type argument.  But for now, the
-        // only type we can validly infer for f.then((_) {print("hello");}) is
-        // Future<Null>, so we allow this.
-        return;
-      }
-      _hasReturnWithoutValue = true;
-      _errorReporter.reportErrorForNode(
-          StaticWarningCode.RETURN_WITHOUT_VALUE, statement);
+      _checkForAllEmptyReturnStatementErrorCodes(statement, expectedReturnType);
       return;
     } else if (_inGenerator) {
       // RETURN_IN_GENERATOR
@@ -2371,6 +2397,7 @@
           CompileTimeErrorCode.RETURN_IN_GENERATOR,
           statement,
           [_inAsync ? "async*" : "sync*"]);
+      return;
     }
 
     _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
@@ -4837,8 +4864,10 @@
     if (_hasReturnWithoutValue) {
       return;
     }
-    if (_returnsWith.isNotEmpty && _returnsWithout.isNotEmpty) {
-      for (ReturnStatement returnWith in _returnsWith) {
+    var nonVoidReturnsWith =
+        _returnsWith.where((stmt) => !getStaticType(stmt.expression).isVoid);
+    if (nonVoidReturnsWith.isNotEmpty && _returnsWithout.isNotEmpty) {
+      for (ReturnStatement returnWith in nonVoidReturnsWith) {
         _errorReporter.reportErrorForToken(
             StaticWarningCode.MIXED_RETURN_TYPES, returnWith.returnKeyword);
       }
@@ -5647,7 +5676,7 @@
    * See [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
    */
   void _checkForReturnOfInvalidType(
-      Expression returnExpression, DartType expectedReturnType,
+      Expression returnExpression, DartType expectedType,
       {bool isArrowFunction = false}) {
     if (_enclosingFunction == null) {
       return;
@@ -5658,19 +5687,79 @@
       // of the return type.  So no need to do any further checking.
       return;
     }
+    if (_options.strongMode) {
+      if (returnExpression == null) {
+        return; // Empty returns are handled elsewhere
+      }
+
+      DartType expressionType = getStaticType(returnExpression);
+
+      void reportTypeError() {
+        String displayName = _enclosingFunction.displayName;
+
+        if (displayName.isEmpty) {
+          _errorReporter.reportTypeErrorForNode(
+              StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+              returnExpression,
+              [expressionType, expectedType]);
+        } else {
+          _errorReporter.reportTypeErrorForNode(
+              StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+              returnExpression,
+              [expressionType, expectedType, displayName]);
+        }
+      }
+
+      var toType = expectedType;
+      var fromType = expressionType;
+
+      if (isArrowFunction) {
+        if (_inAsync && toType.flattenFutures(_typeSystem).isVoid) {
+          return;
+        } else if (toType.isVoid) {
+          return;
+        }
+      }
+
+      if (toType.isDynamic) {
+        return;
+      }
+
+      if (toType.isVoid) {
+        if (fromType.isVoid) {
+          return;
+        }
+        if (!_inAsync && fromType.isDynamic ||
+            fromType.isDartCoreNull ||
+            fromType.isBottom) {
+          return;
+        }
+      } else if (!fromType.isVoid) {
+        if (_inAsync) {
+          fromType = _typeProvider.futureType
+              .instantiate(<DartType>[fromType.flattenFutures(_typeSystem)]);
+        }
+        if (_expressionIsAssignableAtType(returnExpression, fromType, toType)) {
+          return;
+        }
+      }
+      reportTypeError();
+      return;
+    }
+    // TODO(leafp): Delete this non Dart 2 path
     DartType staticReturnType = _computeReturnTypeForMethod(returnExpression);
     String displayName = _enclosingFunction.displayName;
 
     void reportTypeError() => _errorReporter.reportTypeErrorForNode(
         StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
         returnExpression,
-        [staticReturnType, expectedReturnType, displayName]);
+        [staticReturnType, expectedType, displayName]);
     void reportTypeErrorFromClosure() => _errorReporter.reportTypeErrorForNode(
         StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
         returnExpression,
-        [staticReturnType, expectedReturnType]);
+        [staticReturnType, expectedType]);
 
-    if (expectedReturnType.isVoid) {
+    if (expectedType.isVoid) {
       if (isArrowFunction) {
         // "void f(..) => e" admits all types for "e".
         return;
@@ -5691,10 +5780,10 @@
 
     // TODO(mfairhurst) Make this stricter once codebases are compliant.
     final invalidVoidReturn = staticReturnType.isVoid &&
-        !(expectedReturnType.isVoid || expectedReturnType.isDynamic);
+        !(expectedType.isVoid || expectedType.isDynamic);
     if (!invalidVoidReturn &&
         _expressionIsAssignableAtType(
-            returnExpression, staticReturnType, expectedReturnType)) {
+            returnExpression, staticReturnType, expectedType)) {
       return;
     }
     if (displayName.isEmpty) {
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 1a5a68a..9422646 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -4637,7 +4637,7 @@
       Token token = getAndAdvance();
       int value = null;
       try {
-        value = int.parse(token.lexeme.substring(2), radix: 16);
+        value = int.parse(token.lexeme);
       } on FormatException {
         // The invalid format should have been reported by the scanner.
       }
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 69905bb..6f5e77a 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -110,7 +110,7 @@
     currentToken = fastaParser.parseClassMember(currentToken);
     ClassDeclaration declaration = astBuilder.classDeclaration;
     astBuilder.classDeclaration = null;
-    return declaration.members[0];
+    return declaration.members.isNotEmpty ? declaration.members[0] : null;
   }
 
   @override
@@ -130,7 +130,9 @@
   @override
   CompilationUnit parseCompilationUnit2() {
     currentToken = fastaParser.parseUnit(currentToken);
-    return astBuilder.pop();
+    CompilationUnitImpl compilationUnit = astBuilder.pop();
+    compilationUnit.localDeclarations = astBuilder.localDeclarations;
+    return compilationUnit;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 09d4a84..663b76e 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1186,7 +1186,30 @@
       if (body.isGenerator) {
         return;
       }
-      // Check that the type is resolvable, and is not "void"
+
+      if (_typeSystem is StrongTypeSystemImpl) {
+        // Check that the type is resolvable, and is not "void"
+        DartType returnTypeType = returnType.type;
+        if (returnTypeType == null) {
+          return;
+        }
+
+        var flattenedType = body.isAsynchronous
+            ? returnTypeType.flattenFutures(_typeSystem)
+            : returnTypeType;
+        if (flattenedType.isDynamic ||
+            flattenedType.isDartCoreNull ||
+            flattenedType.isVoid) {
+          return;
+        }
+        // Check the block for a return statement, if not, create the hint
+        if (!ExitDetector.exits(body)) {
+          _errorReporter.reportErrorForNode(HintCode.MISSING_RETURN, returnType,
+              [returnTypeType.displayName]);
+        }
+      }
+      // TODO(leafp): Delete this non-strong mode path
+      // Check that the type is resolvable and not "void"
       DartType returnTypeType = returnType.type;
       if (returnTypeType == null ||
           returnTypeType.isVoid ||
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 43cb699..876f47d 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -372,7 +372,8 @@
     }
 
     // Replace Analyzer type parameters with type arguments.
-    throw new UnimplementedError('TODO(paulberry)');
+    throw new UnimplementedError(
+        'TODO(paulberry): resynthesize generic typedef');
   }
 
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index bb05401..47bdf9f 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -74,6 +74,13 @@
    * [assetPath] or in a subdirectory of the parent of the file.
    */
   bool _assetExistsAtPath(String assetPath) {
+    // Check for asset directories.
+    Folder assetDirectory = provider.getFolder(assetPath);
+    if (assetDirectory.exists) {
+      return true;
+    }
+
+    // Else, check for an asset file.
     File assetFile = provider.getFile(assetPath);
     if (assetFile.exists) {
       return true;
@@ -159,15 +166,16 @@
               if (entry.startsWith('packages/')) {
                 // TODO(brianwilkerson) Add validation of package references.
               } else {
+                bool isDirectoryEntry = entry.endsWith("/");
                 String normalizedEntry =
                     context.joinAll(path.posix.split(entry));
                 String assetPath = context.join(packageRoot, normalizedEntry);
                 if (!_assetExistsAtPath(assetPath)) {
+                  ErrorCode errorCode = isDirectoryEntry
+                      ? PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST
+                      : PubspecWarningCode.ASSET_DOES_NOT_EXIST;
                   _reportErrorForNode(
-                      reporter,
-                      entryValue,
-                      PubspecWarningCode.ASSET_DOES_NOT_EXIST,
-                      [entryValue.value]);
+                      reporter, entryValue, errorCode, [entryValue.value]);
                 }
               }
             } else {
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
index d4d4c2d..0e3461b 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
@@ -23,6 +23,18 @@
           correction: "Try creating the file or fixing the path to the file.");
 
   /**
+   * A code indicating that a specified asset directory does not exist.
+   *
+   * Parameters:
+   * 0: the path to the asset directory as given in the file.
+   */
+  static const PubspecWarningCode ASSET_DIRECTORY_DOES_NOT_EXIST =
+      const PubspecWarningCode('ASSET_DIRECTORY_DOES_NOT_EXIST',
+          "The asset directory {0} does not exist.",
+          correction: "Try creating the directory or fixing the path to the "
+              "directory.");
+
+  /**
    * A code indicating that the value of the asset field is not a list.
    */
   static const PubspecWarningCode ASSET_FIELD_NOT_LIST = const PubspecWarningCode(
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index d89deab..bee56b9 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/context_locator.dart';
 
 /**
  * A mixin for test classes that adds a [ResourceProvider] and utility methods
@@ -15,6 +16,24 @@
 class ResourceProviderMixin {
   MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
+  String convertPath(String path) => resourceProvider.convertPath(path);
+
+  /// Convert the given [path] to be a valid import uri for this provider's path context.
+  String convertPathForImport(String path) {
+    path = resourceProvider.convertPath(path);
+
+    // On Windows, absolute import paths are not quite the same as a normal fs path.
+    // C:\test.dart must be imported as one of:
+    //   import "file:///C:/test.dart"
+    //   import "/C:/test.dart"
+    if (Platform.isWindows && resourceProvider.pathContext.isAbsolute(path)) {
+      // The .path on a file Uri is in the form "/C:/test.dart"
+      path = new Uri.file(path).path;
+    }
+
+    return path;
+  }
+
   void deleteFile(String path) {
     String convertedPath = resourceProvider.convertPath(path);
     resourceProvider.deleteFile(convertedPath);
@@ -35,6 +54,17 @@
     return resourceProvider.getFolder(convertedPath);
   }
 
+  String join(String part1,
+          [String part2,
+          String part3,
+          String part4,
+          String part5,
+          String part6,
+          String part7,
+          String part8]) =>
+      resourceProvider.pathContext
+          .join(part1, part2, part3, part4, part5, part6, part7, part8);
+
   void modifyFile(String path, String content) {
     String convertedPath = resourceProvider.convertPath(path);
     resourceProvider.modifyFile(convertedPath, content);
@@ -55,32 +85,13 @@
     return resourceProvider.newFolder(convertedPath);
   }
 
-  String join(String part1,
-          [String part2,
-          String part3,
-          String part4,
-          String part5,
-          String part6,
-          String part7,
-          String part8]) =>
-      resourceProvider.pathContext
-          .join(part1, part2, part3, part4, part5, part6, part7, part8);
+  File newOptionsFile(String directoryPath) {
+    return newFile(resourceProvider.pathContext
+        .join(directoryPath, ContextLocatorImpl.ANALYSIS_OPTIONS_NAME));
+  }
 
-  String convertPath(String path) => resourceProvider.convertPath(path);
-
-  /// Convert the given [path] to be a valid import uri for this provider's path context.
-  String convertPathForImport(String path) {
-    path = resourceProvider.convertPath(path);
-
-    // On Windows, absolute import paths are not quite the same as a normal fs path.
-    // C:\test.dart must be imported as one of:
-    //   import "file:///C:/test.dart"
-    //   import "/C:/test.dart"
-    if (Platform.isWindows && resourceProvider.pathContext.isAbsolute(path)) {
-      // The .path on a file Uri is in the form "/C:/test.dart"
-      path = new Uri.file(path).path;
-    }
-
-    return path;
+  File newPackagesFile(String directoryPath) {
+    return newFile(resourceProvider.pathContext
+        .join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME));
   }
 }
diff --git a/pkg/analyzer/test/file_system/overlay_file_system_test.dart b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
new file mode 100644
index 0000000..e06fafd
--- /dev/null
+++ b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
@@ -0,0 +1,784 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/file_system/overlay_file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FileTest);
+    defineReflectiveTests(FolderTest);
+    defineReflectiveTests(OverlayResourceProviderTest);
+  });
+}
+
+var _isFile = new isInstanceOf<File>();
+var _isFileSystemException = new isInstanceOf<FileSystemException>();
+var _isFolder = new isInstanceOf<Folder>();
+
+@reflectiveTest
+class FileTest extends OverlayTestSupport {
+  @failingTest
+  test_changes() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  test_copyTo_noOverlay() {
+    File file = _file(exists: true);
+    File targetFile =
+        provider.getFile(baseProvider.convertPath('/foo/test.dart'));
+    expect(targetFile.exists, isFalse);
+    file.copyTo(file.parent.parent);
+    expect(targetFile.exists, isTrue);
+  }
+
+  test_copyTo_onlyOverlay() {
+    File file = _file(exists: false);
+    provider.setOverlay(file.path, content: 'overlay', modificationStamp: 3);
+    File targetFile =
+        provider.getFile(baseProvider.convertPath('/foo/test.dart'));
+    expect(targetFile.exists, isFalse);
+    file.copyTo(file.parent.parent);
+    expect(targetFile.exists, isTrue);
+    expect(targetFile.readAsStringSync(), 'overlay');
+    provider.removeOverlay(targetFile.path);
+    expect(targetFile.exists, isFalse);
+  }
+
+  test_copyTo_withOverlay() {
+    File file = _file(exists: true, content: 'base');
+    provider.setOverlay(file.path, content: 'overlay', modificationStamp: 3);
+    File targetFile =
+        provider.getFile(baseProvider.convertPath('/foo/test.dart'));
+    expect(targetFile.exists, isFalse);
+    file.copyTo(file.parent.parent);
+    expect(targetFile.exists, isTrue);
+    expect(targetFile.readAsStringSync(), 'overlay');
+    provider.removeOverlay(targetFile.path);
+    expect(targetFile.exists, isTrue);
+    expect(targetFile.readAsStringSync(), 'base');
+  }
+
+  test_createSource() {
+    File file = _file(exists: true);
+    Source source = file.createSource();
+    expect(source, isNotNull);
+    expect(source.fullName, defaultFilePath);
+    expect(source.uri, new Uri.file(defaultFilePath));
+  }
+
+  test_delete_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.exists, isTrue);
+    file.delete();
+    expect(file.exists, isFalse);
+  }
+
+  test_delete_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.exists, isTrue);
+    file.delete();
+    expect(file.exists, isFalse);
+  }
+
+  test_delete_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(file.exists, isFalse);
+    expect(() => file.delete(), throwsA(_isFileSystemException));
+  }
+
+  test_delete_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.exists, isTrue);
+    file.delete();
+    expect(file.exists, isFalse);
+  }
+
+  test_exists_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.exists, isTrue);
+  }
+
+  test_exists_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.exists, isTrue);
+  }
+
+  test_exists_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(file.exists, isFalse);
+  }
+
+  test_exists_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.exists, isTrue);
+  }
+
+  test_isOrContains_false() {
+    File file = _file(exists: true);
+    expect(file.isOrContains(baseProvider.convertPath('/foo/bar/a.dart')),
+        isFalse);
+  }
+
+  test_isOrContains_true() {
+    File file = _file(exists: true);
+    expect(file.isOrContains(file.path), isTrue);
+  }
+
+  test_lengthSync_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.lengthSync, 1);
+  }
+
+  test_lengthSync_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.lengthSync, 3);
+  }
+
+  test_modificationStamp_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.modificationStamp, isNotNull);
+  }
+
+  test_modificationStamp_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.modificationStamp, 42);
+  }
+
+  test_modificationStamp_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(() => file.modificationStamp, throwsA(_isFileSystemException));
+  }
+
+  test_modificationStamp_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.modificationStamp, 42);
+  }
+
+  test_parent() {
+    Folder parent = _file(exists: true).parent;
+    expect(parent, isNotNull);
+    expect(parent.exists, isTrue);
+    expect(parent.path, defaultFolderPath);
+  }
+
+  test_readAsBytesSync_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.readAsBytesSync(), <int>[97]);
+  }
+
+  test_readAsBytesSync_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.readAsBytesSync(), <int>[98, 98, 98]);
+  }
+
+  test_readAsBytesSync_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(() => file.readAsBytesSync(), throwsA(_isFileSystemException));
+  }
+
+  test_readAsBytesSync_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.readAsBytesSync(), <int>[98, 98, 98]);
+  }
+
+  test_readAsStringSync_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file.readAsStringSync(), 'a');
+  }
+
+  test_readAsStringSync_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file.readAsStringSync(), 'bbb');
+  }
+
+  test_readAsStringSync_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(() {
+      file.readAsStringSync();
+    }, throwsA(_isFileSystemException));
+  }
+
+  test_readAsStringSync_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file.readAsStringSync(), 'bbb');
+  }
+
+  test_renameSync_existingFile_conflictsWithFile() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(content: 'old', exists: true, path: oldPath);
+    File newFile = _file(content: 'new', exists: true, path: newPath);
+    oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'old');
+  }
+
+  test_renameSync_existingFile_conflictsWithFolder() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-baz');
+    File oldFile = _file(exists: true, path: oldPath);
+    Folder newFolder = _folder(exists: true, path: newPath);
+    expect(() => oldFile.renameSync(newPath), throwsA(_isFileSystemException));
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isTrue);
+    expect(newFolder.path, newPath);
+    expect(newFolder.exists, isTrue);
+  }
+
+  test_renameSync_existingFile_withoutOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: true, path: oldPath);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'a');
+  }
+
+  test_renameSync_existingFile_withOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: true, path: oldPath, withOverlay: true);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'bbb');
+  }
+
+  test_renameSync_notExisting_withoutOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: true, path: oldPath);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'a');
+  }
+
+  test_renameSync_notExisting_withOverlay() {
+    String oldPath = '/foo/bar/file.txt';
+    String newPath = baseProvider.convertPath('/foo/bar/new-file.txt');
+    File oldFile = _file(exists: false, path: oldPath, withOverlay: true);
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, baseProvider.convertPath(oldPath));
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'bbb');
+  }
+
+  @failingTest
+  void test_resolveSymbolicLinksSync_links_existingFile_withoutOverlay() {
+    fail('Not tested');
+    // TODO(brianwilkerson) Decide how to test this given that we cannot
+    // create a link in a MemoryResourceProvider.
+//    // Create a file at '/temp/a/b/test.txt'.
+//    String pathA = baseProvider.convertPath('/temp/a');
+//    String pathB = baseProvider.convertPath('/temp/a/b');
+//    baseProvider.newFolder(pathB);
+//    String filePath = baseProvider.convertPath('/temp/a/b/test.txt');
+//    File testFile = baseProvider.newFile(filePath, 'test');
+//
+//    // Create a symbolic link from '/temp/c/d' to '/temp/a'.
+//    String pathC = baseProvider.convertPath('/temp/c');
+//    String pathD = baseProvider.convertPath('/temp/c/d');
+//    new io.Link(pathD).createSync(pathA, recursive: true);
+//
+//    // Create a symbolic link from '/temp/e/f' to '/temp/c'.
+//    String pathE = baseProvider.convertPath('/temp/e');
+//    String pathF = baseProvider.convertPath('/temp/e/f');
+//    new io.Link(pathF).createSync(pathC, recursive: true);
+//
+//    // Resolve the path '/temp/e/f/d/b/test.txt' to '/temp/a/b/test.txt'.
+//    String linkPath = baseProvider.convertPath('/temp/e/f/d/b/test.txt');
+//    File file = baseProvider.getFile(linkPath);
+//    expect(file.resolveSymbolicLinksSync().path,
+//        testFile.resolveSymbolicLinksSync());
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_existingFile_withoutOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: true, path: '/temp/a/b/test.txt'));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_existingFile_withOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: true, path: '/temp/a/b/test.txt', withOverlay: true));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_notExisting_withoutOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: false, path: '/temp/a/b/test.txt'));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_notExisting_withOverlay() {
+    _resolveSymbolicLinksSync_noLinks(
+        _file(exists: false, path: '/temp/a/b/test.txt', withOverlay: true));
+  }
+
+  test_shortName() {
+    expect(_file(exists: true).shortName, 'test.dart');
+  }
+
+  test_toUri() {
+    File file = _file(exists: true);
+    expect(file.toUri(), new Uri.file(file.path));
+  }
+
+  test_writeAsBytesSync_withoutOverlay() {
+    File file = _file(exists: true);
+    file.writeAsBytesSync(<int>[99, 99]);
+    expect(file.readAsBytesSync(), <int>[99, 99]);
+  }
+
+  test_writeAsBytesSync_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(() => file.writeAsBytesSync(<int>[99, 99]),
+        throwsA(_isFileSystemException));
+  }
+
+  test_writeAsStringSync_withoutOverlay() {
+    File file = _file(exists: true);
+    file.writeAsStringSync('cc');
+    expect(file.readAsStringSync(), 'cc');
+  }
+
+  test_writeAsStringSync_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(() => file.writeAsStringSync('cc'), throwsA(_isFileSystemException));
+  }
+
+  void _resolveSymbolicLinksSync_noLinks(File file) {
+    //
+    // On some platforms the path to the temp directory includes a symbolic
+    // link. We remove that from the equation before creating the File in order
+    // to show that the operation works as expected without symbolic links.
+    //
+    file = baseProvider.getFile(file.resolveSymbolicLinksSync().path);
+    expect(file.resolveSymbolicLinksSync(), file);
+  }
+}
+
+@reflectiveTest
+class FolderTest extends OverlayTestSupport {
+  test_canonicalizePath_dot_absolute() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('/a/b/./c')),
+        equals(baseProvider.convertPath('/a/b/c')));
+  }
+
+  test_canonicalizePath_dot_relative() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('./baz')),
+        equals(baseProvider.convertPath('/foo/bar/baz')));
+  }
+
+  test_canonicalizePath_dotDot_absolute() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('/a/b/../c')),
+        equals(baseProvider.convertPath('/a/c')));
+  }
+
+  test_canonicalizePath_dotDot_relative() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('../baz')),
+        equals(baseProvider.convertPath('/foo/baz')));
+  }
+
+  test_canonicalizePath_simple_absolute() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('/baz')),
+        equals(baseProvider.convertPath('/baz')));
+  }
+
+  test_canonicalizePath_simple_relative() {
+    Folder folder = _folder(exists: true, path: '/foo/bar');
+    expect(folder.canonicalizePath(baseProvider.convertPath('baz')),
+        equals(baseProvider.convertPath('/foo/bar/baz')));
+  }
+
+  @failingTest
+  test_changes() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  test_contains() {
+    Folder folder = _folder(exists: true);
+    expect(folder.contains(defaultFilePath), isTrue);
+  }
+
+  test_copyTo() {
+    String sourcePath = baseProvider.convertPath('/source');
+    String subdirPath = baseProvider.convertPath('/source/subdir');
+    baseProvider.newFolder(sourcePath);
+    baseProvider.newFolder(subdirPath);
+    baseProvider.newFile(
+        baseProvider.convertPath('/source/file1.txt'), 'file1');
+    baseProvider.newFile(
+        baseProvider.convertPath('/source/subdir/file2.txt'), 'file2');
+    Folder source = provider.getFolder(sourcePath);
+    Folder destination =
+        provider.getFolder(baseProvider.convertPath('/destination'));
+
+    Folder copy = source.copyTo(destination);
+    expect(copy.parent, destination);
+    _verifyStructure(copy, source);
+  }
+
+  test_create() {
+    Folder folder = _folder(exists: false);
+    expect(folder.exists, isFalse);
+    folder.create();
+    expect(folder.exists, isTrue);
+  }
+
+  test_delete_existing() {
+    Folder folder = _folder(exists: true);
+    expect(folder.exists, isTrue);
+    folder.delete();
+    expect(folder.exists, isFalse);
+  }
+
+  test_delete_notExisting() {
+    Folder folder = _folder(exists: false);
+    expect(folder.exists, isFalse);
+    expect(() => folder.delete(), throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
+  test_exists_false() {
+    Folder folder = _folder(exists: false);
+    expect(folder.exists, isFalse);
+  }
+
+  test_exists_true() {
+    Folder folder = _folder(exists: true);
+    expect(folder.exists, isTrue);
+  }
+
+  test_getChild_file_existing() {
+    Folder folder = _folder(exists: true);
+    _file(exists: true);
+    Resource child = folder.getChild(defaultFilePath);
+    expect(child, _isFile);
+  }
+
+  test_getChild_file_notExisting() {
+    Folder folder = _folder(exists: true);
+    Resource child = folder.getChild(defaultFilePath);
+    expect(child, _isFile);
+  }
+
+  test_getChild_folder() {
+    Folder folder = _folder(exists: true);
+    String childPath = provider.pathContext.join(folder.path, 'lib');
+    _folder(exists: true, path: childPath);
+    Resource child = folder.getChild(childPath);
+    expect(child, _isFolder);
+  }
+
+  test_getChildAssumingFile() {
+    Folder folder = _folder(exists: true);
+    File child = folder.getChildAssumingFile('README.md');
+    expect(child, isNotNull);
+  }
+
+  test_getChildAssumingFolder() {
+    Folder folder = _folder(exists: true);
+    Folder child = folder.getChildAssumingFolder('lib');
+    expect(child, isNotNull);
+  }
+
+  test_getChildren() {
+    Folder folder = _folder(exists: true);
+    Folder child1 = _folder(
+        exists: true, path: provider.pathContext.join(folder.path, 'lib'));
+    _file(exists: true, path: provider.pathContext.join(child1.path, 'a.dart'));
+    File child2 = _file(
+        exists: true, path: provider.pathContext.join(folder.path, 'b.dart'));
+    File child3 = _file(
+        exists: false,
+        path: provider.pathContext.join(folder.path, 'c.dart'),
+        withOverlay: true);
+    List<Resource> children = folder.getChildren();
+    expect(children, hasLength(3));
+    expect(children.map((resource) => resource.path),
+        unorderedEquals([child1.path, child2.path, child3.path]));
+  }
+
+  test_isOrContains_false() {
+    Folder folder = _folder(exists: true);
+    expect(folder.isOrContains(baseProvider.convertPath('/foo/baz')), isFalse);
+  }
+
+  test_isOrContains_true_child() {
+    Folder folder = _folder(exists: true);
+    expect(folder.isOrContains(defaultFilePath), isTrue);
+  }
+
+  test_isOrContains_true_same() {
+    Folder folder = _folder(exists: true);
+    expect(folder.isOrContains(folder.path), isTrue);
+  }
+
+  test_parent_ofNonRoot() {
+    Folder parent = _folder(exists: true).parent;
+    expect(parent, isNotNull);
+    expect(parent.exists, isTrue);
+    expect(parent.path, baseProvider.convertPath('/foo'));
+  }
+
+  test_parent_ofRoot() {
+    Folder parent = _folder(exists: true, path: '/').parent;
+    expect(parent, isNull);
+  }
+
+  @failingTest
+  test_resolveSymbolicLinksSync_links() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_existingFile() {
+    _resolveSymbolicLinksSync_noLinks(
+        _folder(exists: true, path: '/temp/a/b/test.txt'));
+  }
+
+  void test_resolveSymbolicLinksSync_noLinks_notExisting() {
+    _resolveSymbolicLinksSync_noLinks(
+        _folder(exists: false, path: '/temp/a/b/test.txt'));
+  }
+
+  test_shortName() {
+    expect(_folder(exists: true).shortName, 'bar');
+  }
+
+  test_toUri() {
+    Folder folder = _folder(exists: true);
+    expect(folder.toUri(), new Uri.directory(folder.path));
+  }
+
+  void _resolveSymbolicLinksSync_noLinks(Folder folder) {
+    //
+    // On some platforms the path to the temp directory includes a symbolic
+    // link. We remove that from the equation before creating the File in order
+    // to show that the operation works as expected without symbolic links.
+    //
+    folder = baseProvider.getFolder(folder.resolveSymbolicLinksSync().path);
+    expect(folder.resolveSymbolicLinksSync(), folder);
+  }
+
+  /**
+   * Verify that the [copy] has the same name and content as the [source].
+   */
+  void _verifyStructure(Folder copy, Folder source) {
+    expect(copy.shortName, source.shortName);
+    Map<String, File> sourceFiles = <String, File>{};
+    Map<String, Folder> sourceFolders = <String, Folder>{};
+    for (Resource child in source.getChildren()) {
+      if (child is File) {
+        sourceFiles[child.shortName] = child;
+      } else if (child is Folder) {
+        sourceFolders[child.shortName] = child;
+      } else {
+        fail('Unknown class of resource: ${child.runtimeType}');
+      }
+    }
+    Map<String, File> copyFiles = <String, File>{};
+    Map<String, Folder> copyFolders = <String, Folder>{};
+    for (Resource child in source.getChildren()) {
+      if (child is File) {
+        copyFiles[child.shortName] = child;
+      } else if (child is Folder) {
+        copyFolders[child.shortName] = child;
+      } else {
+        fail('Unknown class of resource: ${child.runtimeType}');
+      }
+    }
+    for (String fileName in sourceFiles.keys) {
+      File sourceChild = sourceFiles[fileName];
+      File copiedChild = copyFiles[fileName];
+      if (copiedChild == null) {
+        fail('Failed to copy file ${sourceChild.path}');
+      }
+      expect(copiedChild.readAsStringSync(), sourceChild.readAsStringSync(),
+          reason: 'Incorrectly copied file ${sourceChild.path}');
+    }
+    for (String fileName in sourceFolders.keys) {
+      Folder sourceChild = sourceFolders[fileName];
+      Folder copiedChild = copyFolders[fileName];
+      if (copiedChild == null) {
+        fail('Failed to copy folder ${sourceChild.path}');
+      }
+      _verifyStructure(copiedChild, sourceChild);
+    }
+  }
+}
+
+@reflectiveTest
+class OverlayResourceProviderTest extends OverlayTestSupport {
+  test_getFile_existing_withoutOverlay() {
+    File file = _file(exists: true);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isTrue);
+  }
+
+  test_getFile_existing_withOverlay() {
+    File file = _file(exists: true, withOverlay: true);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isTrue);
+  }
+
+  test_getFile_notExisting_withoutOverlay() {
+    File file = _file(exists: false);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isFalse);
+  }
+
+  test_getFile_notExisting_withOverlay() {
+    File file = _file(exists: false, withOverlay: true);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isTrue);
+  }
+
+  test_getFolder_existing() {
+    Folder folder = _folder(exists: true);
+    expect(folder, isNotNull);
+    expect(folder.path, defaultFolderPath);
+    expect(folder.exists, isTrue);
+  }
+
+  test_getFolder_notExisting() {
+    Folder folder = _folder(exists: false);
+    expect(folder, isNotNull);
+    expect(folder.path, defaultFolderPath);
+    expect(folder.exists, isFalse);
+  }
+
+  test_getModificationTimes_withoutOverlay() async {
+    Source source = _file(exists: true).createSource();
+    List<int> times = await provider.getModificationTimes([source]);
+    expect(times, [source.modificationStamp]);
+  }
+
+  test_getModificationTimes_withOverlay() async {
+    Source source = _file(exists: true, withOverlay: true).createSource();
+    List<int> times = await provider.getModificationTimes([source]);
+    expect(times, [42]);
+  }
+
+  test_getResource_existingFile_withoutOverlay() {
+    String path = _file(exists: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getResource_existingFile_withOverlay() {
+    String path = _file(exists: true, withOverlay: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getResource_existingFolder() {
+    String path = _folder(exists: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFolder);
+  }
+
+  test_getResource_notExisting_withoutOverlay() {
+    String path = _file(exists: false).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getResource_notExisting_withOverlay() {
+    String path = _file(exists: false, withOverlay: true).path;
+    Resource resource = provider.getResource(path);
+    expect(resource, _isFile);
+  }
+
+  test_getStateLocation_uniqueness() {
+    String idOne = 'one';
+    Folder folderOne = provider.getStateLocation(idOne);
+    expect(folderOne, isNotNull);
+    String idTwo = 'two';
+    Folder folderTwo = provider.getStateLocation(idTwo);
+    expect(folderTwo, isNotNull);
+    expect(folderTwo, isNot(equals(folderOne)));
+    expect(provider.getStateLocation(idOne), equals(folderOne));
+  }
+
+  test_pathContext() {
+    expect(provider.pathContext, baseProvider.pathContext);
+  }
+}
+
+class OverlayTestSupport {
+  MemoryResourceProvider baseProvider;
+  OverlayResourceProvider provider;
+
+  String defaultFolderPath;
+  String defaultFilePath;
+
+  void setUp() {
+    baseProvider = new MemoryResourceProvider();
+    provider = new OverlayResourceProvider(baseProvider);
+
+    defaultFolderPath = baseProvider.convertPath('/foo/bar');
+    defaultFilePath = baseProvider.convertPath('/foo/bar/test.dart');
+  }
+
+  File _file(
+      {@required bool exists,
+      String content,
+      String path,
+      bool withOverlay = false}) {
+    if (path == null) {
+      path = defaultFilePath;
+    } else {
+      path = baseProvider.convertPath(path);
+    }
+    if (exists) {
+      baseProvider.newFile(path, content ?? 'a');
+    }
+    if (withOverlay) {
+      provider.setOverlay(path, content: 'bbb', modificationStamp: 42);
+    }
+    return provider.getFile(path);
+  }
+
+  Folder _folder({@required bool exists, String path}) {
+    if (path == null) {
+      path = defaultFolderPath;
+    } else {
+      path = baseProvider.convertPath(path);
+    }
+    if (exists) {
+      baseProvider.newFolder(path);
+    }
+    return provider.getFolder(path);
+  }
+}
diff --git a/pkg/analyzer/test/file_system/test_all.dart b/pkg/analyzer/test/file_system/test_all.dart
index 75a06d2..05d9220 100644
--- a/pkg/analyzer/test/file_system/test_all.dart
+++ b/pkg/analyzer/test/file_system/test_all.dart
@@ -2,20 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.test.file_system.test_all;
-
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'memory_file_system_test.dart' as memory_file_system_test;
-import 'physical_resource_provider_test.dart'
-    as physical_resource_provider_test;
-import 'resource_uri_resolver_test.dart' as resource_uri_resolver_test;
+import 'memory_file_system_test.dart' as memory_file_system;
+import 'overlay_file_system_test.dart' as overlay_file_system;
+import 'physical_resource_provider_test.dart' as physical_resource_provider;
+import 'resource_uri_resolver_test.dart' as resource_uri_resolver;
 
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
-    memory_file_system_test.main();
-    physical_resource_provider_test.main();
-    resource_uri_resolver_test.main();
+    memory_file_system.main();
+    overlay_file_system.main();
+    physical_resource_provider.main();
+    resource_uri_resolver.main();
   }, name: 'file system');
 }
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 629ddde..171376f 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Kernel);
+    defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Kernel);
   });
 }
 
@@ -172,6 +170,12 @@
   }
 
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_listLiteral_inferredElementType() async =>
+      super.test_listLiteral_inferredElementType();
+
+  @failingTest
   @override
   test_mapKeyTypeNotAssignable() async {
     // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, found 0;
@@ -180,6 +184,18 @@
   }
 
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_mapLiteral_inferredKeyType() async =>
+      super.test_mapLiteral_inferredKeyType();
+
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_mapLiteral_inferredValueType() async =>
+      super.test_mapLiteral_inferredValueType();
+
+  @failingTest
   @override
   test_mapValueTypeNotAssignable() async {
     // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, found 0;
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index 9832e8c..765ee32 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(CompileTimeErrorCodeTest_Kernel);
+    defineReflectiveTests(CompileTimeErrorCodeTest_Kernel);
   });
 }
 
@@ -35,6 +33,11 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/12916')
+  test_ambiguousExport() async => super.test_ambiguousExport();
+
+  @override
+  @failingTest
   test_annotationWithNotClass() async {
     // Bad state: No reference information for property at 117
     await super.test_annotationWithNotClass();
@@ -70,6 +73,13 @@
 
   @override
   @failingTest
+  test_async_used_as_identifier_in_prefix() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super.test_async_used_as_identifier_in_prefix();
+  }
+
+  @override
+  @failingTest
   test_bug_23176() async {
     // This test fails because the kernel driver element model produces a
     // different element model result than the regular parser produces. Once these
@@ -438,22 +448,6 @@
 
   @override
   @failingTest
-  test_constInitializedWithNonConstValue_missingConstInListLiteral() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
-    await super
-        .test_constInitializedWithNonConstValue_missingConstInListLiteral();
-  }
-
-  @override
-  @failingTest
-  test_constInitializedWithNonConstValue_missingConstInMapLiteral() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
-    await super
-        .test_constInitializedWithNonConstValue_missingConstInMapLiteral();
-  }
-
-  @override
-  @failingTest
   test_constInitializedWithNonConstValueFromDeferredClass() async {
     // Bad state: Expected element reference for analyzer offset 58; got one for kernel offset 60
     await super.test_constInitializedWithNonConstValueFromDeferredClass();
@@ -965,21 +959,6 @@
 
   @override
   @failingTest
-  test_fieldInitializerOutsideConstructor_defaultParameter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
-    await super.test_fieldInitializerOutsideConstructor_defaultParameter();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializerOutsideConstructor_inFunctionTypeParameter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
-    await super
-        .test_fieldInitializerOutsideConstructor_inFunctionTypeParameter();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
   test_fieldInitializerRedirectingConstructor_afterRedirection() async {
     return super.test_fieldInitializerRedirectingConstructor_afterRedirection();
@@ -1025,20 +1004,6 @@
 
   @override
   @failingTest
-  test_finalNotInitialized_instanceField_const_static() async {
-    // Bad state: Some types were not consumed, starting at offset 26
-    await super.test_finalNotInitialized_instanceField_const_static();
-  }
-
-  @override
-  @failingTest
-  test_finalNotInitialized_library_const() async {
-    // Bad state: Some types were not consumed, starting at offset 7
-    await super.test_finalNotInitialized_library_const();
-  }
-
-  @override
-  @failingTest
   test_finalNotInitialized_local_const() async {
     // Expected 1 errors of type CompileTimeErrorCode.CONST_NOT_INITIALIZED, found 0
     await super.test_finalNotInitialized_local_const();
@@ -2724,13 +2689,6 @@
 
   @override
   @failingTest
-  test_referencedBeforeDeclaration_hideInBlock_function() async {
-    // Bad state: No declaration information for v() {} at 34
-    await super.test_referencedBeforeDeclaration_hideInBlock_function();
-  }
-
-  @override
-  @failingTest
   test_referencedBeforeDeclaration_hideInBlock_local() async {
     // Bad state: No type information for v at 38
     await super.test_referencedBeforeDeclaration_hideInBlock_local();
@@ -2759,13 +2717,6 @@
 
   @override
   @failingTest
-  test_referencedBeforeDeclaration_type_localFunction() async {
-    // Bad state: No declaration information for int String(int x) => x + 1; at 40
-    await super.test_referencedBeforeDeclaration_type_localFunction();
-  }
-
-  @override
-  @failingTest
   test_referencedBeforeDeclaration_type_localVariable() async {
     // Bad state: No type information for String at 44
     await super.test_referencedBeforeDeclaration_type_localVariable();
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 06b1454..5423d74 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -564,7 +564,6 @@
     verify([source]);
   }
 
-  @failingTest
   test_awaitInWrongContext_syncStar() async {
     // This test requires better error recovery than we currently have. In
     // particular, we need to be able to distinguish between an await expression
@@ -574,7 +573,9 @@
   yield await x;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    if (usingFastaParser) {
+      assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    }
     verify([source]);
   }
 
@@ -588,10 +589,18 @@
 }
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      ParserErrorCode.EXPECTED_CLASS_MEMBER,
-      ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
-    ]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE,
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE,
+                ParserErrorCode.EXPECTED_TOKEN
+              ]
+            : [
+                ParserErrorCode.EXPECTED_CLASS_MEMBER,
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+              ]);
     verify([source]);
   }
 
@@ -655,7 +664,15 @@
   typedef x;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                StaticWarningCode.UNDEFINED_IDENTIFIER,
+                StaticWarningCode.UNDEFINED_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN
+              ]
+            : [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
 
@@ -2203,17 +2220,32 @@
   test_extendsDisallowedClass_class_double() async {
     Source source = addSource("class A extends double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_extendsDisallowedClass_class_int() async {
     Source source = addSource("class A extends int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]);
     verify([source]);
   }
 
@@ -2230,17 +2262,32 @@
   test_extendsDisallowedClass_class_num() async {
     Source source = addSource("class A extends num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_extendsDisallowedClass_class_String() async {
     Source source = addSource("class A extends String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]);
     verify([source]);
   }
 
@@ -2265,7 +2312,14 @@
 class M {}
 class C = double with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2279,7 +2333,8 @@
         useCFE
             ? [
                 CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
               ]
             : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
@@ -2299,7 +2354,14 @@
 class M {}
 class C = num with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2313,7 +2375,8 @@
         useCFE
             ? [
                 CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
               ]
             : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
@@ -2738,22 +2801,28 @@
   test_implementsDisallowedClass_class_double() async {
     Source source = addSource("class A implements double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_int() async {
     Source source = addSource("class A implements int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2771,22 +2840,28 @@
   test_implementsDisallowedClass_class_num() async {
     Source source = addSource("class A implements num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_String() async {
     Source source = addSource("class A implements String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2824,11 +2899,14 @@
 class M {}
 class C = A with M implements double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2838,11 +2916,14 @@
 class M {}
 class C = A with M implements int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2866,11 +2947,14 @@
 class M {}
 class C = A with M implements num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2880,11 +2964,14 @@
 class M {}
 class C = A with M implements String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4370,22 +4457,28 @@
   test_mixinOfDisallowedClass_class_double() async {
     Source source = addSource("class A extends Object with double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_int() async {
     Source source = addSource("class A extends Object with int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4403,22 +4496,28 @@
   test_mixinOfDisallowedClass_class_num() async {
     Source source = addSource("class A extends Object with num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_String() async {
     Source source = addSource("class A extends Object with String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4440,11 +4539,14 @@
 class A {}
 class C = A with double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4453,11 +4555,14 @@
 class A {}
 class C = A with int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4479,11 +4584,14 @@
 class A {}
 class C = A with num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4492,11 +4600,14 @@
 class A {}
 class C = A with String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -5105,7 +5216,23 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(
-        source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+        source,
+        usingFastaParser
+            ? [
+                // TODO(danrubel): Consider improving recovery
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+              ]
+            : [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
 
@@ -5116,7 +5243,21 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(
-        source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+        source,
+        usingFastaParser
+            ? [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+              ]
+            : [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
 
@@ -6494,7 +6635,14 @@
   return 0;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                CompileTimeErrorCode.RETURN_IN_GENERATOR,
+                CompileTimeErrorCode.RETURN_IN_GENERATOR
+              ]
+            : [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
     verify([source]);
   }
 
@@ -6504,7 +6652,14 @@
   return 0;
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [
+                CompileTimeErrorCode.RETURN_IN_GENERATOR,
+                CompileTimeErrorCode.RETURN_IN_GENERATOR
+              ]
+            : [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
     verify([source]);
   }
 
@@ -6680,10 +6835,14 @@
 f(this.x(y)) {}
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
-      CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
-    ]);
+    assertErrors(
+        source,
+        usingFastaParser
+            ? [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]
+            : [
+                ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+                CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
+              ]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 6ad2446..e93560a3 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -247,7 +247,12 @@
     // analyzer.  TODO(paulberry): is this a bug?
     FunctionDeclaration node = EngineTestCase.findNode(
         unit, code, 'g', (AstNode n) => n is FunctionDeclaration);
-    expect((node as FunctionDeclarationImpl).metadata, isEmpty);
+    NodeList<Annotation> metadata = (node as FunctionDeclarationImpl).metadata;
+    if (usingFastaParser) {
+      expect(metadata, hasLength(1));
+    } else {
+      expect(metadata, isEmpty);
+    }
   }
 
   test_metadata_localVariableDeclaration() async {
@@ -814,6 +819,8 @@
   }
 
   test_genericFunction_typeParameter() async {
+    // Fasta ignores generic type comments
+    if (usingFastaParser) return;
     String code = r'''
 /*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null;
 ''';
@@ -836,6 +843,8 @@
   }
 
   test_genericMethod_typeParameter() async {
+    // Fasta ignores generic type comments
+    if (usingFastaParser) return;
     String code = r'''
 class C {
   /*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null;
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 34fc3ca..410dd7e 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ErrorSuppressionTest_Kernel);
+    defineReflectiveTests(ErrorSuppressionTest_Kernel);
   });
 }
 
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 6f6314d..ad843c2 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(HintCodeTest_Kernel);
+    defineReflectiveTests(HintCodeTest_Kernel);
   });
 }
 
@@ -66,41 +64,6 @@
 
   @failingTest
   @override
-  test_canBeNullAfterNullAware_after_cascade() async {
-    // Expected 1 errors of type HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, found 0
-    return super.test_canBeNullAfterNullAware_after_cascade();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_else() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_else();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_else_nested() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_else_nested();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_if() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_if();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_if_nested() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_if_nested();
-  }
-
-  @failingTest
-  @override
   test_deadCode_deadFinalStatementInCase() async {
     // Expected 1 errors of type StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, found 0
     return super.test_deadCode_deadFinalStatementInCase();
@@ -173,37 +136,16 @@
 
   @failingTest
   @override
-  test_divisionOptimization_propagatedType() async {
-    // Expected 1 errors of type HintCode.DIVISION_OPTIMIZATION, found 0
-    return super.test_divisionOptimization_propagatedType();
+  test_duplicateShownHiddenName_hidden() {
+    // Expected 1 errors of type HintCode.DUPLICATE_HIDDEN_NAME, found 0
+    return super.test_duplicateShownHiddenName_hidden();
   }
 
   @failingTest
   @override
-  test_invalidAssignment_instanceVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_instanceVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_localVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_localVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_staticVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_staticVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_variableDeclaration() async {
-    // UnimplementedError: Multiple field
-    return super.test_invalidAssignment_variableDeclaration();
+  test_duplicateShownHiddenName_shown() {
+    // Expected 1 errors of type HintCode.DUPLICATE_SHOWN_NAME, found 0
+    return super.test_duplicateShownHiddenName_shown();
   }
 
   @override
@@ -237,6 +179,13 @@
     return super.test_invalidRequiredParam_valid();
   }
 
+  @override
+  @failingTest
+  test_isNotDouble() {
+    // Bad state: No data for is at 10
+    return super.test_isNotDouble();
+  }
+
   @failingTest
   @override
   test_js_lib_OK() async {
@@ -300,6 +249,13 @@
     return super.test_mustCallSuper_indirect();
   }
 
+  @failingTest
+  @override
+  test_nullAwareBeforeOperator_ok_is_not() {
+    // Bad state: No data for is at 14
+    return super.test_nullAwareBeforeOperator_ok_is_not();
+  }
+
   @override
   @failingTest
   test_required_constructor_param() async {
@@ -374,6 +330,14 @@
     return super.test_strongMode_downCastCompositeWarn();
   }
 
+  @failingTest
+  @override
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_call() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_call();
+  }
+
   @override
   @failingTest
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke() {
@@ -390,23 +354,41 @@
 
   @failingTest
   @override
-  test_undefinedGetter() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_GETTER, found 0
-    return super.test_undefinedGetter();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_not_generic() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_not_generic();
   }
 
   @failingTest
   @override
-  test_undefinedMethod() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
-    return super.test_undefinedMethod();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_prefixed() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_prefixed();
   }
 
   @failingTest
   @override
-  test_undefinedMethod_assignmentExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
-    return super.test_undefinedMethod_assignmentExpression();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_prefixed() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_prefixed();
+  }
+
+  @failingTest
+  @override
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_prefixed() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_prefixed();
+  }
+
+  @failingTest
+  @override
+  test_typeCheck_type_not_Null() {
+    // Bad state: No data for is at 20
+    return super.test_typeCheck_type_not_Null();
   }
 
   @failingTest
@@ -439,23 +421,23 @@
 
   @failingTest
   @override
-  test_undefinedOperator_postfixExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
-    return super.test_undefinedOperator_postfixExpression();
+  test_unnecessaryTypeCheck_null_not_Null() {
+    // Bad state: No data for is at 14
+    return super.test_unnecessaryTypeCheck_null_not_Null();
   }
 
   @failingTest
   @override
-  test_undefinedOperator_prefixExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
-    return super.test_undefinedOperator_prefixExpression();
+  test_unnecessaryTypeCheck_type_not_dynamic() {
+    // Bad state: No data for is at 20
+    return super.test_unnecessaryTypeCheck_type_not_dynamic();
   }
 
   @failingTest
   @override
-  test_undefinedSetter() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_SETTER, found 0
-    return super.test_undefinedSetter();
+  test_unnecessaryTypeCheck_type_not_object() {
+    // Bad state: No data for is at 20
+    return super.test_unnecessaryTypeCheck_type_not_object();
   }
 
   @failingTest
@@ -493,16 +475,4 @@
     // Expected 1 errors of type HintCode.UNUSED_SHOWN_NAME, found 0
     return super.test_unusedShownName_topLevelVariable();
   }
-
-  @failingTest
-  @override
-  test_importDeferredLibraryWithLoadFunction() async {
-    await super.test_importDeferredLibraryWithLoadFunction();
-  }
-
-  @failingTest
-  @override
-  test_no_missingReturn_async_futureOrVoid() async {
-    await super.test_no_missingReturn_async_futureOrVoid();
-  }
 }
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index f37baf0..1ee7d3e 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -2573,11 +2573,7 @@
 FutureOr<void> f(Future f) async {}
 ''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [HintCode.MISSING_RETURN]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index c52404a..2f7a8c9 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(NonErrorResolverTest_Kernel);
+    defineReflectiveTests(NonErrorResolverTest_Kernel);
   });
 }
 
@@ -45,10 +43,16 @@
 
   @override
   @failingTest
-  @notForDart2
-  test_async_return_flattens_futures() async {
-    // Only FutureOr is flattened.
-    return super.test_async_return_flattens_futures();
+  test_argumentTypeNotAssignable_invocation_typedef_generic() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_argumentTypeNotAssignable_invocation_typedef_generic();
+  }
+
+  @override
+  @failingTest
+  test_argumentTypeNotAssignable_optionalNew() {
+    // Bad state: No data for (builder: () {return Widget();}) at 164
+    return super.test_argumentTypeNotAssignable_optionalNew();
   }
 
   @override
@@ -123,6 +127,13 @@
 
   @override
   @failingTest
+  test_const_dynamic() {
+    // UnimplementedError: TODO(paulberry): DynamicType
+    return super.test_const_dynamic();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_constConstructorWithNonConstSuper_unresolved() async {
     return super.test_constConstructorWithNonConstSuper_unresolved();
@@ -151,6 +162,34 @@
 
   @override
   @failingTest
+  test_duplicateDefinition_emptyName() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super.test_duplicateDefinition_emptyName();
+  }
+
+  @override
+  @failingTest
+  test_dynamicIdentifier() {
+    // UnimplementedError: TODO(paulberry): DynamicType
+    return super.test_dynamicIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_fieldFormalParameter_genericFunctionTyped() {
+    // Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (88)
+    return super.test_fieldFormalParameter_genericFunctionTyped();
+  }
+
+  @override
+  @failingTest
+  test_fieldFormalParameter_genericFunctionTyped_named() {
+    // Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (89)
+    return super.test_fieldFormalParameter_genericFunctionTyped_named();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_finalNotInitialized_hasNativeClause_hasConstructor() async {
     return super.test_finalNotInitialized_hasNativeClause_hasConstructor();
@@ -165,13 +204,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_forEach_genericFunctionType() async {
-    return super.test_forEach_genericFunctionType();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_functionDeclaration_scope_signature() async {
     return super.test_functionDeclaration_scope_signature();
@@ -186,11 +218,62 @@
 
   @override
   @failingTest
+  test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_castsAndTypeChecks_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_castsAndTypeChecks_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_fieldAndReturnType_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_genericTypeAlias_invalidGenericFunctionType() async {
     return super.test_genericTypeAlias_invalidGenericFunctionType();
   }
 
+  @override
+  @failingTest
+  test_genericTypeAlias_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_typeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_typeParameters();
+  }
+
   @override // passes with kernel
   test_infer_mixin() => super.test_infer_mixin();
 
@@ -200,16 +283,6 @@
 
   @override
   @failingTest
-  test_infer_mixin_with_substitution() =>
-      super.test_infer_mixin_with_substitution();
-
-  @override
-  @failingTest
-  test_infer_mixin_with_substitution_functionType() =>
-      super.test_infer_mixin_with_substitution_functionType();
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_integerLiteralOutOfRange_negative_valid() async {
     return super.test_integerLiteralOutOfRange_negative_valid();
@@ -224,6 +297,47 @@
 
   @override
   @failingTest
+  test_invalidAnnotation_constantVariable_field_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super
+        .test_invalidAnnotation_constantVariable_field_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super
+        .test_invalidAnnotation_constantVariable_topLevel_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constConstructor_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super.test_invalidAnnotation_constConstructor_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constConstructor_named_importWithPrefix() {
+    // Bad state: No data for named at 29
+    return super
+        .test_invalidAnnotation_constConstructor_named_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_functionTypeTypeParameter() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_invocationOfNonFunction_functionTypeTypeParameter();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
   test_invocationOfNonFunction_Object() async {
     return super.test_invocationOfNonFunction_Object();
@@ -231,6 +345,13 @@
 
   @override
   @failingTest
+  test_issue_32394() {
+    // Failed assertion: line 1133 pos 12: 'element != null': is not true.
+    return super.test_issue_32394();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_loadLibraryDefined() async {
     return super.test_loadLibraryDefined();
@@ -238,6 +359,14 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/30609')
+  test_metadata_enumConstantDeclaration() {
+    // Failed to resolve 2 nodes
+    return super.test_metadata_enumConstantDeclaration();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_methodDeclaration_scope_signature() async {
     return super.test_methodDeclaration_scope_signature();
@@ -245,6 +374,13 @@
 
   @override
   @failingTest
+  test_nativeConstConstructor() {
+    // Expected 0 errors of type ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, found 1 (35)
+    return super.test_nativeConstConstructor();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31628')
   test_nonConstCaseExpression_constField() async {
     return super.test_nonConstCaseExpression_constField();
@@ -273,16 +409,16 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_returnOfInvalidType_typeParameter_18468() async {
-    return super.test_returnOfInvalidType_typeParameter_18468();
+  test_optionalNew_rewrite_instantiatesToBounds() {
+    // Bad state: No data for named1 at 21
+    return super.test_optionalNew_rewrite_instantiatesToBounds();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_sharedDeferredPrefix() async {
-    return super.test_sharedDeferredPrefix();
+  test_returnOfInvalidType_typeParameter_18468() async {
+    return super.test_returnOfInvalidType_typeParameter_18468();
   }
 
   @override
@@ -301,9 +437,9 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_undefinedIdentifier_synthetic_whenExpression() async {
-    return super.test_undefinedIdentifier_synthetic_whenExpression();
+  test_undefinedGetter_static_conditionalAccess() {
+    // Bad state: No data for A at 36
+    return super.test_undefinedGetter_static_conditionalAccess();
   }
 
   @override
@@ -312,4 +448,18 @@
   test_undefinedIdentifier_synthetic_whenMethodName() async {
     return super.test_undefinedIdentifier_synthetic_whenMethodName();
   }
+
+  @override
+  @failingTest
+  test_undefinedMethod_static_conditionalAccess() {
+    // Bad state: No data for A at 39
+    return super.test_undefinedMethod_static_conditionalAccess();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSetter_static_conditionalAccess() {
+    // Bad state: No data for A at 34
+    return super.test_undefinedSetter_static_conditionalAccess();
+  }
 }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index f425dce..1084149 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -664,18 +664,6 @@
     verify([source]);
   }
 
-  test_async_future_object_with_return() async {
-    Source source = addSource('''
-import 'dart:async';
-Future<Object> f() async {
-  return;
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_async_future_object_with_return_value() async {
     Source source = addSource('''
 import 'dart:async';
@@ -722,19 +710,6 @@
     verify([source]);
   }
 
-  test_async_return_flattens_futures() async {
-    Source source = addSource('''
-import 'dart:async';
-Future<int> f() async {
-  return g();
-}
-Future<Future<int>> g() => null;
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_async_with_return() async {
     Source source = addSource('''
 f() async {
@@ -789,14 +764,11 @@
   }
 
   test_await_flattened() async {
-    // The analyzer type system over-flattens so it considers `await ffi()` to
-    // have type `int` - see dartbug.com/31887
-    var expectedType = enableKernelDriver ? 'Future<int>' : 'int';
     Source source = addSource('''
 import 'dart:async';
 Future<Future<int>> ffi() => null;
 f() async {
-  $expectedType b = await ffi();
+  Future<int> b = await ffi();
 }
 ''');
     await computeAnalysisResult(source);
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index 082ef32..dc39f65 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -11,9 +11,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(NonHintCodeTest_Kernel);
+    defineReflectiveTests(NonHintCodeTest_Kernel);
   });
 }
 
@@ -39,6 +37,40 @@
   @override
   bool get useCFE => true;
 
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningFunction() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inDefiningFunction();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningMethod() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super.test_deprecatedAnnotationUse_namedParameter_inDefiningMethod();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction();
+  }
+
   @failingTest
   @override
   @potentialAnalyzerProblem
@@ -51,20 +83,6 @@
   @override
   @failingTest
   @notForDart2
-  test_undefinedGetter_inSubtype() async {
-    await super.test_undefinedGetter_inSubtype();
-  }
-
-  @override
-  @failingTest
-  @notForDart2
-  test_undefinedMethod_inSubtype() async {
-    await super.test_undefinedMethod_inSubtype();
-  }
-
-  @override
-  @failingTest
-  @notForDart2
   test_undefinedOperator_binaryExpression_inSubtype() async {
     await super.test_undefinedOperator_binaryExpression_inSubtype();
   }
@@ -91,13 +109,6 @@
   }
 
   @override
-  @failingTest
-  @notForDart2
-  test_undefinedSetter_inSubtype() async {
-    await super.test_undefinedSetter_inSubtype();
-  }
-
-  @override
   test_unnecessaryCast_generics() async {
     // dartbug.com/18953
     // Overridden because type inference now produces more information and there
@@ -122,17 +133,26 @@
 //    await super.test_unusedImport_annotationOnDirective();
   }
 
-  @failingTest
   @override
-  @potentialAnalyzerProblem
-  test_unusedImport_metadata() async {
-    await super.test_unusedImport_metadata();
+  @failingTest
+  test_overrideOnNonOverridingField_inSuperclass() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    return super.test_overrideOnNonOverridingField_inSuperclass();
+  }
+
+  @override
+  @failingTest
+  test_overrideOnNonOverridingField_inInterface() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    return super.test_overrideOnNonOverridingField_inInterface();
   }
 
   @failingTest
   @override
   @potentialAnalyzerProblem
-  test_importDeferredLibraryWithLoadFunction() async {
-    await super.test_importDeferredLibraryWithLoadFunction();
+  test_unusedImport_metadata() async {
+    await super.test_unusedImport_metadata();
   }
 }
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index d418538..e18c1e1 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -44,7 +44,7 @@
 Future<Object> f() async {}
 ''');
     await computeAnalysisResult(source);
-    assertNoErrors(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 8c02681..6999dfb 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -126,249 +126,6 @@
   }
 
   @override
-  @failingTest
-  void test_invalidCodePoint() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 251:40                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   test/generated/parser_fasta_test.dart 3196:39                      ParserProxy._run
-    super.test_invalidCodePoint();
-  }
-
-  @override
-  @failingTest
-  void test_invalidHexEscape_invalidDigit() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 221:47                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   test/generated/parser_fasta_test.dart 3196:39                      ParserProxy._run
-    super.test_invalidHexEscape_invalidDigit();
-  }
-
-  @override
-  @failingTest
-  void test_invalidHexEscape_tooFewDigits() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 217:52                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   test/generated/parser_fasta_test.dart 3196:39                      ParserProxy._run
-    super.test_invalidHexEscape_tooFewDigits();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_incomplete_noDigits() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 232:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_incomplete_noDigits();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_incomplete_someDigits() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 232:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_incomplete_someDigits();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_invalidDigit() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 240:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_invalidDigit();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_tooFewDigits_fixed() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 240:54                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_tooFewDigits_fixed();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_tooFewDigits_variable() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 235:49                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_tooFewDigits_variable();
-  }
-
-  @override
-  @failingTest
-  void test_invalidUnicodeEscape_tooManyDigits_variable() {
-    // TODO(brianwilkerson) Does not recover.
-    //   Internal problem: Compiler cannot run without a compiler context.
-    //   Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
-    //   package:front_end/src/fasta/compiler_context.dart 81:7             CompilerContext.current
-    //   package:front_end/src/fasta/command_line_reporting.dart 112:30     shouldThrowOn
-    //   package:front_end/src/fasta/deprecated_problems.dart 41:7          deprecated_inputError
-    //   package:front_end/src/fasta/quote.dart 181:5                       unescapeCodeUnits.error
-    //   package:front_end/src/fasta/quote.dart 251:40                      unescapeCodeUnits
-    //   package:front_end/src/fasta/quote.dart 147:13                      unescape
-    //   package:front_end/src/fasta/quote.dart 135:10                      unescapeString
-    //   package:analyzer/src/fasta/ast_builder.dart 159:22                 AstBuilder.endLiteralString
-    //   test/generated/parser_fasta_listener.dart 896:14                   ForwardingTestListener.endLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3497:14             Parser.parseSingleLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3434:13             Parser.parseLiteralString
-    //   package:front_end/src/fasta/parser/parser.dart 3133:14             Parser.parsePrimary
-    //   package:front_end/src/fasta/parser/parser.dart 3097:14             Parser.parseUnaryExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2968:13             Parser.parsePrecedenceExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2942:11             Parser.parseExpression
-    //   package:front_end/src/fasta/parser/parser.dart 2862:13             Parser.parseExpressionStatement
-    //   package:front_end/src/fasta/parser/parser.dart 2790:14             Parser.parseStatementX
-    //   package:front_end/src/fasta/parser/parser.dart 2722:20             Parser.parseStatement
-    //   test/generated/parser_fasta_test.dart 3287:39                      ParserProxy._run
-    super.test_invalidUnicodeEscape_tooManyDigits_variable();
-  }
-
-  @override
   void test_method_invalidTypeParameterComments() {
     // Ignored: Fasta does not support the generic comment syntax.
   }
@@ -496,7 +253,7 @@
   @override
   @failingTest
   void test_parseUnaryExpression_decrement_super() {
-    // TODO(brianwilkerson) Does not recover.
+    // TODO(danrubel) Reports a different error and different token stream.
     // Expected: TokenType:<MINUS>
     //   Actual: TokenType:<MINUS_MINUS>
     super.test_parseUnaryExpression_decrement_super();
@@ -505,7 +262,7 @@
   @override
   @failingTest
   void test_parseUnaryExpression_decrement_super_withComment() {
-    // TODO(brianwilkerson) Does not recover.
+    // TODO(danrubel) Reports a different error and different token stream.
     // Expected: TokenType:<MINUS>
     //   Actual: TokenType:<MINUS_MINUS>
     super.test_parseUnaryExpression_decrement_super_withComment();
@@ -1204,13 +961,6 @@
   }
 
   @override
-  @failingTest
-  void test_missingIdentifier_afterAnnotation() {
-    // TODO(brianwilkerson) reportUnrecoverableErrorWithToken
-    super.test_missingIdentifier_afterAnnotation();
-  }
-
-  @override
   void test_relationalExpression_missing_LHS_RHS() {
     parseExpression("is", codes: [
       ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -1230,14 +980,7 @@
 
 @reflectiveTest
 class SimpleParserTest_Fasta extends FastaParserTestCase
-    with SimpleParserTestMixin {
-  @override
-  @failingTest
-  void test_parseTypeParameterList_single() {
-    // TODO(brianwilkerson) Does not use all tokens.
-    super.test_parseTypeParameterList_single();
-  }
-}
+    with SimpleParserTestMixin {}
 
 /**
  * Tests of the fasta parser based on [StatementParserTestMixin].
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index b0a2885..7ca4c06 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -1560,11 +1560,6 @@
   }
 
   @failingTest
-  void test_invalidCodePoint() {
-    super.test_invalidCodePoint();
-  }
-
-  @failingTest
   void test_invalidCommentReference__new_nonIdentifier() {
     super.test_invalidCommentReference__new_nonIdentifier();
   }
@@ -1595,16 +1590,6 @@
   }
 
   @failingTest
-  void test_invalidHexEscape_invalidDigit() {
-    super.test_invalidHexEscape_invalidDigit();
-  }
-
-  @failingTest
-  void test_invalidHexEscape_tooFewDigits() {
-    super.test_invalidHexEscape_tooFewDigits();
-  }
-
-  @failingTest
   void test_invalidInterpolationIdentifier_startWithDigit() {
     super.test_invalidInterpolationIdentifier_startWithDigit();
   }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index f9edf37..3c85986 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -25,6 +25,9 @@
 import 'test_support.dart';
 
 main() {
+  // The fasta parser has a parallel set of tests in parser_fasta_test.dart
+  if (Parser.useFasta) return;
+
   defineReflectiveSuite(() {
     defineReflectiveTests(ClassMemberParserTest);
     defineReflectiveTests(ComplexParserTest);
@@ -3998,8 +4001,8 @@
   }
 
   void test_invalidCodePoint() {
-    StringLiteral literal = parseExpression("'\\u{110000}'",
-        errors: [expectedError(ParserErrorCode.INVALID_CODE_POINT, 0, 10)]);
+    StringLiteral literal = parseExpression("'begin \\u{110000}'",
+        errors: [expectedError(ParserErrorCode.INVALID_CODE_POINT, 7, 9)]);
     expectNotNullIfNoErrors(literal);
   }
 
@@ -4065,8 +4068,8 @@
   }
 
   void test_invalidHexEscape_invalidDigit() {
-    StringLiteral literal = parseExpression("'\\x0 a'",
-        errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 1, 3)]);
+    StringLiteral literal = parseExpression("'not \\x0 a'",
+        errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 5, 3)]);
     expectNotNullIfNoErrors(literal);
   }
 
@@ -4248,7 +4251,7 @@
   }
 
   void test_invalidUnicodeEscape_invalidDigit() {
-    Expression expression = parseStringLiteral("'\\u0 a'");
+    Expression expression = parseStringLiteral("'\\u0 and some more'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrors(
         [expectedError(ParserErrorCode.INVALID_UNICODE_ESCAPE, 1, 3)]);
@@ -4271,10 +4274,12 @@
   void test_invalidUnicodeEscape_tooManyDigits_variable() {
     Expression expression = parseStringLiteral("'\\u{12345678}'");
     expectNotNullIfNoErrors(expression);
-    listener.assertErrors([
-      expectedError(ParserErrorCode.INVALID_UNICODE_ESCAPE, 1, 12),
-      expectedError(ParserErrorCode.INVALID_CODE_POINT, 1, 12)
-    ]);
+    listener.assertErrors(usingFastaParser
+        ? [expectedError(ParserErrorCode.INVALID_CODE_POINT, 1, 9)]
+        : [
+            expectedError(ParserErrorCode.INVALID_UNICODE_ESCAPE, 1, 12),
+            expectedError(ParserErrorCode.INVALID_CODE_POINT, 1, 12)
+          ]);
   }
 
   void test_libraryDirectiveNotFirst() {
@@ -11813,17 +11818,23 @@
   }
 
   void test_missingIdentifier_afterAnnotation() {
-    createParser('@override }');
+    createParser('@override }', expectedEndOffset: 10);
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors(
         [expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 10, 1)]);
-    expect(member, new isInstanceOf<MethodDeclaration>());
-    MethodDeclaration method = member;
-    expect(method.documentationComment, isNull);
-    NodeList<Annotation> metadata = method.metadata;
-    expect(metadata, hasLength(1));
-    expect(metadata[0].name.name, "override");
+    if (usingFastaParser) {
+      // TODO(danrubel): Consider generating a sub method so that the
+      // existing annotation can be associated with a class member.
+      expect(member, isNull);
+    } else {
+      expect(member, new isInstanceOf<MethodDeclaration>());
+      MethodDeclaration method = member;
+      expect(method.documentationComment, isNull);
+      NodeList<Annotation> metadata = method.metadata;
+      expect(metadata, hasLength(1));
+      expect(metadata[0].name.name, "override");
+    }
   }
 
   void test_missingSemicolon_varialeDeclarationList() {
@@ -14592,13 +14603,20 @@
   }
 
   void test_parseTypeParameterList_single() {
-    createParser('<<A>');
+    createParser('<<A>', expectedEndOffset: 0);
     TypeParameterList parameterList = parser.parseTypeParameterList();
-    expectNotNullIfNoErrors(parameterList);
-    assertNoErrors();
-    expect(parameterList.leftBracket, isNotNull);
-    expect(parameterList.rightBracket, isNotNull);
-    expect(parameterList.typeParameters, hasLength(1));
+    if (usingFastaParser) {
+      // TODO(danrubel): Consider splitting `<<` and marking the first `<`
+      // as an unexpected token.
+      expect(parameterList, isNull);
+      assertNoErrors();
+    } else {
+      expectNotNullIfNoErrors(parameterList);
+      assertNoErrors();
+      expect(parameterList.leftBracket, isNotNull);
+      expect(parameterList.rightBracket, isNotNull);
+      expect(parameterList.typeParameters, hasLength(1));
+    }
   }
 
   void test_parseTypeParameterList_withTrailingEquals() {
diff --git a/pkg/analyzer/test/generated/resolver_kernel_test.dart b/pkg/analyzer/test/generated/resolver_kernel_test.dart
index a3537a4..bc11b8b 100644
--- a/pkg/analyzer/test/generated/resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/resolver_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StrictModeTest_Kernel);
+    defineReflectiveTests(StrictModeTest_Kernel);
   });
 }
 
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
index 07c4b89..bdee524 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticTypeAnalyzer2Test_Kernel);
+    defineReflectiveTests(StaticTypeAnalyzer2Test_Kernel);
   });
 }
 
@@ -24,20 +22,6 @@
 
   @override
   @failingTest
-  test_FunctionExpressionInvocation_block() async {
-    // Bad state: No reference information for (() {return 1;})() at 21
-    await super.test_FunctionExpressionInvocation_block();
-  }
-
-  @override
-  @failingTest
-  test_MethodInvocation_nameType_parameter_propagatedType() async {
-    // Expected: DynamicTypeImpl:<dynamic>
-    await super.test_MethodInvocation_nameType_parameter_propagatedType();
-  }
-
-  @override
-  @failingTest
   test_staticMethods_classTypeParameters_genericMethod() async {
     // Expected: '(dynamic) → void'
     await super.test_staticMethods_classTypeParameters_genericMethod();
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 0d314be..7ee2030 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -342,10 +342,10 @@
     expect(_flatten(futureDynamicType), dynamicType);
     // flatten(Future<int>) = int
     expect(_flatten(futureIntType), intType);
-    // flatten(Future<Future>) = dynamic
-    expect(_flatten(futureFutureDynamicType), dynamicType);
-    // flatten(Future<Future<int>>) = int
-    expect(_flatten(futureFutureIntType), intType);
+    // flatten(Future<Future>) = Future<dynamic>
+    expect(_flatten(futureFutureDynamicType), futureDynamicType);
+    // flatten(Future<Future<int>>) = Future<int>
+    expect(_flatten(futureFutureIntType), futureIntType);
   }
 
   void test_flatten_unrelated_types() {
@@ -482,7 +482,7 @@
         _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
     Expression node = AstTestFactory
         .awaitExpression(_resolvedVariable(futureFutureIntType, 'e'));
-    expect(_analyze(node), same(intType));
+    expect(_analyze(node), same(futureIntType));
     _listener.assertNoErrors();
   }
 
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index f864c75..234c2ff 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -8,10 +8,8 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticTypeWarningCodeTest_Kernel);
-    // defineReflectiveTests(StrongModeStaticTypeWarningCodeTest_Kernel);
+    defineReflectiveTests(StaticTypeWarningCodeTest_Kernel);
+    defineReflectiveTests(StrongModeStaticTypeWarningCodeTest_Kernel);
   });
 }
 
@@ -66,6 +64,13 @@
 
   @override
   @failingTest
+  test_bug21912() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_bug21912();
+  }
+
+  @override
+  @failingTest
   test_expectedOneListTypeArgument() async {
     // Bad state: Found 1 argument types for 2 type arguments
     await super.test_expectedOneListTypeArgument();
@@ -431,6 +436,16 @@
 
   @override
   @failingTest
+  test_returnOfInvalidType_async_future_future_int_mismatches_future_int() {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+    // found 0; 0 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found
+    // 1 (54)
+    return super
+        .test_returnOfInvalidType_async_future_future_int_mismatches_future_int();
+  }
+
+  @override
+  @failingTest
   test_returnOfInvalidType_async_future_int_mismatches_future_string() async {
     // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
     await super
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index ca84d57..1912d7f 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -143,14 +143,13 @@
   }
 
   test_await_flattened() async {
-    // The analyzer type system over-flattens - see dartbug.com/31887
     await assertErrorsInCode('''
 import 'dart:async';
 Future<Future<int>> ffi() => null;
 f() async {
-  Future<int> b = await ffi(); // Warning: int not assignable to Future<int>
+  Future<int> b = await ffi(); 
 }
-''', useCFE ? [] : [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+''', []);
   }
 
   test_await_simple() async {
@@ -921,6 +920,16 @@
 f(B<A> b) {}''', [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
   }
 
+  test_returnOfInvalidType_async_future_future_int_mismatches_future_int() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+Future<int> f() async {
+  return g();
+}
+Future<Future<int>> g() => null;
+''', [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+  }
+
   test_returnOfInvalidType_async_future_int_mismatches_future_string() async {
     await assertErrorsInCode('''
 import 'dart:async';
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index da2d2e9..ff7880f 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticWarningCodeTest_Kernel);
+    defineReflectiveTests(StaticWarningCodeTest_Kernel);
   });
 }
 
@@ -150,6 +148,13 @@
 
   @override
   @failingTest
+  test_argumentTypeNotAssignable_call() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_argumentTypeNotAssignable_call();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_argumentTypeNotAssignable_cascadeSecond() async {
     return super.test_argumentTypeNotAssignable_cascadeSecond();
@@ -476,20 +481,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_concreteClassWithAbstractMember() async {
-    return super.test_concreteClassWithAbstractMember();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_concreteClassWithAbstractMember_noSuchMethod_interface() async {
-    return super.test_concreteClassWithAbstractMember_noSuchMethod_interface();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_conflictingDartImport() async {
     return super.test_conflictingDartImport();
   }
@@ -759,58 +750,188 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_direct() async {
-    return super.test_functionWithoutCall_direct();
+  test_generalizedVoid_invocationOfVoidFieldError() async {
+    return super.test_generalizedVoid_invocationOfVoidFieldError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_direct_typeAlias() async {
-    return super.test_functionWithoutCall_direct_typeAlias();
+  test_generalizedVoid_invocationOfVoidLocalError() async {
+    return super.test_generalizedVoid_invocationOfVoidLocalError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_extends() async {
-    return super.test_functionWithoutCall_indirect_extends();
+  test_generalizedVoid_invocationOfVoidResultError() async {
+    return super.test_generalizedVoid_invocationOfVoidResultError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_extends_typeAlias() async {
-    return super.test_functionWithoutCall_indirect_extends_typeAlias();
+  test_generalizedVoid_invocationOfVoidToplevelError() async {
+    return super.test_generalizedVoid_invocationOfVoidToplevelError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_implements() async {
-    return super.test_functionWithoutCall_indirect_implements();
+  test_generalizedVoid_throwVoidValueError() async {
+    return super.test_generalizedVoid_throwVoidValueError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_implements_typeAlias() async {
-    return super.test_functionWithoutCall_indirect_implements_typeAlias();
+  test_generalizedVoid_useOfInForeachIterableError() async {
+    return super.test_generalizedVoid_useOfInForeachIterableError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_mixin_implements() async {
-    return super.test_functionWithoutCall_mixin_implements();
+  test_generalizedVoid_useOfVoidAsIndexAssignError() async {
+    return super.test_generalizedVoid_useOfVoidAsIndexAssignError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_mixin_implements_typeAlias() async {
-    return super.test_functionWithoutCall_mixin_implements_typeAlias();
+  test_generalizedVoid_useOfVoidAsIndexError() async {
+    return super.test_generalizedVoid_useOfVoidAsIndexError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidAssignedToDynamicError() async {
+    return super.test_generalizedVoid_useOfVoidAssignedToDynamicError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidByIndexingError() async {
+    return super.test_generalizedVoid_useOfVoidByIndexingError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallMethodError() async {
+    return super.test_generalizedVoid_useOfVoidCallMethodError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallMethodWithNullError() async {
+    return super.test_generalizedVoid_useOfVoidCallMethodWithNullError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallSetterError() async {
+    return super.test_generalizedVoid_useOfVoidCallSetterError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCascadeError() async {
+    return super.test_generalizedVoid_useOfVoidCascadeError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalLhsError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalLhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalRhsError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalRhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInDoWhileConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInDoWhileConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInForeachVariableError() async {
+    return super.test_generalizedVoid_useOfVoidInForeachVariableError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInIsTestError() async {
+    return super.test_generalizedVoid_useOfVoidInIsTestError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInListLiteralError() async {
+    return super.test_generalizedVoid_useOfVoidInListLiteralError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
+    return super.test_generalizedVoid_useOfVoidInMapLiteralKeyError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
+    return super.test_generalizedVoid_useOfVoidInMapLiteralValueError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
+    return super.test_generalizedVoid_useOfVoidInNullOperatorLhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
+    return super.test_generalizedVoid_useOfVoidInSpecialAssignmentError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInSwitchExpressionError() async {
+    return super.test_generalizedVoid_useOfVoidInSwitchExpressionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInWhileConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInWhileConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidNullPropertyAccessError() async {
+    return super.test_generalizedVoid_useOfVoidNullPropertyAccessError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidPropertyAccessError() async {
+    return super.test_generalizedVoid_useOfVoidPropertyAccessError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError() async {
+    return super.test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidWhenArgumentError() async {
+    return super.test_generalizedVoid_useOfVoidWhenArgumentError();
   }
 
   @override
@@ -973,34 +1094,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_invalidOverride_defaultOverridesNonDefault() async {
-    return super.test_invalidOverride_defaultOverridesNonDefault();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverride_defaultOverridesNonDefault_named() async {
-    return super.test_invalidOverride_defaultOverridesNonDefault_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverrideDifferentDefaultValues_named() async {
-    return super.test_invalidOverrideDifferentDefaultValues_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverrideDifferentDefaultValues_positional() async {
-    return super.test_invalidOverrideDifferentDefaultValues_positional();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_invalidOverrideNamed_fewerNamedParameters() async {
     return super.test_invalidOverrideNamed_fewerNamedParameters();
   }
@@ -1520,6 +1613,13 @@
 
   @override
   @failingTest
+  test_returnWithoutValue_async_future_object_with_return() {
+    // Expected 1 errors of type StaticWarningCode.RETURN_WITHOUT_VALUE, found 0
+    return super.test_returnWithoutValue_async_future_object_with_return();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_returnWithoutValue_factoryConstructor() async {
     return super.test_returnWithoutValue_factoryConstructor();
@@ -1549,13 +1649,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_returnWithoutValue_Null() async {
-    return super.test_returnWithoutValue_Null();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_staticAccessToInstanceMember_method_invocation() async {
     return super.test_staticAccessToInstanceMember_method_invocation();
   }
@@ -1663,13 +1756,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typePromotion_functionType_arg_InterToDyn() async {
-    return super.test_typePromotion_functionType_arg_InterToDyn();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeTestNonType() async {
     return super.test_typeTestNonType();
   }
@@ -1814,204 +1900,6 @@
     return super.test_undefinedStaticMethodOrGetter_setter_inSuperclass();
   }
 
-  @override
-  @failingTest
-  test_generalizedVoid_assignToVoid_notStrong_error() async {
-    return super.test_generalizedVoid_assignToVoid_notStrong_error();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInForPartsOk() async {
-    return super.test_generalizedVoid_useOfVoidInForPartsOk();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInIsTestError() async {
-    return super.test_generalizedVoid_useOfVoidInIsTestError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalLhsError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalLhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalRhsError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalRhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidWhenArgumentError() async {
-    return super.test_generalizedVoid_useOfVoidWhenArgumentError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAssignedToDynamicError() async {
-    return super.test_generalizedVoid_useOfVoidAssignedToDynamicError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_throwVoidValueError() async {
-    return super.test_generalizedVoid_throwVoidValueError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInListLiteralError() async {
-    return super.test_generalizedVoid_useOfVoidInListLiteralError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
-    return super.test_generalizedVoid_useOfVoidInMapLiteralValueError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
-    return super.test_generalizedVoid_useOfVoidInMapLiteralKeyError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
-    return super.test_generalizedVoid_useOfVoidInNullOperatorLhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError() async {
-    return super.test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInWhileConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInWhileConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInDoWhileConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInDoWhileConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfInForeachIterableError() async {
-    return super.test_generalizedVoid_useOfInForeachIterableError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInForeachVariableError() async {
-    return super.test_generalizedVoid_useOfVoidInForeachVariableError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
-    return super.test_generalizedVoid_useOfVoidInSpecialAssignmentError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallMethodError() async {
-    return super.test_generalizedVoid_useOfVoidCallMethodError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallMethodWithNullError() async {
-    return super.test_generalizedVoid_useOfVoidCallMethodWithNullError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCascadeError() async {
-    return super.test_generalizedVoid_useOfVoidCascadeError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidToplevelError() async {
-    return super.test_generalizedVoid_invocationOfVoidToplevelError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidLocalError() async {
-    return super.test_generalizedVoid_invocationOfVoidLocalError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidFieldError() async {
-    return super.test_generalizedVoid_invocationOfVoidFieldError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidResultError() async {
-    return super.test_generalizedVoid_invocationOfVoidResultError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidByIndexingError() async {
-    return super.test_generalizedVoid_useOfVoidByIndexingError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAsIndexError() async {
-    return super.test_generalizedVoid_useOfVoidAsIndexError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAsIndexAssignError() async {
-    return super.test_generalizedVoid_useOfVoidAsIndexAssignError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInSwitchExpressionError() async {
-    return super.test_generalizedVoid_useOfVoidInSwitchExpressionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidPropertyAccessError() async {
-    return super.test_generalizedVoid_useOfVoidPropertyAccessError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallSetterError() async {
-    return super.test_generalizedVoid_useOfVoidCallSetterError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidNullPropertyAccessError() async {
-    return super.test_generalizedVoid_useOfVoidNullPropertyAccessError();
-  }
-
   @failingTest
   @override
   test_useOfVoidResult_assignmentExpression_function() async {
@@ -2026,8 +1914,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_variableDeclaration_method2() async {
-    return super.test_useOfVoidResult_variableDeclaration_method2();
+  test_useOfVoidResult_inForLoop_error() async {
+    return super.test_useOfVoidResult_inForLoop_error();
   }
 
   @override
@@ -2037,8 +1925,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_inForLoop_error() async {
-    return super.test_useOfVoidResult_inForLoop_error();
+  test_useOfVoidResult_variableDeclaration_function_error() async {
+    return super.test_useOfVoidResult_variableDeclaration_function_error();
   }
 
   @override
@@ -2048,8 +1936,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_variableDeclaration_function_error() async {
-    return super.test_useOfVoidResult_variableDeclaration_function_error();
+  test_useOfVoidResult_variableDeclaration_method2() async {
+    return super.test_useOfVoidResult_variableDeclaration_method2();
   }
 
   @failingTest
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index a78274e..7f66abf 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -3672,6 +3672,18 @@
     verify([source]);
   }
 
+  test_returnWithoutValue_async_future_object_with_return() async {
+    Source source = addSource('''
+import 'dart:async';
+Future<Object> f() async {
+  return;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
   test_returnWithoutValue_factoryConstructor() async {
     Source source = addSource("class A { factory A() { return; } }");
     await computeAnalysisResult(source);
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 61abc60..9157b6d 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -9,11 +9,9 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StrongModeLocalInferenceTest_Kernel);
-    // defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test_Kernel);
-    // defineReflectiveTests(StrongModeTypePropagationTest_Kernel);
+    defineReflectiveTests(StrongModeLocalInferenceTest_Kernel);
+    defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test_Kernel);
+    defineReflectiveTests(StrongModeTypePropagationTest_Kernel);
   });
 }
 
@@ -67,6 +65,13 @@
 
   @override
   @failingTest
+  test_constrainedByBounds4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_constrainedByBounds4();
+  }
+
+  @override
+  @failingTest
   test_constrainedByBounds5() async {
     // Bad state: Expected a type for 4 at 119; got one for kernel offset 118
     await super.test_constrainedByBounds5();
@@ -102,6 +107,41 @@
 
   @override
   @failingTest
+  test_functionDeclaration_body_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionDeclaration_body_propagation();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_typedArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_assignment_typedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_unTypedArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_assignment_unTypedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_body_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_body_propagation();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_unTypedArgument_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_unTypedArgument_propagation();
+  }
+
+  @override
+  @failingTest
   test_futureOr_downwards8() async {
     // type 'BottomTypeImpl' is not a subtype of type 'InterfaceType' in type cast where
     await super.test_futureOr_downwards8();
@@ -222,13 +262,6 @@
 
   @override
   @failingTest
-  test_inferredFieldDeclaration_propagation() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_inferredFieldDeclaration_propagation();
-  }
-
-  @override
-  @failingTest
   test_instanceCreation() async {
     // AnalysisException: Element mismatch in /test.dart at class A<S, T>
     await super.test_instanceCreation();
@@ -240,6 +273,13 @@
 
   @override
   @failingTest
+  test_partialTypes1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_partialTypes1();
+  }
+
+  @override
+  @failingTest
   test_pinning_multipleConstraints1() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_CAST_LITERAL, found 0
     await super.test_pinning_multipleConstraints1();
@@ -254,12 +294,96 @@
 
   @override
   @failingTest
+  test_pinning_multipleConstraints_contravariant1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant1();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant2() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant2();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant3() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant3();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant4();
+  }
+
+  @override
+  @failingTest
+  test_redirectedConstructor_named() {
+    // Expected: 'A<T2, U2>'; Actual: 'A<T, U>'
+    return super.test_redirectedConstructor_named();
+  }
+
+  @override
+  @failingTest
+  test_redirectedConstructor_unnamed() {
+    // Expected: 'A<T2, U2>'; Actual: 'A<T, U>'
+    return super.test_redirectedConstructor_unnamed();
+  }
+
+  @override
+  @failingTest
   test_redirectingConstructor_propagation() async {
     // AnalysisException: Element mismatch in /test.dart at class A
     await super.test_redirectingConstructor_propagation();
     // TODO(brianwilkerson) Figure out why this test is flaky.
     fail('Flaky test');
   }
+
+  @override
+  @failingTest
+  test_returnType_variance1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance1();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance2() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance2();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance3() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance3();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance4();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance5() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance5();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance6() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance6();
+  }
 }
 
 @reflectiveTest
@@ -289,6 +413,13 @@
 
   @override
   @failingTest
+  test_genericFunction_typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericFunction_typedef();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_explicitTypeParams() async {
     // Bad state: Found 2 argument types for 1 type arguments
     await super.test_genericMethod_explicitTypeParams();
@@ -303,6 +434,22 @@
 
   @override
   @failingTest
+  test_genericMethod_functionExpressionInvocation_functionTypedParameter_explicit() {
+    // Failed to resolve 2 nodes
+    return super
+        .test_genericMethod_functionExpressionInvocation_functionTypedParameter_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionExpressionInvocation_functionTypedParameter_inferred() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionExpressionInvocation_functionTypedParameter_inferred();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_functionExpressionInvocation_inferred() async {
     // Bad state: Expected element declaration for analyzer offset 230; got one for kernel offset 233
     await super.test_genericMethod_functionExpressionInvocation_inferred();
@@ -317,6 +464,22 @@
 
   @override
   @failingTest
+  test_genericMethod_functionInvocation_functionTypedParameter_explicit() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionInvocation_functionTypedParameter_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionInvocation_functionTypedParameter_inferred() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionInvocation_functionTypedParameter_inferred();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_functionInvocation_inferred() async {
     // Failed to resolve 1 nodes:
     await super.test_genericMethod_functionInvocation_inferred();
@@ -324,6 +487,13 @@
 
   @override
   @failingTest
+  test_genericMethod_functionTypedParameter_tearoff() {
+    // Failed to resolve 1 nodes
+    return super.test_genericMethod_functionTypedParameter_tearoff();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_implicitDynamic() async {
     // Expected: '<T>((dynamic) → T) → T'
     await super.test_genericMethod_implicitDynamic();
@@ -338,9 +508,24 @@
 
   @override
   @failingTest
-  test_genericMethod_override_invalidReturnType() async {
+  test_genericMethod_nestedFunctions() {
+    // Expected: '<S>(S) → <S>(S) → S'; Actual: '<S₀>(S) → <S>(S) → S'
+    return super.test_genericMethod_nestedFunctions();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_differentContextsSameBounds() {
+    // UnimplementedError: TODO(paulberry): TypeParameterType
+    return super.test_genericMethod_override_differentContextsSameBounds();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_invalidContravariantTypeParamBounds() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    await super.test_genericMethod_override_invalidReturnType();
+    await super
+        .test_genericMethod_override_invalidContravariantTypeParamBounds();
   }
 
   @override
@@ -353,10 +538,9 @@
 
   @override
   @failingTest
-  test_genericMethod_override_invalidContravariantTypeParamBounds() async {
+  test_genericMethod_override_invalidReturnType() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    await super
-        .test_genericMethod_override_invalidContravariantTypeParamBounds();
+    await super.test_genericMethod_override_invalidReturnType();
   }
 
   @override
@@ -382,9 +566,109 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_instantiateToBounds_class_error_recursion() async {
-    return super.test_instantiateToBounds_class_error_recursion();
+  test_genericMethod_toplevel_field_staticTearoff() {
+    // Failed to resolve 1 nodes
+    return super.test_genericMethod_toplevel_field_staticTearoff();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_error_typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_instantiateToBounds_class_error_typedef();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_class_error_recursion_typedef() {
+    // Expected 2 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0; 1 errors of
+    // type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
+    return super.test_notInstantiatedBound_class_error_recursion_typedef();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_argument() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_argument();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_argument2() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_argument2();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_direct() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_direct();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_indirect() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_indirect();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_functionType() {
+    // Expected 2 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_functionType();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_argument() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_argument();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_argument2() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_argument2();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_direct() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_direct();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_ok_class_function() {
+    // Failed to resolve 1 nodes
+    return super.test_notInstantiatedBound_ok_class_function();
+  }
+
+  @override
+  @failingTest
+  test_objectMethodOnFunctions_Typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_objectMethodOnFunctions_Typedef();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_object_void() async {
+    await super.test_returnOfInvalidType_object_void();
   }
 
   @override
@@ -407,12 +691,6 @@
     // Expected 2 errors of type StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, found 0
     await super.test_setterWithOtherTypeIsError();
   }
-
-  @override
-  @failingTest
-  test_returnOfInvalidType_object_void() async {
-    await super.test_returnOfInvalidType_object_void();
-  }
 }
 
 @reflectiveTest
@@ -426,4 +704,12 @@
 
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef();
+  }
 }
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 1d9afa9..8cbef81 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -154,7 +154,7 @@
   void test_defineAnalysisArguments() {
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
-    expect(parser.options, hasLength(14));
+    expect(parser.options, hasLength(13));
   }
 
   void test_extractDefinedVariables() {
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 558578c..94e546b 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -707,35 +707,6 @@
     _expectEqualOptions(options, expected);
   }
 
-  void test_getAnalysisOptions_default_flutter_disabled() {
-    _defineMockLintRules();
-    ArgParser argParser = new ArgParser();
-    defineAnalysisArguments(argParser);
-    ArgResults argResults =
-        argParser.parse(['--no-$packageDefaultAnalysisOptions']);
-
-    builderOptions = createContextBuilderOptions(argResults);
-    expect(builderOptions.packageDefaultAnalysisOptions, isFalse);
-    builder = new ContextBuilder(resourceProvider, sdkManager, contentCache,
-        options: builderOptions);
-
-    AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
-
-    String packagesFilePath =
-        resourceProvider.convertPath('/some/directory/path/.packages');
-    createFile(packagesFilePath, 'flutter:/pkg/flutter/lib/');
-    String optionsFilePath = resourceProvider
-        .convertPath('/pkg/flutter/lib/analysis_options_user.yaml');
-    createFile(optionsFilePath, '''
-linter:
-  rules:
-    - mock_lint_rule
-''');
-    String projPath = resourceProvider.convertPath('/some/directory/path');
-    AnalysisOptions options = builder.getAnalysisOptions(projPath);
-    _expectEqualOptions(options, expected);
-  }
-
   void test_getAnalysisOptions_default_noOverrides() {
     AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
     defaultOptions.enableLazyAssignmentOperators = true;
@@ -788,7 +759,6 @@
     defineAnalysisArguments(argParser);
     ArgResults argResults = argParser.parse([]);
     builderOptions = createContextBuilderOptions(argResults);
-    expect(builderOptions.packageDefaultAnalysisOptions, isTrue);
     builder = new ContextBuilder(resourceProvider, sdkManager, contentCache,
         options: builderOptions);
     AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
diff --git a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
new file mode 100644
index 0000000..0afd0b0
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
@@ -0,0 +1,119 @@
+// 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/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../context/mock_sdk.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AnalysisContextCollectionTest);
+  });
+}
+
+@reflectiveTest
+class AnalysisContextCollectionTest extends Object with ResourceProviderMixin {
+  void setUp() {
+    new MockSdk(resourceProvider: resourceProvider);
+  }
+
+  test_contextFor_noContext() {
+    var collection = _newCollection(includedPaths: [convertPath('/root')]);
+    expect(
+      () => collection.contextFor(convertPath('/other/test.dart')),
+      throwsStateError,
+    );
+  }
+
+  test_contextFor_notAbsolute() {
+    var collection = _newCollection(includedPaths: [convertPath('/root')]);
+    expect(
+      () => collection.contextFor(convertPath('test.dart')),
+      throwsArgumentError,
+    );
+  }
+
+  test_contextFor_notNormalized() {
+    var collection = _newCollection(includedPaths: [convertPath('/root')]);
+    expect(
+      () => collection.contextFor(convertPath('/test/lib/../lib/test.dart')),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_includedPaths_notAbsolute() {
+    expect(
+      () => new AnalysisContextCollectionImpl(includedPaths: ['root']),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_includedPaths_notNormalized() {
+    expect(
+      () => new AnalysisContextCollectionImpl(
+          includedPaths: [convertPath('/root/lib/../lib')]),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_outer_inner() {
+    var outerFolder = newFolder('/test/outer');
+    newFile('/test/outer/lib/outer.dart');
+
+    var innerFolder = newFolder('/test/outer/inner');
+    newOptionsFile('/test/outer/inner');
+    newFile('/test/outer/inner/inner.dart');
+
+    var collection = _newCollection(includedPaths: [outerFolder.path]);
+
+    expect(collection.contexts, hasLength(2));
+
+    var outerContext = collection.contexts
+        .singleWhere((c) => c.contextRoot.root == outerFolder);
+    var innerContext = collection.contexts
+        .singleWhere((c) => c.contextRoot.root == innerFolder);
+    expect(innerContext, isNot(same(outerContext)));
+
+    // Outer and inner contexts own corresponding files.
+    expect(collection.contextFor(convertPath('/test/outer/lib/outer.dart')),
+        same(outerContext));
+    expect(collection.contextFor(convertPath('/test/outer/inner/inner.dart')),
+        same(innerContext));
+
+    // The file does not have to exist, during creation, or at all.
+    expect(collection.contextFor(convertPath('/test/outer/lib/outer2.dart')),
+        same(outerContext));
+    expect(collection.contextFor(convertPath('/test/outer/inner/inner2.dart')),
+        same(innerContext));
+  }
+
+  test_new_sdkPath_notAbsolute() {
+    expect(
+      () => new AnalysisContextCollectionImpl(
+          includedPaths: ['/root'], sdkPath: 'sdk'),
+      throwsArgumentError,
+    );
+  }
+
+  test_new_sdkPath_notNormalized() {
+    expect(
+      () => new AnalysisContextCollectionImpl(
+          includedPaths: [convertPath('/root')], sdkPath: '/home/sdk/../sdk'),
+      throwsArgumentError,
+    );
+  }
+
+  AnalysisContextCollectionImpl _newCollection(
+      {@required List<String> includedPaths}) {
+    return new AnalysisContextCollectionImpl(
+      resourceProvider: resourceProvider,
+      includedPaths: includedPaths,
+      sdkPath: convertPath(sdkRoot),
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index ea4762e..388be9b 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -37,16 +37,6 @@
     fail(buffer.toString());
   }
 
-  File newOptionsFile(String directoryPath) {
-    return newFile(resourceProvider.pathContext
-        .join(directoryPath, ContextLocatorImpl.ANALYSIS_OPTIONS_NAME));
-  }
-
-  File newPackagesFile(String directoryPath) {
-    return newFile(resourceProvider.pathContext
-        .join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME));
-  }
-
   void setUp() {
     contextLocator = new ContextLocatorImpl(resourceProvider: resourceProvider);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
index 573d210..9b6324d 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
@@ -55,6 +55,17 @@
     expect(contextRoot.isAnalyzed(filePath), isFalse);
   }
 
+  test_isAnalyzed_explicitlyExcluded_same() {
+    String aPath = provider.convertPath('/test/root/lib/a.dart');
+    String bPath = provider.convertPath('/test/root/lib/b.dart');
+    File aFile = provider.getFile(aPath);
+
+    contextRoot.excluded.add(aFile);
+
+    expect(contextRoot.isAnalyzed(aPath), isFalse);
+    expect(contextRoot.isAnalyzed(bPath), isTrue);
+  }
+
   test_isAnalyzed_implicitlyExcluded_dot_analysisOptions() {
     String filePath = provider.convertPath('/test/root/lib/.analysis_options');
     expect(contextRoot.isAnalyzed(filePath), isFalse);
@@ -70,6 +81,18 @@
     expect(contextRoot.isAnalyzed(filePath), isTrue);
   }
 
+  test_isAnalyzed_included_same() {
+    String aPath = provider.convertPath('/test/root/lib/a.dart');
+    String bPath = provider.convertPath('/test/root/lib/b.dart');
+    File aFile = provider.getFile(aPath);
+
+    contextRoot = new ContextRootImpl(provider, rootFolder);
+    contextRoot.included.add(aFile);
+
+    expect(contextRoot.isAnalyzed(aPath), isTrue);
+    expect(contextRoot.isAnalyzed(bPath), isFalse);
+  }
+
   test_isAnalyzed_packagesDirectory_analyzed() {
     String folderPath = provider.convertPath('/test/root/lib/packages');
     provider.newFolder(folderPath);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index 19ca54e..830cd0f 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -9,9 +9,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisDriverTest_Kernel);
+    defineReflectiveTests(AnalysisDriverTest_Kernel);
   });
 }
 
@@ -59,13 +57,6 @@
   @failingTest
   @potentialAnalyzerProblem
   @override
-  test_const_annotation_notConstConstructor() async {
-    await super.test_const_annotation_notConstConstructor();
-  }
-
-  @failingTest
-  @potentialAnalyzerProblem
-  @override
   test_const_annotation_withArgs() async {
     await super.test_const_annotation_withArgs();
   }
@@ -77,6 +68,13 @@
     await super.test_const_externalConstFactory();
   }
 
+  @override
+  @failingTest
+  test_const_implicitCreation() {
+    // Bad state: No data for () at 69
+    return super.test_const_implicitCreation();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31555')
   @override
@@ -192,6 +190,23 @@
     await super.test_getResult_nameConflict_local_typeInference();
   }
 
+  @override
+  @failingTest
+  test_missingDartLibrary_async() {
+    // Crash when compiling package:test/test.dart, at character offset null:
+    // Class 'FutureOr' not found in library 'dart:async'
+    return super.test_missingDartLibrary_async();
+  }
+
+  @override
+  @failingTest
+  test_missingDartLibrary_core() {
+    // Crash when compiling package:test/test.dart, at character offset null:
+    // file:///sdk/lib/core/core.dart:1: Internal problem: Couldn't find
+    // 'Object' in 'file:///sdk/lib/core/core.dart'.
+    return super.test_missingDartLibrary_core();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
   @override
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index 66a1bb0..2422f69 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisDriverResolutionTest_Kernel);
+    defineReflectiveTests(AnalysisDriverResolutionTest_Kernel);
   });
 }
 
@@ -25,10 +23,84 @@
 
   @override
   @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classConstructor() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classConstructor();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classConstructorNamed() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classConstructorNamed();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classField() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classField();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_topLevelVariable() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_topLevelVariable();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31605')
   test_constructor_redirected_generic() async {
     await super.test_constructor_redirected_generic();
   }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_functionExpressionInvocation() {
+    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
+    return super.test_functionExpressionInvocation();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_instanceCreation_prefixed() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_instanceCreation_prefixed();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_isExpression_not() {
+    // TODO(paulberry): I suspect that the special case for is! has bit rotted
+    return super.test_isExpression_not();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_local_function_generic() {
+    // TODO(paulberry): I suspect this is broken due to the function type's
+    // generic parameters not being properly associated with the generic
+    // parameters from the kernel representation.
+    return super.test_local_function_generic();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_type_functionTypeAlias() {
+    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
+    return super.test_type_functionTypeAlias();
+  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index cd75df1..20acbf2 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'analysis_context_collection_test.dart' as analysis_context_collection;
 import 'context_builder_test.dart' as context_builder;
 import 'context_locator_test.dart' as context_locator;
 import 'context_root_test.dart' as context_root;
@@ -23,6 +24,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    analysis_context_collection.main();
     context_builder.main();
     context_locator.main();
     context_root.main();
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
index c860a24..dd7bbaa 100644
--- a/pkg/analyzer/test/src/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -496,7 +497,7 @@
     resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
   }
 
-  void resolve(String source) async {
+  Future<void> resolve(String source) async {
     testSource = source;
     testUnit = await resolveSource2('/test.dart', source);
   }
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index ab82e9a..1a930e5 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -18,6 +18,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -449,12 +450,16 @@
 
   test_dependencyOnFactoryRedirect() async {
     // a depends on A.foo() depends on A.bar()
-    await _assertProperDependencies(r'''
+    await _assertProperDependencies(
+        r'''
 const A a = const A.foo();
 class A {
   factory const A.foo() = A.bar;
   const A.bar();
-}''');
+}''',
+        Parser.useFasta
+            ? const <ErrorCode>[ParserErrorCode.CONST_AFTER_FACTORY]
+            : const <ErrorCode>[]);
   }
 
   test_dependencyOnFactoryRedirectWithTypeParams() async {
diff --git a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
deleted file mode 100644
index 1b1a23b..0000000
--- a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/fasta/resolution_applier.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:kernel/kernel.dart' as kernel;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../generated/parser_fasta_test.dart';
-import '../../generated/resolver_test_case.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ResolutionApplierTest);
-  });
-}
-
-@reflectiveTest
-class ResolutionApplierTest extends FastaParserTestCase {
-  /// The type provider used to access the types passed to the resolution
-  /// applier.
-  TestTypeProvider typeProvider;
-
-  /// 1. Generate an AST structure from the given [content]. The AST is expected
-  ///    to have a top-level function declaration as the first element.
-  /// 2. Use a [ResolutionApplier] to apply the [declaredElements],
-  ///    [referencedElements], and [types] to the body of the function.
-  /// 3. Verify that everything in the function body that should be resolved
-  ///    _is_ resolved.
-  void applyTypes(String content, List<Element> declaredElements,
-      List<Element> referencedElements, List<DartType> types) {
-    CompilationUnit unit = parseCompilationUnit(content);
-    expect(unit, isNotNull);
-    expect(unit.declarations, hasLength(1));
-    FunctionDeclaration function = unit.declarations[0];
-    FunctionBody body = function.functionExpression.body;
-    ResolutionApplier applier = new ResolutionApplier(
-        null,
-        new _TestTypeContext(),
-        declaredElements,
-        referencedElements,
-        types.map((type) => new _KernelWrapperOfType(type)).toList());
-
-    body.accept(applier);
-    applier.checkDone();
-
-    ResolutionVerifier verifier = new ResolutionVerifier();
-    // TODO(brianwilkerson) Uncomment the line below when the tests no longer
-    // fail.
-//    body.accept(verifier);
-    verifier.assertResolved();
-  }
-
-  void setUp() {
-    typeProvider = new TestTypeProvider();
-  }
-
-  void test_binaryExpression() {
-    applyTypes(r'''
-f(String s, int i) {
-  return s + i;
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('+', -1),
-      _createFunctionParameter('i', 16),
-    ], <DartType>[
-      typeProvider.stringType,
-      new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
-      new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
-      new TypeArgumentsDartType([]),
-      typeProvider.intType,
-      typeProvider.stringType,
-    ]);
-  }
-
-  void test_functionExpressionInvocation() {
-    applyTypes(r'''
-f(Object a) {
-  return a.b().c();
-}
-''', [], [
-      _createFunctionParameter('a', 9),
-      new MethodElementImpl('b', -1),
-      new MethodElementImpl('c', -1)
-    ], <DartType>[
-      typeProvider.objectType,
-      typeProvider.objectType,
-      typeProvider.objectType,
-      new TypeArgumentsDartType([]),
-      typeProvider.objectType,
-      typeProvider.objectType,
-      typeProvider.objectType,
-      new TypeArgumentsDartType([]),
-      typeProvider.objectType
-    ]);
-  }
-
-  void test_genericFunctionType() {
-    GenericFunctionTypeElementImpl element =
-        new GenericFunctionTypeElementImpl.forOffset(8);
-    element.enclosingElement = new FunctionElementImpl('f', 0);
-    element.typeParameters = <TypeParameterElement>[];
-    element.returnType = typeProvider.intType;
-    element.parameters = [
-      _createFunctionParameter('', -1, type: typeProvider.stringType),
-      _createFunctionParameter('x', 34, type: typeProvider.boolType),
-    ];
-    FunctionTypeImpl functionType = new FunctionTypeImpl(element);
-    element.type = functionType;
-    applyTypes(r'''
-f() {
-  int Function(String, bool x) foo;
-}
-''', [new LocalVariableElementImpl('foo', 37)], [], <DartType>[functionType]);
-  }
-
-  void test_listLiteral_const_noAnnotation() {
-    applyTypes(r'''
-get f => const ['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_const_typeAnnotation() {
-    applyTypes(r'''
-get f => const <String>['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_noAnnotation() {
-    applyTypes(r'''
-get f => ['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_typeAnnotation() {
-    applyTypes(r'''
-get f => <String>['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_localVariable() {
-    InterfaceType mapType = typeProvider.mapType.instantiate([
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-    applyTypes(r'''
-f() {
-  Map<String, List<String>> m = {};
-}
-''', [new LocalVariableElementImpl('m', 34)], [], <DartType>[mapType, mapType]);
-  }
-
-  void test_mapLiteral_const_noAnnotation() {
-    applyTypes(r'''
-get f => const {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_const_typeAnnotation() {
-    applyTypes(r'''
-get f => const <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_noAnnotation() {
-    applyTypes(r'''
-get f => {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_typeAnnotation() {
-    applyTypes(r'''
-get f => <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_methodInvocation_getter() {
-    applyTypes(r'''
-f(String s) {
-  return s.length;
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('length', -1)
-    ], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-    ]);
-  }
-
-  void test_methodInvocation_method() {
-    var substringType =
-        new FunctionTypeImpl(new FunctionElementImpl('substring', -1));
-    applyTypes(r'''
-f(String s) {
-  return s.substring(3, 7);
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('length', -1)
-    ], <DartType>[
-      typeProvider.stringType,
-      substringType,
-      substringType,
-      new TypeArgumentsDartType([]),
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.stringType
-    ]);
-  }
-
-  @failingTest
-  void test_typeAlias() {
-    TypeParameterElement B = _createTypeParameter('B', 42);
-    TypeParameterElement C = _createTypeParameter('C', 45);
-    GenericTypeAliasElementImpl element =
-        new GenericTypeAliasElementImpl('A', 40);
-    element.typeParameters = <TypeParameterElement>[B, C];
-    GenericFunctionTypeElementImpl functionElement =
-        element.function = new GenericFunctionTypeElementImpl.forOffset(-1);
-    functionElement.typeParameters = <TypeParameterElement>[];
-    functionElement.returnType = B.type;
-    functionElement.parameters = [
-      _createFunctionParameter('x', 48, type: C.type),
-    ];
-    FunctionTypeImpl functionType = new FunctionTypeImpl.forTypedef(element);
-    applyTypes(r'''
-f() {
-  A<int, String> foo;
-}
-//typedef B A<B, C>(C x);
-''', [new LocalVariableElementImpl('foo', 23)], [], <DartType>[functionType]);
-  }
-
-  /// Return a newly created parameter element with the given [name] and
-  /// [offset].
-  ParameterElement _createFunctionParameter(String name, int offset,
-      {DartType type}) {
-    ParameterElementImpl parameter = new ParameterElementImpl(name, offset);
-    parameter.type = type;
-    parameter.parameterKind = ParameterKind.REQUIRED;
-    return parameter;
-  }
-
-  /// Return a newly created type parameter element with the given [name] and
-  /// [offset].
-  TypeParameterElement _createTypeParameter(String name, int offset) {
-    TypeParameterElementImpl typeParameter =
-        new TypeParameterElementImpl(name, offset);
-    TypeParameterTypeImpl typeParameterType =
-        new TypeParameterTypeImpl(typeParameter);
-    typeParameter.type = typeParameterType;
-    return typeParameter;
-  }
-}
-
-/// Kernel wrapper around the Analyzer [type].
-class _KernelWrapperOfType implements kernel.DartType {
-  final DartType type;
-
-  _KernelWrapperOfType(this.type);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-/// Test implementation of [TypeContext].
-class _TestTypeContext implements TypeContext {
-  @override
-  ClassElement get enclosingClassElement => null;
-
-  @override
-  DartType get stringType => null;
-
-  @override
-  DartType get typeType => null;
-
-  @override
-  void encloseVariable(ElementImpl element) {}
-
-  @override
-  void enterLocalFunction(FunctionElementImpl element) {}
-
-  @override
-  void exitLocalFunction(FunctionElementImpl element) {}
-
-  @override
-  DartType translateType(kernel.DartType kernelType) {
-    return (kernelType as _KernelWrapperOfType).type;
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/test_all.dart b/pkg/analyzer/test/src/fasta/test_all.dart
index 675b470..37ccad1 100644
--- a/pkg/analyzer/test/src/fasta/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/test_all.dart
@@ -7,7 +7,6 @@
 import 'ast_builder_test.dart' as ast_builder;
 import 'message_coverage_test.dart' as message_coverage;
 import 'recovery/test_all.dart' as recovery;
-import 'resolution_applier_test.dart' as resolution_applier;
 import 'resolution_test.dart' as resolution;
 
 main() {
@@ -15,7 +14,6 @@
     ast_builder.main();
     message_coverage.main();
     recovery.main();
-    resolution_applier.main();
     resolution.main();
   }, name: 'fasta');
 }
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index 9386a8d..f4eb228 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -159,6 +159,25 @@
 ''');
   }
 
+  test_assetDirectoryDoesNotExist_error() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/logos/
+''', [PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST]);
+  }
+
+  test_assetDirectoryDoesExists_noError() {
+    newFolder('/sample/assets/logos');
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/logos/
+''');
+  }
+
   test_dependenciesFieldNotMap_dev_error_bool() {
     assertErrors('''
 name: sample
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 0f78b0f..952ede8 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -8760,10 +8760,15 @@
     serializeLibraryText('@a(-b=""c');
     expect(unlinkedUnits, hasLength(1));
     List<UnlinkedVariable> variables = unlinkedUnits[0].variables;
-    expect(variables, hasLength(1));
-    List<UnlinkedExpr> annotations = variables[0].annotations;
-    expect(annotations, hasLength(1));
-    expect(annotations[0].isValidConst, isFalse);
+    if (Parser.useFasta) {
+      // Fasta recovers by appending `)` after `c`
+      expect(variables, isEmpty);
+    } else {
+      expect(variables, hasLength(1));
+      List<UnlinkedExpr> annotations = variables[0].annotations;
+      expect(annotations, hasLength(1));
+      expect(annotations[0].isValidConst, isFalse);
+    }
   }
 
   test_metadata_invalid_instanceCreation_argument_super() {
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
index 53477e1..b3da4d0 100644
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -161,10 +161,7 @@
         FolderBasedDartSdk.defaultSdkDirectory(resourceProvider));
 
     ContextBuilderOptions builderOptions = new ContextBuilderOptions();
-    if (Platform.packageRoot != null) {
-      builderOptions.defaultPackagesDirectoryPath =
-          Uri.parse(Platform.packageRoot).toFilePath();
-    } else if (Platform.packageConfig != null) {
+    if (Platform.packageConfig != null) {
       builderOptions.defaultPackageFilePath =
           Uri.parse(Platform.packageConfig).toFilePath();
     } else {
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index 9f07d92..11ec5f0 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -96,6 +96,7 @@
     contextOptions.generateImplicitErrors = clOptions.showPackageWarnings;
     contextOptions.generateSdkErrors = clOptions.showSdkWarnings;
     contextOptions.previewDart2 = clOptions.previewDart2;
+    contextOptions.useFastaParser = clOptions.useFastaParser;
     contextOptions.strongMode = clOptions.strongMode;
     if (clOptions.useCFE) {
       contextOptions.useFastaParser = true;
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index d82228d..80450e8 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -114,6 +114,9 @@
   /// Whether to enable the Dart 2.0 Common Front End.
   final bool useCFE;
 
+  /// Whether to enable parsing via the Fasta parser.
+  final bool useFastaParser;
+
   /// Whether to enable the Dart 2.0 Preview.
   final bool previewDart2;
 
@@ -187,6 +190,7 @@
         machineFormat = args['format'] == 'machine',
         perfReport = args['x-perf-report'],
         useCFE = args['use-cfe'],
+        useFastaParser = args['use-fasta-parser'],
         previewDart2 = args['preview-dart-2'],
         batchMode = args['batch'],
         showPackageWarnings = args['show-package-warnings'] ||
@@ -509,7 +513,10 @@
           help:
               'Enable the Dart 2.0 Common Front End implementation (experimental).',
           defaultsTo: false,
-          negatable: false,
+          hide: hide)
+      ..addFlag('use-fasta-parser',
+          help: 'Whether to enable parsing via the Fasta parser.',
+          defaultsTo: false,
           hide: hide)
       ..addFlag('preview-dart-2',
           help: 'Enable the Dart 2.0 preview.',
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index d33adca..606e0c3 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -28,19 +28,14 @@
     defineReflectiveTests(BuildModeTest);
     defineReflectiveTests(ExitCodesTest);
     defineReflectiveTests(ExitCodesTest_PreviewDart2);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ExitCodesTest_UseCFE);
+    defineReflectiveTests(ExitCodesTest_UseCFE);
     defineReflectiveTests(LinterTest);
     defineReflectiveTests(LinterTest_PreviewDart2);
-    // Disabled until integration with the CFE has been restarted.
-//    defineReflectiveTests(LinterTest_UseCFE);
+    defineReflectiveTests(LinterTest_UseCFE);
     defineReflectiveTests(NonDartFilesTest);
     defineReflectiveTests(OptionsTest);
     defineReflectiveTests(OptionsTest_PreviewDart2);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OptionsTest_UseCFE);
+    defineReflectiveTests(OptionsTest_UseCFE);
   }, name: 'Driver');
 }
 
@@ -680,6 +675,12 @@
 
   @override
   @failingTest
+  test_enableAssertInitializer() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
   test_fatalErrors() {
     // TODO(devoncarew): This test times out when used with @failingTest.
     return new Future.error('failing test');
@@ -687,11 +688,51 @@
 
   @override
   @failingTest
-  test_fatalWarnings() => super.test_fatalWarnings();
+  test_fatalHints() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_notFatalWarnings() => super.test_notFatalWarnings();
+  test_fatalWarnings() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_missingOptionsFile() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_notFatalHints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_notFatalWarnings() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_partFile() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_partFile_extra() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_partFile_reversed() {
+    fail('Test crashes CFE');
+  }
 }
 
 @reflectiveTest
@@ -800,6 +841,48 @@
 class LinterTest_UseCFE extends LinterTest {
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_defaultLints_generatedLints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_defaultLints_getsDefaultLints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_lintsInOptions_generatedLints() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_lintsInOptions_getAnalysisOptions() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_noLints_lintsDisabled() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_noLints_noGeneratedWarnings() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_noLints_noRegisteredLints() {
+    fail('Test times out');
+  }
 }
 
 @reflectiveTest
@@ -1016,42 +1099,75 @@
 
   @override
   @failingTest
-  test_analysisOptions_excludes() => super.test_analysisOptions_excludes();
+  test_analysisOptions_excludes() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() =>
-      super.test_analysisOptions_excludesRelativeToAnalysisOptions_explicit();
+  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() =>
-      super.test_analysisOptions_excludesRelativeToAnalysisOptions_inferred();
+  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_filters() => super.test_basic_filters();
+  test_analyzeFilesInDifferentContexts() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_language() => super.test_basic_language();
+  test_basic_filters() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_strongMode() => super.test_basic_strongMode();
+  test_basic_language() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_includeDirective() => super.test_includeDirective();
+  test_basic_strongMode() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_previewDart2() => super.test_previewDart2();
+  test_includeDirective() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_withFlags_overrideFatalWarning() =>
-      super.test_withFlags_overrideFatalWarning();
+  test_previewDart2() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_strongSdk() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_todo() {
+    fail('Test times out');
+  }
+
+  @override
+  @failingTest
+  test_withFlags_overrideFatalWarning() {
+    fail('Test times out');
+  }
 }
 
 class TestSource implements Source {
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 86ff443..4ffddfe 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -251,6 +251,17 @@
         expect(options.useCFE, isTrue);
       });
 
+      test('--use-fasta-parser', () {
+        CommandLineOptions options =
+            CommandLineOptions.parse(['--use-fasta-parser', 'foo.dart']);
+        expect(options.useFastaParser, isTrue);
+      });
+
+      test('--no-use-fasta-parser', () {
+        CommandLineOptions options = CommandLineOptions.parse(['', 'foo.dart']);
+        expect(options.useFastaParser, isFalse);
+      });
+
       test('--preview-dart-2', () {
         CommandLineOptions options =
             CommandLineOptions.parse(['--preview-dart-2', 'foo.dart']);
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
index 0e58499..fbeae0c 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
@@ -653,9 +653,6 @@
     } else if (servicesPort != null) {
       arguments.add('--enable-vm-service=$servicesPort');
     }
-    if (Platform.packageRoot != null) {
-      arguments.add('--package-root=${Platform.packageRoot}');
-    }
     if (Platform.packageConfig != null) {
       arguments.add('--packages=${Platform.packageConfig}');
     }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index c35ddbb..42d6b0c 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -41,7 +41,13 @@
 
   static const String strongMode = '--strong';
   static const String previewDart2 = '--preview-dart-2';
+  // Revert to Dart 1.0
+  //
+  // Temporary option to opt-out of Dart 2.0 while migrating.
+  static const String noPreviewDart2 = '--no-preview-dart-2';
+
   static const String omitImplicitChecks = '--omit-implicit-checks';
+  static const String laxRuntimeTypeToString = '--lax-runtime-type-to-string';
 
   static const String platformBinaries = '--platform-binaries=.+';
 
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index cf2ed2c..ad9214f 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -19,6 +19,7 @@
   Iterable<ConstantExpression> get constantLiterals =>
       const <ConstantExpression>[];
   Iterable<ClassEntity> get seenClasses => const <ClassEntity>[];
+  Iterable<RuntimeTypeUse> get runtimeTypeUses => const <RuntimeTypeUse>[];
 
   Iterable<dynamic> get nativeData => const <dynamic>[];
 
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 738bd388..c54b666 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -1091,6 +1091,15 @@
   FunctionEntity get createInvocationMirror =>
       _findHelperFunction('createInvocationMirror');
 
+  bool isCreateInvocationMirrorHelper(MemberEntity member) {
+    return member.isTopLevel &&
+        member.name == '_createInvocationMirror' &&
+        member.library == coreLibrary;
+  }
+
+  FunctionEntity get createUnmangledInvocationMirror =>
+      _findHelperFunction('createUnmangledInvocationMirror');
+
   FunctionEntity get cyclicThrowHelper =>
       _findHelperFunction("throwCyclicInit");
 
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 7916753..b03de0b 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -1144,6 +1144,15 @@
           });
           isValid = false;
         }
+        if (isValid &&
+            (operator.kind == BinaryOperatorKind.IDIV ||
+                operator.kind == BinaryOperatorKind.MOD)) {
+          if (rightValue.isZero) {
+            environment.reportError(right, MessageKind.INVALID_CONSTANT_DIV,
+                {'left': left, 'right': right, 'operator': operator});
+            isValid = false;
+          }
+        }
         break;
       case BinaryOperatorKind.SHL:
       case BinaryOperatorKind.SHR:
@@ -1168,6 +1177,16 @@
           });
           isValid = false;
         }
+        if (isValid &&
+            (operator.kind == BinaryOperatorKind.SHL ||
+                operator.kind == BinaryOperatorKind.SHR)) {
+          IntConstantValue shift = rightValue;
+          if (shift.intValue < BigInt.zero) {
+            environment.reportError(right, MessageKind.INVALID_CONSTANT_SHIFT,
+                {'left': left, 'right': right, 'operator': operator});
+            isValid = false;
+          }
+        }
         break;
       case BinaryOperatorKind.LOGICAL_AND:
         if (!leftValue.isBool) {
@@ -1229,6 +1248,8 @@
           if (value != null) {
             return value;
           }
+          environment
+              .reportError(this, MessageKind.NOT_A_COMPILE_TIME_CONSTANT, {});
       }
     }
     return new NonConstantValue();
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index e1a8e61..a06b868 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -124,7 +124,8 @@
   bool analyzeOnly = false;
   bool trustTypeAnnotations = false;
   bool checkedMode = false;
-  bool strongMode = false;
+  bool strongMode = true;
+  bool forceStrongMode = true;
   List<String> hints = <String>[];
   bool verbose;
   bool throwOnError;
@@ -219,11 +220,16 @@
     passThrough(argument);
   }
 
-  void setStrongMode(_) {
-    strongMode = true;
+  void setForceStrongMode(_) {
+    strongMode = forceStrongMode = true;
     passThrough(Flags.strongMode);
   }
 
+  void setLegacyMode(_) {
+    if (!forceStrongMode) strongMode = false;
+    passThrough(Flags.noPreviewDart2);
+  }
+
   void addInEnvironment(String argument) {
     int eqIndex = argument.indexOf('=');
     String name = argument.substring(2, eqIndex);
@@ -357,9 +363,16 @@
     new OptionHandler(Flags.useContentSecurityPolicy, passThrough),
     new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
     new OptionHandler(Flags.enableAssertMessage, passThrough),
-    new OptionHandler(Flags.strongMode, setStrongMode),
-    new OptionHandler(Flags.previewDart2, setStrongMode),
+    // TODO(sigmund): ignore this option after we update our test bot
+    // configurations or stop testing Dart1.
+    // At the time this was added, some bots invoked dart2js with
+    // --no-preview-dart-2, but some test files contain extra dart2js options,
+    // including --strong. We want to make sure --strong takes precedence.
+    new OptionHandler(Flags.strongMode, setForceStrongMode),
+    new OptionHandler(Flags.previewDart2, setForceStrongMode),
+    new OptionHandler(Flags.noPreviewDart2, setLegacyMode),
     new OptionHandler(Flags.omitImplicitChecks, passThrough),
+    new OptionHandler(Flags.laxRuntimeTypeToString, passThrough),
     new OptionHandler(Flags.benchmarkingProduction, passThrough),
 
     // TODO(floitsch): remove conditional directives flag.
@@ -422,6 +435,17 @@
   if (enableColors != null) {
     diagnosticHandler.enableColors = enableColors;
   }
+
+  if (checkedMode && strongMode) {
+    checkedMode = false;
+    hints.add("Option '${Flags.enableCheckedMode}' is not needed in Dart 2.0.");
+  }
+
+  if (trustTypeAnnotations && strongMode) {
+    hints.add("Option '${Flags.trustTypeAnnotations}' is not available "
+        "in Dart 2.0. Try using '${Flags.omitImplicitChecks}' instead.");
+  }
+
   for (String hint in hints) {
     diagnosticHandler.info(hint, api.Diagnostic.HINT);
   }
@@ -438,20 +462,9 @@
     helpAndFail('Extra arguments: ${extra.join(" ")}');
   }
 
-  if (checkedMode && strongMode) {
-    checkedMode = false;
-    hints.add("Option '${Flags.enableCheckedMode}' is not needed in strong "
-        "mode.");
-  }
-
-  if (trustTypeAnnotations) {
-    if (checkedMode) {
-      helpAndFail("Option '${Flags.trustTypeAnnotations}' may not be used in "
-          "checked mode.");
-    } else if (strongMode) {
-      hints.add("Option '${Flags.trustTypeAnnotations}' is not available "
-          "in strong mode. Try using '${Flags.omitImplicitChecks}' instead.");
-    }
+  if (trustTypeAnnotations && checkedMode) {
+    helpAndFail("Option '${Flags.trustTypeAnnotations}' may not be used in "
+        "checked mode.");
   }
 
   if (packageRoot != null && packageConfig != null) {
@@ -504,8 +517,6 @@
 
   Uri script = currentDirectory.resolve(arguments[0]);
   diagnosticHandler.autoReadFileUri = true;
-  // TODO(sigmund): reenable hints (Issue #32111)
-  diagnosticHandler.showHints = showHints = false;
   CompilerOptions compilerOptions = CompilerOptions.parse(options,
       libraryRoot: libraryRoot, platformBinaries: platformBinaries)
     ..entryPoint = script
@@ -587,7 +598,6 @@
 
 Common options:
   -o <file> Generate the output into <file>.
-  -c        Insert runtime type checks and enable assertions (checked mode).
   -m        Generate minified output.
   -h        Display this message (add -v for information about all options).''');
 }
@@ -620,25 +630,10 @@
   --version
     Display version information.
 
-  -p<path>, --package-root=<path>
-    Where to find packages, that is, "package:..." imports.  This option cannot
-    be used with --packages.
-
   --packages=<path>
     Path to the package resolution configuration file, which supplies a mapping
     of package names to paths.  This option cannot be used with --package-root.
 
-  --analyze-all
-    Analyze all code.  Without this option, the compiler only analyzes
-    code that is reachable from [main].  This option implies --analyze-only.
-
-  --analyze-only
-    Analyze but do not generate code.
-
-  --analyze-signatures-only
-    Skip analysis of method bodies and field initializers. This option implies
-    --analyze-only.
-
   --suppress-warnings
     Do not display any warnings.
 
@@ -668,14 +663,14 @@
   --fast-startup
     Produce JavaScript that can be parsed more quickly by VMs. This option
     usually results in larger JavaScript files with faster startup.
-    Note: the dart:mirrors library is not supported with this option.
 
-  --preview-dart-2
-    Preview of all Dart 2.0 semantics, this includes generic methods and strong
-    mode type checks.
+  --no-preview-dart-2
+    Temporarily revert to Dart 1.0 semantics.
 
-    This flag is mainly for early dogfooding and will be removed when all
-    features are shipped.
+    By default dart2js compiles programs in Dart 2.0 semantics, which includes
+    generic methods and strong mode type checks. Since apps may have additional
+    checks that fail at runtime, this temporary flag may help in the migration
+    process. See also '--omit-implicit-checks'.
 
 The following advanced options can help reduce the size of the generated code,
 but they may cause programs to behave unexpectedly if assumptions are not met.
@@ -684,7 +679,7 @@
 
   --omit-implicit-checks
     Omit implicit runtime checks, such as parameter checks and implicit
-    downcasts. These checks are included by default in strong mode. By
+    downcasts. These checks are included by default in Dart 2.0. By
     using this flag the checks are removed, however the compiler will assume
     that all such checks were valid and may use this information for
     optimizations. Use this option only if you have enough testing to ensure
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 0bd3e70..496e9aa 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -215,6 +215,7 @@
   INVALID_CONSTANT_COMPLEMENT_TYPE,
   INVALID_CONSTANT_CONDITIONAL_TYPE,
   INVALID_CONSTANT_CONSTRUCTOR,
+  INVALID_CONSTANT_DIV,
   INVALID_CONSTANT_INDEX,
   INVALID_CONSTANT_INTERPOLATION_TYPE,
   INVALID_CONSTANT_NEGATE_TYPE,
@@ -222,6 +223,7 @@
   INVALID_CONSTANT_NUM_ADD_TYPE,
   INVALID_CONSTANT_STRING_ADD_TYPE,
   INVALID_CONSTANT_STRING_LENGTH_TYPE,
+  INVALID_CONSTANT_SHIFT,
   INVALID_CONSTRUCTOR_ARGUMENTS,
   INVALID_CONSTRUCTOR_NAME,
   INVALID_CONTINUE,
@@ -3501,6 +3503,15 @@
           "`#{constant}` of type '#{type}' is not a valid operand for a "
           ".length expression. Must be a value of type 'String'."),
 
+      MessageKind.INVALID_CONSTANT_SHIFT: const MessageTemplate(
+          MessageKind.INVALID_CONSTANT_SHIFT,
+          "Shift amount must be non-negative in "
+          "`#{left} #{operator} #{right}`."),
+
+      MessageKind.INVALID_CONSTANT_DIV: const MessageTemplate(
+          MessageKind.INVALID_CONSTANT_DIV,
+          "Divisor must be non-zero in `#{left} #{operator} #{right}`."),
+
       MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE: const MessageTemplate(
           MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE,
           "`#{constant}` of type '#{type}' is not a valid operand of a "
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index bacfc5e..a8164c0 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -409,7 +409,8 @@
             compiler.backendStrategy.sourceInformationStrategy,
         constantCompilerTask = new JavaScriptConstantTask(compiler) {
     CommonElements commonElements = compiler.frontendStrategy.commonElements;
-    _backendUsageBuilder = new BackendUsageBuilderImpl(commonElements);
+    _backendUsageBuilder =
+        new BackendUsageBuilderImpl(compiler.frontendStrategy);
     _checkedModeHelpers = new CheckedModeHelpers();
     emitter =
         new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter);
@@ -799,6 +800,7 @@
         closedWorld.nativeData,
         closedWorld.elementEnvironment,
         closedWorld.commonElements,
+        closedWorld.rtiNeed,
         strongMode: compiler.options.strongMode);
     emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter);
     // TODO(johnniwinther): Share the impact object created in
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 90bc21f..9adf701 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -720,9 +720,12 @@
   BackendImpact _noSuchMethodSupport;
 
   BackendImpact get noSuchMethodSupport {
-    return _noSuchMethodSupport ??= new BackendImpact(
-        staticUses: [_commonElements.createInvocationMirror],
-        dynamicUses: [Selectors.noSuchMethod_]);
+    return _noSuchMethodSupport ??= new BackendImpact(staticUses: [
+      _commonElements.createInvocationMirror,
+      _commonElements.createUnmangledInvocationMirror
+    ], dynamicUses: [
+      Selectors.noSuchMethod_
+    ]);
   }
 
   BackendImpact _loadLibrary;
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 7e2065e..3b7503c 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -6,6 +6,8 @@
 import '../common_elements.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../frontend_strategy.dart';
+import '../universe/feature.dart';
 import '../util/util.dart' show Setlet;
 import 'backend_impact.dart';
 
@@ -26,6 +28,8 @@
 
   Iterable<ClassEntity> get helperClassesUsed;
 
+  Iterable<RuntimeTypeUse> get runtimeTypeUses;
+
   /// `true` if a core-library function requires the preamble file to function.
   bool get requiresPreamble;
 
@@ -71,8 +75,8 @@
 
   void registerUsedMember(MemberEntity member);
 
-  /// `true` of `Object.runtimeType` is used.
-  bool isRuntimeTypeUsed;
+  /// Register use of `runtimeType`.
+  void registerRuntimeTypeUse(RuntimeTypeUse runtimeTypeUse);
 
   /// `true` if `Function.apply` is used.
   bool isFunctionApplyUsed;
@@ -84,7 +88,7 @@
 }
 
 class BackendUsageBuilderImpl implements BackendUsageBuilder {
-  final CommonElements _commonElements;
+  FrontendStrategy _frontendStrategy;
   // TODO(johnniwinther): Remove the need for these.
   Setlet<FunctionEntity> _globalFunctionDependencies;
   Setlet<ClassEntity> _globalClassDependencies;
@@ -95,6 +99,8 @@
   /// List of classes that the backend may use.
   final Set<ClassEntity> _helperClassesUsed = new Set<ClassEntity>();
 
+  final Set<RuntimeTypeUse> _runtimeTypeUses = new Set<RuntimeTypeUse>();
+
   bool _needToInitializeIsolateAffinityTag = false;
   bool _needToInitializeDispatchProperty = false;
 
@@ -104,9 +110,6 @@
   /// `true` if [CommonElements.invokeOnMethod] is used.
   bool isInvokeOnUsed = false;
 
-  /// `true` of `Object.runtimeType` is used.
-  bool isRuntimeTypeUsed = false;
-
   /// `true` if `Function.apply` is used.
   bool isFunctionApplyUsed = false;
 
@@ -116,43 +119,34 @@
   /// `true` if `noSuchMethod` is used.
   bool isNoSuchMethodUsed = false;
 
-  BackendUsageBuilderImpl(this._commonElements);
+  BackendUsageBuilderImpl(this._frontendStrategy);
+
+  CommonElements get _commonElements => _frontendStrategy.commonElements;
 
   @override
   void registerBackendFunctionUse(FunctionEntity element) {
-    assert(_isValidBackendUse(element),
+    assert(_isValidBackendUse(element, element.library),
         failedAt(element, "Backend use of $element is not allowed."));
     _helperFunctionsUsed.add(element);
   }
 
   @override
   void registerBackendClassUse(ClassEntity element) {
-    assert(_isValidBackendUse(element),
+    assert(_isValidBackendUse(element, element.library),
         failedAt(element, "Backend use of $element is not allowed."));
     _helperClassesUsed.add(element);
   }
 
-  bool _isValidBackendUse(Entity element) {
+  bool _isValidBackendUse(Entity element, LibraryEntity library) {
     if (_isValidEntity(element)) return true;
-    // TODO(redemption): Support these checks on kernel based elements:
-    /*if (element is Element) {
-      assert(element.isDeclaration,
-          failedAt(element, "Backend use $element must be the declaration."));
-      if (element.implementationLibrary.isPatch ||
-          // Needed to detect deserialized injected elements, that is
-          // element declared in patch files.
-          (element.library.isPlatformLibrary &&
-              element.sourcePosition.uri.path
-                  .contains('_internal/js_runtime/lib/')) ||
-          element.library == _commonElements.jsHelperLibrary ||
-          element.library == _commonElements.interceptorsLibrary) {
-        // TODO(johnniwinther): We should be more precise about these.
-        return true;
-      } else {
-        return false;
-      }
-    }*/
-    return true;
+    SourceSpan span = _frontendStrategy.spanFromSpannable(element, element);
+    if (library.canonicalUri.scheme == 'dart' &&
+        span.uri.path.contains('_internal/js_runtime/lib/')) {
+      // TODO(johnniwinther): We should be more precise about these.
+      return true;
+    } else {
+      return false;
+    }
   }
 
   bool _isValidEntity(Entity element) {
@@ -258,6 +252,11 @@
     _globalClassDependencies.add(element);
   }
 
+  @override
+  void registerRuntimeTypeUse(RuntimeTypeUse runtimeTypeUse) {
+    _runtimeTypeUses.add(runtimeTypeUse);
+  }
+
   BackendUsage close() {
     return new BackendUsageImpl(
         globalFunctionDependencies: _globalFunctionDependencies,
@@ -268,7 +267,7 @@
         needToInitializeDispatchProperty: _needToInitializeDispatchProperty,
         requiresPreamble: requiresPreamble,
         isInvokeOnUsed: isInvokeOnUsed,
-        isRuntimeTypeUsed: isRuntimeTypeUsed,
+        runtimeTypeUses: _runtimeTypeUses,
         isFunctionApplyUsed: isFunctionApplyUsed,
         isMirrorsUsed: isMirrorsUsed,
         isNoSuchMethodUsed: isNoSuchMethodUsed);
@@ -286,6 +285,8 @@
   /// Set of classes instantiated by the backend.
   final Set<ClassEntity> _helperClassesUsed;
 
+  final Set<RuntimeTypeUse> _runtimeTypeUses;
+
   bool needToInitializeIsolateAffinityTag;
   bool needToInitializeDispatchProperty;
 
@@ -295,9 +296,6 @@
   /// `true` if [CommonElements.invokeOnMethod] is used.
   final bool isInvokeOnUsed;
 
-  /// `true` of `Object.runtimeType` is used.
-  final bool isRuntimeTypeUsed;
-
   /// `true` if `Function.apply` is used.
   final bool isFunctionApplyUsed;
 
@@ -316,14 +314,15 @@
       this.needToInitializeDispatchProperty,
       this.requiresPreamble,
       this.isInvokeOnUsed,
-      this.isRuntimeTypeUsed,
+      Set<RuntimeTypeUse> runtimeTypeUses,
       this.isFunctionApplyUsed,
       this.isMirrorsUsed,
       this.isNoSuchMethodUsed})
       : this._globalFunctionDependencies = globalFunctionDependencies,
         this._globalClassDependencies = globalClassDependencies,
         this._helperFunctionsUsed = helperFunctionsUsed,
-        this._helperClassesUsed = helperClassesUsed;
+        this._helperClassesUsed = helperClassesUsed,
+        this._runtimeTypeUses = runtimeTypeUses;
 
   @override
   bool isFunctionUsedByBackend(FunctionEntity element) {
@@ -347,4 +346,10 @@
 
   @override
   Iterable<ClassEntity> get helperClassesUsed => _helperClassesUsed;
+
+  @override
+  bool get isRuntimeTypeUsed => _runtimeTypeUses.isNotEmpty;
+
+  @override
+  Iterable<RuntimeTypeUse> get runtimeTypeUses => _runtimeTypeUses;
 }
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 8d6506d..a438262 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -233,6 +233,14 @@
           .registerTypeUse(new TypeUse.instantiation(listLiteralUse.type));
     }
 
+    for (RuntimeTypeUse runtimeTypeUse in worldImpact.runtimeTypeUses) {
+      // Enable runtime type support if we discover a getter called
+      // runtimeType. We have to enable runtime type before hitting the
+      // codegen, so that constructors know whether they need to generate code
+      // for runtime type.
+      _backendUsageBuilder.registerRuntimeTypeUse(runtimeTypeUse);
+    }
+
     if (worldImpact.constSymbolNames.isNotEmpty) {
       registerImpact(_impacts.constSymbol);
     }
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index f46723a..c1b2cac 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -285,6 +285,10 @@
     }
     _backendUsage.registerUsedMember(member);
 
+    if (_commonElements.isCreateInvocationMirrorHelper(member)) {
+      _registerBackendImpact(worldImpact, _impacts.noSuchMethodSupport);
+    }
+
     if (_elementEnvironment.isDeferredLoadLibraryGetter(member)) {
       // TODO(sigurdm): Create a function registerLoadLibraryAccess.
       if (!_isLoadLibraryFunctionResolved) {
@@ -298,7 +302,6 @@
       // runtimeType. We have to enable runtime type before hitting the
       // codegen, so that constructors know whether they need to generate code
       // for runtime type.
-      _backendUsage.isRuntimeTypeUsed = true;
       // TODO(ahe): Record precise dependency here.
       worldImpact.addImpact(_registerRuntimeType());
     }
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 332926b..a449b52 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -16,7 +16,7 @@
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
-import '../world.dart' show JClosedWorld, KClosedWorld;
+import '../world.dart' show ClassQuery, JClosedWorld, KClosedWorld;
 import 'backend_usage.dart';
 import 'namer.dart';
 import 'native_data.dart';
@@ -86,17 +86,12 @@
   ///
   bool methodNeedsSignature(FunctionEntity method);
 
-  /// Returns `true` if a signature is needed for the call-method created for
-  /// [localFunction].
-  ///
-  /// See [methodNeedsSignature] for more information on what a signature is
-  /// and when it is needed.
-  bool localFunctionNeedsSignature(Local localFunction);
-
   /// Returns `true` if a dynamic call of [selector] needs to pass type
   /// arguments.
   bool selectorNeedsTypeArguments(Selector selector);
 
+  bool get runtimeTypeUsedOnClosures;
+
   /// Returns `true` if a generic instantiation on an expression of type
   /// [functionType] with the given [typeArgumentCount] needs to pass type
   /// arguments.
@@ -112,9 +107,6 @@
   bool classNeedsTypeArguments(ClassEntity cls) => true;
 
   @override
-  bool localFunctionNeedsSignature(Local localFunction) => true;
-
-  @override
   bool methodNeedsSignature(FunctionEntity method) => true;
 
   @override
@@ -127,6 +119,9 @@
   bool selectorNeedsTypeArguments(Selector selector) => true;
 
   @override
+  bool get runtimeTypeUsedOnClosures => true;
+
+  @override
   bool instantiationNeedsTypeArguments(
       DartType functionType, int typeArgumentCount) {
     return true;
@@ -719,7 +714,6 @@
 
 class RuntimeTypesNeedImpl implements RuntimeTypesNeed {
   final ElementEnvironment _elementEnvironment;
-  final BackendUsage _backendUsage;
   final Set<ClassEntity> classesNeedingTypeArguments;
   final Set<FunctionEntity> methodsNeedingSignature;
   final Set<FunctionEntity> methodsNeedingTypeArguments;
@@ -727,54 +721,45 @@
   final Set<Local> localFunctionsNeedingTypeArguments;
   final Set<Selector> selectorsNeedingTypeArguments;
   final Set<int> instantiationsNeedingTypeArguments;
+  // TODO(johnniwinther): Remove these fields together with Dart 1.
+  final bool allNeedsTypeArguments;
+  final bool runtimeTypeUsedOnClosures;
 
   RuntimeTypesNeedImpl(
       this._elementEnvironment,
-      this._backendUsage,
       this.classesNeedingTypeArguments,
       this.methodsNeedingSignature,
       this.methodsNeedingTypeArguments,
       this.localFunctionsNeedingSignature,
       this.localFunctionsNeedingTypeArguments,
       this.selectorsNeedingTypeArguments,
-      this.instantiationsNeedingTypeArguments);
+      this.instantiationsNeedingTypeArguments,
+      {this.allNeedsTypeArguments,
+      this.runtimeTypeUsedOnClosures});
 
   bool checkClass(covariant ClassEntity cls) => true;
 
   bool classNeedsTypeArguments(ClassEntity cls) {
     assert(checkClass(cls));
     if (!_elementEnvironment.isGenericClass(cls)) return false;
-    if (_backendUsage.isRuntimeTypeUsed) return true;
+    if (allNeedsTypeArguments) return true;
     return classesNeedingTypeArguments.contains(cls);
   }
 
   bool methodNeedsSignature(FunctionEntity function) {
-    return _backendUsage.isRuntimeTypeUsed ||
-        methodsNeedingSignature.contains(function);
+    return allNeedsTypeArguments || methodsNeedingSignature.contains(function);
   }
 
   bool methodNeedsTypeArguments(FunctionEntity function) {
     if (function.parameterStructure.typeParameters == 0) return false;
-    if (_backendUsage.isRuntimeTypeUsed) return true;
+    if (allNeedsTypeArguments) return true;
     return methodsNeedingTypeArguments.contains(function);
   }
 
-  bool localFunctionNeedsSignature(Local function) {
-    // This function should not be called when the compiler is using the new FE
-    // (--use-kernel). As an invariant, localFunctionsNeedingSignature is always
-    // null when --use-kernel is true.
-    if (localFunctionsNeedingSignature == null) {
-      throw new UnsupportedError(
-          'RuntimeTypesNeed.localFunctionNeedingSignature with --use-kernel');
-    }
-    return _backendUsage.isRuntimeTypeUsed ||
-        localFunctionsNeedingSignature.contains(function);
-  }
-
   @override
   bool selectorNeedsTypeArguments(Selector selector) {
     if (selector.callStructure.typeArgumentCount == 0) return false;
-    if (_backendUsage.isRuntimeTypeUsed) return true;
+    if (allNeedsTypeArguments) return true;
     return selectorsNeedingTypeArguments.contains(selector);
   }
 
@@ -1642,6 +1627,135 @@
       }
     }
 
+    bool allNeedsTypeArguments;
+    bool runtimeTypeUsedOnClosures;
+    BackendUsage backendUsage = closedWorld.backendUsage;
+    CommonElements commonElements = closedWorld.commonElements;
+    if (!options.strongMode) {
+      allNeedsTypeArguments =
+          runtimeTypeUsedOnClosures = backendUsage.isRuntimeTypeUsed;
+    } else {
+      allNeedsTypeArguments = runtimeTypeUsedOnClosures = false;
+
+      /// Set to `true` if subclasses of `Object` need runtimeType. This is
+      /// only used to stop the computation early.
+      bool neededOnAll = false;
+
+      /// Set to `true` if subclasses of `Function` need runtimeType.
+      bool neededOnFunctions = false;
+
+      Set<ClassEntity> classesDirectlyNeedingRuntimeType =
+          new Set<ClassEntity>();
+
+      ClassEntity impliedClass(DartType type) {
+        if (type is InterfaceType) {
+          return type.element;
+        } else if (type is DynamicType) {
+          return commonElements.objectClass;
+        } else if (type is FunctionType) {
+          // TODO(johnniwinther): Include only potential function type subtypes.
+          return commonElements.functionClass;
+        } else if (type is VoidType) {
+          // No classes implied.
+        } else if (type is FunctionTypeVariable) {
+          return impliedClass(type.bound);
+        } else if (type is TypeVariableType) {
+          // TODO(johnniwinther): Can we do better?
+          return impliedClass(
+              _elementEnvironment.getTypeVariableBound(type.element));
+        }
+        throw new UnsupportedError('Unexpected type $type');
+      }
+
+      void addClass(ClassEntity cls) {
+        if (cls != null) {
+          classesDirectlyNeedingRuntimeType.add(cls);
+        }
+        if (cls == commonElements.objectClass) {
+          neededOnAll = true;
+        }
+        if (cls == commonElements.functionClass) {
+          neededOnFunctions = true;
+        }
+      }
+
+      for (RuntimeTypeUse runtimeTypeUse in backendUsage.runtimeTypeUses) {
+        switch (runtimeTypeUse.kind) {
+          case RuntimeTypeUseKind.string:
+            if (!options.laxRuntimeTypeToString) {
+              addClass(impliedClass(runtimeTypeUse.receiverType));
+            }
+
+            break;
+          case RuntimeTypeUseKind.equals:
+            ClassEntity receiverClass =
+                impliedClass(runtimeTypeUse.receiverType);
+            ClassEntity argumentClass =
+                impliedClass(runtimeTypeUse.argumentType);
+
+            // TODO(johnniwinther): Special case use of `this.runtimeType`.
+            if (closedWorld.isSubtypeOf(receiverClass, argumentClass)) {
+              addClass(receiverClass);
+            } else if (closedWorld.isSubtypeOf(argumentClass, receiverClass)) {
+              addClass(argumentClass);
+            }
+            if (neededOnAll) break;
+            // TODO(johnniwinther): Special case use of `this.runtimeType`.
+            // TODO(johnniwinther): Rename [commonSubclasses] to something like
+            // [strictCommonClasses] and support the non-strict case directly.
+            // Since we do a subclassesOf
+            classesDirectlyNeedingRuntimeType.addAll(
+                closedWorld.commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
+                    argumentClass, ClassQuery.SUBTYPE));
+            break;
+          case RuntimeTypeUseKind.unknown:
+            addClass(impliedClass(runtimeTypeUse.receiverType));
+            break;
+        }
+        if (neededOnAll) break;
+      }
+      Set<ClassEntity> allClassesNeedingRuntimeType;
+      if (neededOnAll) {
+        neededOnFunctions = true;
+        allClassesNeedingRuntimeType =
+            closedWorld.subclassesOf(commonElements.objectClass).toSet();
+      } else {
+        allClassesNeedingRuntimeType = new Set<ClassEntity>();
+        // TODO(johnniwinther): Support this operation directly in
+        // [ClosedWorld] using the [ClassSet]s.
+        for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
+          if (!allClassesNeedingRuntimeType.contains(cls)) {
+            allClassesNeedingRuntimeType.addAll(closedWorld.subtypesOf(cls));
+          }
+        }
+      }
+      allClassesNeedingRuntimeType.forEach(potentiallyNeedTypeArguments);
+      if (neededOnFunctions) {
+        for (Local function in resolutionWorldBuilder.genericLocalFunctions) {
+          potentiallyNeedTypeArguments(function);
+        }
+        for (Local function in localFunctions) {
+          FunctionType functionType =
+              _elementEnvironment.getLocalFunctionType(function);
+          functionType.forEachTypeVariable((TypeVariableType typeVariable) {
+            Entity typeDeclaration = typeVariable.element.typeDeclaration;
+            if (!processedEntities.contains(typeDeclaration)) {
+              potentiallyNeedTypeArguments(typeDeclaration);
+            }
+          });
+          localFunctionsNeedingSignature.addAll(localFunctions);
+        }
+        for (FunctionEntity function in resolutionWorldBuilder.genericMethods) {
+          potentiallyNeedTypeArguments(function);
+        }
+        for (FunctionEntity function
+            in resolutionWorldBuilder.closurizedMembersWithFreeTypeVariables) {
+          methodsNeedingSignature.add(function);
+          potentiallyNeedTypeArguments(function.enclosingClass);
+        }
+      }
+    }
+
     Set<Selector> selectorsNeedingTypeArguments = new Set<Selector>();
     typeVariableTests
         .forEachAppliedSelector((Selector selector, Set<Entity> targets) {
@@ -1708,18 +1822,21 @@
     print('selectorsNeedingTypeArguments:');
     selectorsNeedingTypeArguments.forEach((e) => print('  $e'));
     print('instantiationsNeedingTypeArguments: '
-        '$instantiationsNeedingTypeArguments');*/
+        '$instantiationsNeedingTypeArguments');
+    print('allNeedsTypeArguments=$allNeedsTypeArguments');
+    print('runtimeTypeUsedOnClosures=$runtimeTypeUsedOnClosures');*/
 
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
-        closedWorld.backendUsage,
         classesNeedingTypeArguments,
         methodsNeedingSignature,
         methodsNeedingTypeArguments,
         localFunctionsNeedingSignature,
         localFunctionsNeedingTypeArguments,
         selectorsNeedingTypeArguments,
-        instantiationsNeedingTypeArguments);
+        instantiationsNeedingTypeArguments,
+        allNeedsTypeArguments: allNeedsTypeArguments,
+        runtimeTypeUsedOnClosures: runtimeTypeUsedOnClosures);
   }
 }
 
@@ -1873,8 +1990,14 @@
     //
     // In Dart 2, a closure class implements the function type of its `call`
     // method and needs a signature function for testing its function type
-    // against typedefs and function types that are used in is-checks.
-    if (isFunctionChecked || checkedFunctionTypes.isNotEmpty) {
+    // against typedefs and function types that are used in is-checks. Since
+    // closures have a signature method iff they need it and should have a
+    // function type iff they have a signature, we process all classes. We know
+    // that the function type is not inherited, so we don't need to process
+    // their super classes.
+    if (isFunctionChecked ||
+        checkedFunctionTypes.isNotEmpty ||
+        options.strongMode) {
       Set<ClassEntity> processedClasses = new Set<ClassEntity>();
 
       void processClass(ClassEntity cls) {
@@ -1903,7 +2026,11 @@
           liveClasses.add(cls);
         }
       });
-      liveClasses.forEach(processSuperClasses);
+      if (options.strongMode) {
+        liveClasses.forEach(processClass);
+      } else {
+        liveClasses.forEach(processSuperClasses);
+      }
     }
 
     if (options.parameterCheckPolicy.isEmitted) {
@@ -1931,13 +2058,13 @@
 /// In Dart 1, any class with a `call` method has a function type, in Dart 2
 /// only closure classes have a function type.
 ClassFunctionType _computeFunctionType(
-    ElementEnvironment _elementEnvironment, ClassEntity cls,
+    ElementEnvironment elementEnvironment, ClassEntity cls,
     {bool strongMode}) {
   FunctionEntity signatureFunction;
   if (cls.isClosure) {
     // Use signature function if available.
     signatureFunction =
-        _elementEnvironment.lookupLocalClassMember(cls, Identifiers.signature);
+        elementEnvironment.lookupLocalClassMember(cls, Identifiers.signature);
     if (signatureFunction == null && strongMode) {
       // In Dart 2, a closure only needs its function type if it has a
       // signature function.
@@ -1948,10 +2075,10 @@
     return null;
   }
   MemberEntity call =
-      _elementEnvironment.lookupLocalClassMember(cls, Identifiers.call);
+      elementEnvironment.lookupLocalClassMember(cls, Identifiers.call);
   if (call != null && call.isFunction) {
     FunctionEntity callFunction = call;
-    FunctionType callType = _elementEnvironment.getFunctionType(callFunction);
+    FunctionType callType = elementEnvironment.getFunctionType(callFunction);
     return new ClassFunctionType(callFunction, callType, signatureFunction);
   }
   return null;
@@ -1962,9 +2089,11 @@
   final ElementEnvironment _elementEnvironment;
   final CommonElements commonElements;
   final TypeRepresentationGenerator _representationGenerator;
+  final RuntimeTypesNeed _rtiNeed;
 
   RuntimeTypesEncoderImpl(this.namer, NativeBasicData nativeData,
-      this._elementEnvironment, this.commonElements, {bool strongMode})
+      this._elementEnvironment, this.commonElements, this._rtiNeed,
+      {bool strongMode})
       : _representationGenerator = new TypeRepresentationGenerator(
             namer, nativeData,
             strongMode: strongMode);
@@ -2068,7 +2197,16 @@
     ClassEntity contextClass = DartTypes.getClassContext(type);
     jsAst.Expression encoding =
         getTypeEncoding(emitter, type, alwaysGenerateFunction: true);
-    if (contextClass != null) {
+    if (contextClass != null &&
+        // We only generate folding using 'computeSignature' if [contextClass]
+        // has reified type arguments. The 'computeSignature' function might not
+        // be emitted (if it's not needed elsewhere) and the generated signature
+        // will have `undefined` as its type variables in any case.
+        //
+        // This is needed specifically for --lax-runtime-type-to-string which
+        // may require a signature on a method that uses class type variables
+        // while at the same time not needing type arguments on the class.
+        _rtiNeed.classNeedsTypeArguments(contextClass)) {
       jsAst.Name contextName = namer.className(contextClass);
       return js('function () { return #(#, #, #); }', [
         emitter.staticFunctionAccess(commonElements.computeSignature),
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 34a538d..407b49e 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -1695,6 +1695,9 @@
     if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
     if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
     if (compiler.options.omitImplicitChecks) flavor.write(', omit checks');
+    if (compiler.options.laxRuntimeTypeToString) {
+      flavor.write(', lax runtime type');
+    }
     if (compiler.options.useContentSecurityPolicy) flavor.write(', CSP');
     if (_closedWorld.backendUsage.isMirrorsUsed) flavor.write(', mirrors');
     return new jsAst.Comment(generatedBy(compiler, flavor: '$flavor'));
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index f57321e..edda727 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -226,6 +226,9 @@
     if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
     if (compiler.options.trustTypeAnnotations) flavor.write(', trust types');
     if (compiler.options.omitImplicitChecks) flavor.write(', omit checks');
+    if (compiler.options.laxRuntimeTypeToString) {
+      flavor.write(', lax runtime type');
+    }
     if (compiler.options.useContentSecurityPolicy) flavor.write(', CSP');
     return new js.Comment(generatedBy(compiler, flavor: '$flavor'));
   }
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 2641d69..5f2a4a1 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -92,7 +92,7 @@
 
 abstract class JsToFrontendMapBase extends JsToFrontendMap {
   DartType toBackendType(DartType type) =>
-      const TypeConverter().visit(type, _toBackendEntity);
+      type == null ? null : const TypeConverter().visit(type, _toBackendEntity);
 
   Entity _toBackendEntity(Entity entity) {
     if (entity is ClassEntity) return toBackendClass(entity);
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index e1779e6..6b68731 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -44,6 +44,7 @@
 import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
 import '../universe/class_set.dart';
+import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
 import '../world.dart';
@@ -202,7 +203,7 @@
       NativeBasicData nativeBasicData,
       JClosedWorld closedWorld,
       SelectorConstraintsStrategy selectorConstraintsStrategy) {
-    return new KernelCodegenWorldBuilder(
+    return new CodegenWorldBuilderImpl(
         elementMap,
         _globalLocalsMap,
         closedWorld.elementEnvironment,
@@ -348,11 +349,12 @@
           this,
           map.toBackendMemberMap(closureModels, identity),
           new JsClosureRtiNeed(
-            backendUsage,
-            jRtiNeed,
-            localFunctionsNodesNeedingTypeArguments,
-            localFunctionsNodesNeedingSignature,
-          ));
+              jRtiNeed,
+              localFunctionsNodesNeedingTypeArguments,
+              localFunctionsNodesNeedingSignature,
+              runtimeTypeUsedOnClosures:
+                  kernelRtiNeed.runtimeTypeUsedOnClosures,
+              allNeedsTypeArguments: kernelRtiNeed.allNeedsTypeArguments));
 
       List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
       for (ir.Node node in localFunctionsNodesNeedingSignature) {
@@ -416,6 +418,14 @@
         map.toBackendFunctionSet(backendUsage.helperFunctionsUsed);
     Set<ClassEntity> helperClassesUsed =
         map.toBackendClassSet(backendUsage.helperClassesUsed);
+    Set<RuntimeTypeUse> runtimeTypeUses =
+        backendUsage.runtimeTypeUses.map((RuntimeTypeUse runtimeTypeUse) {
+      return new RuntimeTypeUse(
+          runtimeTypeUse.kind,
+          map.toBackendType(runtimeTypeUse.receiverType),
+          map.toBackendType(runtimeTypeUse.argumentType));
+    }).toSet();
+
     return new BackendUsageImpl(
         globalFunctionDependencies: globalFunctionDependencies,
         globalClassDependencies: globalClassDependencies,
@@ -427,7 +437,7 @@
             backendUsage.needToInitializeDispatchProperty,
         requiresPreamble: backendUsage.requiresPreamble,
         isInvokeOnUsed: backendUsage.isInvokeOnUsed,
-        isRuntimeTypeUsed: backendUsage.isRuntimeTypeUsed,
+        runtimeTypeUses: runtimeTypeUses,
         isFunctionApplyUsed: backendUsage.isFunctionApplyUsed,
         isMirrorsUsed: backendUsage.isMirrorsUsed,
         isNoSuchMethodUsed: backendUsage.isNoSuchMethodUsed);
@@ -565,14 +575,15 @@
     }).toSet();
     return new RuntimeTypesNeedImpl(
         _elementEnvironment,
-        backendUsage,
         classesNeedingTypeArguments,
         methodsNeedingSignature,
         methodsNeedingTypeArguments,
         null,
         null,
         selectorsNeedingTypeArguments,
-        rtiNeed.instantiationsNeedingTypeArguments);
+        rtiNeed.instantiationsNeedingTypeArguments,
+        allNeedsTypeArguments: rtiNeed.allNeedsTypeArguments,
+        runtimeTypeUsedOnClosures: rtiNeed.runtimeTypeUsedOnClosures);
   }
 
   /// Construct a closure class and set up the necessary class inference
@@ -854,23 +865,21 @@
 }
 
 class JsClosureRtiNeed implements ClosureRtiNeed {
-  final BackendUsage backendUsage;
   final RuntimeTypesNeed rtiNeed;
   final Set<ir.Node> localFunctionsNodesNeedingTypeArguments;
   final Set<ir.Node> localFunctionsNodesNeedingSignature;
+  final bool runtimeTypeUsedOnClosures;
+  final bool allNeedsTypeArguments;
 
-  JsClosureRtiNeed(
-      this.backendUsage,
-      this.rtiNeed,
-      this.localFunctionsNodesNeedingTypeArguments,
-      this.localFunctionsNodesNeedingSignature);
+  JsClosureRtiNeed(this.rtiNeed, this.localFunctionsNodesNeedingTypeArguments,
+      this.localFunctionsNodesNeedingSignature,
+      {this.runtimeTypeUsedOnClosures, this.allNeedsTypeArguments});
 
   @override
   bool localFunctionNeedsSignature(ir.Node node) {
     assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return backendUsage.isRuntimeTypeUsed
-        ? true
-        : localFunctionsNodesNeedingSignature.contains(node);
+    return runtimeTypeUsedOnClosures ||
+        localFunctionsNodesNeedingSignature.contains(node);
   }
 
   @override
@@ -884,9 +893,8 @@
   @override
   bool localFunctionNeedsTypeArguments(ir.Node node) {
     assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return backendUsage.isRuntimeTypeUsed
-        ? true
-        : localFunctionsNodesNeedingTypeArguments.contains(node);
+    return allNeedsTypeArguments ||
+        localFunctionsNodesNeedingTypeArguments.contains(node);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 462ba79..71a8c15 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -4,12 +4,13 @@
 
 library compiler.src.kernel.dart2js_target;
 
-import 'package:kernel/kernel.dart';
+import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/target/targets.dart';
 
 import '../native/native.dart' show maybeEnableNative;
+import '../universe/selector.dart';
 
 /// A kernel [Target] to configure the Dart Front End for dart2js.
 class Dart2jsTarget extends Target {
@@ -20,6 +21,8 @@
 
   bool get strongMode => flags.strongMode;
 
+  bool get enableNoSuchMethodForwarders => flags.strongMode;
+
   List<String> get extraRequiredLibraries => _requiredLibraries[name];
 
   @override
@@ -40,23 +43,56 @@
 
   @override
   void performModularTransformationsOnLibraries(
-      CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
+      CoreTypes coreTypes, ClassHierarchy hierarchy, List<ir.Library> libraries,
       {void logger(String msg)}) {}
 
   @override
-  void performGlobalTransformations(CoreTypes coreTypes, Component component,
+  void performGlobalTransformations(CoreTypes coreTypes, ir.Component component,
       {void logger(String msg)}) {}
 
   @override
-  Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
-      String name, Arguments arguments, int offset, bool isSuper) {
-    // TODO(sigmund): implement;
-    return new InvalidExpression(null);
+  ir.Expression instantiateInvocation(
+      CoreTypes coreTypes,
+      ir.Expression receiver,
+      String name,
+      ir.Arguments arguments,
+      int offset,
+      bool isSuper) {
+    int kind;
+    if (name.startsWith('get:')) {
+      kind = Selector.invocationMirrorGetterKind;
+      name = name.substring(4);
+    } else if (name.startsWith('set:')) {
+      kind = Selector.invocationMirrorSetterKind;
+      name = name.substring(4);
+    } else {
+      kind = Selector.invocationMirrorMethodKind;
+    }
+    return new ir.StaticInvocation(
+        coreTypes.index
+            .getTopLevelMember('dart:core', '_createInvocationMirror'),
+        new ir.Arguments(<ir.Expression>[
+          new ir.StringLiteral(name)..fileOffset = offset,
+          new ir.ListLiteral(
+              arguments.types.map((t) => new ir.TypeLiteral(t)).toList()),
+          new ir.ListLiteral(arguments.positional)..fileOffset = offset,
+          new ir.MapLiteral(new List<ir.MapEntry>.from(
+              arguments.named.map((ir.NamedExpression arg) {
+            return new ir.MapEntry(
+                new ir.StringLiteral(arg.name)..fileOffset = arg.fileOffset,
+                arg.value)
+              ..fileOffset = arg.fileOffset;
+          })), keyType: coreTypes.stringClass.rawType)
+            ..isConst = (arguments.named.length == 0)
+            ..fileOffset = arguments.fileOffset,
+          new ir.IntLiteral(kind)..fileOffset = offset,
+        ]))
+      ..fileOffset = offset;
   }
 
   @override
-  Expression instantiateNoSuchMethodError(CoreTypes coreTypes,
-      Expression receiver, String name, Arguments arguments, int offset,
+  ir.Expression instantiateNoSuchMethodError(CoreTypes coreTypes,
+      ir.Expression receiver, String name, ir.Arguments arguments, int offset,
       {bool isMethod: false,
       bool isGetter: false,
       bool isSetter: false,
@@ -68,7 +104,7 @@
       bool isConstructor: false,
       bool isTopLevel: false}) {
     // TODO(sigmund): implement;
-    return new InvalidExpression(null);
+    return new ir.InvalidExpression(null);
   }
 }
 
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 128db95..7be52d1 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -93,8 +93,11 @@
   /// Returns the [Name] corresponding to [name].
   Name getName(ir.Name name);
 
-  /// Return `true` if [node] is the `dart:_foreign_helper` library.
-  bool isForeignLibrary(ir.Library node);
+  /// Return `true` if [member] is a "foreign helper", that is, a member whose
+  /// semantics is defined synthetically and not through Dart code.
+  ///
+  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
+  bool isForeignHelper(MemberEntity member);
 
   /// Computes the [native.NativeBehavior] for a call to the [JS] function.
   native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
@@ -563,3 +566,52 @@
           "Async marker ${node.asyncMarker} is not supported.");
   }
 }
+
+/// Kernel encodes a null-aware expression `a?.b` as
+///
+///     let final #1 = a in #1 == null ? null : #1.b
+///
+/// [getNullAwareExpression] recognizes such expressions storing the result in
+/// a [NullAwareExpression] object.
+///
+/// [syntheticVariable] holds the synthesized `#1` variable. [expression] holds
+/// the `#1.b` expression. [receiver] returns `a` expression. [parent] returns
+/// the parent of the let node, i.e. the parent node of the original null-aware
+/// expression. [let] returns the let node created for the encoding.
+class NullAwareExpression {
+  final ir.VariableDeclaration syntheticVariable;
+  final ir.Expression expression;
+
+  NullAwareExpression(this.syntheticVariable, this.expression);
+
+  ir.Expression get receiver => syntheticVariable.initializer;
+
+  ir.TreeNode get parent => syntheticVariable.parent.parent;
+
+  ir.Let get let => syntheticVariable.parent;
+
+  String toString() => let.toString();
+}
+
+NullAwareExpression getNullAwareExpression(ir.TreeNode node) {
+  if (node is ir.Let) {
+    ir.Expression body = node.body;
+    if (node.variable.name == null &&
+        node.variable.isFinal &&
+        body is ir.ConditionalExpression &&
+        body.condition is ir.MethodInvocation &&
+        body.then is ir.NullLiteral) {
+      ir.MethodInvocation invocation = body.condition;
+      ir.Expression receiver = invocation.receiver;
+      if (invocation.name.name == '==' &&
+          receiver is ir.VariableGet &&
+          receiver.variable == node.variable &&
+          invocation.arguments.positional.single is ir.NullLiteral) {
+        // We have
+        //   let #t1 = e0 in #t1 == null ? null : e1
+        return new NullAwareExpression(node.variable, body.otherwise);
+      }
+    }
+  }
+  return null;
+}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index e66871d..b2584d4 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -37,7 +37,6 @@
 import '../js_model/closure.dart';
 import '../js_model/elements.dart';
 import '../js_model/locals.dart';
-import '../native/enqueue.dart';
 import '../native/native.dart' as native;
 import '../native/resolver.dart';
 import '../options.dart';
@@ -1975,48 +1974,6 @@
   bool get enableAssertions => _elementMap.options.enableUserAssertions;
 }
 
-class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase {
-  final KernelToElementMapForImpactImpl elementMap;
-
-  KernelResolutionWorldBuilder(
-      CompilerOptions options,
-      this.elementMap,
-      NativeBasicData nativeBasicData,
-      NativeDataBuilder nativeDataBuilder,
-      InterceptorDataBuilder interceptorDataBuilder,
-      BackendUsageBuilder backendUsageBuilder,
-      RuntimeTypesNeedBuilder rtiNeedBuilder,
-      KAllocatorAnalysis allocatorAnalysis,
-      NativeResolutionEnqueuer nativeResolutionEnqueuer,
-      NoSuchMethodRegistry noSuchMethodRegistry,
-      SelectorConstraintsStrategy selectorConstraintsStrategy,
-      ClassHierarchyBuilder classHierarchyBuilder,
-      ClassQueries classQueries)
-      : super(
-            options,
-            elementMap.elementEnvironment,
-            elementMap.types,
-            elementMap.commonElements,
-            nativeBasicData,
-            nativeDataBuilder,
-            interceptorDataBuilder,
-            backendUsageBuilder,
-            rtiNeedBuilder,
-            allocatorAnalysis,
-            nativeResolutionEnqueuer,
-            noSuchMethodRegistry,
-            selectorConstraintsStrategy,
-            classHierarchyBuilder,
-            classQueries);
-
-  @override
-  void forEachLocalFunction(void f(MemberEntity member, Local localFunction)) {
-    for (KLocalFunction local in localFunctions) {
-      f(local.memberContext, local);
-    }
-  }
-}
-
 abstract class KernelClosedWorldMixin implements ClosedWorldBase {
   KernelToElementMapBase get elementMap;
 
@@ -2173,6 +2130,124 @@
     return _classSets[cls];
   }
 
+  // TODO(johnniwinther): Share the methods based on [ClassSet] and
+  // [ClassHierarchyNode] between KClosedWorld and JClosedWorld.
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = _classSets[y];
+    assert(classSet != null,
+        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
+    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
+    assert(classHierarchyNode != null,
+        failedAt(x, "No ClassHierarchyNode for $x"));
+    return classSet.hasSubtype(classHierarchyNode);
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet
+          .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+    }
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
+    ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
+    if (hierarchy == null) return const <ClassEntity>[];
+    return hierarchy
+        .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// _not_ including [cls].
+  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+          strict: true);
+    }
+  }
+
+  Iterable<ClassEntity> getInterfaces(ClassEntity cls) {
+    return elementMap._getInterfaces(cls).map((t) => t.element);
+  }
+
+  ClassEntity getSuperClass(ClassEntity cls) {
+    return elementMap._getSuperType(cls)?.element;
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] _not_ including [cls] itself.
+  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return const <ClassEntity>[];
+    return subclasses.subclassesByMask(
+        ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
+    if (xSubset == null) return null;
+    Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
+    if (ySubset == null) return null;
+    return xSubset.toSet().intersection(ySubset.toSet());
+  }
+
+  Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
+    switch (query) {
+      case ClassQuery.EXACT:
+        return null;
+      case ClassQuery.SUBCLASS:
+        return strictSubclassesOf(cls);
+      case ClassQuery.SUBTYPE:
+        return strictSubtypesOf(cls);
+    }
+    throw new ArgumentError('Unexpected query: $query.');
+  }
+
+  Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    // TODO(johnniwinther): Use [ClassSet] to compute this.
+    // Compute the set of classes that are contained in both class subsets.
+    Set<ClassEntity> common =
+        _commonContainedClasses(cls1, query1, cls2, query2);
+    if (common == null || common.isEmpty) return const <ClassEntity>[];
+    // Narrow down the candidates by only looking at common classes
+    // that do not have a superclass or supertype that will be a
+    // better candidate.
+    return common.where((ClassEntity each) {
+      bool containsSuperclass = common.contains(getSuperClass(each));
+      // If the superclass is also a candidate, then we don't want to
+      // deal with this class. If we're only looking for a subclass we
+      // know we don't have to look at the list of interfaces because
+      // they can never be in the common set.
+      if (containsSuperclass ||
+          query1 == ClassQuery.SUBCLASS ||
+          query2 == ClassQuery.SUBCLASS) {
+        return !containsSuperclass;
+      }
+      // Run through the direct supertypes of the class. If the common
+      // set contains the direct supertype of the class, we ignore the
+      // the class because the supertype is a better candidate.
+
+      for (ClassEntity interface in getInterfaces(each)) {
+        if (common.contains(interface)) return false;
+      }
+      return true;
+    });
+  }
+
   /// Applies [f] to each live class that implements [cls] _not_ including [cls]
   /// itself.
   void forEachStrictSubtypeOf(
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index d8c74cc..88c8a8c 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -104,9 +104,13 @@
     return new Selector.setter(name);
   }
 
-  /// Return `true` if [node] is the `dart:_foreign_helper` library.
-  bool isForeignLibrary(ir.Library node) {
-    return node.importUri == Uris.dart__foreign_helper;
+  /// Return `true` if [member] is a "foreign helper", that is, a member whose
+  /// semantics is defined synthetically and not through Dart code.
+  ///
+  /// Most foreign helpers are located in the `dart:_foreign_helper` library.
+  bool isForeignHelper(MemberEntity member) {
+    return member.library == commonElements.foreignLibrary ||
+        commonElements.isCreateInvocationMirrorHelper(member);
   }
 
   /// Looks up [typeName] for use in the spec-string of a `JS` call.
@@ -387,7 +391,7 @@
 
   /// Compute the kind of foreign helper function called by [node], if any.
   ForeignKind getForeignKind(ir.StaticInvocation node) {
-    if (isForeignLibrary(node.target.enclosingLibrary)) {
+    if (isForeignHelper(getMember(node.target))) {
       switch (node.target.name.name) {
         case JavaScriptBackend.JS:
           return ForeignKind.JS;
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index dcef78f..ec0511b 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -373,7 +373,8 @@
       }
     }
 
-    void addProcedures(ir.Class c, {bool includeStatic}) {
+    void addProcedures(ir.Class c,
+        {bool includeStatic, bool includeNoSuchMethodForwarders}) {
       for (ir.Procedure member in c.procedures) {
         if (member.isForwardingStub && member.isAbstract) {
           // Skip abstract forwarding stubs. These are never emitted but they
@@ -391,6 +392,9 @@
           continue;
         }
         if (!includeStatic && member.isStatic) continue;
+        if (!includeNoSuchMethodForwarders && member.isNoSuchMethodForwarder) {
+          continue;
+        }
         var name = member.name.name;
         assert(!name.contains('#'));
         if (member.kind == ir.ProcedureKind.Factory) {
@@ -424,13 +428,15 @@
     if (cls.mixedInClass != null) {
       elementMap.ensureClassMembers(cls.mixedInClass);
       addFields(cls.mixedInClass.mixin, includeStatic: false);
-      addProcedures(cls.mixedInClass.mixin, includeStatic: false);
+      addProcedures(cls.mixedInClass.mixin,
+          includeStatic: false, includeNoSuchMethodForwarders: false);
       mergeSort(members, compare: orderByFileOffset);
       mixinMemberCount = members.length;
     }
     addFields(cls, includeStatic: true);
     addConstructors(cls);
-    addProcedures(cls, includeStatic: true);
+    addProcedures(cls,
+        includeStatic: true, includeNoSuchMethodForwarders: true);
 
     if (isUnnamedMixinApplication && _constructorMap.isEmpty) {
       // Ensure that constructors are created for the superclass in case it
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index b595d81..19e2aa3 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -136,9 +136,12 @@
       SelectorConstraintsStrategy selectorConstraintsStrategy,
       ClassHierarchyBuilder classHierarchyBuilder,
       ClassQueries classQueries) {
-    return new KernelResolutionWorldBuilder(
+    return new ResolutionWorldBuilderImpl(
         _options,
         elementMap,
+        elementMap.elementEnvironment,
+        elementMap.types,
+        elementMap.commonElements,
         nativeBasicData,
         nativeDataBuilder,
         interceptorDataBuilder,
diff --git a/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart b/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
new file mode 100644
index 0000000..096c9b2
--- /dev/null
+++ b/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
@@ -0,0 +1,310 @@
+// 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:kernel/ast.dart' as ir;
+
+import '../common/names.dart';
+import '../elements/types.dart';
+import '../kernel/element_map.dart';
+import '../universe/feature.dart';
+
+/// Computes the [RuntimeTypeUse] corresponding to the `e.runtimeType` [node].
+RuntimeTypeUse computeRuntimeTypeUse(
+    KernelToElementMapForImpact elementMap, ir.PropertyGet node) {
+  /// Returns `true` if [node] is of the form `e.runtimeType`.
+  bool isGetRuntimeType(ir.TreeNode node) {
+    return node is ir.PropertyGet && node.name.name == Identifiers.runtimeType_;
+  }
+
+  /// Returns [node] if [node] is of the form `e.runtimeType` and `null`
+  /// otherwise.
+  ir.PropertyGet asGetRuntimeType(ir.TreeNode node) {
+    return isGetRuntimeType(node) ? node : null;
+  }
+
+  /// Returns `true` if [node] is of the form `e.toString()`.
+  bool isInvokeToString(ir.TreeNode node) {
+    return node is ir.MethodInvocation && node.name.name == 'toString';
+  }
+
+  assert(isGetRuntimeType(node));
+
+  // TODO(johnniwinther): Special-case `this.runtimeType`.
+  ir.Expression receiver;
+  ir.Expression argument;
+  RuntimeTypeUseKind kind;
+
+  if (node.receiver is ir.VariableGet &&
+      node.parent is ir.ConditionalExpression &&
+      node.parent.parent is ir.Let) {
+    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+    if (nullAware != null) {
+      // The node is of the form:
+      //
+      //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
+      //                                             ^
+
+      if (nullAware.parent is ir.VariableDeclaration &&
+          nullAware.parent.parent is ir.Let) {
+        NullAwareExpression outer =
+            getNullAwareExpression(nullAware.parent.parent);
+        if (outer != null &&
+            outer.receiver == nullAware.let &&
+            isInvokeToString(outer.expression)) {
+          // Detected
+          //
+          //     e?.runtimeType?.toString()
+          //        ^
+          // encoded as
+          //
+          //     let #t2 = (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
+          //                                                        ^
+          //        in #t2 == null ? null : #t2.toString()
+          //
+          kind = RuntimeTypeUseKind.string;
+          receiver = nullAware.receiver;
+        }
+      } else if (nullAware.parent is ir.MethodInvocation) {
+        ir.MethodInvocation methodInvocation = nullAware.parent;
+        if (methodInvocation.receiver == nullAware.let &&
+            methodInvocation.name.name == '==') {
+          // Detected
+          //
+          //  e0?.runtimeType == other
+          ir.PropertyGet otherGetRuntimeType =
+              asGetRuntimeType(methodInvocation.arguments.positional.first);
+          if (otherGetRuntimeType != null) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1.runtimeType
+            //         ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //                                               ^
+            //        .==(e1.runtimeType)
+            kind = RuntimeTypeUseKind.equals;
+            receiver = nullAware.receiver;
+            argument = otherGetRuntimeType.receiver;
+          }
+
+          NullAwareExpression otherNullAware = getNullAwareExpression(
+              methodInvocation.arguments.positional.first);
+          if (otherNullAware != null &&
+              isGetRuntimeType(otherNullAware.expression)) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1?.runtimeType
+            //         ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //                                               ^
+            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
+            //
+            kind = RuntimeTypeUseKind.equals;
+            receiver = nullAware.receiver;
+            argument = otherNullAware.receiver;
+          }
+        } else if (isInvokeToString(nullAware.parent)) {
+          // Detected
+          //
+          //     e?.runtimeType.toString()
+          //        ^
+          // encoded as
+          //
+          //     (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
+          //                                          ^
+          //         .toString()
+          //
+          kind = RuntimeTypeUseKind.string;
+          receiver = nullAware.receiver;
+        }
+      } else if (nullAware.parent is ir.Arguments &&
+          nullAware.parent.parent is ir.MethodInvocation) {
+        ir.MethodInvocation methodInvocation = nullAware.parent.parent;
+        if (methodInvocation.name.name == '==' &&
+            methodInvocation.arguments.positional.first == nullAware.let) {
+          // [nullAware] is the right hand side of ==.
+
+          ir.PropertyGet otherGetRuntimeType =
+              asGetRuntimeType(methodInvocation.receiver);
+          NullAwareExpression otherNullAware =
+              getNullAwareExpression(methodInvocation.receiver);
+
+          if (otherGetRuntimeType != null) {
+            // Detected
+            //
+            //     e0.runtimeType == e1?.runtimeType
+            //                           ^
+            // encoded as
+            //
+            //     e0.runtimeType.==(
+            //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
+            //                                                  ^
+            kind = RuntimeTypeUseKind.equals;
+            receiver = otherGetRuntimeType.receiver;
+            argument = nullAware.receiver;
+          }
+
+          if (otherNullAware != null &&
+              isGetRuntimeType(otherNullAware.expression)) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1?.runtimeType
+            //                            ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
+            //                                                      ^
+            kind = RuntimeTypeUseKind.equals;
+            receiver = otherNullAware.receiver;
+            argument = nullAware.receiver;
+          }
+        }
+      } else if (nullAware.parent is ir.StringConcatenation) {
+        // Detected
+        //
+        //     '${e?.runtimeType}'
+        //           ^
+        // encoded as
+        //
+        //     '${let #t1 = e in #t1 == null ? null : #t1.runtimeType}'
+        //                                                ^
+        kind = RuntimeTypeUseKind.string;
+        receiver = nullAware.receiver;
+      } else {
+        // Default to unknown
+        //
+        //     e?.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
+        //                                         ^
+        kind = RuntimeTypeUseKind.unknown;
+        receiver = nullAware.receiver;
+      }
+    }
+  } else if (node.parent is ir.VariableDeclaration &&
+      node.parent.parent is ir.Let) {
+    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+    if (nullAware != null && isInvokeToString(nullAware.expression)) {
+      // Detected
+      //
+      //     e.runtimeType?.toString()
+      //       ^
+      // encoded as
+      //
+      //     let #t1 = e.runtimeType in #t1 == null ? null : #t1.toString()
+      //                 ^
+      kind = RuntimeTypeUseKind.string;
+      receiver = node.receiver;
+    }
+  } else if (node.parent is ir.MethodInvocation) {
+    ir.MethodInvocation methodInvocation = node.parent;
+    if (methodInvocation.name.name == '==' &&
+        methodInvocation.receiver == node) {
+      // [node] is the left hand side of ==.
+
+      ir.PropertyGet otherGetRuntimeType =
+          asGetRuntimeType(methodInvocation.arguments.positional.first);
+      NullAwareExpression nullAware =
+          getNullAwareExpression(methodInvocation.arguments.positional.first);
+      if (otherGetRuntimeType != null) {
+        // Detected
+        //
+        //     e0.runtimeType == e1.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(e1.runtimeType)
+        //        ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = node.receiver;
+        argument = otherGetRuntimeType.receiver;
+      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
+        // Detected
+        //
+        //     e0.runtimeType == e1?.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(
+        //        ^
+        //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
+        kind = RuntimeTypeUseKind.equals;
+        receiver = node.receiver;
+        argument = nullAware.receiver;
+      }
+    } else if (isInvokeToString(node.parent)) {
+      // Detected
+      //
+      //     e.runtimeType.toString()
+      //       ^
+      kind = RuntimeTypeUseKind.string;
+      receiver = node.receiver;
+    }
+  } else if (node.parent is ir.Arguments &&
+      node.parent.parent is ir.MethodInvocation) {
+    ir.MethodInvocation methodInvocation = node.parent.parent;
+    if (methodInvocation.name.name == '==' &&
+        methodInvocation.arguments.positional.first == node) {
+      // [node] is the right hand side of ==.
+      ir.PropertyGet otherGetRuntimeType =
+          asGetRuntimeType(methodInvocation.receiver);
+      NullAwareExpression nullAware =
+          getNullAwareExpression(methodInvocation.receiver);
+
+      if (otherGetRuntimeType != null) {
+        // Detected
+        //
+        //     e0.runtimeType == e1.runtimeType
+        //                          ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(e1.runtimeType)
+        //                          ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = otherGetRuntimeType.receiver;
+        argument = node.receiver;
+      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
+        // Detected
+        //
+        //     e0?.runtimeType == e1.runtimeType
+        //                           ^
+        // encoded as
+        //
+        //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+        //         .==(e1.runtimeType)
+        //                ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = nullAware.receiver;
+        argument = node.receiver;
+      }
+    }
+  } else if (node.parent is ir.StringConcatenation) {
+    // Detected
+    //
+    //     '${e.runtimeType}'
+    //          ^
+    kind = RuntimeTypeUseKind.string;
+    receiver = node.receiver;
+  }
+
+  if (kind == null) {
+    // Default to unknown
+    //
+    //     e.runtimeType
+    //       ^
+    kind = RuntimeTypeUseKind.unknown;
+    receiver = node.receiver;
+  }
+
+  DartType receiverType = elementMap.getStaticType(receiver);
+  DartType argumentType =
+      argument == null ? argument : elementMap.getStaticType(argument);
+  return new RuntimeTypeUse(kind, receiverType, argumentType);
+}
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index cea1634..866d70c 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -208,6 +208,10 @@
   /// Whether to omit implicit strong mode checks.
   bool omitImplicitChecks = false;
 
+  /// Whether to omit class type arguments only needed for `toString` on
+  /// `RuntimeType`.
+  bool laxRuntimeTypeToString = false;
+
   /// What should the compiler do with type assertions of assignments.
   ///
   /// This is an internal configuration option derived from other flags.
@@ -227,7 +231,7 @@
   bool useContentSecurityPolicy = false;
 
   /// Enables strong mode in dart2js.
-  bool strongMode = false;
+  bool strongMode = true;
 
   /// When obfuscating for minification, whether to use the frequency of a name
   /// as an heuristic to pick shorter names.
@@ -321,8 +325,11 @@
       ..platformBinaries =
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
-      ..strongMode = _hasOption(options, Flags.strongMode)
+      ..strongMode = _hasOption(options, Flags.strongMode) ||
+          !_hasOption(options, Flags.noPreviewDart2)
       ..omitImplicitChecks = _hasOption(options, Flags.omitImplicitChecks)
+      ..laxRuntimeTypeToString =
+          _hasOption(options, Flags.laxRuntimeTypeToString)
       ..testMode = _hasOption(options, Flags.testMode)
       ..trustJSInteropTypeAnnotations =
           _hasOption(options, Flags.trustJSInteropTypeAnnotations)
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index ecdf526..b8f4879 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -22,6 +22,7 @@
   Setlet<ConstantExpression> _constantLiterals;
   Setlet<dynamic> _nativeData;
   Setlet<ClassEntity> _seenClasses;
+  Set<RuntimeTypeUse> _runtimeTypeUses;
   Set<GenericInstantiation> _genericInstantiations;
 
   ResolutionWorldImpactBuilder(this.name);
@@ -51,6 +52,19 @@
     return _listLiterals != null ? _listLiterals : const <ListLiteralUse>[];
   }
 
+  void registerRuntimeTypeUse(RuntimeTypeUse runtimeTypeUse) {
+    assert(runtimeTypeUse != null);
+    _runtimeTypeUses ??= new Setlet<RuntimeTypeUse>();
+    _runtimeTypeUses.add(runtimeTypeUse);
+  }
+
+  @override
+  Iterable<RuntimeTypeUse> get runtimeTypeUses {
+    return _runtimeTypeUses != null
+        ? _runtimeTypeUses
+        : const <RuntimeTypeUse>[];
+  }
+
   void registerConstSymbolName(String name) {
     _constSymbolNames ??= new Setlet<String>();
     _constSymbolNames.add(name);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 2ad67c8..fb04063 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -19,6 +19,7 @@
 import '../dump_info.dart';
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
+import '../elements/names.dart';
 import '../elements/types.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
@@ -3280,11 +3281,11 @@
     ir.Procedure target = node.target;
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildCall(node, node);
-    if (_elementMap.isForeignLibrary(target.enclosingLibrary)) {
-      handleInvokeStaticForeign(node, target);
+    FunctionEntity function = _elementMap.getMember(target);
+    if (_elementMap.isForeignHelper(function)) {
+      handleInvokeStaticForeign(node, function);
       return;
     }
-    FunctionEntity function = _elementMap.getMember(target);
 
     if (options.strongMode &&
         function == _commonElements.extractTypeArguments &&
@@ -3558,8 +3559,8 @@
   }
 
   void handleInvokeStaticForeign(
-      ir.StaticInvocation invocation, ir.Procedure target) {
-    String name = target.name.name;
+      ir.StaticInvocation invocation, MemberEntity member) {
+    String name = member.name;
     if (name == 'JS') {
       handleForeignJs(invocation);
     } else if (name == 'DART_CLOSURE_TO_JS') {
@@ -3584,6 +3585,8 @@
       handleJsInterceptorConstant(invocation);
     } else if (name == 'JS_STRING_CONCAT') {
       handleJsStringConcat(invocation);
+    } else if (name == '_createInvocationMirror') {
+      _handleCreateInvocationMirror(invocation);
     } else {
       reporter.internalError(
           _elementMap.getSpannable(targetElement, invocation),
@@ -3591,6 +3594,114 @@
     }
   }
 
+  void _handleCreateInvocationMirror(ir.StaticInvocation invocation) {
+    ir.StringLiteral nameLiteral = invocation.arguments.positional[0];
+    String name = nameLiteral.value;
+
+    ir.ListLiteral typeArgumentsLiteral = invocation.arguments.positional[1];
+    List<DartType> typeArguments =
+        typeArgumentsLiteral.expressions.map((ir.Expression expression) {
+      ir.TypeLiteral typeLiteral = expression;
+      return _elementMap.getDartType(typeLiteral.type);
+    }).toList();
+
+    ir.ListLiteral positionalArgumentsLiteral =
+        invocation.arguments.positional[2];
+    ir.MapLiteral namedArgumentsLiteral = invocation.arguments.positional[3];
+    ir.IntLiteral kindLiteral = invocation.arguments.positional[4];
+
+    Name memberName = new Name(name, _currentFrame.member.library);
+    Selector selector;
+    switch (kindLiteral.value) {
+      case Selector.invocationMirrorGetterKind:
+        selector = new Selector.getter(memberName);
+        break;
+      case Selector.invocationMirrorSetterKind:
+        selector = new Selector.setter(memberName);
+        break;
+      case Selector.invocationMirrorMethodKind:
+        if (memberName == Names.INDEX_NAME) {
+          selector = new Selector.index();
+        } else if (memberName == Names.INDEX_SET_NAME) {
+          selector = new Selector.indexSet();
+        } else {
+          CallStructure callStructure = new CallStructure(
+              positionalArgumentsLiteral.expressions.length,
+              namedArgumentsLiteral.entries.map<String>((ir.MapEntry entry) {
+                ir.StringLiteral key = entry.key;
+                return key.value;
+              }).toList(),
+              typeArguments.length);
+          if (Selector.isOperatorName(name)) {
+            selector =
+                new Selector(SelectorKind.OPERATOR, memberName, callStructure);
+          } else {
+            selector = new Selector.call(memberName, callStructure);
+          }
+        }
+        break;
+    }
+
+    HConstant nameConstant = graph.addConstant(
+        closedWorld.constantSystem
+            .createSymbol(closedWorld.commonElements, name),
+        closedWorld);
+
+    List<HInstruction> arguments = <HInstruction>[];
+    for (ir.Expression argument in positionalArgumentsLiteral.expressions) {
+      argument.accept(this);
+      arguments.add(pop());
+    }
+    if (namedArgumentsLiteral.entries.isNotEmpty) {
+      Map<String, HInstruction> namedValues = <String, HInstruction>{};
+      for (ir.MapEntry entry in namedArgumentsLiteral.entries) {
+        ir.StringLiteral key = entry.key;
+        String name = key.value;
+        entry.value.accept(this);
+        namedValues[name] = pop();
+      }
+      for (String name in selector.callStructure.getOrderedNamedArguments()) {
+        arguments.add(namedValues[name]);
+      }
+    }
+
+    _addTypeArguments(arguments, typeArguments,
+        _sourceInformationBuilder.buildCall(invocation, invocation));
+
+    HInstruction argumentsInstruction = buildLiteralList(arguments);
+    add(argumentsInstruction);
+
+    List<HInstruction> argumentNames = <HInstruction>[];
+    for (String argumentName in selector.namedArguments) {
+      ConstantValue argumentNameConstant =
+          constantSystem.createString(argumentName);
+      argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld));
+    }
+    HInstruction argumentNamesInstruction = buildLiteralList(argumentNames);
+    add(argumentNamesInstruction);
+
+    HInstruction typeArgumentCount =
+        graph.addConstantInt(typeArguments.length, closedWorld);
+
+    js.Name internalName = namer.invocationName(selector);
+
+    ConstantValue kindConstant =
+        constantSystem.createIntFromInt(selector.invocationMirrorKind);
+
+    _pushStaticInvocation(
+        _commonElements.createUnmangledInvocationMirror,
+        [
+          nameConstant,
+          graph.addConstantStringFromName(internalName, closedWorld),
+          graph.addConstant(kindConstant, closedWorld),
+          argumentsInstruction,
+          argumentNamesInstruction,
+          typeArgumentCount,
+        ],
+        abstractValueDomain.dynamicType,
+        const <DartType>[]);
+  }
+
   bool _unexpectedForeignArguments(ir.StaticInvocation invocation,
       {int minPositional, int maxPositional, int typeArgumentCount = 0}) {
     String pluralizeArguments(int count, [String adjective = '']) {
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 0c3846e..b5cd0b2 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -13,6 +13,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../kernel/element_map.dart';
+import '../kernel/runtime_type_analysis.dart';
 import '../options.dart';
 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder;
 import '../universe/call_structure.dart';
@@ -141,9 +142,8 @@
     handleSignature(constructor.function, checkReturnType: false);
     visitNodes(constructor.initializers);
     visitNode(constructor.function.body);
-    if (constructor.isExternal &&
-        !elementMap.isForeignLibrary(constructor.enclosingLibrary)) {
-      MemberEntity member = elementMap.getMember(constructor);
+    MemberEntity member = elementMap.getMember(constructor);
+    if (constructor.isExternal && !elementMap.isForeignHelper(member)) {
       bool isJsInterop = elementMap.nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(constructor, isJsInterop: isJsInterop));
@@ -197,9 +197,8 @@
     handleSignature(procedure.function);
     visitNode(procedure.function.body);
     handleAsyncMarker(procedure.function);
-    if (procedure.isExternal &&
-        !elementMap.isForeignLibrary(procedure.enclosingLibrary)) {
-      MemberEntity member = elementMap.getMember(procedure);
+    MemberEntity member = elementMap.getMember(procedure);
+    if (procedure.isExternal && !elementMap.isForeignHelper(member)) {
       bool isJsInterop = elementMap.nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(procedure, isJsInterop: isJsInterop));
@@ -651,6 +650,16 @@
     impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
         new Selector.getter(elementMap.getName(node.name)),
         constraint, const <DartType>[]));
+
+    if (node.name.name == Identifiers.runtimeType_) {
+      if (_options.strongMode) {
+        RuntimeTypeUse runtimeTypeUse = computeRuntimeTypeUse(elementMap, node);
+        impactBuilder.registerRuntimeTypeUse(runtimeTypeUse);
+      } else {
+        impactBuilder.registerRuntimeTypeUse(new RuntimeTypeUse(
+            RuntimeTypeUseKind.unknown, const DynamicType(), null));
+      }
+    }
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 2258231..4451c74 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -978,7 +978,7 @@
   HInstruction(this.inputs, this.instructionType)
       : id = idCounter++,
         usedBy = <HInstruction>[] {
-    assert(inputs.every((e) => e != null));
+    assert(inputs.every((e) => e != null), "inputs: $inputs");
   }
 
   int get hashCode => id;
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index bc0ea62..cd71861 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -424,7 +424,8 @@
         } else if (applies(commonElements.jsArrayAdd)) {
           // The codegen special cases array calls, but does not
           // inline argument type checks.
-          if (!_options.enableTypeAssertions) {
+          if (!_options.parameterCheckPolicy.isEmitted ||
+              input is HLiteralList) {
             target = commonElements.jsArrayAdd;
           }
         }
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index bd9dca0..b0f526e 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -79,7 +79,7 @@
       [Comparator<ConstantValue> preSortCompare]);
 }
 
-abstract class CodegenWorldBuilderImpl extends WorldBuilderBase
+class CodegenWorldBuilderImpl extends WorldBuilderBase
     implements CodegenWorldBuilder {
   final ElementEnvironment _elementEnvironment;
   final NativeBasicData _nativeBasicData;
@@ -159,8 +159,16 @@
 
   final Set<ConstantValue> _constantValues = new Set<ConstantValue>();
 
-  CodegenWorldBuilderImpl(this._elementEnvironment, this._nativeBasicData,
-      this._world, this.selectorConstraintsStrategy);
+  final KernelToWorldBuilder _elementMap;
+  final GlobalLocalsMap _globalLocalsMap;
+
+  CodegenWorldBuilderImpl(
+      this._elementMap,
+      this._globalLocalsMap,
+      this._elementEnvironment,
+      this._nativeBasicData,
+      this._world,
+      this.selectorConstraintsStrategy);
 
   Iterable<ClassEntity> get processedClasses => _processedClasses.keys
       .where((cls) => _processedClasses[cls].isInstantiated);
@@ -636,21 +644,6 @@
     _staticMemberUsage.forEach(processMemberUse);
     return functions;
   }
-}
-
-class KernelCodegenWorldBuilder extends CodegenWorldBuilderImpl {
-  final KernelToWorldBuilder _elementMap;
-  final GlobalLocalsMap _globalLocalsMap;
-
-  KernelCodegenWorldBuilder(
-      this._elementMap,
-      this._globalLocalsMap,
-      ElementEnvironment elementEnvironment,
-      NativeBasicData nativeBasicData,
-      JClosedWorld world,
-      SelectorConstraintsStrategy selectorConstraintsStrategy)
-      : super(elementEnvironment, nativeBasicData, world,
-            selectorConstraintsStrategy);
 
   @override
   bool hasConstantFieldInitializer(FieldEntity field) {
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index 3d4f018..f854843 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -8,7 +8,7 @@
 /// compilation pipeline, for example during resolution.
 library compiler.universe.feature;
 
-import '../elements/types.dart' show DartType, InterfaceType;
+import '../elements/types.dart';
 import '../util/util.dart';
 
 /// A language feature that may be seen in the program.
@@ -148,6 +148,73 @@
   }
 }
 
+/// Enum for recognized use kinds of `Object.runtimeType`.
+enum RuntimeTypeUseKind {
+  /// Unknown use of `Object.runtimeType`. This is the fallback value if the
+  /// usage didn't match any of the recogized patterns.
+  unknown,
+
+  /// `Object.runtimeType` used in a pattern like
+  /// `a.runtimeType == b.runtimeType`.
+  equals,
+
+  /// `Object.runtimeType` used in a pattern like `'${e.runtimeType}'` or
+  /// `e.runtimeType.toString()`.
+  string,
+}
+
+/// A use of `Object.runtimeType`.
+class RuntimeTypeUse {
+  /// The use kind of `Object.runtimeType`.
+  final RuntimeTypeUseKind kind;
+
+  /// The static type of the receiver.
+  final DartType receiverType;
+
+  /// The static type of the argument if [kind] is `RuntimeTypeUseKind.equals`.
+  final DartType argumentType;
+
+  RuntimeTypeUse(this.kind, this.receiverType, this.argumentType);
+
+  int get hashCode =>
+      kind.hashCode * 13 +
+      receiverType.hashCode * 17 +
+      argumentType.hashCode * 19;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! RuntimeTypeUse) return false;
+    return kind == other.kind &&
+        receiverType == other.receiverType &&
+        argumentType == other.argumentType;
+  }
+
+  /// Short textual representation use for testing.
+  String get shortText {
+    StringBuffer sb = new StringBuffer();
+    switch (kind) {
+      case RuntimeTypeUseKind.string:
+        sb.write('string:');
+        sb.write(receiverType);
+        break;
+      case RuntimeTypeUseKind.equals:
+        sb.write('equals:');
+        sb.write(receiverType);
+        sb.write('/');
+        sb.write(argumentType);
+        break;
+      case RuntimeTypeUseKind.unknown:
+        sb.write('unknown:');
+        sb.write(receiverType);
+        break;
+    }
+    return sb.toString();
+  }
+
+  String toString() => 'RuntimeTypeUse(kind=$kind,receiver=$receiverType'
+      ',argument=$argumentType)';
+}
+
 /// A generic instantiation of an expression of type [functionType] with the
 /// given [typeArguments].
 class GenericInstantiation {
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 726dc05..b472c00 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -267,8 +267,8 @@
   }
 }
 
-/// Base implementation of [ResolutionEnqueuerWorldBuilder].
-abstract class ResolutionWorldBuilderBase extends WorldBuilderBase
+/// Implementation of [ResolutionEnqueuerWorldBuilder].
+class ResolutionWorldBuilderImpl extends WorldBuilderBase
     implements ResolutionEnqueuerWorldBuilder {
   /// Instantiation information for all classes with instantiated types.
   ///
@@ -373,9 +373,9 @@
   final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
   final NoSuchMethodRegistry _noSuchMethodRegistry;
 
-  final SelectorConstraintsStrategy selectorConstraintsStrategy;
-  final ClassHierarchyBuilder classHierarchyBuilder;
-  final ClassQueries classQueries;
+  final SelectorConstraintsStrategy _selectorConstraintsStrategy;
+  final ClassHierarchyBuilder _classHierarchyBuilder;
+  final ClassQueries _classQueries;
 
   bool hasRuntimeTypeSupport = false;
   bool hasFunctionApplySupport = false;
@@ -392,8 +392,11 @@
 
   bool get isClosed => _closed;
 
-  ResolutionWorldBuilderBase(
+  final KernelToElementMapForImpactImpl _elementMap;
+
+  ResolutionWorldBuilderImpl(
       this._options,
+      this._elementMap,
       this._elementEnvironment,
       this._dartTypes,
       this._commonElements,
@@ -405,9 +408,9 @@
       this._allocatorAnalysis,
       this._nativeResolutionEnqueuer,
       this._noSuchMethodRegistry,
-      this.selectorConstraintsStrategy,
-      this.classHierarchyBuilder,
-      this.classQueries);
+      this._selectorConstraintsStrategy,
+      this._classHierarchyBuilder,
+      this._classQueries);
 
   Iterable<ClassEntity> get processedClasses => _processedClasses.keys
       .where((cls) => _processedClasses[cls].isInstantiated);
@@ -535,7 +538,7 @@
         isRedirection: isRedirection);
     if (kind != Instantiation.UNINSTANTIATED) {
       if (_options.strongMode) {
-        classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
+        _classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
             directlyInstantiated: info.isDirectlyInstantiated,
             abstractlyInstantiated: info.isAbstractlyInstantiated);
       }
@@ -600,7 +603,7 @@
     void _process(Map<String, Set<_MemberUsage>> memberMap,
         EnumSet<MemberUse> action(_MemberUsage usage)) {
       _processSet(memberMap, methodName, (_MemberUsage usage) {
-        if (selectorConstraintsStrategy.appliedUnnamed(
+        if (_selectorConstraintsStrategy.appliedUnnamed(
             dynamicUse, usage.entity, this)) {
           memberUsed(usage.entity, action(usage));
           return true;
@@ -640,7 +643,7 @@
         name, () => new Maplet<Selector, SelectorConstraints>());
     UniverseSelectorConstraints constraints =
         selectors.putIfAbsent(selector, () {
-      return selectorConstraintsStrategy.createSelectorConstraints(selector);
+      return _selectorConstraintsStrategy.createSelectorConstraints(selector);
     });
     return constraints.addReceiverConstraint(constraint);
   }
@@ -883,7 +886,7 @@
 
   /// Returns an iterable over all mixin applications that mixin [cls].
   Iterable<ClassEntity> allMixinUsesOf(ClassEntity cls) {
-    Iterable<ClassEntity> uses = classHierarchyBuilder.mixinUses[cls];
+    Iterable<ClassEntity> uses = _classHierarchyBuilder.mixinUses[cls];
     return uses != null ? uses : const <ClassEntity>[];
   }
 
@@ -909,26 +912,26 @@
       if (!info.hasInstantiation) {
         return;
       }
-      assert(classQueries.checkClass(cls));
-      if (!classQueries.validateClass(cls)) {
+      assert(_classQueries.checkClass(cls));
+      if (!_classQueries.validateClass(cls)) {
         failedAt(cls, 'Class "${cls.name}" is not resolved.');
       }
 
-      classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
+      _classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
           directlyInstantiated: info.isDirectlyInstantiated,
           abstractlyInstantiated: info.isAbstractlyInstantiated);
 
       // Walk through the superclasses, and record the types
       // implemented by that type on the superclasses.
-      ClassEntity superclass = classQueries.getSuperClass(cls);
+      ClassEntity superclass = _classQueries.getSuperClass(cls);
       while (superclass != null) {
         Set<ClassEntity> typesImplementedBySubclassesOfCls =
             typesImplementedBySubclasses.putIfAbsent(
                 superclass, () => new Set<ClassEntity>());
-        for (InterfaceType current in classQueries.getSupertypes(cls)) {
+        for (InterfaceType current in _classQueries.getSupertypes(cls)) {
           typesImplementedBySubclassesOfCls.add(current.element);
         }
-        superclass = classQueries.getSuperClass(superclass);
+        superclass = _classQueries.getSuperClass(superclass);
       }
     }
 
@@ -953,15 +956,15 @@
   }
 
   void registerClass(ClassEntity cls) {
-    classHierarchyBuilder.registerClass(cls);
+    _classHierarchyBuilder.registerClass(cls);
   }
 
   bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type) {
     // TODO(johnniwinther): Use the [member] itself to avoid enqueueing members
     // that are overridden.
-    classHierarchyBuilder.registerClass(member.enclosingClass);
-    classHierarchyBuilder.registerClass(type);
-    return classHierarchyBuilder.isInheritedInSubtypeOf(
+    _classHierarchyBuilder.registerClass(member.enclosingClass);
+    _classHierarchyBuilder.registerClass(type);
+    return _classHierarchyBuilder.isInheritedInSubtypeOf(
         member.enclosingClass, type);
   }
 
@@ -980,44 +983,6 @@
     _memberUsage.forEach(processMemberUse);
     return functions;
   }
-}
-
-abstract class KernelResolutionWorldBuilderBase
-    extends ResolutionWorldBuilderBase {
-  KernelToElementMapForImpactImpl get elementMap;
-
-  KernelResolutionWorldBuilderBase(
-      CompilerOptions options,
-      ElementEnvironment elementEnvironment,
-      DartTypes dartTypes,
-      CommonElements commonElements,
-      NativeBasicData nativeBasicData,
-      NativeDataBuilder nativeDataBuilder,
-      InterceptorDataBuilder interceptorDataBuilder,
-      BackendUsageBuilder backendUsageBuilder,
-      RuntimeTypesNeedBuilder rtiNeedBuilder,
-      KAllocatorAnalysis allocatorAnalysis,
-      NativeResolutionEnqueuer nativeResolutionEnqueuer,
-      NoSuchMethodRegistry noSuchMethodRegistry,
-      SelectorConstraintsStrategy selectorConstraintsStrategy,
-      ClassHierarchyBuilder classHierarchyBuilder,
-      ClassQueries classQueries)
-      : super(
-            options,
-            elementEnvironment,
-            dartTypes,
-            commonElements,
-            nativeBasicData,
-            nativeDataBuilder,
-            interceptorDataBuilder,
-            backendUsageBuilder,
-            rtiNeedBuilder,
-            allocatorAnalysis,
-            nativeResolutionEnqueuer,
-            noSuchMethodRegistry,
-            selectorConstraintsStrategy,
-            classHierarchyBuilder,
-            classQueries);
 
   @override
   KClosedWorld closeWorld() {
@@ -1025,18 +990,19 @@
         populateHierarchyNodes();
 
     var backendUsage = _backendUsageBuilder.close();
-    backendUsage.helperClassesUsed.forEach(classHierarchyBuilder.registerClass);
+    backendUsage.helperClassesUsed
+        .forEach(_classHierarchyBuilder.registerClass);
     _nativeResolutionEnqueuer.liveNativeClasses
-        .forEach(classHierarchyBuilder.registerClass);
+        .forEach(_classHierarchyBuilder.registerClass);
 
     _closed = true;
     assert(
-        classHierarchyBuilder.classHierarchyNodes.length ==
-            classHierarchyBuilder.classSets.length,
+        _classHierarchyBuilder.classHierarchyNodes.length ==
+            _classHierarchyBuilder.classSets.length,
         "ClassHierarchyNode/ClassSet mismatch: "
-        "${classHierarchyBuilder.classHierarchyNodes} vs "
-        "${classHierarchyBuilder.classSets}");
-    return _closedWorldCache = new KClosedWorldImpl(elementMap,
+        "${_classHierarchyBuilder.classHierarchyNodes} vs "
+        "${_classHierarchyBuilder.classSets}");
+    return _closedWorldCache = new KClosedWorldImpl(_elementMap,
         options: _options,
         elementEnvironment: _elementEnvironment,
         dartTypes: _dartTypes,
@@ -1053,9 +1019,16 @@
         liveInstanceMembers: _liveInstanceMembers,
         assignedInstanceMembers: computeAssignedInstanceMembers(),
         processedMembers: _processedMembers,
-        mixinUses: classHierarchyBuilder.mixinUses,
+        mixinUses: _classHierarchyBuilder.mixinUses,
         typesImplementedBySubclasses: typesImplementedBySubclasses,
-        classHierarchyNodes: classHierarchyBuilder.classHierarchyNodes,
-        classSets: classHierarchyBuilder.classSets);
+        classHierarchyNodes: _classHierarchyBuilder.classHierarchyNodes,
+        classSets: _classHierarchyBuilder.classSets);
+  }
+
+  @override
+  void forEachLocalFunction(void f(MemberEntity member, Local localFunction)) {
+    for (KLocalFunction local in localFunctions) {
+      f(local.memberContext, local);
+    }
   }
 }
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index d4af193..34aaf06 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -208,15 +208,16 @@
    */
   String get invocationMirrorMemberName => isSetter ? '$name=' : name;
 
+  static const int invocationMirrorMethodKind = 0;
+  static const int invocationMirrorGetterKind = 1;
+  static const int invocationMirrorSetterKind = 2;
+
   int get invocationMirrorKind {
-    const int METHOD = 0;
-    const int GETTER = 1;
-    const int SETTER = 2;
-    int kind = METHOD;
+    int kind = invocationMirrorMethodKind;
     if (isGetter) {
-      kind = GETTER;
+      kind = invocationMirrorGetterKind;
     } else if (isSetter) {
-      kind = SETTER;
+      kind = invocationMirrorSetterKind;
     }
     return kind;
   }
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index d43fb15..c1bf88d 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -21,6 +21,7 @@
 import '../js_model/locals.dart';
 import '../js_model/elements.dart' show JSignatureMethod;
 import '../kernel/element_map_impl.dart';
+import '../kernel/kelements.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../options.dart';
 import '../universe/class_set.dart';
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 3cc5ee8..2a33f49 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -1066,6 +1066,39 @@
   RuntimeTypesNeed get rtiNeed;
   NoSuchMethodData get noSuchMethodData;
 
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y);
+
+  /// Returns an iterable of the classes that are contained in the
+  /// strict subclass/subtype sets of both [cls1] and [cls2].
+  ///
+  /// Classes that are implied by included superclasses/supertypes are not
+  /// returned.
+  ///
+  /// For instance for this hierarchy
+  ///
+  ///     class A {}
+  ///     class B {}
+  ///     class C implements A, B {}
+  ///     class D extends C {}
+  ///
+  /// the query
+  ///
+  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
+  ///
+  /// return the set {C} because [D] is implied by [C].
+  Iterable<ClassEntity> commonSubclasses(
+      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls);
+
+  /// Returns an iterable over the live classes that extend [cls] including
+  /// [cls] itself.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls);
+
   /// Applies [f] to each live class that implements [cls] _not_ including [cls]
   /// itself.
   void forEachStrictSubtypeOf(
diff --git a/pkg/compiler/tool/status_files/log_parser.dart b/pkg/compiler/tool/status_files/log_parser.dart
index d373a2b..43df6f4 100644
--- a/pkg/compiler/tool/status_files/log_parser.dart
+++ b/pkg/compiler/tool/status_files/log_parser.dart
@@ -12,7 +12,7 @@
 
 /// Extracts test records from a test.py [log].
 List<Record> parse(String log) {
-  var records = [];
+  var records = <Record>[];
   var suite;
   var test;
   var config;
@@ -20,7 +20,7 @@
   var actual;
   var reason;
   var fullReason; // lines before stack, usually multiline reason.
-  var stack = [];
+  var stack = <String>[];
   var paragraph = []; // collector of lines for fullReason.
   bool reproIsNext = false;
   for (var line in log.split('\n')) {
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index 854700c..4dd9996 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -20,7 +20,7 @@
   args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);
 
   if (args.contains('--persistent_worker')) {
-    await new _CompilerWorker(args..remove('--persistent_worker')).run();
+    await _CompilerWorker(args..remove('--persistent_worker')).run();
   } else if (args.isNotEmpty && args.last == "--batch") {
     await runBatch(args.sublist(0, args.length - 1));
   } else {
@@ -39,10 +39,10 @@
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var args = _startupArgs.toList()..addAll(request.arguments);
 
-    var output = new StringBuffer();
+    var output = StringBuffer();
     var exitCode = compile(args, printFn: output.writeln);
     AnalysisEngine.instance.clearCaches();
-    return new WorkResponse()
+    return WorkResponse()
       ..exitCode = exitCode
       ..output = output.toString();
   }
@@ -51,12 +51,12 @@
 runBatch(List<String> batchArgs) async {
   int totalTests = 0;
   int testsFailed = 0;
-  var watch = new Stopwatch()..start();
+  var watch = Stopwatch()..start();
   print('>>> BATCH START');
   String line;
   while ((line = stdin.readLineSync(encoding: utf8)).isNotEmpty) {
     totalTests++;
-    var args = batchArgs.toList()..addAll(line.split(new RegExp(r'\s+')));
+    var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+')));
 
     // We don't try/catch here, since `compile` should handle that.
     var compileExitCode = compile(args);
diff --git a/pkg/dev_compiler/bin/dartdevk.dart b/pkg/dev_compiler/bin/dartdevk.dart
index 98f3907..027cfe4 100755
--- a/pkg/dev_compiler/bin/dartdevk.dart
+++ b/pkg/dev_compiler/bin/dartdevk.dart
@@ -18,7 +18,7 @@
   if (parsedArgs.isBatch) {
     await runBatch(parsedArgs.args);
   } else if (parsedArgs.isWorker) {
-    await new _CompilerWorker(parsedArgs.args).run();
+    await _CompilerWorker(parsedArgs.args).run();
   } else {
     var result = await compile(parsedArgs.args);
     exitCode = result.success ? 0 : 1;
@@ -29,7 +29,7 @@
 Future runBatch(List<String> batchArgs) async {
   var tests = 0;
   var failed = 0;
-  var watch = new Stopwatch()..start();
+  var watch = Stopwatch()..start();
 
   print('>>> BATCH START');
 
@@ -38,7 +38,7 @@
 
   while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
     tests++;
-    var args = batchArgs.toList()..addAll(line.split(new RegExp(r'\s+')));
+    var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+')));
 
     String outcome;
     try {
@@ -74,12 +74,12 @@
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var args = _startupArgs.toList()..addAll(request.arguments);
 
-    var output = new StringBuffer();
+    var output = StringBuffer();
     var result = await runZoned(() => compile(args), zoneSpecification:
-        new ZoneSpecification(print: (self, parent, zone, message) {
+        ZoneSpecification(print: (self, parent, zone, message) {
       output.writeln(message.toString());
     }));
-    return new WorkResponse()
+    return WorkResponse()
       ..exitCode = result.success ? 0 : 1
       ..output = output.toString();
   }
@@ -95,11 +95,11 @@
 /// latter needs to be replaced by reading all the contents of the
 /// file and expanding them into the resulting argument list.
 _ParsedArgs _preprocessArgs(List<String> args) {
-  if (args.isEmpty) return new _ParsedArgs(false, false, args);
+  if (args.isEmpty) return _ParsedArgs(false, false, args);
 
   String lastArg = args.last;
   if (lastArg == '--batch') {
-    return new _ParsedArgs(true, false, args.sublist(0, args.length - 1));
+    return _ParsedArgs(true, false, args.sublist(0, args.length - 1));
   }
 
   var newArgs = <String>[];
@@ -115,20 +115,20 @@
       newArgs.add(arg);
     }
   }
-  return new _ParsedArgs(false, isWorker, newArgs);
+  return _ParsedArgs(false, isWorker, newArgs);
 }
 
 /// Return all lines in a file found at [path].
 Iterable<String> _readLines(String path) {
   try {
-    return new File(path)
+    return File(path)
         .readAsStringSync()
         .replaceAll('\r\n', '\n')
         .replaceAll('\r', '\n')
         .split('\n')
         .where((String line) => line.isNotEmpty);
   } on FileSystemException catch (e) {
-    throw new Exception('Failed to read $path: $e');
+    throw Exception('Failed to read $path: $e');
   }
 }
 
diff --git a/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart b/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
index f4b4539..672a2a3 100644
--- a/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/ast_builder.dart
@@ -10,10 +10,10 @@
 
 export 'package:analyzer/dart/ast/standard_ast_factory.dart';
 
-final ast = new AstBuilder();
+final ast = AstBuilder();
 
 class AstBuilder {
-  KeywordToken get constKeyword => new KeywordToken(Keyword.CONST, 0);
+  KeywordToken get constKeyword => KeywordToken(Keyword.CONST, 0);
 
   TypeName typeName(Identifier id, List<TypeAnnotation> args) {
     TypeArgumentList argList = null;
@@ -26,8 +26,8 @@
     TypeParameterList tps =
         (tParams.length == 0) ? null : typeParameterList(tParams);
     FormalParameterList fps = formalParameterList(params);
-    Token semi = new Token(TokenType.SEMICOLON, 0);
-    Token td = new KeywordToken(Keyword.TYPEDEF, 0);
+    Token semi = Token(TokenType.SEMICOLON, 0);
+    Token td = KeywordToken(Keyword.TYPEDEF, 0);
     return astFactory.functionTypeAlias(
         null, null, td, ret, name, tps, fps, semi);
   }
@@ -41,13 +41,13 @@
   }
 
   PropertyAccess propertyAccess(Expression target, SimpleIdentifier name) {
-    var p = new Token(TokenType.PERIOD, 0);
+    var p = Token(TokenType.PERIOD, 0);
     return astFactory.propertyAccess(target, p, name);
   }
 
   MethodInvocation methodInvoke(Expression target, SimpleIdentifier name,
       TypeArgumentList typeArguments, NodeList<Expression> args) {
-    var p = new Token(TokenType.PERIOD, 0);
+    var p = Token(TokenType.PERIOD, 0);
     return astFactory.methodInvocation(
         target, p, name, typeArguments, argumentList(args));
   }
@@ -180,7 +180,7 @@
   Token _binaryOperation(String oper) {
     var type = getTokenType(oper);
     assert(type != null);
-    return new Token(type, 0);
+    return Token(type, 0);
   }
 
   BinaryExpression binaryExpression(Expression l, String oper, Expression r) {
@@ -190,8 +190,8 @@
 
   ConditionalExpression conditionalExpression(
       Expression cond, Expression tExp, Expression fExp) {
-    var q = new Token(TokenType.QUESTION, 0);
-    var c = new Token(TokenType.COLON, 0);
+    var q = Token(TokenType.QUESTION, 0);
+    var c = Token(TokenType.COLON, 0);
     return astFactory.conditionalExpression(cond, q, tExp, c, fExp);
   }
 
@@ -201,14 +201,14 @@
   }
 
   Block block(List<Statement> statements) {
-    Token ld = new BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
-    Token rd = new Token(TokenType.CLOSE_CURLY_BRACKET, 0);
+    Token ld = BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
+    Token rd = Token(TokenType.CLOSE_CURLY_BRACKET, 0);
     return astFactory.block(ld, statements, rd);
   }
 
   MethodDeclaration blockMethodDeclaration(TypeName rt, SimpleIdentifier m,
       List<FormalParameter> params, List<Statement> statements,
-      {bool isStatic: false}) {
+      {bool isStatic = false}) {
     FormalParameterList fl = formalParameterList(params);
     Block b = block(statements);
     BlockFunctionBody body = blockFunctionBody(b);
@@ -266,8 +266,8 @@
   }
 
   NamedExpression namedExpression(String s, Expression e) {
-    Label l = astFactory.label(
-        identifierFromString(s), new Token(TokenType.COLON, 0));
+    Label l =
+        astFactory.label(identifierFromString(s), Token(TokenType.COLON, 0));
     return astFactory.namedExpression(l, e);
   }
 
@@ -275,8 +275,8 @@
   /// specified by the VariableElement. See also [variableStatement].
   VariableDeclarationList declareVariable(SimpleIdentifier name,
       [Expression init]) {
-    var eqToken = init != null ? new Token(TokenType.EQ, 0) : null;
-    var varToken = new KeywordToken(Keyword.VAR, 0);
+    var eqToken = init != null ? Token(TokenType.EQ, 0) : null;
+    var varToken = KeywordToken(Keyword.VAR, 0);
     return astFactory.variableDeclarationList(null, null, varToken, null,
         [astFactory.variableDeclaration(name, eqToken, init)]);
   }
@@ -288,89 +288,88 @@
 
   InstanceCreationExpression instanceCreation(
       ConstructorName ctor, List<Expression> args) {
-    var newToken = new KeywordToken(Keyword.NEW, 0);
+    var newToken = KeywordToken(Keyword.NEW, 0);
     return astFactory.instanceCreationExpression(
         newToken, ctor, argumentList(args));
   }
 
   ConstructorName constructorName(TypeName type, [SimpleIdentifier name]) {
-    Token period = name != null ? new Token(TokenType.PERIOD, 0) : null;
+    Token period = name != null ? Token(TokenType.PERIOD, 0) : null;
     return astFactory.constructorName(type, period, name);
   }
 
   SimpleIdentifier identifierFromString(String name) {
-    StringToken token = new SyntheticStringToken(TokenType.IDENTIFIER, name, 0);
+    StringToken token = SyntheticStringToken(TokenType.IDENTIFIER, name, 0);
     return astFactory.simpleIdentifier(token);
   }
 
   PrefixedIdentifier prefixedIdentifier(
       SimpleIdentifier pre, SimpleIdentifier id) {
-    Token period = new Token(TokenType.PERIOD, 0);
+    Token period = Token(TokenType.PERIOD, 0);
     return astFactory.prefixedIdentifier(pre, period, id);
   }
 
   TypeParameter typeParameter(SimpleIdentifier name, [TypeName bound = null]) {
-    Token keyword =
-        (bound == null) ? null : new KeywordToken(Keyword.EXTENDS, 0);
+    Token keyword = (bound == null) ? null : KeywordToken(Keyword.EXTENDS, 0);
     return astFactory.typeParameter(null, null, name, keyword, bound);
   }
 
   TypeParameterList typeParameterList(List<TypeParameter> params) {
-    Token lb = new Token(TokenType.LT, 0);
-    Token rb = new Token(TokenType.GT, 0);
+    Token lb = Token(TokenType.LT, 0);
+    Token rb = Token(TokenType.GT, 0);
     return astFactory.typeParameterList(lb, params, rb);
   }
 
   TypeArgumentList typeArgumentList(List<TypeAnnotation> args) {
-    Token lb = new Token(TokenType.LT, 0);
-    Token rb = new Token(TokenType.GT, 0);
+    Token lb = Token(TokenType.LT, 0);
+    Token rb = Token(TokenType.GT, 0);
     return astFactory.typeArgumentList(lb, args, rb);
   }
 
   ArgumentList argumentList(List<Expression> args) {
-    Token lp = new BeginToken(TokenType.OPEN_PAREN, 0);
-    Token rp = new Token(TokenType.CLOSE_PAREN, 0);
+    Token lp = BeginToken(TokenType.OPEN_PAREN, 0);
+    Token rp = Token(TokenType.CLOSE_PAREN, 0);
     return astFactory.argumentList(lp, args, rp);
   }
 
   BooleanLiteral booleanLiteral(bool b) {
-    var k = new KeywordToken(b ? Keyword.TRUE : Keyword.FALSE, 0);
+    var k = KeywordToken(b ? Keyword.TRUE : Keyword.FALSE, 0);
     return astFactory.booleanLiteral(k, b);
   }
 
   NullLiteral nullLiteral() {
-    var n = new KeywordToken(Keyword.NULL, 0);
+    var n = KeywordToken(Keyword.NULL, 0);
     return astFactory.nullLiteral(n);
   }
 
   IntegerLiteral integerLiteral(int i) {
-    StringToken token = new StringToken(TokenType.INT, '$i', 0);
+    StringToken token = StringToken(TokenType.INT, '$i', 0);
     return astFactory.integerLiteral(token, i);
   }
 
   SimpleStringLiteral simpleStringLiteral(String s) {
-    StringToken token = new StringToken(TokenType.STRING, "\"" + s + "\"", 0);
+    StringToken token = StringToken(TokenType.STRING, "\"" + s + "\"", 0);
     return astFactory.simpleStringLiteral(token, s);
   }
 
   SimpleStringLiteral tripleQuotedStringLiteral(String s) {
-    StringToken token = new StringToken(TokenType.STRING, '"""' + s + '"""', 0);
+    StringToken token = StringToken(TokenType.STRING, '"""' + s + '"""', 0);
     return astFactory.simpleStringLiteral(token, s);
   }
 
   AsExpression asExpression(Expression exp, TypeName type) {
-    Token token = new KeywordToken(Keyword.AS, 0);
+    Token token = KeywordToken(Keyword.AS, 0);
     return astFactory.asExpression(exp, token, type);
   }
 
   IsExpression isExpression(Expression exp, TypeName type) {
-    Token token = new KeywordToken(Keyword.IS, 0);
+    Token token = KeywordToken(Keyword.IS, 0);
     return astFactory.isExpression(exp, token, null, type);
   }
 
   ParenthesizedExpression parenthesizedExpression(Expression exp) {
-    Token lp = new BeginToken(TokenType.OPEN_PAREN, exp.offset);
-    Token rp = new Token(TokenType.CLOSE_PAREN, exp.end);
+    Token lp = BeginToken(TokenType.OPEN_PAREN, exp.offset);
+    Token rp = Token(TokenType.CLOSE_PAREN, exp.end);
     return astFactory.parenthesizedExpression(lp, exp, rp);
   }
 
@@ -380,20 +379,20 @@
   }
 
   FormalParameterList formalParameterList(List<FormalParameter> params) {
-    Token lp = new BeginToken(TokenType.OPEN_PAREN, 0);
-    Token rp = new Token(TokenType.CLOSE_PAREN, 0);
+    Token lp = BeginToken(TokenType.OPEN_PAREN, 0);
+    Token rp = Token(TokenType.CLOSE_PAREN, 0);
     bool hasOptional = params.any((p) => p.isPositional);
     bool hasNamed = params.any((p) => p.isNamed);
     assert(!(hasOptional && hasNamed));
     Token ld = null;
     Token rd = null;
     if (hasOptional) {
-      ld = new BeginToken(TokenType.OPEN_SQUARE_BRACKET, 0);
-      rd = new Token(TokenType.CLOSE_SQUARE_BRACKET, 0);
+      ld = BeginToken(TokenType.OPEN_SQUARE_BRACKET, 0);
+      rd = Token(TokenType.CLOSE_SQUARE_BRACKET, 0);
     }
     if (hasNamed) {
-      ld = new BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
-      rd = new Token(TokenType.CLOSE_CURLY_BRACKET, 0);
+      ld = BeginToken(TokenType.OPEN_CURLY_BRACKET, 0);
+      rd = Token(TokenType.CLOSE_CURLY_BRACKET, 0);
     }
     return astFactory.formalParameterList(lp, params, ld, rd, rp);
   }
@@ -404,12 +403,12 @@
 
   ExpressionFunctionBody expressionFunctionBody(Expression body,
       [bool decl = false]) {
-    Token semi = (decl) ? new Token(TokenType.SEMICOLON, 0) : null;
+    Token semi = (decl) ? Token(TokenType.SEMICOLON, 0) : null;
     return astFactory.expressionFunctionBody(null, null, body, semi);
   }
 
   ExpressionStatement expressionStatement(Expression expression) {
-    Token semi = new Token(TokenType.SEMICOLON, 0);
+    Token semi = Token(TokenType.SEMICOLON, 0);
     return astFactory.expressionStatement(expression, semi);
   }
 
@@ -420,8 +419,8 @@
 
   MethodDeclaration methodDeclaration(TypeName rt, SimpleIdentifier m,
       FormalParameterList fl, FunctionBody body,
-      {bool isStatic: false}) {
-    Token st = isStatic ? new KeywordToken(Keyword.STATIC, 0) : null;
+      {bool isStatic = false}) {
+    Token st = isStatic ? KeywordToken(Keyword.STATIC, 0) : null;
     return astFactory.methodDeclaration(
         null, null, null, st, rt, null, null, m, null, fl, body);
   }
@@ -432,8 +431,8 @@
   }
 
   Statement returnExpression([Expression e]) {
-    Token ret = new KeywordToken(Keyword.RETURN, 0);
-    Token semi = new Token(TokenType.SEMICOLON, 0);
+    Token ret = KeywordToken(Keyword.RETURN, 0);
+    Token semi = Token(TokenType.SEMICOLON, 0);
     return astFactory.returnStatement(ret, e, semi);
   }
 
@@ -453,7 +452,7 @@
 
   VariableDeclarationStatement variableDeclarationStatement(
       VariableDeclarationList varDecl) {
-    var semi = new Token(TokenType.SEMICOLON, 0);
+    var semi = Token(TokenType.SEMICOLON, 0);
     return astFactory.variableDeclarationStatement(varDecl, semi);
   }
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index a4f0d88..fdda18f 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -91,10 +91,10 @@
   ///
   /// We sometimes special case codegen for a single library, as it simplifies
   /// name scoping requirements.
-  final _libraries = new Map<LibraryElement, JS.Identifier>();
+  final _libraries = Map<LibraryElement, JS.Identifier>();
 
   /// Imported libraries, and the temporaries used to refer to them.
-  final _imports = new Map<LibraryElement, JS.TemporaryId>();
+  final _imports = Map<LibraryElement, JS.TemporaryId>();
 
   /// The list of dart:_runtime SDK functions; these are assumed by other code
   /// in the SDK to be generated before anything else.
@@ -118,11 +118,10 @@
   /// In an async* function, this represents the stream controller parameter.
   JS.TemporaryId _asyncStarController;
 
-  final _initializingFormalTemps =
-      new HashMap<ParameterElement, JS.TemporaryId>();
+  final _initializingFormalTemps = HashMap<ParameterElement, JS.TemporaryId>();
 
   JS.Identifier _extensionSymbolsModule;
-  final _extensionSymbols = new Map<String, JS.TemporaryId>();
+  final _extensionSymbols = Map<String, JS.TemporaryId>();
 
   /// The  type provider from the current Analysis [context].
   final TypeProvider types;
@@ -153,6 +152,7 @@
   final InterfaceType linkedHashSetImplType;
   final InterfaceType identityHashSetImplType;
   final InterfaceType syncIterableType;
+  final InterfaceType asyncStarImplType;
 
   ConstFieldVisitor _constants;
 
@@ -179,7 +179,7 @@
   /// mappings.
   Element _currentElement;
 
-  final _deferredProperties = new HashMap<PropertyAccessorElement, JS.Method>();
+  final _deferredProperties = HashMap<PropertyAccessorElement, JS.Method>();
 
   BuildUnit _buildUnit;
 
@@ -187,7 +187,7 @@
 
   bool _superAllowed = true;
 
-  final _superHelpers = new Map<String, JS.Method>();
+  final _superHelpers = Map<String, JS.Method>();
 
   List<TypeParameterType> _typeParamInConst;
 
@@ -200,14 +200,14 @@
 
   /// Information about virtual fields for all libraries in the current build
   /// unit.
-  final virtualFields = new VirtualFieldModel();
+  final virtualFields = VirtualFieldModel();
 
-  final _usedCovariantPrivateMembers = new HashSet<ExecutableElement>();
+  final _usedCovariantPrivateMembers = HashSet<ExecutableElement>();
 
   CodeGenerator(
       AnalysisContext c, this.summaryData, this.options, this._extensionTypes)
       : context = c,
-        rules = new StrongTypeSystemImpl(c.typeProvider),
+        rules = StrongTypeSystemImpl(c.typeProvider),
         types = c.typeProvider,
         _asyncStreamIterator = getClass(c, 'dart:async', 'StreamIterator').type,
         _coreIdentical = _getLibrary(c, 'dart:core')
@@ -233,8 +233,9 @@
         identityHashSetImplType =
             getClass(c, 'dart:collection', '_IdentityHashSet').type,
         syncIterableType = getClass(c, 'dart:_js_helper', 'SyncIterable').type,
+        asyncStarImplType = getClass(c, 'dart:async', '_AsyncStarImpl').type,
         dartJSLibrary = _getLibrary(c, 'dart:js') {
-    jsTypeRep = new JSTypeRep(rules, c);
+    jsTypeRep = JSTypeRep(rules, c);
   }
 
   LibraryElement get currentLibrary => _currentElement.library;
@@ -262,7 +263,7 @@
     var module = _emitModule(compilationUnits, unit.name);
     var dartApiSummary = _summarizeModule(compilationUnits);
 
-    return new JSModuleFile(unit.name, errors, options, module, dartApiSummary);
+    return JSModuleFile(unit.name, errors, options, module, dartApiSummary);
   }
 
   List<int> _summarizeModule(List<CompilationUnit> units) {
@@ -277,9 +278,9 @@
               : (sdk as FolderBasedDartSdk).getSummarySdkBundle(true));
     }
 
-    var assembler = new PackageBundleAssembler();
+    var assembler = PackageBundleAssembler();
 
-    var uriToUnit = new Map<String, UnlinkedUnit>.fromIterables(
+    var uriToUnit = Map<String, UnlinkedUnit>.fromIterables(
         units.map((u) => u.element.source.uri.toString()), units.map((unit) {
       var unlinked = serializeAstUnlinked(unit);
       assembler.addUnlinkedUnit(unit.element.source, unlinked);
@@ -303,7 +304,7 @@
 
   JS.Program _emitModule(List<CompilationUnit> compilationUnits, String name) {
     if (moduleItems.isNotEmpty) {
-      throw new StateError('Can only call emitModule once.');
+      throw StateError('Can only call emitModule once.');
     }
 
     for (var unit in compilationUnits) {
@@ -313,7 +314,7 @@
     // Transform the AST to make coercions explicit.
     compilationUnits = CoercionReifier.reify(compilationUnits);
     var items = <JS.ModuleItem>[];
-    var root = new JS.Identifier('_root');
+    var root = JS.Identifier('_root');
     items.add(js.statement('const # = Object.create(null)', [root]));
 
     var isBuildingSdk =
@@ -321,20 +322,20 @@
     if (isBuildingSdk) {
       // Don't allow these to be renamed when we're building the SDK.
       // There is JS code in dart:* that depends on their names.
-      runtimeModule = new JS.Identifier('dart');
-      _extensionSymbolsModule = new JS.Identifier('dartx');
+      runtimeModule = JS.Identifier('dart');
+      _extensionSymbolsModule = JS.Identifier('dartx');
     } else {
       // Otherwise allow these to be renamed so users can write them.
-      runtimeModule = new JS.TemporaryId('dart');
-      _extensionSymbolsModule = new JS.TemporaryId('dartx');
+      runtimeModule = JS.TemporaryId('dart');
+      _extensionSymbolsModule = JS.TemporaryId('dartx');
     }
-    _typeTable = new TypeTable(runtimeModule);
+    _typeTable = TypeTable(runtimeModule);
 
     // Initialize our library variables.
     var exports = <JS.NameSpecifier>[];
     void emitLibrary(JS.Identifier id) {
       items.add(js.statement('const # = Object.create(#)', [id, root]));
-      exports.add(new JS.NameSpecifier(id));
+      exports.add(JS.NameSpecifier(id));
     }
 
     for (var unit in compilationUnits) {
@@ -343,7 +344,7 @@
 
       var libraryTemp = isSdkInternalRuntime(library)
           ? runtimeModule
-          : new JS.TemporaryId(jsLibraryName(_libraryRoot, library));
+          : JS.TemporaryId(jsLibraryName(_libraryRoot, library));
       _libraries[library] = libraryTemp;
       emitLibrary(libraryTemp);
     }
@@ -352,11 +353,11 @@
     // TODO(jmesserly): find a cleaner design for this.
     if (isBuildingSdk) emitLibrary(_extensionSymbolsModule);
 
-    items.add(new JS.ExportDeclaration(new JS.ExportClause(exports)));
+    items.add(JS.ExportDeclaration(JS.ExportClause(exports)));
 
     // Collect all class/type Element -> Node mappings
     // in case we need to forward declare any classes.
-    _declarationNodes = new HashMap<TypeDefiningElement, AstNode>.identity();
+    _declarationNodes = HashMap<TypeDefiningElement, AstNode>.identity();
     for (var unit in compilationUnits) {
       for (var declaration in unit.declarations) {
         var element = declaration.element;
@@ -366,7 +367,7 @@
       }
     }
     if (compilationUnits.isNotEmpty) {
-      _constants = new ConstFieldVisitor(context,
+      _constants = ConstFieldVisitor(context,
           dummySource: resolutionMap
               .elementDeclaredByCompilationUnit(compilationUnits.first)
               .source);
@@ -391,7 +392,7 @@
     // Initialize extension symbols
     _extensionSymbols.forEach((name, id) {
       JS.Expression value =
-          new JS.PropertyAccess(_extensionSymbolsModule, _propertyName(name));
+          JS.PropertyAccess(_extensionSymbolsModule, _propertyName(name));
       if (isBuildingSdk) {
         value = js.call('# = Symbol(#)', [value, js.string("dartx.$name")]);
       }
@@ -409,7 +410,7 @@
     _copyAndFlattenBlocks(items, moduleItems);
 
     // Build the module.
-    return new JS.Program(items, name: _buildUnit.name);
+    return JS.Program(items, name: _buildUnit.name);
   }
 
   void _emitDebuggerExtensionInfo(String name) {
@@ -417,7 +418,7 @@
     _libraries.forEach((library, value) {
       // TODO(jacobr): we could specify a short library name instead of the
       // full library uri if we wanted to save space.
-      properties.add(new JS.Property(
+      properties.add(JS.Property(
           js.escapedString(jsLibraryDebuggerName(_libraryRoot, library)),
           value));
     });
@@ -428,7 +429,7 @@
         .statement('#.trackLibraries(#, #, ${JSModuleFile.sourceMapHoleID});', [
       runtimeModule,
       js.string(name),
-      new JS.ObjectInitializer(properties, multiline: true)
+      JS.ObjectInitializer(properties, multiline: true)
     ]));
   }
 
@@ -482,7 +483,7 @@
     if (parts.isEmpty) parts = [''];
     JS.PropertyAccess access;
     for (var part in parts) {
-      access = new JS.PropertyAccess(
+      access = JS.PropertyAccess(
           access ?? runtimeCall('global'), js.escapedString(part, "'"));
     }
     return access;
@@ -493,7 +494,7 @@
     var name = getAnnotationName(e, isPublicJSAnnotation);
     if (name != null) {
       if (name.contains('.')) {
-        throw new UnsupportedError(
+        throw UnsupportedError(
             'static members do not support "." in their names. '
             'See https://github.com/dart-lang/sdk/issues/27926');
       }
@@ -526,13 +527,13 @@
     }
     var moduleName = _buildUnit.libraryToModule(source);
     if (moduleName == null) {
-      throw new StateError('Could not find module containing "$library".');
+      throw StateError('Could not find module containing "$library".');
     }
     return moduleName;
   }
 
   void _finishImports(List<JS.ModuleItem> items) {
-    var modules = new Map<String, List<LibraryElement>>();
+    var modules = Map<String, List<LibraryElement>>();
 
     for (var import in _imports.keys) {
       modules.putIfAbsent(_libraryToModule(import), () => []).add(import);
@@ -553,13 +554,13 @@
       //     import {foo as foo$} from 'foo'; // if rename was needed
       //
       var imports =
-          libraries.map((l) => new JS.NameSpecifier(_imports[l])).toList();
+          libraries.map((l) => JS.NameSpecifier(_imports[l])).toList();
       if (module == coreModuleName) {
-        imports.add(new JS.NameSpecifier(runtimeModule));
-        imports.add(new JS.NameSpecifier(_extensionSymbolsModule));
+        imports.add(JS.NameSpecifier(runtimeModule));
+        imports.add(JS.NameSpecifier(_extensionSymbolsModule));
       }
 
-      items.add(new JS.ImportDeclaration(
+      items.add(JS.ImportDeclaration(
           namedImports: imports, from: js.string(module, "'")));
     });
   }
@@ -696,7 +697,7 @@
 
     var currentNames = currentLibrary.publicNamespace.definedNames;
     var exportedNames =
-        new NamespaceBuilder().createExportNamespaceForDirective(element);
+        NamespaceBuilder().createExportNamespaceForDirective(element);
 
     // We only need to export main as it is the only method part of the
     // publicly exposed JS API for a library.
@@ -886,19 +887,19 @@
     // https://github.com/dart-lang/sdk/issues/31003
     var className = classElem.typeParameters.isNotEmpty
         ? (classElem == _jsArray
-            ? new JS.Identifier(classElem.name)
-            : new JS.TemporaryId(classElem.name))
+            ? JS.Identifier(classElem.name)
+            : JS.TemporaryId(classElem.name))
         : _emitTopLevelName(classElem);
 
     var savedClassProperties = _classProperties;
-    _classProperties = new ClassPropertyModel.build(
+    _classProperties = ClassPropertyModel.build(
         _extensionTypes,
         virtualFields,
         classElem,
         getClassCovariantParameters(classNode),
         _usedCovariantPrivateMembers);
 
-    var memberMap = new Map<Element, Declaration>();
+    var memberMap = Map<Element, Declaration>();
     for (var m in members) {
       if (m is FieldDeclaration) {
         for (var f in m.fields.variables) {
@@ -1146,7 +1147,7 @@
     if (isClassSymbol == null) {
       // TODO(jmesserly): we could export these symbols, if we want to mark
       // implemented interfaces for user-defined classes.
-      var id = new JS.TemporaryId("_is_${classElem.name}_default");
+      var id = JS.TemporaryId("_is_${classElem.name}_default");
       moduleItems.add(
           js.statement('const # = Symbol(#);', [id, js.string(id.name, "'")]));
       isClassSymbol = id;
@@ -1186,16 +1187,16 @@
 
   List<JS.Identifier> _emitTypeFormals(List<TypeParameterElement> typeFormals) {
     return typeFormals
-        .map((t) => new JS.Identifier(t.name))
+        .map((t) => JS.Identifier(t.name))
         .toList(growable: false);
   }
 
   /// Emits a field declaration for TypeScript & Closure's ES6_TYPED
   /// (e.g. `class Foo { i: string; }`)
   JS.VariableDeclarationList _emitTypeScriptField(FieldElement field) {
-    return new JS.VariableDeclarationList(field.isStatic ? 'static' : null, [
-      new JS.VariableInitialization(
-          new JS.Identifier(
+    return JS.VariableDeclarationList(field.isStatic ? 'static' : null, [
+      JS.VariableInitialization(
+          JS.Identifier(
               // TODO(ochafik): use a refactored _emitMemberName instead.
               field.name,
               type: emitTypeRef(field.type)),
@@ -1218,7 +1219,7 @@
       jsFormals,
       _typeTable.discharge(formals),
       body,
-      className ?? new JS.Identifier(element.name)
+      className ?? JS.Identifier(element.name)
     ]);
 
     var genericArgs = [typeConstructor];
@@ -1244,13 +1245,12 @@
         ? classElem.fields.map(_emitTypeScriptField).toList()
         : null;
     if (classElem.typeParameters.isNotEmpty) {
-      return new JS.ClassExpression(
-              className as JS.Identifier, heritage, methods,
+      return JS.ClassExpression(className as JS.Identifier, heritage, methods,
               typeParams: typeParams, fields: jsFields)
           .toStatement();
     }
-    var classExpr = new JS.ClassExpression(
-        new JS.TemporaryId(classElem.name), heritage, methods,
+    var classExpr = JS.ClassExpression(
+        JS.TemporaryId(classElem.name), heritage, methods,
         typeParams: typeParams, fields: jsFields);
     return js.statement('# = #;', [className, classExpr]);
   }
@@ -1276,7 +1276,7 @@
     }
 
     bool shouldDefer(DartType t) {
-      var visited = new Set<DartType>();
+      var visited = Set<DartType>();
       bool defer(DartType t) {
         if (classElem == t.element) return true;
         if (t.isObject) return false;
@@ -1331,8 +1331,8 @@
           ctorBody
               .add(_emitSuperConstructorCall(className, ctor.name, jsParams));
         }
-        body.add(_addConstructorToClass(className, ctor.name,
-            new JS.Fun(jsParams, new JS.Block(ctorBody))));
+        body.add(_addConstructorToClass(
+            className, ctor.name, JS.Fun(jsParams, JS.Block(ctorBody))));
       }
     }
 
@@ -1378,8 +1378,8 @@
         //     mixinMembers(C, class C$ extends M { <methods>  });
         mixinBody.add(runtimeStatement('mixinMembers(#, #)', [
           classExpr,
-          new JS.ClassExpression(
-              new JS.TemporaryId(classElem.name), mixinClass, methods)
+          JS.ClassExpression(
+              JS.TemporaryId(classElem.name), mixinClass, methods)
         ]));
       }
 
@@ -1391,10 +1391,10 @@
       var m = classElem.mixins[i];
 
       var mixinString = classElem.supertype.name + '_' + m.name;
-      var mixinClassName = new JS.TemporaryId(mixinString);
-      var mixinId = new JS.TemporaryId(mixinString + '\$');
+      var mixinClassName = JS.TemporaryId(mixinString);
+      var mixinId = JS.TemporaryId(mixinString + '\$');
       var mixinClassExpression =
-          new JS.ClassExpression(mixinClassName, baseClass, []);
+          JS.ClassExpression(mixinClassName, baseClass, []);
       // Bind the mixin class to a name to workaround a V8 bug with es6 classes
       // and anonymous function names.
       // TODO(leafp:) Eliminate this once the bug is fixed:
@@ -1440,17 +1440,17 @@
         var field = decl.element as FieldElement;
         var name = getAnnotationName(field, isJSName) ?? field.name;
         // Generate getter
-        var fn = new JS.Fun([], js.block('{ return this.#; }', [name]));
+        var fn = JS.Fun([], js.block('{ return this.#; }', [name]));
         var method =
-            new JS.Method(_declareMemberName(field.getter), fn, isGetter: true);
+            JS.Method(_declareMemberName(field.getter), fn, isGetter: true);
         jsMethods.add(method);
 
         // Generate setter
         if (!decl.isFinal) {
-          var value = new JS.TemporaryId('value');
-          fn = new JS.Fun([value], js.block('{ this.# = #; }', [name, value]));
-          method = new JS.Method(_declareMemberName(field.setter), fn,
-              isSetter: true);
+          var value = JS.TemporaryId('value');
+          fn = JS.Fun([value], js.block('{ this.# = #; }', [name, value]));
+          method =
+              JS.Method(_declareMemberName(field.setter), fn, isSetter: true);
           jsMethods.add(method);
         }
       }
@@ -1470,23 +1470,23 @@
     if (type.isObject) {
       // Dart does not use ES6 constructors.
       // Add an error to catch any invalid usage.
-      jsMethods.add(
-          new JS.Method(_propertyName('constructor'), js.fun(r'''function() {
+      jsMethods
+          .add(JS.Method(_propertyName('constructor'), js.fun(r'''function() {
                   throw Error("use `new " + #.typeName(#.getReifiedType(this)) +
                       ".new(...)` to create a Dart object");
               }''', [runtimeModule, runtimeModule])));
     } else if (classElem.isEnum) {
       // Generate Enum.toString()
       var fields = classElem.fields.where((f) => f.type == type).toList();
-      var mapMap = new List<JS.Property>(fields.length);
+      var mapMap = List<JS.Property>(fields.length);
       for (var i = 0; i < fields.length; ++i) {
-        mapMap[i] = new JS.Property(
+        mapMap[i] = JS.Property(
             js.number(i), js.string('${type.name}.${fields[i].name}'));
       }
-      jsMethods.add(new JS.Method(
+      jsMethods.add(JS.Method(
           _declareMemberName(types.objectType.getMethod('toString')),
           js.fun('function() { return #[this.index]; }',
-              new JS.ObjectInitializer(mapMap, multiline: true))));
+              JS.ObjectInitializer(mapMap, multiline: true))));
     }
 
     for (var m in memberNodes) {
@@ -1554,12 +1554,12 @@
       if (member is PropertyAccessorElement) {
         var param =
             covariantParams.lookup(member.parameters[0]) as ParameterElement;
-        methods.add(new JS.Method(
+        methods.add(JS.Method(
             name,
             js.fun('function(x) { return super.# = #._check(x); }',
                 [name, _emitType(param.type)]),
             isSetter: true));
-        methods.add(new JS.Method(
+        methods.add(JS.Method(
             name, js.fun('function() { return super.#; }', [name]),
             isGetter: true));
       } else if (member is MethodElement) {
@@ -1569,7 +1569,7 @@
         _emitCovarianceBoundsCheck(type.typeFormals, covariantParams, body);
 
         var typeFormals = _emitTypeFormals(type.typeFormals);
-        var jsParams = new List<JS.Parameter>.from(typeFormals);
+        var jsParams = List<JS.Parameter>.from(typeFormals);
         bool foundNamedParams = false;
         for (var param in member.parameters) {
           param = covariantParams.lookup(param) as ParameterElement;
@@ -1608,11 +1608,11 @@
           body.add(js.statement(
               'return super.#(#)(#);', [name, typeFormals, jsParams]));
         }
-        var fn = new JS.Fun(jsParams, new JS.Block(body),
+        var fn = JS.Fun(jsParams, JS.Block(body),
             typeParams: typeFormals, returnType: emitTypeRef(type.returnType));
-        methods.add(new JS.Method(name, fn));
+        methods.add(JS.Method(name, fn));
       } else {
-        throw new StateError(
+        throw StateError(
             'unable to generate a covariant check for element: `$member` '
             '(${member.runtimeType})');
       }
@@ -1641,9 +1641,9 @@
       // rest/spread support, but this should work for now.
       var params = _emitParameters(node.parameters?.parameters);
 
-      fun = new JS.Fun(
+      fun = JS.Fun(
           params,
-          new JS.Block([
+          JS.Block([
             js.statement('return $newKeyword #(#)',
                 [visitConstructorName(redirect), params])
               ..sourceInformation = _nodeStart(redirect)
@@ -1657,13 +1657,13 @@
       body.add(_visitStatement(node.body));
 
       var params = _emitParameters(node.parameters?.parameters);
-      fun = new JS.Fun(params, new JS.Block(body), returnType: returnType);
+      fun = JS.Fun(params, JS.Block(body), returnType: returnType);
     }
 
     _currentFunction = savedFunction;
 
     return closureAnnotate(
-        new JS.Method(name, fun, isStatic: true)
+        JS.Method(name, fun, isStatic: true)
           ..sourceInformation = _functionEnd(node),
         element,
         node);
@@ -1691,11 +1691,11 @@
   JS.Method _implementMockMember(ExecutableElement method, InterfaceType type) {
     var invocationProps = <JS.Property>[];
     addProperty(String name, JS.Expression value) {
-      invocationProps.add(new JS.Property(js.string(name), value));
+      invocationProps.add(JS.Property(js.string(name), value));
     }
 
     var typeParams = _emitTypeFormals(method.type.typeFormals);
-    var fnArgs = new List<JS.Parameter>.from(typeParams);
+    var fnArgs = List<JS.Parameter>.from(typeParams);
     var args = _emitParametersForElement(method);
     fnArgs.addAll(args);
     var argInit = _emitArgumentInitializers(method);
@@ -1717,12 +1717,12 @@
       // Sort the names to match dart2js order.
       var sortedNames = (namedParameterTypes.keys.toList())..sort();
       var named = sortedNames
-          .map((n) => new JS.Property(_propertyName(n), new JS.Identifier(n)));
-      addProperty('namedArguments', new JS.ObjectInitializer(named.toList()));
+          .map((n) => JS.Property(_propertyName(n), JS.Identifier(n)));
+      addProperty('namedArguments', JS.ObjectInitializer(named.toList()));
       positionalArgs.removeLast();
     }
     if (typeParams.isNotEmpty) {
-      addProperty('typeArguments', new JS.ArrayInitializer(typeParams));
+      addProperty('typeArguments', JS.ArrayInitializer(typeParams));
     }
 
     var fnBody =
@@ -1730,7 +1730,7 @@
       runtimeModule,
       _declareMemberName(method),
       args,
-      new JS.ObjectInitializer(invocationProps)
+      JS.ObjectInitializer(invocationProps)
     ]);
 
     if (!method.returnType.isDynamic) {
@@ -1738,13 +1738,13 @@
     }
 
     var fnBlock = argInit != null
-        ? new JS.Block([argInit, fnBody.toReturn()])
+        ? JS.Block([argInit, fnBody.toReturn()])
         : fnBody.toReturn().toBlock();
 
-    return new JS.Method(
+    return JS.Method(
         _declareMemberName(method,
             useExtension: _extensionTypes.isNativeClass(type.element)),
-        new JS.Fun(fnArgs, fnBlock, typeParams: typeParams),
+        JS.Fun(fnArgs, fnBlock, typeParams: typeParams),
         isGetter: method is PropertyAccessorElement && method.isGetter,
         isSetter: method is PropertyAccessorElement && method.isSetter,
         isStatic: false);
@@ -1766,14 +1766,12 @@
     var mocks = _classProperties.mockMembers;
     if (!mocks.containsKey(element.name)) {
       var getter = js.fun('function() { return this[#]; }', [virtualField]);
-      result.add(new JS.Method(name, getter, isGetter: true)
+      result.add(JS.Method(name, getter, isGetter: true)
         ..sourceInformation = _functionSpan(field.name));
     }
 
     if (!mocks.containsKey(element.name + '=')) {
-      var args = field.isFinal
-          ? [new JS.Super(), name]
-          : [new JS.This(), virtualField];
+      var args = field.isFinal ? [JS.Super(), name] : [JS.This(), virtualField];
 
       String jsCode;
       var setter = element.setter;
@@ -1787,7 +1785,7 @@
         jsCode = 'function(value) { #[#] = value; }';
       }
 
-      result.add(new JS.Method(name, js.fun(jsCode, args), isSetter: true)
+      result.add(JS.Method(name, js.fun(jsCode, args), isSetter: true)
         ..sourceInformation = _functionSpan(field.name));
     }
 
@@ -1812,7 +1810,7 @@
           _classProperties.inheritedSetters.contains(field.name)) {
         // Generate a setter that forwards to super.
         var fn = js.fun('function(value) { super[#] = value; }', [name]);
-        return new JS.Method(name, fn, isSetter: true);
+        return JS.Method(name, fn, isSetter: true);
       }
     } else {
       var getter = field.getter;
@@ -1820,7 +1818,7 @@
           _classProperties.inheritedGetters.contains(field.name)) {
         // Generate a getter that forwards to super.
         var fn = js.fun('function() { return super[#]; }', [name]);
-        return new JS.Method(name, fn, isGetter: true);
+        return JS.Method(name, fn, isGetter: true);
       }
     }
     return null;
@@ -1853,7 +1851,7 @@
 
     // Otherwise, emit the adapter method, which wraps the Dart iterator in
     // an ES6 iterator.
-    return new JS.Method(
+    return JS.Method(
         js.call('Symbol.iterator'),
         js.call('function() { return new #.JsIterator(this.#); }',
             [runtimeModule, _emitMemberName('iterator', type: t)]) as JS.Fun);
@@ -1904,9 +1902,8 @@
       return body;
     }
 
-    var fields = new List<VariableDeclaration>.from(memberMap.values.where(
-        (m) =>
-            m is VariableDeclaration && !(m.element as FieldElement).isStatic));
+    var fields = List<VariableDeclaration>.from(memberMap.values.where((m) =>
+        m is VariableDeclaration && !(m.element as FieldElement).isStatic));
 
     // Iff no constructor is specified for a class C, it implicitly has a
     // default constructor `C() : super() {}`, unless C is class Object.
@@ -1920,7 +1917,7 @@
 
       addConstructor(
           '',
-          new JS.Fun([], new JS.Block(ctorBody))
+          JS.Fun([], JS.Block(ctorBody))
             ..sourceInformation = _functionEnd(classNode));
       return body;
     }
@@ -1998,7 +1995,7 @@
       for (var f in classElem.fields) {
         if (f.type != type) continue;
         // static const E id_i = const E(i);
-        values.add(new JS.PropertyAccess(
+        values.add(JS.PropertyAccess(
             _emitStaticClassName(classElem), _declareMemberName(f.getter)));
         var enumValue = runtimeCall('const(new (#.#)(#))', [
           _emitConstructorAccess(type),
@@ -2059,7 +2056,7 @@
         runtimeModule,
         helperName,
         className,
-        new JS.ArrayInitializer(names, multiline: names.length > 4)
+        JS.ArrayInitializer(names, multiline: names.length > 4)
       ]));
     }
 
@@ -2083,11 +2080,11 @@
         var proto = classElem.type.isObject
             ? js.call('Object.create(null)')
             : runtimeCall('get${name}s(#.__proto__)', [className]);
-        elements.insert(0, new JS.Property(_propertyName('__proto__'), proto));
+        elements.insert(0, JS.Property(_propertyName('__proto__'), proto));
       }
       body.add(runtimeStatement('set${name}Signature(#, () => #)', [
         className,
-        new JS.ObjectInitializer(elements, multiline: elements.length > 1)
+        JS.ObjectInitializer(elements, multiline: elements.length > 1)
       ]));
     }
 
@@ -2125,13 +2122,13 @@
           var type = _emitAnnotatedFunctionType(
               reifiedType, annotationNode?.metadata,
               parameters: annotationNode?.parameters?.parameters);
-          var property = new JS.Property(_declareMemberName(method), type);
+          var property = JS.Property(_declareMemberName(method), type);
           if (isStatic) {
             staticMethods.add(property);
           } else {
             instanceMethods.add(property);
             if (extMembers.contains(name)) {
-              instanceMethods.add(new JS.Property(
+              instanceMethods.add(JS.Property(
                   _declareMemberName(method, useExtension: true), type));
             }
           }
@@ -2188,14 +2185,14 @@
                   nameType: false),
               annotationNode?.metadata);
 
-          var property = new JS.Property(_declareMemberName(accessor), type);
+          var property = JS.Property(_declareMemberName(accessor), type);
           if (isStatic) {
             (isGetter ? staticGetters : staticSetters).add(property);
           } else {
             var accessors = isGetter ? instanceGetters : instanceSetters;
             accessors.add(property);
             if (extMembers.contains(accessor.variable.name)) {
-              accessors.add(new JS.Property(
+              accessors.add(JS.Property(
                   _declareMemberName(accessor, useExtension: true), type));
             }
           }
@@ -2226,7 +2223,7 @@
         var fieldSig = _emitFieldSignature(field.type,
             metadata: metadata, isFinal: field.isFinal);
         (isStatic ? staticFields : instanceFields)
-            .add(new JS.Property(memberName, fieldSig));
+            .add(JS.Property(memberName, fieldSig));
       }
       emitSignature('Field', instanceFields);
       emitSignature('StaticField', staticFields);
@@ -2240,7 +2237,7 @@
         var type = _emitAnnotatedFunctionType(
             ctor.type, annotationNode?.metadata,
             parameters: annotationNode?.parameters?.parameters);
-        constructors.add(new JS.Property(memberName, type));
+        constructors.add(JS.Property(memberName, type));
       }
 
       emitSignature('Constructor', constructors);
@@ -2268,7 +2265,7 @@
     _superAllowed = savedSuperAllowed;
     _currentFunction = savedFunction;
 
-    return new JS.Fun(params, body)..sourceInformation = _functionEnd(node);
+    return JS.Fun(params, body)..sourceInformation = _functionEnd(node);
   }
 
   FunctionType _getMemberRuntimeType(ExecutableElement element) {
@@ -2277,18 +2274,18 @@
     if (!element.parameters.any(_isCovariant)) return element.type;
 
     var parameters = element.parameters
-        .map((p) => new ParameterElementImpl.synthetic(p.name,
+        .map((p) => ParameterElementImpl.synthetic(p.name,
             _isCovariant(p) ? objectClass.type : p.type, p.parameterKind))
         .toList();
 
-    var function = new FunctionElementImpl("", -1)
+    var function = FunctionElementImpl("", -1)
       ..isSynthetic = true
       ..returnType = element.returnType
       // TODO(jmesserly): do covariant type parameter bounds also need to be
       // reified as `Object`?
       ..shareTypeParameters(element.typeParameters)
       ..parameters = parameters;
-    return function.type = new FunctionTypeImpl(function);
+    return function.type = FunctionTypeImpl(function);
   }
 
   JS.Expression _constructorName(String name) {
@@ -2317,7 +2314,7 @@
     for (var init in node.initializers) {
       if (init is RedirectingConstructorInvocation) {
         body.add(_emitRedirectingConstructor(init, className));
-        return new JS.Block(body);
+        return JS.Block(body);
       }
     }
 
@@ -2344,7 +2341,7 @@
     }
 
     body.add(_emitFunctionScopedBody(node.body, node.element));
-    return new JS.Block(body);
+    return JS.Block(body);
   }
 
   JS.Statement _emitRedirectingConstructor(
@@ -2425,7 +2422,7 @@
 
     var body = <JS.Statement>[];
     if (ctor != null) {
-      ctorFields = new HashSet<FieldElement>();
+      ctorFields = HashSet<FieldElement>();
 
       // Run constructor parameter initializers such as `this.foo`
       for (var p in ctor.parameters.parameters) {
@@ -2491,7 +2488,7 @@
         if (paramNode != null) {
           var paramDefault = (paramNode as DefaultFormalParameter).defaultValue;
           if (paramDefault == null) {
-            defaultValue = new JS.LiteralNull();
+            defaultValue = JS.LiteralNull();
           } else if (_isJSUndefined(paramDefault)) {
             defaultValue = null;
           } else {
@@ -2567,11 +2564,10 @@
     String name =
         getAnnotationName(node.element, isJSAnnotation) ?? node.name.name;
     if (node.isGetter) {
-      return new JS.Fun([], js.block('{ return this.#; }', [name]));
+      return JS.Fun([], js.block('{ return this.#; }', [name]));
     } else if (node.isSetter) {
       var params = _emitParameters(node.parameters?.parameters);
-      return new JS.Fun(
-          params, js.block('{ this.# = #; }', [name, params.last]));
+      return JS.Fun(params, js.block('{ this.# = #; }', [name, params.last]));
     } else {
       return js.fun(
           'function (...args) { return this.#.apply(this, args); }', name);
@@ -2595,7 +2591,7 @@
     }
 
     return closureAnnotate(
-        new JS.Method(_declareMemberName(node.element), fn,
+        JS.Method(_declareMemberName(node.element), fn,
             isGetter: node.isGetter,
             isSetter: node.isSetter,
             isStatic: node.isStatic)
@@ -2683,7 +2679,7 @@
   JS.Method _emitTopLevelProperty(FunctionDeclaration node) {
     var name = node.name.name;
     return closureAnnotate(
-        new JS.Method(_propertyName(name),
+        JS.Method(_propertyName(name),
             _emitFunctionExpression(node.functionExpression),
             isGetter: node.isGetter, isSetter: node.isSetter)
           ..sourceInformation = _functionEnd(node),
@@ -2714,7 +2710,7 @@
   }
 
   JS.Expression _emitFunctionTagged(JS.Expression fn, FunctionType type,
-      {bool topLevel: false}) {
+      {bool topLevel = false}) {
     var lazy = topLevel && !_typeIsLoaded(type);
     var typeRep = _emitFunctionType(type, lazy: lazy);
     return runtimeCall(lazy ? 'lazyFn(#, #)' : 'fn(#, #)', [fn, typeRep]);
@@ -2752,7 +2748,7 @@
 
     // Convert `function(...) { ... }` to `(...) => ...`
     // This is for readability, but it also ensures correct `this` binding.
-    return new JS.ArrowFun(f.params, body,
+    return JS.ArrowFun(f.params, body,
         typeParams: f.typeParams, returnType: f.returnType);
   }
 
@@ -2782,13 +2778,13 @@
 
     JS.Block code = isSync
         ? _emitFunctionBody(element, parameters, body)
-        : new JS.Block([
+        : JS.Block([
             _emitGeneratorFunction(element, parameters, body).toReturn()
               ..sourceInformation = _nodeStart(body)
           ]);
 
     code = super.exitFunction(element.name, formals, code);
-    return new JS.Fun(formals, code,
+    return JS.Fun(formals, code,
         typeParams: typeFormals, returnType: emitTypeRef(type.returnType));
   }
 
@@ -2800,7 +2796,7 @@
     var initArgs = _emitArgumentInitializers(element, parameters);
     var block = _emitFunctionScopedBody(body, element);
 
-    if (initArgs != null) block = new JS.Block([initArgs, block]);
+    if (initArgs != null) block = JS.Block([initArgs, block]);
 
     _currentFunction = savedFunction;
 
@@ -2808,7 +2804,7 @@
       // TODO(jmesserly: JS AST printer does not understand the need to emit a
       // nested scoped block in a JS function. So we need to add a non-scoped
       // wrapper to ensure it gets printed.
-      block = new JS.Block([block]);
+      block = JS.Block([block]);
     }
     return block;
   }
@@ -2825,7 +2821,7 @@
       // named argument initialization, and sync* functions also emit locally
       // modified parameters into the function's scope.
       var parameterNames =
-          new HashSet<String>.from(element.parameters.map((e) => e.name));
+          HashSet<String>.from(element.parameters.map((e) => e.name));
       return block.toScopedBlock(parameterNames);
     }
     return block;
@@ -2861,15 +2857,15 @@
       // TODO(jmesserly): this will emit argument initializers (for default
       // values) inside the generator function body. Is that the best place?
       var jsBody = _emitFunctionBody(element, parameters, body);
-      var genFn = new JS.Fun(jsParams, jsBody,
+      var genFn = JS.Fun(jsParams, jsBody,
           isGenerator: true, returnType: emitTypeRef(returnType));
 
       // Name the function if possible, to get better stack traces.
       var name = element.name;
       JS.Expression gen = genFn;
       if (name.isNotEmpty) {
-        gen = new JS.NamedFunction(
-            new JS.TemporaryId(JS.friendlyNameForDartOperator[name] ?? name),
+        gen = JS.NamedFunction(
+            JS.TemporaryId(JS.friendlyNameForDartOperator[name] ?? name),
             genFn);
       }
       gen.sourceInformation = _functionEnd(body);
@@ -2913,17 +2909,18 @@
     }
 
     if (element.isGenerator) {
-      // `async*` uses the `dart.asyncStar` helper, and also has an extra
-      // `stream` parameter to the generator, which is used for passing values
-      // to the `_AsyncStarStreamController` implementation type.
+      // `async*` uses the `_AsyncStarImpl<T>` helper class. The generator
+      // callback takes an instance of this class.
       //
       // `yield` is specially generated inside `async*` by visitYieldStatement.
       // `await` is generated as `yield`.
       //
-      // dart:_runtime/generators.dart has an example of the generated code.
-      var asyncStarParam = new JS.TemporaryId('stream');
+      // _AsyncStarImpl has an example of the generated code.
+      var asyncStarParam = JS.TemporaryId('stream');
       var gen = emitGeneratorFn([asyncStarParam], asyncStarParam);
-      return runtimeCall('asyncStar(#, #)', [_emitType(returnType), gen]);
+
+      var asyncStarImpl = asyncStarImplType.instantiate([returnType]);
+      return js.call('new #.new(#).stream', [_emitType(asyncStarImpl), gen]);
     }
 
     // `async` works similar to `sync*`:
@@ -2956,11 +2953,11 @@
     if (JS.This.foundIn(fn)) {
       declareFn = js.statement('const # = #.bind(this);', [name, fn]);
     } else {
-      declareFn = new JS.FunctionDeclaration(name, fn);
+      declareFn = JS.FunctionDeclaration(name, fn);
     }
     var element = func.element;
     if (_reifyFunctionType(element)) {
-      declareFn = new JS.Block(
+      declareFn = JS.Block(
           [declareFn, _emitFunctionTagged(name, element.type).toStatement()]);
     }
     return declareFn;
@@ -3041,7 +3038,7 @@
       return _emitParameter(element);
     }
 
-    return new JS.Identifier(element.name);
+    return JS.Identifier(element.name);
   }
 
   JS.Expression _emitLibraryMemberElement(Element element, Expression node) {
@@ -3081,22 +3078,22 @@
 
     // For instance members, we add implicit-this.
     // For method tear-offs, we ensure it's a bound method.
-    var target = isStatic ? _emitStaticClassName(classElem) : new JS.This();
+    var target = isStatic ? _emitStaticClassName(classElem) : JS.This();
     if (element is MethodElement && _reifyTearoff(element, node)) {
       if (isStatic) {
         // TODO(jmesserly): we could tag static/top-level function types once
         // in the module initialization, rather than at the point where they
         // escape.
         return _emitFunctionTagged(
-            new JS.PropertyAccess(target, member), element.type);
+            JS.PropertyAccess(target, member), element.type);
       }
       return runtimeCall('bind(#, #)', [target, member]);
     }
-    return new JS.PropertyAccess(target, member);
+    return JS.PropertyAccess(target, member);
   }
 
   JS.Identifier _emitVariableDef(SimpleIdentifier id, {JS.TypeRef type}) {
-    return new JS.Identifier(id.name, type: type)
+    return JS.Identifier(id.name, type: type)
       ..sourceInformation = _nodeStart(id);
   }
 
@@ -3127,7 +3124,7 @@
   }
 
   JS.Identifier _emitParameter(ParameterElement element,
-      {bool declaration: false}) {
+      {bool declaration = false}) {
     // initializing formal parameter, e.g. `Point(this._x)`
     // TODO(jmesserly): type ref is not attached in this case.
     if (element.isInitializingFormal && element.isPrivate) {
@@ -3135,11 +3132,11 @@
       /// The renamer would handle this, but it would prefer to rename the
       /// temporary used for the private symbol. Instead rename the parameter.
       return _initializingFormalTemps.putIfAbsent(
-          element, () => new JS.TemporaryId(element.name.substring(1)));
+          element, () => JS.TemporaryId(element.name.substring(1)));
     }
 
     var type = declaration ? emitTypeRef(element.type) : null;
-    return new JS.Identifier(element.name, type: type);
+    return JS.Identifier(element.name, type: type);
   }
 
   List<Annotation> _parameterMetadata(FormalParameter p) =>
@@ -3152,25 +3149,25 @@
   JS.Expression _emitAnnotatedResult(
       JS.Expression result, List<Annotation> metadata) {
     if (options.emitMetadata && metadata != null && metadata.isNotEmpty) {
-      result = new JS.ArrayInitializer(
+      result = JS.ArrayInitializer(
           [result]..addAll(metadata.map(_instantiateAnnotation)));
     }
     return result;
   }
 
   JS.Expression _emitFieldSignature(DartType type,
-      {List<Annotation> metadata, bool isFinal: true}) {
+      {List<Annotation> metadata, bool isFinal = true}) {
     var args = [_emitType(type)];
     if (options.emitMetadata && metadata != null && metadata.isNotEmpty) {
-      args.add(new JS.ArrayInitializer(
-          metadata.map(_instantiateAnnotation).toList()));
+      args.add(
+          JS.ArrayInitializer(metadata.map(_instantiateAnnotation).toList()));
     }
     return runtimeCall(isFinal ? 'finalFieldType(#)' : 'fieldType(#)', [args]);
   }
 
   JS.ArrayInitializer _emitTypeNames(
       List<DartType> types, List<FormalParameter> parameters,
-      {bool nameType: true}) {
+      {bool nameType = true}) {
     var result = <JS.Expression>[];
     for (int i = 0; i < types.length; ++i) {
       var metadata =
@@ -3178,7 +3175,7 @@
       var typeName = _emitType(types[i], nameType: nameType);
       result.add(_emitAnnotatedResult(typeName, metadata));
     }
-    return new JS.ArrayInitializer(result);
+    return JS.ArrayInitializer(result);
   }
 
   JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) {
@@ -3186,9 +3183,9 @@
     types.forEach((name, type) {
       var key = _propertyName(name);
       var value = _emitType(type);
-      properties.add(new JS.Property(key, value));
+      properties.add(JS.Property(key, value));
     });
-    return new JS.ObjectInitializer(properties);
+    return JS.ObjectInitializer(properties);
   }
 
   /// Emit the pieces of a function type, as an array of return type,
@@ -3274,7 +3271,7 @@
   /// Emits a Dart [type] into code.
   ///
   /// If [nameType] is true, then the type will be named.
-  JS.Expression _emitType(DartType type, {bool nameType: true}) {
+  JS.Expression _emitType(DartType type, {bool nameType = true}) {
     // The void and dynamic types are not defined in core.
     if (type.isVoid) {
       return runtimeCall('void');
@@ -3321,7 +3318,7 @@
 
     if (type is TypeParameterType) {
       _typeParamInConst?.add(type);
-      return new JS.Identifier(name);
+      return JS.Identifier(name);
     }
 
     if (type is ParameterizedType) {
@@ -3345,12 +3342,13 @@
     return js.call('#(#)', [genericName, typeArgs]);
   }
 
-  JS.PropertyAccess _emitTopLevelName(Element e, {String suffix: ''}) {
+  JS.PropertyAccess _emitTopLevelName(Element e, {String suffix = ''}) {
     return _emitJSInterop(e) ?? _emitTopLevelNameNoInterop(e, suffix: suffix);
   }
 
-  JS.PropertyAccess _emitTopLevelNameNoInterop(Element e, {String suffix: ''}) {
-    return new JS.PropertyAccess(
+  JS.PropertyAccess _emitTopLevelNameNoInterop(Element e,
+      {String suffix = ''}) {
+    return JS.PropertyAccess(
         emitLibraryName(e.library), _emitTopLevelMemberName(e, suffix: suffix));
   }
 
@@ -3358,7 +3356,7 @@
   ///
   /// NOTE: usually you should use [_emitTopLevelName] instead of this. This
   /// function does not handle JS interop.
-  JS.Expression _emitTopLevelMemberName(Element e, {String suffix: ''}) {
+  JS.Expression _emitTopLevelMemberName(Element e, {String suffix = ''}) {
     var name = getJSExportName(e) ?? _getElementName(e);
     return _propertyName(name + suffix);
   }
@@ -3389,7 +3387,7 @@
       var x = _bindLeftHandSide(vars, left, context: left);
       // Capture the result of evaluating the left hand side in a temp.
       var t = _bindValue(vars, 't', x, context: x);
-      return new JS.MetaLet(vars, [
+      return JS.MetaLet(vars, [
         js.call('# == null ? # : #',
             [_visitExpression(t), _emitSet(x, right), _visitExpression(t)])
       ]);
@@ -3408,7 +3406,7 @@
 
     var castTo = getImplicitOperationCast(left);
     if (castTo != null) inc = CoercionReifier.castExpression(inc, castTo);
-    return new JS.MetaLet(vars, [_emitSet(lhs, inc)]);
+    return JS.MetaLet(vars, [_emitSet(lhs, inc)]);
   }
 
   JS.Expression _emitSet(Expression left, Expression right) {
@@ -3513,7 +3511,7 @@
     // Unqualified class member. This could mean implicit `this`, or implicit
     // static from the same class.
     if (element is FieldElement) {
-      return _emitSetField(right, element, new JS.This(), node);
+      return _emitSetField(right, element, JS.This(), node);
     }
 
     // We should not get here.
@@ -3529,7 +3527,7 @@
     } else if (element is ParameterElement) {
       target = _emitParameter(element);
     } else {
-      target = new JS.Identifier(element.name);
+      target = JS.Identifier(element.name);
     }
     target.sourceInformation = _nodeSpan(left);
     return _visitExpression(rhs).toAssignExpression(target);
@@ -3549,7 +3547,7 @@
     var member = _emitMemberName(field.name,
         isStatic: isStatic, type: classElem.type, element: field.setter);
     jsTarget = isStatic
-        ? (new JS.PropertyAccess(_emitStaticClassName(classElem), member)
+        ? (JS.PropertyAccess(_emitStaticClassName(classElem), member)
           ..sourceInformation = _nodeSpan(id))
         : _emitTargetAccess(jsTarget, member, field.setter, id);
     return _visitExpression(right).toAssignExpression(jsTarget);
@@ -3570,25 +3568,25 @@
       _visitExpression(left),
       _emitSet(_stripNullAwareOp(node, left), right)
     ]);
-    return new JS.MetaLet(vars, [body]);
+    return JS.MetaLet(vars, [body]);
   }
 
   @override
   JS.Block visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    return new JS.Block([_visitExpression(node.expression).toReturn()]);
+    return JS.Block([_visitExpression(node.expression).toReturn()]);
   }
 
   @override
-  JS.Block visitEmptyFunctionBody(EmptyFunctionBody node) => new JS.Block([]);
+  JS.Block visitEmptyFunctionBody(EmptyFunctionBody node) => JS.Block([]);
 
   @override
   JS.Block visitBlockFunctionBody(BlockFunctionBody node) {
-    return new JS.Block(_visitStatementList(node.block.statements));
+    return JS.Block(_visitStatementList(node.block.statements));
   }
 
   @override
   JS.Block visitBlock(Block node) =>
-      new JS.Block(_visitStatementList(node.statements), isScope: true);
+      JS.Block(_visitStatementList(node.statements), isScope: true);
 
   @override
   visitMethodInvocation(MethodInvocation node) {
@@ -3677,7 +3675,7 @@
     if (!_superAllowed && jsTarget is JS.Super && member != null) {
       result = _getSuperHelper(member, jsName);
     } else {
-      result = new JS.PropertyAccess(jsTarget, jsName);
+      result = JS.PropertyAccess(jsTarget, jsName);
     }
     if (node != null) {
       // Use the full span for a cascade property so we can hover over `bar` in
@@ -3701,28 +3699,28 @@
                 ? 'function(x) { super[#] = x; }'
                 : 'function() { return super[#]; }',
             [jsName]);
-        return new JS.Method(new JS.TemporaryId(member.variable.name), fn,
+        return JS.Method(JS.TemporaryId(member.variable.name), fn,
             isGetter: !isSetter, isSetter: isSetter);
       } else {
         var method = member as MethodElement;
-        var params = new List<JS.Identifier>.from(
-            _emitTypeFormals(method.typeParameters));
+        var params =
+            List<JS.Identifier>.from(_emitTypeFormals(method.typeParameters));
         for (var param in method.parameters) {
           if (param.isNamed) {
             params.add(namedArgumentTemp);
             break;
           }
-          params.add(new JS.Identifier(param.name));
+          params.add(JS.Identifier(param.name));
         }
 
         var fn = js.fun(
             'function(#) { return super[#](#); }', [params, jsName, params]);
         var name = method.name;
         name = JS.friendlyNameForDartOperator[name] ?? name;
-        return new JS.Method(new JS.TemporaryId(name), fn);
+        return JS.Method(JS.TemporaryId(name), fn);
       }
     });
-    return new JS.PropertyAccess(new JS.This(), jsMethod.name);
+    return JS.PropertyAccess(JS.This(), jsMethod.name);
   }
 
   JS.Expression _emitMethodCall(Expression target, MethodInvocation node) {
@@ -3760,7 +3758,7 @@
       if (fromType is InterfaceType) {
         var callName = _getImplicitCallTarget(fromType);
         if (callName != null) {
-          jsTarget = new JS.PropertyAccess(jsTarget, callName);
+          jsTarget = JS.PropertyAccess(jsTarget, callName);
         }
       }
     }
@@ -3769,7 +3767,7 @@
       jsTarget = js.call('#._check(#)', [_emitType(castTo), jsTarget]);
     }
     if (typeArgs != null) args.insertAll(0, typeArgs);
-    return new JS.Call(jsTarget, args);
+    return JS.Call(jsTarget, args);
   }
 
   JS.Expression _emitDynamicInvoke(
@@ -3851,7 +3849,7 @@
       return _emitJSDoubleEq(args, negated: negated);
     }
     var code = negated ? '!#' : '#';
-    return js.call(code, new JS.Call(_emitTopLevelName(_coreIdentical), args));
+    return js.call(code, JS.Call(_emitTopLevelName(_coreIdentical), args));
   }
 
   /// Emits a function call, to a top-level function, local function, or
@@ -3891,7 +3889,7 @@
       }
     }
 
-    return new JS.Call(fn, args);
+    return JS.Call(fn, args);
   }
 
   JS.Node _emitDebuggerCall(InvocationExpression node) {
@@ -3926,10 +3924,10 @@
         //
         // For a single `message` argument, use `{message: ...}`, which
         // coerces to true (the default value of `when`).
-        ? (foundWhen ? jsArgs[0].value : new JS.ObjectInitializer(jsArgs))
+        ? (foundWhen ? jsArgs[0].value : JS.ObjectInitializer(jsArgs))
         // If we have both `message` and `when` arguments, evaluate them in
         // order, then extract the `when` argument.
-        : js.call('#.when', new JS.ObjectInitializer(jsArgs));
+        : js.call('#.when', JS.ObjectInitializer(jsArgs));
     return isStatement
         ? js.statement('if (#) debugger;', when)
         : js.call('# && (() => { debugger; return true })()', when);
@@ -3999,7 +3997,7 @@
     String source;
     if (code is StringInterpolation) {
       if (args.length > 2) {
-        throw new ArgumentError(
+        throw ArgumentError(
             "Can't mix template args and string interpolation in JS calls.");
       }
       templateArgs = <Expression>[];
@@ -4045,14 +4043,13 @@
       if (arg is NamedExpression) {
         named.add(visitNamedExpression(arg));
       } else if (arg is MethodInvocation && isJsSpreadInvocation(arg)) {
-        args.add(
-            new JS.Spread(_visitExpression(arg.argumentList.arguments[0])));
+        args.add(JS.Spread(_visitExpression(arg.argumentList.arguments[0])));
       } else {
         args.add(_visitExpression(arg));
       }
     }
     if (named.isNotEmpty) {
-      args.add(new JS.ObjectInitializer(named));
+      args.add(JS.ObjectInitializer(named));
     }
     return args;
   }
@@ -4060,7 +4057,7 @@
   @override
   JS.Property visitNamedExpression(NamedExpression node) {
     assert(node.parent is ArgumentList);
-    return new JS.Property(
+    return JS.Property(
         _propertyName(node.name.label.name), _visitExpression(node.expression));
   }
 
@@ -4068,7 +4065,7 @@
     var jsParams = <JS.Identifier>[];
     for (var p in member.parameters) {
       if (p.isPositional) {
-        jsParams.add(new JS.Identifier(p.name));
+        jsParams.add(JS.Identifier(p.name));
       } else {
         jsParams.add(namedArgumentTemp);
         break;
@@ -4098,14 +4095,14 @@
 
   @override
   JS.EmptyStatement visitEmptyStatement(EmptyStatement node) =>
-      new JS.EmptyStatement();
+      JS.EmptyStatement();
 
   @override
   JS.Statement visitAssertStatement(AssertStatement node) =>
       _emitAssert(node.condition, node.message);
 
   JS.Statement _emitAssert(Expression condition, Expression message) {
-    if (!options.enableAsserts) return new JS.EmptyStatement();
+    if (!options.enableAsserts) return JS.EmptyStatement();
     // TODO(jmesserly): only emit in checked mode.
     var conditionType = condition.staticType;
     var jsCondition = _visitExpression(condition);
@@ -4151,7 +4148,7 @@
         _asyncStarController,
         helperName,
         jsExpr,
-        new JS.Yield(null)..sourceInformation = _nodeStart(node)
+        JS.Yield(null)..sourceInformation = _nodeStart(node)
       ]);
     }
     // A normal yield in a sync*
@@ -4160,7 +4157,7 @@
 
   @override
   JS.Expression visitAwaitExpression(AwaitExpression node) {
-    return new JS.Yield(_visitExpression(node.expression));
+    return JS.Yield(_visitExpression(node.expression));
   }
 
   /// This is not used--we emit top-level fields as we are emitting the
@@ -4203,7 +4200,7 @@
           //     dart.fn(f, typeOfF);
           //
           value = _emitArrowFunction(initializer);
-          return new JS.Block([
+          return JS.Block([
             value.toVariableDeclaration(name),
             _emitFunctionTagged(
                     name, getStaticType(initializer) as FunctionType,
@@ -4223,7 +4220,7 @@
   JS.VariableDeclarationList visitVariableDeclarationList(
       VariableDeclarationList node) {
     if (node == null) return null;
-    return new JS.VariableDeclarationList(
+    return JS.VariableDeclarationList(
         'let', node.variables?.map(visitVariableDeclaration)?.toList());
   }
 
@@ -4237,7 +4234,7 @@
 
     var name =
         _emitVariableDef(node.name, type: emitTypeRef(node.element.type));
-    return new JS.VariableInitialization(
+    return JS.VariableInitialization(
         name, _visitInitializer(node.initializer, node.element));
   }
 
@@ -4280,7 +4277,7 @@
   JS.Expression _visitInitializer(Expression init, Element variable) {
     // explicitly initialize to null, to avoid getting `undefined`.
     // TODO(jmesserly): do this only for vars that aren't definitely assigned.
-    if (init == null) return new JS.LiteralNull();
+    if (init == null) return JS.LiteralNull();
     return _annotatedNullCheck(variable)
         ? notNull(init)
         : _visitExpression(init);
@@ -4296,20 +4293,20 @@
       var element = node.element;
       var access = emitFieldName(element);
       accessors.add(closureAnnotate(
-          new JS.Method(
+          JS.Method(
               access,
               js.call('function() { return #; }',
                   _visitInitializer(node.initializer, element)) as JS.Fun,
               isGetter: true)
-            ..sourceInformation = _hoverComment(
-                new JS.PropertyAccess(objExpr, access), node.name),
+            ..sourceInformation =
+                _hoverComment(JS.PropertyAccess(objExpr, access), node.name),
           _findAccessor(element, getter: true),
           node));
 
       // TODO(jmesserly): currently uses a dummy setter to indicate writable.
       if (!node.isFinal && !node.isConst) {
         accessors.add(closureAnnotate(
-            new JS.Method(access, js.call('function(_) {}') as JS.Fun,
+            JS.Method(access, js.call('function(_) {}') as JS.Fun,
                 isSetter: true),
             _findAccessor(element, getter: false),
             node));
@@ -4332,8 +4329,7 @@
 
   JS.Expression _emitConstructorName(DartType type, String name) {
     return _emitJSInterop(type.element) ??
-        new JS.PropertyAccess(
-            _emitConstructorAccess(type), _constructorName(name));
+        JS.PropertyAccess(_emitConstructorAccess(type), _constructorName(name));
   }
 
   @override
@@ -4392,8 +4388,8 @@
       var ctor = _emitConstructorName(type, name);
       if (ctorNode != null) ctor.sourceInformation = _nodeSpan(ctorNode);
       return element.isFactory && !_hasJSInteropAnnotation(classElem)
-          ? new JS.Call(ctor, args)
-          : new JS.New(ctor, args);
+          ? JS.Call(ctor, args)
+          : JS.New(ctor, args);
     }
 
     return isConst ? _emitConst(emitNew) : emitNew();
@@ -4420,9 +4416,10 @@
 
   /// If the constant [value] is primitive, directly emit the
   /// corresponding JavaScript.  Otherwise, return null.
-  JS.Expression _emitDartObject(DartObject value, {bool handleUnknown: false}) {
+  JS.Expression _emitDartObject(DartObject value,
+      {bool handleUnknown = false}) {
     if (value == null || value.isNull) {
-      return new JS.LiteralNull();
+      return JS.LiteralNull();
     }
     var type = value.type;
     // Handle unknown value: when the declared variable wasn't found, and no
@@ -4433,7 +4430,7 @@
     // https://api.dartlang.org/stable/1.20.1/dart-core/bool/bool.fromEnvironment.html
     if (!value.hasKnownValue) {
       if (!handleUnknown) return null;
-      return type == types.boolType ? js.boolean(false) : new JS.LiteralNull();
+      return type == types.boolType ? js.boolean(false) : JS.LiteralNull();
     }
     if (type == types.boolType) {
       return js.boolean(value.toBoolValue());
@@ -4487,10 +4484,9 @@
           var args = ctor.positionalArguments.map(_emitDartObject).toList();
           var named = <JS.Property>[];
           ctor.namedArguments.forEach((name, value) {
-            named.add(
-                new JS.Property(_propertyName(name), _emitDartObject(value)));
+            named.add(JS.Property(_propertyName(name), _emitDartObject(value)));
           });
-          if (named.isNotEmpty) args.add(new JS.ObjectInitializer(named));
+          if (named.isNotEmpty) args.add(JS.ObjectInitializer(named));
           return args;
         }, isConst: true);
       }
@@ -4520,7 +4516,7 @@
       if (result != null) {
         return result;
       }
-      throw new StateError('failed to evaluate $node');
+      throw StateError('failed to evaluate $node');
     }
 
     // TODO(jmesserly): this is a workaround for Analyzer's type not
@@ -4636,7 +4632,7 @@
       var vars = <JS.MetaLetVariable, JS.Expression>{};
       // Desugar `l ?? r` as `l != null ? l : r`
       var l = _visitExpression(_bindValue(vars, 'l', left, context: left));
-      return new JS.MetaLet(vars, [
+      return JS.MetaLet(vars, [
         js.call('# != null ? # : #', [l, l, _visitExpression(right)])
       ]);
     }
@@ -4893,7 +4889,7 @@
       expr is NullLiteral || getStaticType(expr).isDartCoreNull;
 
   SimpleIdentifier _createTemporary(String name, DartType type,
-      {bool nullable: true, JS.Expression variable, bool dynamicInvoke}) {
+      {bool nullable = true, JS.Expression variable, bool dynamicInvoke}) {
     // We use an invalid source location to signal that this is a temporary.
     // See [_isTemporary].
     // TODO(jmesserly): alternatives are
@@ -4902,11 +4898,11 @@
     // * add a new property to LocalVariableElementImpl.
     // * create a new subtype of LocalVariableElementImpl to mark a temp.
     var id = astFactory
-        .simpleIdentifier(new StringToken(TokenType.IDENTIFIER, name, -1));
+        .simpleIdentifier(StringToken(TokenType.IDENTIFIER, name, -1));
 
-    variable ??= new JS.TemporaryId(name);
+    variable ??= JS.TemporaryId(name);
 
-    var idElement = new TemporaryVariableElement.forNode(id, variable)
+    var idElement = TemporaryVariableElement.forNode(id, variable)
       ..enclosingElement = _currentElement;
     id.staticElement = idElement;
     id.staticType = type;
@@ -4929,7 +4925,7 @@
     // params are available.
     if (_currentFunction == null || usesTypeParams) return jsExpr;
 
-    var temp = new JS.TemporaryId('const');
+    var temp = JS.TemporaryId('const');
     moduleItems.add(js.statement('let #;', [temp]));
     return js.call('# || (# = #)', [temp, temp, jsExpr]);
   }
@@ -5004,7 +5000,7 @@
     // No need to do anything for stateless expressions.
     if (isStateless(_currentFunction, expr, context)) return expr;
 
-    var variable = new JS.MetaLetVariable(name);
+    var variable = JS.MetaLetVariable(name);
     var t = _createTemporary(name, getStaticType(expr),
         variable: variable,
         dynamicInvoke: isDynamicInvoke(expr),
@@ -5060,7 +5056,7 @@
       ..staticType = getStaticType(expr);
 
     var body = <JS.Expression>[_emitSet(left, increment), _visitExpression(x)];
-    return new JS.MetaLet(vars, body, statelessResult: true);
+    return JS.MetaLet(vars, body, statelessResult: true);
   }
 
   @override
@@ -5095,7 +5091,7 @@
           ..staticElement = node.staticElement
           ..staticType = getStaticType(expr);
 
-        return new JS.MetaLet(vars, [_emitSet(x, increment)]);
+        return JS.MetaLet(vars, [_emitSet(x, increment)]);
       }
       return js.call('$op#', notNull(expr));
     }
@@ -5126,7 +5122,7 @@
     _cascadeTarget = _bindValue(vars, '_', node.target, context: node);
     var sections = _visitExpressionList(node.cascadeSections);
     sections.add(_visitExpression(_cascadeTarget));
-    var result = new JS.MetaLet(vars, sections, statelessResult: true);
+    var result = JS.MetaLet(vars, sections, statelessResult: true);
     _cascadeTarget = savedCascadeTemp;
     return result;
   }
@@ -5141,14 +5137,14 @@
       ..sourceInformation = _nodeSpan(node);
     var isRestArg = node is! DefaultFormalParameter &&
         findAnnotation(node.element, isJsRestAnnotation) != null;
-    return isRestArg ? new JS.RestParameter(id) : id;
+    return isRestArg ? JS.RestParameter(id) : id;
   }
 
   @override
-  JS.This visitThisExpression(ThisExpression node) => new JS.This();
+  JS.This visitThisExpression(ThisExpression node) => JS.This();
 
   @override
-  JS.Expression visitSuperExpression(SuperExpression node) => new JS.Super();
+  JS.Expression visitSuperExpression(SuperExpression node) => JS.Super();
 
   @override
   visitPrefixedIdentifier(PrefixedIdentifier node) {
@@ -5179,7 +5175,7 @@
     var t = _bindValue(vars, 't', target, context: target);
 
     var desugared = _stripNullAwareOp(node, t);
-    return new JS.MetaLet(vars, [
+    return JS.MetaLet(vars, [
       js.call('# == null ? null : #',
           [_visitExpression(t), _visitExpression(desugared)])
     ]);
@@ -5250,7 +5246,7 @@
         !virtualFields.isVirtual(field)) {
       // If super.x is a sealed field, then x is an instance property since
       // subclasses cannot override x.
-      jsTarget = new JS.This()..sourceInformation = jsTarget.sourceInformation;
+      jsTarget = JS.This()..sourceInformation = jsTarget.sourceInformation;
     }
 
     JS.Expression result;
@@ -5333,7 +5329,7 @@
   visitIndexExpression(IndexExpression node) {
     var target = _getTarget(node);
     if (_useNativeJsIndexer(target.staticType)) {
-      return new JS.PropertyAccess(
+      return JS.PropertyAccess(
           _visitExpression(target), _visitExpression(node.index));
     }
     return _emitOperatorCall(target, '[]', [node.index], node.staticElement);
@@ -5387,15 +5383,15 @@
     var result = _visitStatement(stmt);
     if (result is JS.ExpressionStatement &&
         result.expression is JS.VariableDeclarationList) {
-      return new JS.Block([result]);
+      return JS.Block([result]);
     }
     return result;
   }
 
   @override
   JS.If visitIfStatement(IfStatement node) {
-    return new JS.If(_visitTest(node.condition),
-        _visitScope(node.thenStatement), _visitScope(node.elseStatement));
+    return JS.If(_visitTest(node.condition), _visitScope(node.thenStatement),
+        _visitScope(node.elseStatement));
   }
 
   @override
@@ -5406,21 +5402,21 @@
     JS.Expression update;
     if (updaters != null && updaters.isNotEmpty) {
       update =
-          new JS.Expression.binary(updaters.map(_visitExpression).toList(), ',')
+          JS.Expression.binary(updaters.map(_visitExpression).toList(), ',')
               .toVoidExpression();
     }
     var condition = _visitTest(node.condition);
-    return new JS.For(init, condition, update, _visitScope(node.body));
+    return JS.For(init, condition, update, _visitScope(node.body));
   }
 
   @override
   JS.While visitWhileStatement(WhileStatement node) {
-    return new JS.While(_visitTest(node.condition), _visitScope(node.body));
+    return JS.While(_visitTest(node.condition), _visitScope(node.body));
   }
 
   @override
   JS.Do visitDoStatement(DoStatement node) {
-    return new JS.Do(_visitScope(node.body), _visitTest(node.condition));
+    return JS.Do(_visitScope(node.body), _visitTest(node.condition));
   }
 
   @override
@@ -5436,11 +5432,10 @@
       var id = node.loopVariable.identifier;
       init = js.call('let #', _emitVariableDef(id));
       if (_annotatedNullCheck(node.loopVariable.element)) {
-        body = new JS.Block(
-            [_nullParameterCheck(new JS.Identifier(id.name)), body]);
+        body = JS.Block([_nullParameterCheck(JS.Identifier(id.name)), body]);
       }
     }
-    return new JS.ForOf(init, iterable, body);
+    return JS.ForOf(init, iterable, body);
   }
 
   JS.Statement _emitAwaitFor(ForEachStatement node) {
@@ -5467,7 +5462,7 @@
         streamIterator.element.unnamedConstructor,
         streamIterator,
         () => [_visitExpression(node.iterable)]);
-    var iter = new JS.TemporaryId('iter');
+    var iter = JS.TemporaryId('iter');
     var variable = node.identifier ?? node.loopVariable.identifier;
     var init = _visitExpression(node.identifier);
     if (init == null) {
@@ -5485,11 +5480,11 @@
         [
           iter,
           createStreamIter,
-          new JS.Yield(js.call('#.moveNext()', iter))
+          JS.Yield(js.call('#.moveNext()', iter))
             ..sourceInformation = _nodeStart(variable),
           init,
           _visitStatement(node.body),
-          new JS.Yield(js.call('#.cancel()', iter))
+          JS.Yield(js.call('#.cancel()', iter))
             ..sourceInformation = _nodeStart(variable)
         ]);
   }
@@ -5497,13 +5492,13 @@
   @override
   visitBreakStatement(BreakStatement node) {
     var label = node.label;
-    return new JS.Break(label?.name);
+    return JS.Break(label?.name);
   }
 
   @override
   visitContinueStatement(ContinueStatement node) {
     var label = node.label;
-    return new JS.Continue(label?.name);
+    return JS.Continue(label?.name);
   }
 
   @override
@@ -5512,7 +5507,7 @@
     _superAllowed = false;
     var finallyBlock = _visitStatement(node.finallyBlock)?.toBlock();
     _superAllowed = savedSuperAllowed;
-    return new JS.Try(_visitStatement(node.body).toBlock(),
+    return JS.Try(_visitStatement(node.body).toBlock(),
         _visitCatch(node.catchClauses), finallyBlock);
   }
 
@@ -5543,7 +5538,7 @@
       catchVarDecl..sourceInformation = _nodeStart(_catchParameter);
     }
     _catchParameter = savedCatch;
-    return new JS.Catch(catchVarDecl, new JS.Block([catchBody]));
+    return JS.Catch(catchVarDecl, JS.Block([catchBody]));
   }
 
   JS.Statement _catchClauseGuard(CatchClause clause, JS.Statement otherwise) {
@@ -5556,7 +5551,7 @@
     // has special case for typeof.
     var castType = _emitType(clause.exceptionType.type);
 
-    return new JS.If(
+    return JS.If(
         js.call('#.is(#)', [castType, _emitSimpleIdentifier(_catchParameter)]),
         then,
         otherwise)
@@ -5570,7 +5565,7 @@
     var body = <JS.Statement>[];
 
     var savedCatch = _catchParameter;
-    var vars = new HashSet<String>();
+    var vars = HashSet<String>();
     if (node.catchKeyword != null) {
       var name = node.exceptionParameter;
       if (name == _catchParameter) {
@@ -5605,7 +5600,7 @@
       body.insert(0, js.comment('Unimplemented case labels: ${node.labels}'));
     }
     // TODO(jmesserly): make sure we are statically checking fall through
-    return new JS.SwitchCase(expr, new JS.Block(body));
+    return JS.SwitchCase(expr, JS.Block(body));
   }
 
   @override
@@ -5615,7 +5610,7 @@
       body.insert(0, js.comment('Unimplemented case labels: ${node.labels}'));
     }
     // TODO(jmesserly): make sure we are statically checking fall through
-    return new JS.SwitchCase.defaultCase(new JS.Block(body));
+    return JS.SwitchCase.defaultCase(JS.Block(body));
   }
 
   JS.SwitchCase _emitSwitchMember(SwitchMember node) {
@@ -5627,7 +5622,7 @@
   }
 
   @override
-  JS.Switch visitSwitchStatement(SwitchStatement node) => new JS.Switch(
+  JS.Switch visitSwitchStatement(SwitchStatement node) => JS.Switch(
       _visitExpression(node.expression),
       node.members?.map(_emitSwitchMember)?.toList());
 
@@ -5635,7 +5630,7 @@
   JS.Statement visitLabeledStatement(LabeledStatement node) {
     var result = _visitStatement(node.statement);
     for (var label in node.labels.reversed) {
-      result = new JS.LabeledStatement(label.label.name, result);
+      result = JS.LabeledStatement(label.label.name, result);
     }
     return result;
   }
@@ -5651,14 +5646,14 @@
     if (node.value != null) {
       return js.number(node.value);
     }
-    return new JS.LiteralNumber('${node.literal}');
+    return JS.LiteralNumber('${node.literal}');
   }
 
   @override
   visitDoubleLiteral(DoubleLiteral node) => js.number(node.value);
 
   @override
-  visitNullLiteral(NullLiteral node) => new JS.LiteralNull();
+  visitNullLiteral(NullLiteral node) => JS.LiteralNull();
 
   @override
   visitSymbolLiteral(SymbolLiteral node) {
@@ -5700,7 +5695,7 @@
   }
 
   JS.Expression _emitList(DartType itemType, List<JS.Expression> items) {
-    var list = new JS.ArrayInitializer(items);
+    var list = JS.ArrayInitializer(items);
 
     // TODO(jmesserly): analyzer will usually infer `List<Object>` because
     // that is the least upper bound of the element types. So we rarely
@@ -5764,7 +5759,7 @@
   JS.Expression visitAdjacentStrings(AdjacentStrings node) {
     var nodes = node.strings;
     if (nodes == null || nodes.isEmpty) return null;
-    return new JS.Expression.binary(_visitExpressionList(nodes), '+');
+    return JS.Expression.binary(_visitExpressionList(nodes), '+');
   }
 
   @override
@@ -5783,7 +5778,7 @@
       }
     }
     if (parts.isEmpty) return js.string('');
-    return new JS.Expression.binary(parts, '+');
+    return JS.Expression.binary(parts, '+');
   }
 
   @override
@@ -5835,7 +5830,7 @@
   /// of `.bar` to ensure `foo.bar` has a hover tooltip.
   NodeEnd _nodeEnd(AstNode node) {
     var loc = _getLocation(node.end);
-    return loc != null ? new NodeEnd(loc) : null;
+    return loc != null ? NodeEnd(loc) : null;
   }
 
   /// Gets the end of a function for source mapping.
@@ -5848,7 +5843,7 @@
   /// Alternatively this can be supplied with [_functionSpan].
   NodeEnd _functionEnd(AstNode node) {
     var loc = _getLocation(node.endToken.offset);
-    return loc != null ? new NodeEnd(loc) : null;
+    return loc != null ? NodeEnd(loc) : null;
   }
 
   /// Similar to [_functionEnd] but also marks the start of the function.
@@ -5857,7 +5852,7 @@
   NodeSpan _functionSpan(AstNode node) {
     var start = _getLocation(node.offset);
     var end = _getLocation(node.endToken.offset);
-    return start != null && end != null ? new NodeSpan(start, end) : null;
+    return start != null && end != null ? NodeSpan(start, end) : null;
   }
 
   /// Combines [_nodeStart] and [_nodeEnd], used when we want to support
@@ -5865,7 +5860,7 @@
   NodeSpan _nodeSpan(AstNode node) {
     var start = _getLocation(node.offset);
     var end = _getLocation(node.end);
-    return start != null && end != null ? new NodeSpan(start, end) : null;
+    return start != null && end != null ? NodeSpan(start, end) : null;
   }
 
   /// Adds a hover comment for Dart [node] using JS expression [expr], where
@@ -5877,9 +5872,7 @@
   HoverComment _hoverComment(JS.Expression expr, AstNode node) {
     var start = _getLocation(node.offset);
     var end = _getLocation(node.end);
-    return start != null && end != null
-        ? new HoverComment(expr, start, end)
-        : null;
+    return start != null && end != null ? HoverComment(expr, start, end) : null;
   }
 
   SourceLocation _getLocation(int offset) {
@@ -5897,10 +5890,10 @@
       fileUri = sourcePath.startsWith('package:')
           ? Uri.parse(sourcePath)
           // TODO(jmesserly): shouldn't this be path.toUri?
-          : new Uri.file(sourcePath);
+          : Uri.file(sourcePath);
     }
     var loc = unit.lineInfo.getLocation(offset);
-    return new SourceLocation(offset,
+    return SourceLocation(offset,
         sourceUrl: fileUri,
         line: loc.lineNumber - 1,
         column: loc.columnNumber - 1);
@@ -5995,7 +5988,7 @@
   ///
   JS.Expression _emitMemberName(String name,
       {DartType type,
-      bool isStatic: false,
+      bool isStatic = false,
       bool useExtension,
       Element element}) {
     // Static members skip the rename steps and may require JS interop renames.
@@ -6012,9 +6005,9 @@
         var parts = runtimeName.split('.');
         if (parts.length < 2) return _propertyName(runtimeName);
 
-        JS.Expression result = new JS.Identifier(parts[0]);
+        JS.Expression result = JS.Identifier(parts[0]);
         for (int i = 1; i < parts.length; i++) {
-          result = new JS.PropertyAccess(result, _propertyName(parts[i]));
+          result = JS.PropertyAccess(result, _propertyName(parts[i]));
         }
         return result;
       }
@@ -6075,11 +6068,11 @@
   JS.TemporaryId _getExtensionSymbolInternal(String name) {
     return _extensionSymbols.putIfAbsent(
         name,
-        () => new JS.TemporaryId(
+        () => JS.TemporaryId(
             '\$${JS.friendlyNameForDartOperator[name] ?? name}'));
   }
 
-  var _forwardingCache = new HashMap<Element, Map<String, Element>>();
+  var _forwardingCache = HashMap<Element, Map<String, Element>>();
 
   Element _lookupForwardedMember(ClassElement element, String name) {
     // We only care about public methods.
@@ -6148,7 +6141,7 @@
     // It's either one of the libraries in this module, or it's an import.
     return _libraries[library] ??
         _imports.putIfAbsent(library,
-            () => new JS.TemporaryId(jsLibraryName(_libraryRoot, library)));
+            () => JS.TemporaryId(jsLibraryName(_libraryRoot, library)));
   }
 
   T closureAnnotate<T extends JS.Node>(
@@ -6225,8 +6218,7 @@
       'throw(Error(#))', js.escapedString("compile error: $message"));
 
   JS.Node _unreachable(Object node) {
-    throw new UnsupportedError(
-        'tried to generate an unreachable node: `$node`');
+    throw UnsupportedError('tried to generate an unreachable node: `$node`');
   }
 
   /// Unused, see methods for emitting declarations.
diff --git a/pkg/dev_compiler/lib/src/analyzer/command.dart b/pkg/dev_compiler/lib/src/analyzer/command.dart
index 2aad791..c7aac45 100644
--- a/pkg/dev_compiler/lib/src/analyzer/command.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/command.dart
@@ -36,7 +36,7 @@
       args = filterUnknownArguments(args, parser);
     }
     argResults = parser.parse(args);
-    analyzerOptions = new AnalyzerOptions.fromArguments(argResults);
+    analyzerOptions = AnalyzerOptions.fromArguments(argResults);
   } on FormatException catch (error) {
     printFn('$error\n\n$_usageMessage');
     return 64;
@@ -91,8 +91,8 @@
   }
 }
 
-ArgParser ddcArgParser({bool hide: true}) {
-  var argParser = new ArgParser(allowTrailingOptions: true)
+ArgParser ddcArgParser({bool hide = true}) {
+  var argParser = ArgParser(allowTrailingOptions: true)
     ..addFlag('help',
         abbr: 'h',
         help: 'Display this message. Add -v to show hidden options.',
@@ -128,8 +128,8 @@
 
 void _compile(ArgResults argResults, AnalyzerOptions analyzerOptions,
     void printFn(Object obj)) {
-  var compiler = new ModuleCompiler(analyzerOptions);
-  var compilerOpts = new CompilerOptions.fromArguments(argResults);
+  var compiler = ModuleCompiler(analyzerOptions);
+  var compilerOpts = CompilerOptions.fromArguments(argResults);
   var outPaths = argResults['out'] as List<String>;
   var moduleFormats = parseModuleFormatOption(argResults);
   bool singleOutFile = argResults['single-out-file'];
@@ -175,7 +175,7 @@
     modulePath = path.basenameWithoutExtension(firstOutPath);
   }
 
-  var unit = new BuildUnit(
+  var unit = BuildUnit(
       modulePath,
       libraryRoot,
       argResults.rest,
@@ -187,8 +187,8 @@
 
   if (!module.isValid) {
     throw compilerOpts.unsafeForceCompile
-        ? new ForceCompileErrorException()
-        : new CompileErrorException();
+        ? ForceCompileErrorException()
+        : CompileErrorException();
   }
 
   // Write JS file, as well as source map and summary (if requested).
@@ -206,7 +206,7 @@
     for (var summaryPath in summaryPaths) {
       // Only overwrite if summary changed.  This plays better with timestamp
       // based build systems.
-      var file = new File(summaryPath);
+      var file = File(summaryPath);
       if (!file.existsSync() ||
           _changed(file.readAsBytesSync(), module.summaryBytes)) {
         if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
@@ -254,7 +254,7 @@
   try {
     // This is relative to bin/snapshot, so ../..
     String versionPath = Platform.script.resolve('../../version').toFilePath();
-    File versionFile = new File(versionPath);
+    File versionFile = File(versionPath);
     return versionFile.readAsStringSync().trim();
   } catch (_) {
     // This happens when the script is not running in the context of an SDK.
@@ -263,7 +263,7 @@
 }
 
 void _usageException(String message) {
-  throw new UsageException(message, _usageMessage);
+  throw UsageException(message, _usageMessage);
 }
 
 /// Thrown when the input source code has errors.
@@ -279,8 +279,8 @@
 
 // TODO(jmesserly): fix this function in analyzer
 List<String> filterUnknownArguments(List<String> args, ArgParser parser) {
-  Set<String> knownOptions = new Set<String>();
-  Set<String> knownAbbreviations = new Set<String>();
+  Set<String> knownOptions = Set<String>();
+  Set<String> knownAbbreviations = Set<String>();
   parser.options.forEach((String name, option) {
     knownOptions.add(name);
     String abbreviation = option.abbr;
diff --git a/pkg/dev_compiler/lib/src/analyzer/context.dart b/pkg/dev_compiler/lib/src/analyzer/context.dart
index 5ce463c..b2d7198 100644
--- a/pkg/dev_compiler/lib/src/analyzer/context.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/context.dart
@@ -51,7 +51,7 @@
       {this.contextBuilderOptions,
       List<String> summaryPaths,
       String dartSdkPath,
-      this.customUrlMappings: const {}})
+      this.customUrlMappings = const {}})
       : dartSdkPath = dartSdkPath ?? getSdkDir().path,
         summaryPaths = summaryPaths ?? const [] {
     contextBuilderOptions.declaredVariables ??= const {};
@@ -62,13 +62,13 @@
       {String dartSdkPath,
       String dartSdkSummaryPath,
       List<String> summaryPaths}) {
-    var contextBuilderOptions = new ContextBuilderOptions()
-      ..defaultOptions = (new AnalysisOptionsImpl()
+    var contextBuilderOptions = ContextBuilderOptions()
+      ..defaultOptions = (AnalysisOptionsImpl()
         ..strongMode = true
         ..previewDart2 = true)
       ..dartSdkSummaryPath = dartSdkSummaryPath;
 
-    return new AnalyzerOptions._(
+    return AnalyzerOptions._(
         contextBuilderOptions: contextBuilderOptions,
         dartSdkPath: dartSdkPath,
         summaryPaths: summaryPaths);
@@ -90,7 +90,7 @@
     if (dartSdkSummaryPath == 'build') dartSdkSummaryPath = null;
     contextBuilderOptions.dartSdkSummaryPath = dartSdkSummaryPath;
 
-    return new AnalyzerOptions._(
+    return AnalyzerOptions._(
         contextBuilderOptions: contextBuilderOptions,
         summaryPaths: summaryPaths ?? args['summary'] as List<String>,
         dartSdkPath: dartSdkPath,
@@ -98,7 +98,7 @@
             _parseUrlMappings(args['url-mapping'] as List<String>));
   }
 
-  static void addArguments(ArgParser parser, {bool hide: true}) {
+  static void addArguments(ArgParser parser, {bool hide = true}) {
     parser
       ..addOption('summary',
           abbr: 's', help: 'summary file(s) to include', allowMultiple: true)
@@ -151,35 +151,35 @@
   resourceProvider ??= PhysicalResourceProvider.INSTANCE;
   var resolvers = <UriResolver>[];
   if (options.customUrlMappings.isNotEmpty) {
-    resolvers.add(
-        new CustomUriResolver(resourceProvider, options.customUrlMappings));
+    resolvers
+        .add(CustomUriResolver(resourceProvider, options.customUrlMappings));
   }
   resolvers.add(sdkResolver);
   if (summaryData != null) {
-    resolvers.add(new InSummaryUriResolver(resourceProvider, summaryData));
+    resolvers.add(InSummaryUriResolver(resourceProvider, summaryData));
   }
 
   if (fileResolvers == null)
     fileResolvers =
         createFileResolvers(options, resourceProvider: resourceProvider);
   resolvers.addAll(fileResolvers);
-  return new SourceFactory(resolvers, null, resourceProvider);
+  return SourceFactory(resolvers, null, resourceProvider);
 }
 
 List<UriResolver> createFileResolvers(AnalyzerOptions options,
     {ResourceProvider resourceProvider}) {
   resourceProvider ??= PhysicalResourceProvider.INSTANCE;
   UriResolver packageResolver() {
-    var builderOptions = new ContextBuilderOptions();
+    var builderOptions = ContextBuilderOptions();
     if (options.packageRoot != null) {
       builderOptions.defaultPackagesDirectoryPath = options.packageRoot;
     }
-    var builder = new ContextBuilder(resourceProvider, null, null,
-        options: builderOptions);
+    var builder =
+        ContextBuilder(resourceProvider, null, null, options: builderOptions);
 
-    return new PackageMapUriResolver(resourceProvider,
+    return PackageMapUriResolver(resourceProvider,
         builder.convertPackagesToMap(builder.createPackageMap('')));
   }
 
-  return [new ResourceUriResolver(resourceProvider), packageResolver()];
+  return [ResourceUriResolver(resourceProvider), packageResolver()];
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
index 8ecdd13..145177d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
@@ -25,8 +25,7 @@
 T fillDynamicTypeArgs<T extends DartType>(T t) {
   if (t is ParameterizedType && t.typeArguments.isNotEmpty) {
     var rawT = (t.element as TypeParameterizedElement).type;
-    var dyn =
-        new List.filled(rawT.typeArguments.length, DynamicTypeImpl.instance);
+    var dyn = List.filled(rawT.typeArguments.length, DynamicTypeImpl.instance);
     return rawT.substitute2(dyn, rawT.typeArguments) as T;
   }
   return t;
@@ -133,7 +132,7 @@
 
 List<ClassElement> getSuperclasses(ClassElement cls) {
   var result = <ClassElement>[];
-  var visited = new HashSet<ClassElement>();
+  var visited = HashSet<ClassElement>();
   while (cls != null && visited.add(cls)) {
     for (var mixinType in cls.mixins.reversed) {
       var mixin = mixinType.element;
@@ -302,7 +301,7 @@
   return sourcePath.startsWith('package:')
       ? Uri.parse(sourcePath)
       // TODO(jmesserly): shouldn't this be path.toUri?
-      : new Uri.file(sourcePath);
+      : Uri.file(sourcePath);
 }
 
 /// Returns true iff this factory constructor just throws [UnsupportedError]/
diff --git a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
index ec730d3..95a1a26 100644
--- a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
@@ -43,7 +43,7 @@
   var location = lineInfo.getLocation(error.offset);
 
   // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2)
-  return (new StringBuffer()
+  return (StringBuffer()
         ..write('[${severity.displayName}] ')
         ..write(error.message)
         ..write(' (${path.prettyUri(error.source.uri)}')
@@ -60,8 +60,7 @@
   // * it can return null
   // * using AnalysisError directly is now suspect, it's a correctness trap
   // * it requires an AnalysisContext
-  return ErrorProcessor
-          .getProcessor(context.analysisOptions, error)
+  return ErrorProcessor.getProcessor(context.analysisOptions, error)
           ?.severity ??
       error.errorCode.errorSeverity;
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/extension_types.dart b/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
index b816065..c3d65cb 100644
--- a/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
@@ -31,11 +31,11 @@
 
   // Abstract types that may be implemented by both native and non-native
   // classes.
-  final _extensibleTypes = new HashSet<ClassElement>();
+  final _extensibleTypes = HashSet<ClassElement>();
 
   // Concrete native types.
-  final _nativeTypes = new HashSet<ClassElement>();
-  final _pendingLibraries = new HashSet<String>();
+  final _nativeTypes = HashSet<ClassElement>();
+  final _pendingLibraries = HashSet<String>();
 
   ExtensionTypeSet(this._context) {
     // TODO(vsm): Eventually, we want to make this extensible - i.e., find
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart b/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart
index 18c13ee..fd61c5a 100644
--- a/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/js_typeref_codegen.dart
@@ -24,9 +24,9 @@
   /// Finds the qualified path to the type.
   JS.TypeRef _emitTopLevelTypeRef(DartType type) {
     var e = type.element;
-    return new JS.TypeRef.qualified([
+    return JS.TypeRef.qualified([
       emitLibraryName(e.library),
-      new JS.Identifier(getJSExportName(e) ?? e.name)
+      JS.Identifier(getJSExportName(e) ?? e.name)
     ]);
   }
 
@@ -34,18 +34,18 @@
     if (!options.closure) return null;
 
     return _resolved.putIfAbsent(type, () {
-      if (type == null) new JS.TypeRef.unknown();
+      if (type == null) JS.TypeRef.unknown();
       // TODO(ochafik): Consider calling _loader.declareBeforeUse(type.element).
-      if (type.isBottom || type.isDynamic) new JS.TypeRef.any();
-      if (type.isVoid) return new JS.TypeRef.void_();
+      if (type.isBottom || type.isDynamic) JS.TypeRef.any();
+      if (type.isVoid) return JS.TypeRef.void_();
 
-      if (type == types.intType) return new JS.TypeRef.number().orNull();
-      if (type == types.numType) return new JS.TypeRef.number().orNull();
-      if (type == types.doubleType) return new JS.TypeRef.number().orNull();
-      if (type == types.boolType) return new JS.TypeRef.boolean().orNull();
-      if (type == types.stringType) return new JS.TypeRef.string();
+      if (type == types.intType) return JS.TypeRef.number().orNull();
+      if (type == types.numType) return JS.TypeRef.number().orNull();
+      if (type == types.doubleType) return JS.TypeRef.number().orNull();
+      if (type == types.boolType) return JS.TypeRef.boolean().orNull();
+      if (type == types.stringType) return JS.TypeRef.string();
 
-      if (type is TypeParameterType) return new JS.TypeRef.named(type.name);
+      if (type is TypeParameterType) return JS.TypeRef.named(type.name);
       if (type is ParameterizedType) {
         JS.TypeRef rawType;
         if (type is FunctionType && type.name == null) {
@@ -53,7 +53,7 @@
           for (var param in type.parameters) {
             if (param.isNamed) break;
             var type = emitTypeRef(param.type);
-            args[new JS.Identifier(param.name)] =
+            args[JS.Identifier(param.name)] =
                 param.isPositional ? type.toOptional() : type;
           }
           var namedParamType = emitNamedParamsArgType(type.parameters);
@@ -61,7 +61,7 @@
             args[namedArgumentTemp] = namedParamType.toOptional();
           }
 
-          rawType = new JS.TypeRef.function(emitTypeRef(type.returnType), args);
+          rawType = JS.TypeRef.function(emitTypeRef(type.returnType), args);
         } else {
           var jsTypeRef = _getDartJsTypeRef(type);
           if (jsTypeRef != null) return jsTypeRef;
@@ -71,9 +71,9 @@
         var typeArgs = _getOwnTypeArguments(type).map(emitTypeRef);
         return typeArgs.isEmpty
             ? rawType
-            : new JS.TypeRef.generic(rawType, typeArgs);
+            : JS.TypeRef.generic(rawType, typeArgs);
       }
-      return new JS.TypeRef.unknown();
+      return JS.TypeRef.unknown();
     });
   }
 
@@ -83,11 +83,11 @@
     var namedArgs = <JS.Identifier, JS.TypeRef>{};
     for (ParameterElement param in params) {
       if (param.isPositional) continue;
-      namedArgs[new JS.Identifier(param.name)] =
+      namedArgs[JS.Identifier(param.name)] =
           emitTypeRef(param.type).toOptional();
     }
     if (namedArgs.isEmpty) return null;
-    return new JS.TypeRef.record(namedArgs);
+    return JS.TypeRef.record(namedArgs);
   }
 
   /// Gets the "own" type arguments of [type].
@@ -112,14 +112,14 @@
     if (type.element.library == dartJSLibrary) {
       switch (type.name) {
         case 'JsArray':
-          return new JS.TypeRef.array(
+          return JS.TypeRef.array(
               type is InterfaceType && type.typeArguments.length == 1
                   ? emitTypeRef(type.typeArguments.single)
                   : null);
         case 'JsObject':
-          return new JS.TypeRef.object();
+          return JS.TypeRef.object();
         case 'JsFunction':
-          return new JS.TypeRef.function();
+          return JS.TypeRef.function();
       }
     }
     return null;
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index 22d64ab..f5a7a53 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -69,7 +69,7 @@
 
   ModuleCompiler._(AnalysisContext context, this.summaryData)
       : context = context,
-        _extensionTypes = new ExtensionTypeSet(context);
+        _extensionTypes = ExtensionTypeSet(context);
 
   factory ModuleCompiler(AnalyzerOptions options,
       {ResourceProvider resourceProvider,
@@ -82,17 +82,17 @@
     resourceProvider ??= PhysicalResourceProvider.INSTANCE;
     analysisRoot ??= path.current;
 
-    var contextBuilder = new ContextBuilder(resourceProvider,
-        new DartSdkManager(options.dartSdkPath, true), new ContentCache(),
+    var contextBuilder = ContextBuilder(resourceProvider,
+        DartSdkManager(options.dartSdkPath, true), ContentCache(),
         options: options.contextBuilderOptions);
 
     var analysisOptions = contextBuilder.getAnalysisOptions(analysisRoot);
     var sdk = contextBuilder.findSdk(null, analysisOptions);
 
-    var sdkResolver = new DartUriResolver(sdk);
+    var sdkResolver = DartUriResolver(sdk);
 
     // Read the summaries.
-    summaryData ??= new SummaryDataStore(options.summaryPaths,
+    summaryData ??= SummaryDataStore(options.summaryPaths,
         resourceProvider: resourceProvider,
         // TODO(vsm): Reset this to true once we cleanup internal build rules.
         disallowOverlappingSummaries: false);
@@ -114,20 +114,20 @@
     context.sourceFactory = srcFactory;
     if (sdkSummaryBundle != null) {
       context.resultProvider =
-          new InputPackagesResultProvider(context, summaryData);
+          InputPackagesResultProvider(context, summaryData);
     }
-    var variables = new Map<String, String>.from(options.declaredVariables)
+    var variables = Map<String, String>.from(options.declaredVariables)
       ..addAll(sdkLibraryVariables);
 
-    context.declaredVariables = new DeclaredVariables.fromMap(variables);
+    context.declaredVariables = DeclaredVariables.fromMap(variables);
     if (!context.analysisOptions.strongMode) {
-      throw new ArgumentError('AnalysisContext must be strong mode');
+      throw ArgumentError('AnalysisContext must be strong mode');
     }
     if (!context.sourceFactory.dartSdk.context.analysisOptions.strongMode) {
-      throw new ArgumentError('AnalysisContext must have strong mode SDK');
+      throw ArgumentError('AnalysisContext must have strong mode SDK');
     }
 
-    return new ModuleCompiler._(context, summaryData);
+    return ModuleCompiler._(context, summaryData);
   }
 
   bool _isFatalError(AnalysisError e, CompilerOptions options) {
@@ -154,7 +154,7 @@
     var trees = <CompilationUnit>[];
     var errors = <AnalysisError>[];
 
-    var librariesToCompile = new Queue<LibraryElement>();
+    var librariesToCompile = Queue<LibraryElement>();
 
     var compilingSdk = false;
     for (var sourcePath in unit.sources) {
@@ -167,12 +167,12 @@
       var fileUsage = 'You need to pass at least one existing .dart file as an'
           ' argument.';
       if (source == null) {
-        throw new UsageException(
+        throw UsageException(
             'Could not create a source for "$sourcePath". The file name is in'
             ' the wrong format or was not found.',
             fileUsage);
       } else if (!source.exists()) {
-        throw new UsageException(
+        throw UsageException(
             'Given file "$sourcePath" does not exist.', fileUsage);
       }
 
@@ -184,7 +184,7 @@
       librariesToCompile.add(context.computeLibraryElement(source));
     }
 
-    var libraries = new HashSet<LibraryElement>();
+    var libraries = HashSet<LibraryElement>();
     while (librariesToCompile.isNotEmpty) {
       var library = librariesToCompile.removeFirst();
       if (library.source is InSummarySource) continue;
@@ -199,8 +199,8 @@
       if (!compilingSdk && !options.emitMetadata) {
         var node = _getDartMirrorsImport(library);
         if (node != null) {
-          errors.add(new AnalysisError(library.source, node.uriOffset,
-              node.uriEnd, invalidImportDartMirrors));
+          errors.add(AnalysisError(library.source, node.uriOffset, node.uriEnd,
+              invalidImportDartMirrors));
         }
       }
 
@@ -224,19 +224,19 @@
 
     if (!options.unsafeForceCompile &&
         errors.any((e) => _isFatalError(e, options))) {
-      return new JSModuleFile.invalid(unit.name, messages, options);
+      return JSModuleFile.invalid(unit.name, messages, options);
     }
 
     try {
       var codeGenerator =
-          new CodeGenerator(context, summaryData, options, _extensionTypes);
+          CodeGenerator(context, summaryData, options, _extensionTypes);
       return codeGenerator.compile(unit, trees, messages);
     } catch (e) {
       if (errors.any((e) => _isFatalError(e, options))) {
         // Force compilation failed.  Suppress the exception and report
         // the static errors instead.
         assert(options.unsafeForceCompile);
-        return new JSModuleFile.invalid(unit.name, messages, options);
+        return JSModuleFile.invalid(unit.name, messages, options);
       }
       rethrow;
     }
@@ -299,17 +299,17 @@
   final String summaryOutPath;
 
   const CompilerOptions(
-      {this.sourceMap: true,
-      this.sourceMapComment: true,
-      this.inlineSourceMap: false,
-      this.summarizeApi: true,
-      this.summaryExtension: 'sum',
-      this.unsafeForceCompile: false,
-      this.replCompile: false,
-      this.emitMetadata: false,
-      this.enableAsserts: true,
-      this.closure: false,
-      this.bazelMapping: const {},
+      {this.sourceMap = true,
+      this.sourceMapComment = true,
+      this.inlineSourceMap = false,
+      this.summarizeApi = true,
+      this.summaryExtension = 'sum',
+      this.unsafeForceCompile = false,
+      this.replCompile = false,
+      this.emitMetadata = false,
+      this.enableAsserts = true,
+      this.closure = false,
+      this.bazelMapping = const {},
       this.summaryOutPath});
 
   CompilerOptions.fromArguments(ArgResults args)
@@ -327,7 +327,7 @@
             _parseBazelMappings(args['bazel-mapping'] as List<String>),
         summaryOutPath = args['summary-out'] as String;
 
-  static void addArguments(ArgParser parser, {bool hide: true}) {
+  static void addArguments(ArgParser parser, {bool hide = true}) {
     parser
       ..addFlag('summarize',
           help: 'emit an API summary file', defaultsTo: true, hide: hide)
@@ -454,25 +454,24 @@
   // TODO(jmesserly): this should match our old logic, but I'm not sure we are
   // correctly handling the pointer from the .js file to the .map file.
   JSModuleCode getCode(ModuleFormat format, String jsUrl, String mapUrl,
-      {bool singleOutFile: false}) {
-    var opts = new JS.JavaScriptPrintingOptions(
+      {bool singleOutFile = false}) {
+    var opts = JS.JavaScriptPrintingOptions(
         emitTypes: options.closure,
         allowKeywordsInProperties: true,
         allowSingleLineIfStatements: true);
     JS.SimpleJavaScriptPrintingContext printer;
     SourceMapBuilder sourceMap;
     if (options.sourceMap) {
-      var sourceMapContext = new SourceMapPrintingContext();
+      var sourceMapContext = SourceMapPrintingContext();
       sourceMap = sourceMapContext.sourceMap;
       printer = sourceMapContext;
     } else {
-      printer = new JS.SimpleJavaScriptPrintingContext();
+      printer = JS.SimpleJavaScriptPrintingContext();
     }
 
     var tree =
         transformModuleFormat(format, moduleTree, singleOutFile: singleOutFile);
-    tree.accept(
-        new JS.Printer(opts, printer, localNamer: new JS.TemporaryNamer(tree)));
+    tree.accept(JS.Printer(opts, printer, localNamer: JS.TemporaryNamer(tree)));
 
     Map builtMap;
     if (options.sourceMap && sourceMap != null) {
@@ -495,7 +494,7 @@
         : 'null';
     text = text.replaceFirst(sourceMapHoleID, rawSourceMap);
 
-    return new JSModuleCode(text, builtMap);
+    return JSModuleCode(text, builtMap);
   }
 
   /// Similar to [getCode] but immediately writes the resulting files.
@@ -503,7 +502,7 @@
   /// If [mapPath] is not supplied but [options.sourceMap] is set, mapPath
   /// will default to [jsPath].map.
   void writeCodeSync(ModuleFormat format, String jsPath,
-      {bool singleOutFile: false}) {
+      {bool singleOutFile = false}) {
     String mapPath = jsPath + '.map';
     var code = getCode(
         format, path.toUri(jsPath).toString(), path.toUri(mapPath).toString(),
@@ -521,7 +520,7 @@
       c = 'eval(${json.encode(c)});\n';
     }
 
-    var file = new File(jsPath);
+    var file = File(jsPath);
     if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
     file.writeAsStringSync(c);
 
@@ -530,7 +529,7 @@
     // should also write a copy of the source file without a sourcemap even when
     // inlineSourceMap is true.
     if (code.sourceMap != null) {
-      file = new File(mapPath);
+      file = File(mapPath);
       if (!file.parent.existsSync()) file.parent.createSync(recursive: true);
       file.writeAsStringSync(json.encode(code.sourceMap));
     }
@@ -560,7 +559,7 @@
 // TODO(jmesserly): find a new home for this.
 Map placeSourceMap(
     Map sourceMap, String sourceMapPath, Map<String, String> bazelMappings) {
-  var map = new Map.from(sourceMap);
+  var map = Map.from(sourceMap);
   // Convert to a local file path if it's not.
   sourceMapPath = path.fromUri(_sourceToUri(sourceMapPath));
   var sourceMapDir = path.dirname(path.absolute(sourceMapPath));
@@ -606,11 +605,11 @@
     default:
       // Assume a file path.
       // TODO(jmesserly): shouldn't this be `path.toUri(path.absolute)`?
-      return new Uri.file(path.absolute(source));
+      return Uri.file(path.absolute(source));
   }
 }
 
-const invalidImportDartMirrors = const StrongModeCode(
+const invalidImportDartMirrors = StrongModeCode(
     ErrorType.COMPILE_TIME_ERROR,
     'IMPORT_DART_MIRRORS',
     'Cannot import "dart:mirrors" in web applications (https://goo.gl/R1anEs).');
diff --git a/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart b/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
index 6ef6e1f..0aed0f8 100644
--- a/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/nullable_type_inference.dart
@@ -35,14 +35,15 @@
   HashSet<LocalVariableElement> _notNullLocals;
 
   void inferNullableTypes(AstNode node) {
-    var visitor = new _NullableLocalInference(this);
+    var visitor = _NullableLocalInference(this);
     node.accept(visitor);
     _notNullLocals = visitor.computeNotNullLocals();
   }
 
   /// Adds a new variable, typically a compiler generated temporary, and record
   /// whether its type is nullable.
-  void addTemporaryVariable(LocalVariableElement local, {bool nullable: true}) {
+  void addTemporaryVariable(LocalVariableElement local,
+      {bool nullable = true}) {
     if (!nullable) _notNullLocals.add(local);
   }
 
@@ -301,14 +302,14 @@
   final NullableTypeInference _nullInference;
 
   /// Known local variables.
-  final _locals = new HashSet<LocalVariableElement>.identity();
+  final _locals = HashSet<LocalVariableElement>.identity();
 
   /// Variables that are known to be nullable.
-  final _nullableLocals = new HashSet<LocalVariableElement>.identity();
+  final _nullableLocals = HashSet<LocalVariableElement>.identity();
 
   /// Given a variable, tracks all other variables that it is assigned to.
   final _assignments =
-      new HashMap<LocalVariableElement, Set<LocalVariableElement>>.identity();
+      HashMap<LocalVariableElement, Set<LocalVariableElement>>.identity();
 
   _NullableLocalInference(this._nullInference);
 
@@ -418,7 +419,7 @@
         bool visitLocal(LocalVariableElement otherLocal) {
           // Record the assignment.
           _assignments
-              .putIfAbsent(otherLocal, () => new HashSet.identity())
+              .putIfAbsent(otherLocal, () => HashSet.identity())
               .add(element);
           // Optimistically assume this local is not null.
           // We will validate this assumption later.
diff --git a/pkg/dev_compiler/lib/src/analyzer/property_model.dart b/pkg/dev_compiler/lib/src/analyzer/property_model.dart
index 617c9d8..b625554 100644
--- a/pkg/dev_compiler/lib/src/analyzer/property_model.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/property_model.dart
@@ -22,12 +22,11 @@
 /// which members are private and thus, could not be overridden outside of the
 /// current library.
 class VirtualFieldModel {
-  final _modelForLibrary =
-      new HashMap<LibraryElement, _LibraryVirtualFieldModel>();
+  final _modelForLibrary = HashMap<LibraryElement, _LibraryVirtualFieldModel>();
 
   _LibraryVirtualFieldModel _getModel(LibraryElement library) =>
       _modelForLibrary.putIfAbsent(
-          library, () => new _LibraryVirtualFieldModel.build(library));
+          library, () => _LibraryVirtualFieldModel.build(library));
 
   /// Returns true if a field is virtual.
   bool isVirtual(FieldElement field) =>
@@ -42,7 +41,7 @@
   ///
   /// This means we must generate them as virtual fields using a property pair
   /// in JavaScript.
-  final _overriddenPrivateFields = new HashSet<FieldElement>();
+  final _overriddenPrivateFields = HashSet<FieldElement>();
 
   /// Private classes that can be extended outside of this library.
   ///
@@ -56,7 +55,7 @@
   ///     class C extends _A {}
   ///
   /// The class _A must treat is "x" as virtual, however _B does not.
-  final _extensiblePrivateClasses = new HashSet<ClassElement>();
+  final _extensiblePrivateClasses = HashSet<ClassElement>();
 
   _LibraryVirtualFieldModel.build(LibraryElement library) {
     var allTypes = library.units.expand((u) => u.types).toList();
@@ -65,7 +64,7 @@
     // From there, visit all immediate private types in this library, and so on
     // from those private types, marking them as extensible.
     var typesToVisit =
-        new Queue<ClassElement>.from(allTypes.where((t) => t.isPublic));
+        Queue<ClassElement>.from(allTypes.where((t) => t.isPublic));
     while (typesToVisit.isNotEmpty) {
       var extensibleType = typesToVisit.removeFirst();
 
@@ -84,12 +83,12 @@
     // time.
     Map<String, FieldElement> getInstanceFieldMap(ClassElement c) {
       var instanceFields = c.fields.where((f) => !f.isStatic);
-      return new HashMap.fromIterables(
+      return HashMap.fromIterables(
           instanceFields.map((f) => f.name), instanceFields);
     }
 
     var allFields =
-        new HashMap.fromIterables(allTypes, allTypes.map(getInstanceFieldMap));
+        HashMap.fromIterables(allTypes, allTypes.map(getInstanceFieldMap));
 
     for (var type in allTypes) {
       Set<ClassElement> supertypes = null;
@@ -108,7 +107,7 @@
         }
 
         if (supertypes == null) {
-          supertypes = new Set();
+          supertypes = Set();
           void collectSupertypes(ClassElement cls) {
             if (!supertypes.add(cls)) return;
             var s = cls.supertype?.element;
@@ -177,18 +176,18 @@
   /// The set of inherited getters, used because JS getters/setters are paired,
   /// so if we're generating a setter we may need to emit a getter that calls
   /// super.
-  final inheritedGetters = new HashSet<String>();
+  final inheritedGetters = HashSet<String>();
 
   /// The set of inherited setters, used because JS getters/setters are paired,
   /// so if we're generating a getter we may need to emit a setter that calls
   /// super.
-  final inheritedSetters = new HashSet<String>();
+  final inheritedSetters = HashSet<String>();
 
   final mockMembers = <String, ExecutableElement>{};
 
-  final extensionMethods = new Set<String>();
+  final extensionMethods = Set<String>();
 
-  final extensionAccessors = new Set<String>();
+  final extensionAccessors = Set<String>();
 
   /// Parameters that are covariant due to covariant generics.
   final Set<Element> covariantParameters;
@@ -220,7 +219,7 @@
     _collectMockMembers(classElem.type);
     _collectExtensionMembers(classElem);
 
-    var virtualAccessorNames = new HashSet<String>()
+    var virtualAccessorNames = HashSet<String>()
       ..addAll(inheritedGetters)
       ..addAll(inheritedSetters)
       ..addAll(extensionAccessors)
@@ -246,7 +245,7 @@
                 covariantParameters != null &&
                 covariantParameters.contains(setter.parameters[0]) &&
                 covariantPrivateMembers.contains(setter)) {
-          virtualFields[field] = new JS.TemporaryId(name);
+          virtualFields[field] = JS.TemporaryId(name);
         }
       }
     }
@@ -274,7 +273,7 @@
     // members are allowed to "override" concrete ones in Dart.
     // (In that case, it will still be treated as a concrete member and can be
     // called at runtime.)
-    var concreteMembers = new HashSet<String>();
+    var concreteMembers = HashSet<String>();
 
     void visit(InterfaceType type, bool isAbstract) {
       if (type == null) return;
@@ -303,12 +302,12 @@
     // Find all generic interfaces that could be used to call into members of
     // this class. This will help us identify which parameters need checks
     // for soundness.
-    var allNatives = new HashSet<String>();
+    var allNatives = HashSet<String>();
     _collectNativeMembers(element.type, allNatives);
     if (allNatives.isEmpty) return;
 
     // For members on this class, check them against all generic interfaces.
-    var seenConcreteMembers = new HashSet<String>();
+    var seenConcreteMembers = HashSet<String>();
     _findExtensionMembers(element.type, seenConcreteMembers, allNatives);
     // Add mock members. These are compiler-generated concrete members that
     // forward to `noSuchMethod`.
@@ -325,13 +324,13 @@
     // For members of the superclass, we may need to add checks because this
     // class adds a new unsafe interface. Collect those checks.
 
-    var visited = new HashSet<ClassElement>()..add(element);
-    var existingMembers = new HashSet<String>();
+    var visited = HashSet<ClassElement>()..add(element);
+    var existingMembers = HashSet<String>();
 
     void visitImmediateSuper(InterfaceType type) {
       // For members of mixins/supertypes, check them against new interfaces,
       // and also record any existing checks they already had.
-      var oldCovariant = new HashSet<String>();
+      var oldCovariant = HashSet<String>();
       _collectNativeMembers(type, oldCovariant);
       var newCovariant = allNatives.difference(oldCovariant);
       if (newCovariant.isEmpty) return;
diff --git a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
index 8c774bb..e0deb58 100644
--- a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
@@ -18,14 +18,14 @@
 // This class implements a pass which modifies (in place) the ast replacing
 // abstract coercion nodes with their dart implementations.
 class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> {
-  final cloner = new _TreeCloner();
+  final cloner = _TreeCloner();
 
   CoercionReifier._();
 
   /// Transforms the given compilation units, and returns a new AST with
   /// explicit coercion nodes in appropriate places.
   static List<CompilationUnit> reify(List<CompilationUnit> units) {
-    var cr = new CoercionReifier._();
+    var cr = CoercionReifier._();
     return units.map(cr.visitCompilationUnit).toList(growable: false);
   }
 
@@ -109,7 +109,7 @@
 
   void _replaceNode(AstNode parent, AstNode oldNode, AstNode newNode) {
     if (!identical(oldNode, newNode)) {
-      var replaced = parent.accept(new NodeReplacer(oldNode, newNode));
+      var replaced = parent.accept(NodeReplacer(oldNode, newNode));
       // It looks like NodeReplacer will always return true.
       // It does throw IllegalArgumentException though, if child is not found.
       assert(replaced);
diff --git a/pkg/dev_compiler/lib/src/analyzer/side_effect_analysis.dart b/pkg/dev_compiler/lib/src/analyzer/side_effect_analysis.dart
index 9d278b6..011988b 100644
--- a/pkg/dev_compiler/lib/src/analyzer/side_effect_analysis.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/side_effect_analysis.dart
@@ -60,7 +60,7 @@
   if (function.isPotentiallyMutatedInScope(e)) {
     // Need to visit the context looking for assignment to this local.
     if (context != null) {
-      var visitor = new _AssignmentFinder(e);
+      var visitor = _AssignmentFinder(e);
       context.accept(visitor);
       return visitor._potentiallyMutated;
     }
@@ -103,11 +103,10 @@
   final ConstantVisitor constantVisitor;
 
   ConstFieldVisitor(AnalysisContext context, {Source dummySource})
-      : constantVisitor = new ConstantVisitor(
-            new ConstantEvaluationEngine(
+      : constantVisitor = ConstantVisitor(
+            ConstantEvaluationEngine(
                 context.typeProvider, context.declaredVariables),
-            new ErrorReporter(
-                AnalysisErrorListener.NULL_LISTENER, dummySource));
+            ErrorReporter(AnalysisErrorListener.NULL_LISTENER, dummySource));
 
   // TODO(jmesserly): this is used to determine if the field initialization is
   // side effect free. We should make the check more general, as things like
diff --git a/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart b/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
index 075903f..f1bef3c 100644
--- a/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
@@ -13,7 +13,7 @@
 import '../js_ast/js_ast.dart' show js;
 
 Set<TypeParameterElement> freeTypeParameters(DartType t) {
-  var result = new Set<TypeParameterElement>();
+  var result = Set<TypeParameterElement>();
   void find(DartType t) {
     if (t is TypeParameterType) {
       result.add(t.element);
@@ -43,7 +43,7 @@
   // Use a LinkedHashMap to maintain key insertion order so the generated code
   // is stable under slight perturbation.  (If this is not good enough we could
   // sort by name to canonicalize order.)
-  final _names = new LinkedHashMap<DartType, JS.TemporaryId>(
+  final _names = LinkedHashMap<DartType, JS.TemporaryId>(
       equals: typesAreEqual, hashCode: typeHashCode);
   Iterable<DartType> get keys => _names.keys.toList();
 
@@ -75,7 +75,7 @@
     return name;
   }
 
-  String _typeString(DartType type, {bool flat: false}) {
+  String _typeString(DartType type, {bool flat = false}) {
     if (type is ParameterizedType && type.name != null) {
       var clazz = type.name;
       var params = type.typeArguments;
@@ -109,14 +109,14 @@
   /// Heuristically choose a good name for the cache and generator
   /// variables.
   JS.TemporaryId chooseTypeName(DartType type) {
-    return new JS.TemporaryId(_typeString(type));
+    return JS.TemporaryId(_typeString(type));
   }
 }
 
 /// _GeneratorTable tracks types which have been
 /// named and hoisted.
 class _GeneratorTable extends _CacheTable {
-  final _defs = new LinkedHashMap<DartType, JS.Expression>(
+  final _defs = LinkedHashMap<DartType, JS.Expression>(
       equals: typesAreEqual, hashCode: typeHashCode);
 
   final JS.Identifier _runtimeModule;
@@ -157,7 +157,7 @@
   /// parameter.
   final _scopeDependencies = <TypeParameterElement, List<DartType>>{};
 
-  TypeTable(JS.Identifier runtime) : _generators = new _GeneratorTable(runtime);
+  TypeTable(JS.Identifier runtime) : _generators = _GeneratorTable(runtime);
 
   /// Emit a list of statements declaring the cache variables and generator
   /// definitions tracked by the table.  If [formals] is present, only
@@ -212,9 +212,9 @@
   /// type itself. This allows better integration with `lazyFn`, avoiding an
   /// extra level of indirection.
   JS.Expression nameFunctionType(FunctionType type, JS.Expression typeRep,
-      {bool lazy: false}) {
+      {bool lazy = false}) {
     if (!_generators.isNamed(type) && recordScopeDependencies(type)) {
-      return lazy ? new JS.ArrowFun([], typeRep) : typeRep;
+      return lazy ? JS.ArrowFun([], typeRep) : typeRep;
     }
 
     var name = _generators._nameType(type, typeRep);
diff --git a/pkg/dev_compiler/lib/src/closure/closure_annotation.dart b/pkg/dev_compiler/lib/src/closure/closure_annotation.dart
index f23c745..7274d65 100644
--- a/pkg/dev_compiler/lib/src/closure/closure_annotation.dart
+++ b/pkg/dev_compiler/lib/src/closure/closure_annotation.dart
@@ -32,22 +32,22 @@
 
   ClosureAnnotation(
       {this.comment,
-      this.interfaces: const [],
-      this.isConst: false,
-      this.isConstructor: false,
-      this.isFinal: false,
-      this.isNoCollapse: false,
-      this.isNoSideEffects: false,
-      this.isOverride: false,
-      this.isPrivate: false,
-      this.isProtected: false,
-      this.isStruct: false,
-      this.isTypedef: false,
+      this.interfaces = const [],
+      this.isConst = false,
+      this.isConstructor = false,
+      this.isFinal = false,
+      this.isNoCollapse = false,
+      this.isNoSideEffects = false,
+      this.isOverride = false,
+      this.isPrivate = false,
+      this.isProtected = false,
+      this.isStruct = false,
+      this.isTypedef = false,
       this.lendsToType,
-      this.paramTypes: const {},
+      this.paramTypes = const {},
       this.returnType,
       this.superType,
-      this.templates: const [],
+      this.templates = const [],
       this.thisType,
       this.throwsType,
       this.type});
@@ -63,8 +63,7 @@
   String toString([String indent = '']) =>
       _cachedString.replaceAll('\n', '\n$indent');
 
-  String _print(JS.TypeRef t) =>
-      (new JS.ClosureTypePrinter()..visit(t)).toString();
+  String _print(JS.TypeRef t) => (JS.ClosureTypePrinter()..visit(t)).toString();
 
   String __cachedString;
   String get _cachedString {
diff --git a/pkg/dev_compiler/lib/src/closure/closure_annotator.dart b/pkg/dev_compiler/lib/src/closure/closure_annotator.dart
index d950e2a..133aae2 100644
--- a/pkg/dev_compiler/lib/src/closure/closure_annotator.dart
+++ b/pkg/dev_compiler/lib/src/closure/closure_annotator.dart
@@ -21,7 +21,7 @@
   ClosureAnnotation closureAnnotationFor(JS.Node node, AnnotatedNode original,
       Element e, String namedArgsMapName) {
     // Note: Dart and Closure privacy are not compatible: don't set `isPrivate: e.isPrivate`.
-    return new ClosureAnnotation(
+    return ClosureAnnotation(
         comment: original?.documentationComment?.toSource(),
         // Note: we don't set isConst here because Closure's constness and
         // Dart's are not really compatible.
diff --git a/pkg/dev_compiler/lib/src/closure/closure_type.dart b/pkg/dev_compiler/lib/src/closure/closure_type.dart
index 3b7aa2b..bc29be0 100644
--- a/pkg/dev_compiler/lib/src/closure/closure_type.dart
+++ b/pkg/dev_compiler/lib/src/closure/closure_type.dart
@@ -11,13 +11,13 @@
 /// TODO(ochafik): Consider convergence with TypeScript, which has no nullability-awareness
 /// (see http://www.typescriptlang.org/Handbook).
 class ClosureType {
-  static const ClosureType _ALL = const ClosureType._("*");
-  static const ClosureType _UNKNOWN = const ClosureType._("?");
+  static const ClosureType _ALL = ClosureType._("*");
+  static const ClosureType _UNKNOWN = ClosureType._("?");
 
   final String _representation;
   final bool isNullable;
 
-  const ClosureType._(this._representation, {this.isNullable: true});
+  const ClosureType._(this._representation, {this.isNullable = true});
 
   bool get isAll => _representation == "*";
   bool get isUnknown => _representation == "?";
@@ -31,40 +31,38 @@
   factory ClosureType.record(Map<String, ClosureType> fieldTypes) {
     var entries = <String>[];
     fieldTypes.forEach((n, t) => entries.add('$n: $t'));
-    return new ClosureType._('{${entries.join(', ')}}');
+    return ClosureType._('{${entries.join(', ')}}');
   }
   factory ClosureType.function(
       [List<ClosureType> paramTypes, ClosureType returnType]) {
     if (paramTypes == null && returnType == null) {
-      return new ClosureType.type("Function");
+      return ClosureType.type("Function");
     }
     var suffix = returnType == null ? '' : ':$returnType';
-    return new ClosureType._(
+    return ClosureType._(
         'function(${paramTypes == null ? '...*' : paramTypes.join(', ')})$suffix');
   }
 
   factory ClosureType.map([ClosureType keyType, ClosureType valueType]) =>
-      new ClosureType._("Object<${keyType ?? _ALL}, ${valueType ?? _ALL}>");
+      ClosureType._("Object<${keyType ?? _ALL}, ${valueType ?? _ALL}>");
 
   factory ClosureType.type([String className = "Object"]) =>
-      new ClosureType._(className);
+      ClosureType._(className);
 
   factory ClosureType.array([ClosureType componentType]) =>
-      new ClosureType._("Array<${componentType ?? _ALL}>");
+      ClosureType._("Array<${componentType ?? _ALL}>");
 
   factory ClosureType.undefined() =>
-      new ClosureType._("undefined", isNullable: false);
-  factory ClosureType.number() =>
-      new ClosureType._("number", isNullable: false);
-  factory ClosureType.boolean() =>
-      new ClosureType._("boolean", isNullable: false);
-  factory ClosureType.string() => new ClosureType._("string");
+      ClosureType._("undefined", isNullable: false);
+  factory ClosureType.number() => ClosureType._("number", isNullable: false);
+  factory ClosureType.boolean() => ClosureType._("boolean", isNullable: false);
+  factory ClosureType.string() => ClosureType._("string");
 
-  ClosureType toOptional() => new ClosureType._("$this=");
+  ClosureType toOptional() => ClosureType._("$this=");
 
   ClosureType toNullable() => isNullable
       ? this
-      : new ClosureType._(
+      : ClosureType._(
           _representation.startsWith('!')
               ? _representation.substring(1)
               : "?$this",
@@ -72,7 +70,7 @@
 
   ClosureType toNonNullable() => !isNullable
       ? this
-      : new ClosureType._(
+      : ClosureType._(
           _representation.startsWith('?')
               ? _representation.substring(1)
               : "!$this",
@@ -80,8 +78,8 @@
 
   /// TODO(ochafik): See which optimizations make sense here (it could be that `(*|undefined)`
   /// cannot be optimized to `*` when used to model optional record fields).
-  ClosureType or(ClosureType other) => new ClosureType._("($this|$other)",
+  ClosureType or(ClosureType other) => ClosureType._("($this|$other)",
       isNullable: isNullable || other.isNullable);
 
-  ClosureType orUndefined() => or(new ClosureType.undefined());
+  ClosureType orUndefined() => or(ClosureType.undefined());
 }
diff --git a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart b/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
index 8675657..65cfe52 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
@@ -49,7 +49,7 @@
   /// This happens multiple times, so ensure the expression form is cached.
   Expression _expression;
 
-  MetaLet(this.variables, this.body, {this.statelessResult: false});
+  MetaLet(this.variables, this.body, {this.statelessResult = false});
 
   /// Returns an expression that ignores the result. This is a cross between
   /// [toExpression] and [toStatement]. Used for C-style for-loop updaters,
@@ -79,7 +79,7 @@
   Expression _toAssign(Expression left, [String op]) {
     var exprs = body.toList();
     exprs.add(exprs.removeLast().toAssignExpression(left, op));
-    return new MetaLet(variables, exprs);
+    return MetaLet(variables, exprs);
   }
 
   Statement toVariableDeclaration(VariableBinding name) {
@@ -132,7 +132,7 @@
     return _finishStatement(statements);
   }
 
-  Block toYieldStatement({bool star: false}) {
+  Block toYieldStatement({bool star = false}) {
     var statements = body
         .map((e) =>
             e == body.last ? e.toYieldStatement(star: star) : e.toStatement())
@@ -173,30 +173,30 @@
     var valueInstantiators = variables.values.map(visitor.visit);
     var bodyInstantiators = body.map(visitor.visit);
 
-    return (args) => new MetaLet(
-        new Map.fromIterables(variables.keys,
+    return (args) => MetaLet(
+        Map.fromIterables(variables.keys,
             valueInstantiators.map((i) => i(args) as Expression)),
         bodyInstantiators.map((i) => i(args) as Expression).toList(),
         statelessResult: statelessResult);
   }
 
   Expression _toInvokedFunction(Block block) {
-    var finder = new _YieldFinder();
+    var finder = _YieldFinder();
     block.accept(finder);
     if (!finder.hasYield) {
-      return new Call(new ArrowFun([], block), []);
+      return Call(ArrowFun([], block), []);
     }
     // If we have a yield, it's more tricky. We'll create a `function*`, which
     // we `yield*` to immediately invoke. We also may need to bind this:
-    Expression fn = new Fun([], block, isGenerator: true);
+    Expression fn = Fun([], block, isGenerator: true);
     if (finder.hasThis) fn = js.call('#.bind(this)', fn);
-    return new Yield(new Call(fn, []), star: true);
+    return Yield(Call(fn, []), star: true);
   }
 
   Block _finishStatement(List<Statement> statements) {
     // Visit the tree and count how many times each temp was used.
-    var counter = new _VariableUseCounter();
-    var node = new Block(statements);
+    var counter = _VariableUseCounter();
+    var node = Block(statements);
     node.accept(counter);
     // Also count the init expressions.
     for (var init in variables.values) init.accept(counter);
@@ -213,9 +213,9 @@
         substitutions[variable] = init;
       } else {
         // Otherwise replace it with a temp, which will be assigned once.
-        var temp = new TemporaryId(variable.displayName);
+        var temp = TemporaryId(variable.displayName);
         substitutions[variable] = temp;
-        initializers.add(new VariableInitialization(temp, init));
+        initializers.add(VariableInitialization(temp, init));
       }
     });
 
@@ -223,10 +223,10 @@
     node = _substitute(node, substitutions);
     if (initializers.isNotEmpty) {
       var first = initializers[0];
-      node = new Block([
+      node = Block([
         initializers.length == 1
             ? first.value.toVariableDeclaration(first.declaration)
-            : new VariableDeclarationList('let', initializers).toStatement(),
+            : VariableDeclarationList('let', initializers).toStatement(),
         node
       ]);
     }
@@ -247,7 +247,7 @@
   ///     result = ((_) => _.addAll(result), _.add(2), _)([])
   ///
   MetaLet _simplifyAssignment(Identifier left,
-      {String op, bool isDeclaration: false}) {
+      {String op, bool isDeclaration = false}) {
     // See if the result value is a let* temporary variable.
     var result = body.last;
     if (result is MetaLetVariable && variables.containsKey(result)) {
@@ -255,23 +255,23 @@
       // would change the assignment order and be an invalid optimization.
       if (!isDeclaration && _IdentFinder.foundIn(left.name, body)) return null;
 
-      var vars = new Map<MetaLetVariable, Expression>.from(variables);
+      var vars = Map<MetaLetVariable, Expression>.from(variables);
       var value = vars.remove(result);
       Expression assign;
       if (isDeclaration) {
         // Technically, putting one of these in a comma expression is not
         // legal. However when isDeclaration is true, toStatement will be
         // called immediately on the MetaLet, which results in legal JS.
-        assign = new VariableDeclarationList(
-            'let', [new VariableInitialization(left, value)]);
+        assign = VariableDeclarationList(
+            'let', [VariableInitialization(left, value)]);
       } else {
         assign = value.toAssignExpression(left, op);
       }
 
       assert(body.isNotEmpty);
-      Binary newBody = new Expression.binary([assign]..addAll(body), ',');
+      Binary newBody = Expression.binary([assign]..addAll(body), ',');
       newBody = _substitute(newBody, {result: left});
-      return new MetaLet(vars, newBody.commaToExpressionList(),
+      return MetaLet(vars, newBody.commaToExpressionList(),
           statelessResult: statelessResult);
     }
     return null;
@@ -281,14 +281,14 @@
 /// Similar to [Template.instantiate] but works with free variables.
 T _substitute<T extends Node>(
     T tree, Map<MetaLetVariable, Expression> substitutions) {
-  var generator = new InstantiatorGeneratorVisitor(/*forceCopy:*/ false);
+  var generator = InstantiatorGeneratorVisitor(/*forceCopy:*/ false);
   var instantiator = generator.compile(tree);
-  var nodes = new List<MetaLetVariable>.from(generator
+  var nodes = List<MetaLetVariable>.from(generator
       .analysis.containsInterpolatedNode
       .where((n) => n is MetaLetVariable));
   if (nodes.isEmpty) return tree;
 
-  return instantiator(new Map.fromIterable(nodes,
+  return instantiator(Map.fromIterable(nodes,
       key: (v) => (v as MetaLetVariable).nameOrPosition,
       value: (v) => substitutions[v] ?? v)) as T;
 }
@@ -335,7 +335,7 @@
   _IdentFinder(this.name);
 
   static bool foundIn(String name, List<Node> body) {
-    var finder = new _IdentFinder(name);
+    var finder = _IdentFinder(name);
     for (var expr in body) {
       expr.accept(finder);
       if (finder.found) return true;
diff --git a/pkg/dev_compiler/lib/src/compiler/js_names.dart b/pkg/dev_compiler/lib/src/compiler/js_names.dart
index 5c212f1..7de9cf9 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_names.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_names.dart
@@ -29,12 +29,12 @@
   final Expression name;
 
   MaybeQualifiedId(this.qualifier, this.name) {
-    _expr = new PropertyAccess(qualifier, name);
+    _expr = PropertyAccess(qualifier, name);
   }
 
   /// Helper to create an [Identifier] from something that starts as a property.
   static Identifier identifier(LiteralString propertyName) =>
-      new Identifier(propertyName.valueWithoutQuotes);
+      Identifier(propertyName.valueWithoutQuotes);
 
   void setQualified(bool qualified) {
     var name = this.name;
@@ -64,7 +64,7 @@
 class TemporaryNamer extends LocalNamer {
   _FunctionScope scope;
 
-  TemporaryNamer(Node node) : scope = new _RenameVisitor.build(node).rootScope;
+  TemporaryNamer(Node node) : scope = _RenameVisitor.build(node).rootScope;
 
   String getName(Identifier node) {
     var rename = scope.renames[identifierKey(node)];
@@ -89,29 +89,29 @@
   final _FunctionScope parent;
 
   /// All names declared in this scope.
-  final declared = new HashSet<Object>();
+  final declared = HashSet<Object>();
 
   /// All names [declared] in this scope or its [parent]s, that is used in this
   /// scope and/or children. This is exactly the set of variable names we must
   /// not collide with inside this scope.
-  final used = new HashSet<String>();
+  final used = HashSet<String>();
 
   /// Nested scopes, these are visited after everything else so the names
   /// they might need are in scope.
-  final childScopes = new Map<Node, _FunctionScope>();
+  final childScopes = Map<Node, _FunctionScope>();
 
   /// New names assigned for temps and identifiers.
-  final renames = new HashMap<Object, String>();
+  final renames = HashMap<Object, String>();
 
   _FunctionScope(this.parent);
 }
 
 /// Collects all names used in the visited tree.
 class _RenameVisitor extends VariableDeclarationVisitor {
-  final pendingRenames = new Map<Object, Set<_FunctionScope>>();
+  final pendingRenames = Map<Object, Set<_FunctionScope>>();
 
-  final _FunctionScope globalScope = new _FunctionScope(null);
-  final _FunctionScope rootScope = new _FunctionScope(null);
+  final _FunctionScope globalScope = _FunctionScope(null);
+  final _FunctionScope rootScope = _FunctionScope(null);
   _FunctionScope scope;
 
   _RenameVisitor.build(Node root) {
@@ -152,7 +152,7 @@
     Set<_FunctionScope> usedIn = null;
     var rename = declScope != globalScope && needsRename(node);
     if (rename) {
-      usedIn = pendingRenames.putIfAbsent(id, () => new HashSet());
+      usedIn = pendingRenames.putIfAbsent(id, () => HashSet());
     }
     for (var s = scope, end = declScope.parent; s != end; s = s.parent) {
       if (usedIn != null) {
@@ -165,11 +165,11 @@
 
   visitFunctionExpression(FunctionExpression node) {
     // Visit nested functions after all identifiers are declared.
-    scope.childScopes[node] = new _FunctionScope(scope);
+    scope.childScopes[node] = _FunctionScope(scope);
   }
 
   visitClassExpression(ClassExpression node) {
-    scope.childScopes[node] = new _FunctionScope(scope);
+    scope.childScopes[node] = _FunctionScope(scope);
   }
 
   void _finishScopes() {
@@ -234,7 +234,7 @@
 
 /// Returns true for invalid JS variable names, such as keywords.
 /// Also handles invalid variable names in strict mode, like "arguments".
-bool invalidVariableName(String keyword, {bool strictMode: true}) {
+bool invalidVariableName(String keyword, {bool strictMode = true}) {
   switch (keyword) {
     // http://www.ecma-international.org/ecma-262/6.0/#sec-future-reserved-words
     case "await":
diff --git a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
index 56a0545..dda2d29 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
@@ -19,12 +19,12 @@
   /// The JS `typeof` value, if unambiguous.
   String get primitiveTypeOf => null;
 
-  static const jsBoolean = const JSBoolean();
-  static const jsNumber = const JSNumber();
-  static const jsNull = const JSNull();
-  static const jsObject = const JSObject();
-  static const jsString = const JSString();
-  static const jsUnknown = const JSUnknown();
+  static const jsBoolean = JSBoolean();
+  static const jsNumber = JSNumber();
+  static const jsNull = JSNull();
+  static const jsObject = JSObject();
+  static const jsString = JSString();
+  static const jsUnknown = JSUnknown();
   // TODO(jmesserly): add JSFunction that maps to Dart's `Function` type.
 }
 
diff --git a/pkg/dev_compiler/lib/src/compiler/js_utils.dart b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
index ff3296b..76686c0 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_utils.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
@@ -17,7 +17,7 @@
           innerFun.params.isEmpty) {
         var body = innerFun.body;
         if (body is Block) {
-          return new Fun(fn.params, body,
+          return Fun(fn.params, body,
               typeParams: fn.typeParams, returnType: fn.returnType);
         }
       }
@@ -27,13 +27,13 @@
 }
 
 Set<Identifier> findMutatedVariables(Node scope) {
-  var v = new MutationVisitor();
+  var v = MutationVisitor();
   scope.accept(v);
   return v.mutated;
 }
 
 class MutationVisitor extends BaseVisitor {
-  final mutated = new Set<Identifier>();
+  final mutated = Set<Identifier>();
   @override
   visitAssignment(node) {
     var id = node.leftHandSide;
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index 17703195e..a3f41e0 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -46,7 +46,7 @@
 /// [allowMultiple] formats to be specified, with each emitted into a separate
 /// file.
 void addModuleFormatOptions(ArgParser argParser,
-    {bool allowMultiple: false, bool hide: true, bool singleOutFile: true}) {
+    {bool allowMultiple = false, bool hide = true, bool singleOutFile = true}) {
   argParser.addMultiOption('modules', help: 'module pattern to emit', allowed: [
     'es6',
     'common',
@@ -80,18 +80,18 @@
 /// that affects the top-level module items, especially [ImportDeclaration]s and
 /// [ExportDeclaration]s.
 Program transformModuleFormat(ModuleFormat format, Program module,
-    {bool singleOutFile: false}) {
+    {bool singleOutFile = false}) {
   switch (format) {
     case ModuleFormat.legacy:
       // Legacy format always generates output compatible with single file mode.
-      return new LegacyModuleBuilder().build(module);
+      return LegacyModuleBuilder().build(module);
     case ModuleFormat.common:
       assert(!singleOutFile);
-      return new CommonJSModuleBuilder().build(module);
+      return CommonJSModuleBuilder().build(module);
     case ModuleFormat.amd:
       // TODO(jmesserly): encode singleOutFile as a module format?
       // Since it's irrelevant except for AMD.
-      return new AmdModuleBuilder(singleOutFile: singleOutFile).build(module);
+      return AmdModuleBuilder(singleOutFile: singleOutFile).build(module);
     case ModuleFormat.es6:
       assert(!singleOutFile);
       return module;
@@ -150,7 +150,7 @@
     visitProgram(module);
 
     // Build import parameters.
-    var exportsVar = new TemporaryId('exports');
+    var exportsVar = TemporaryId('exports');
     var parameters = <TemporaryId>[exportsVar];
     var importNames = <Expression>[];
     var importStatements = <Statement>[];
@@ -158,7 +158,7 @@
       importNames.add(import.from);
       // TODO(jmesserly): we could use destructuring here.
       var moduleVar =
-          new TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
+          TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
       parameters.add(moduleVar);
       for (var importName in import.namedImports) {
         assert(!importName.isStar); // import * not supported in legacy modules.
@@ -195,19 +195,19 @@
 
     var functionName =
         'load__' + pathToJSIdentifier(module.name.replaceAll('.', '_'));
-    var resultModule = new NamedFunction(
-        new Identifier(functionName),
+    var resultModule = NamedFunction(
+        Identifier(functionName),
         js.fun("function(#) { 'use strict'; #; }", [parameters, statements]),
         true);
 
     var moduleDef = js.statement("dart_library.library(#, #, #, #)", [
       js.string(module.name, "'"),
-      new LiteralNull(),
+      LiteralNull(),
       js.commentExpression(
-          "Imports", new ArrayInitializer(importNames, multiline: true)),
+          "Imports", ArrayInitializer(importNames, multiline: true)),
       resultModule
     ]);
-    return new Program(<ModuleItem>[moduleDef]);
+    return Program(<ModuleItem>[moduleDef]);
   }
 }
 
@@ -224,7 +224,7 @@
     for (var import in imports) {
       // TODO(jmesserly): we could use destructuring here.
       var moduleVar =
-          new TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
+          TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
       importStatements
           .add(js.statement('const # = require(#);', [moduleVar, import.from]));
 
@@ -240,7 +240,7 @@
     statements.insertAll(0, importStatements);
 
     if (exports.isNotEmpty) {
-      var exportsVar = new Identifier('exports');
+      var exportsVar = Identifier('exports');
       statements.add(js.comment('Exports:'));
       for (var export in exports) {
         var names = export.exportedNames;
@@ -253,7 +253,7 @@
       }
     }
 
-    return new Program(statements);
+    return Program(statements);
   }
 }
 
@@ -261,7 +261,7 @@
 class AmdModuleBuilder extends _ModuleBuilder {
   final bool singleOutFile;
 
-  AmdModuleBuilder({this.singleOutFile: false});
+  AmdModuleBuilder({this.singleOutFile = false});
 
   Program build(Program module) {
     var importStatements = <Statement>[];
@@ -274,7 +274,7 @@
     for (var import in imports) {
       // TODO(jmesserly): we could use destructuring once Atom supports it.
       var moduleVar =
-          new TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
+          TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes));
       fnParams.add(moduleVar);
       dependencies.add(import.from);
 
@@ -296,12 +296,11 @@
         // export * is not emitted by the compiler, so we don't handle it here.
         assert(names != null);
         for (var name in names) {
-          exportedProps.add(new Property(js.string(name.name), name));
+          exportedProps.add(Property(js.string(name.name), name));
         }
       }
       statements.add(js.comment('Exports:'));
-      statements.add(
-          new Return(new ObjectInitializer(exportedProps, multiline: true)));
+      statements.add(Return(ObjectInitializer(exportedProps, multiline: true)));
     }
 
     // TODO(vsm): Consider using an immediately invoked named function pattern
@@ -309,14 +308,14 @@
     var block = singleOutFile
         ? js.statement("define(#, #, function(#) { 'use strict'; #; });", [
             js.string(module.name, "'"),
-            new ArrayInitializer(dependencies),
+            ArrayInitializer(dependencies),
             fnParams,
             statements
           ])
         : js.statement("define(#, function(#) { 'use strict'; #; });",
-            [new ArrayInitializer(dependencies), fnParams, statements]);
+            [ArrayInitializer(dependencies), fnParams, statements]);
 
-    return new Program([block]);
+    return Program([block]);
   }
 }
 
@@ -335,7 +334,7 @@
     var ch = name[i];
     var needsEscape = ch == r'$' || _invalidCharInIdentifier.hasMatch(ch);
     if (needsEscape && buffer == null) {
-      buffer = new StringBuffer(name.substring(0, i));
+      buffer = StringBuffer(name.substring(0, i));
     }
     if (buffer != null) {
       buffer.write(needsEscape ? '\$${ch.codeUnits.join("")}' : ch);
@@ -345,11 +344,11 @@
   var result = buffer != null ? '$buffer' : name;
   // Ensure the identifier first character is not numeric and that the whole
   // identifier is not a keyword.
-  if (result.startsWith(new RegExp('[0-9]')) || invalidVariableName(result)) {
+  if (result.startsWith(RegExp('[0-9]')) || invalidVariableName(result)) {
     return '\$$result';
   }
   return result;
 }
 
 // Invalid characters for identifiers, which would need to be escaped.
-final _invalidCharInIdentifier = new RegExp(r'[^A-Za-z_$0-9]');
+final _invalidCharInIdentifier = RegExp(r'[^A-Za-z_$0-9]');
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index d2fa9c5..f716813 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -21,9 +21,9 @@
   final List<JS.Identifier> _operatorSetResultStack = [];
 
   JS.Identifier runtimeModule;
-  final namedArgumentTemp = new JS.TemporaryId('opts');
+  final namedArgumentTemp = JS.TemporaryId('opts');
 
-  final _privateNames = new HashMap<Library, HashMap<String, JS.TemporaryId>>();
+  final _privateNames = HashMap<Library, HashMap<String, JS.TemporaryId>>();
 
   /// The list of output module items, in the order they need to be emitted in.
   final moduleItems = <JS.ModuleItem>[];
@@ -43,7 +43,7 @@
       bool Function() isLastParamMutated) {
     if (name == '[]=') {
       _operatorSetResultStack.add(isLastParamMutated()
-          ? new JS.TemporaryId((formals.last as JS.Identifier).name)
+          ? JS.TemporaryId((formals.last as JS.Identifier).name)
           : formals.last);
     } else {
       _operatorSetResultStack.add(null);
@@ -72,7 +72,7 @@
       var valueParam = formals.last;
       var statements = code.statements;
       if (statements.isEmpty || !statements.last.alwaysReturns) {
-        statements.add(new JS.Return(setOperatorResult));
+        statements.add(JS.Return(setOperatorResult));
       }
       if (!identical(setOperatorResult, valueParam)) {
         // If the value parameter was mutated, then we use a temporary
@@ -89,12 +89,10 @@
   /// the `operator []=` method.
   JS.Statement emitReturnStatement(JS.Expression value) {
     if (_operatorSetResult != null) {
-      var result = new JS.Return(_operatorSetResult);
-      return value != null
-          ? new JS.Block([value.toStatement(), result])
-          : result;
+      var result = JS.Return(_operatorSetResult);
+      return value != null ? JS.Block([value.toStatement(), result]) : result;
     }
-    return value != null ? value.toReturn() : new JS.Return();
+    return value != null ? value.toReturn() : JS.Return();
   }
 
   /// Prepends the `dart.` and then uses [js.call] to parse the specified JS
@@ -130,14 +128,13 @@
   }
 
   JS.TemporaryId emitPrivateNameSymbol(Library library, String name) {
-    return _privateNames
-        .putIfAbsent(library, () => new HashMap())
-        .putIfAbsent(name, () {
+    return _privateNames.putIfAbsent(library, () => HashMap()).putIfAbsent(name,
+        () {
       var idName = name;
       if (idName.endsWith('=')) {
         idName = idName.replaceAll('=', '_');
       }
-      var id = new JS.TemporaryId(idName);
+      var id = JS.TemporaryId(idName);
       moduleItems.add(
           js.statement('const # = Symbol(#);', [id, js.string(name, "'")]));
       return id;
diff --git a/pkg/dev_compiler/lib/src/js_ast/builder.dart b/pkg/dev_compiler/lib/src/js_ast/builder.dart
index a918ee6..117f447 100644
--- a/pkg/dev_compiler/lib/src/js_ast/builder.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/builder.dart
@@ -15,7 +15,7 @@
  * TODO(sra): Find the remaining places where js('xxx') used to parse an
  * unbounded number of expression, or institute a cache policy.
  */
-TemplateManager templateManager = new TemplateManager();
+TemplateManager templateManager = TemplateManager();
 
 /**
 
@@ -188,7 +188,7 @@
         var # = 1;
 
 */
-const JsBuilder js = const JsBuilder();
+const JsBuilder js = JsBuilder();
 
 class JsBuilder {
   const JsBuilder();
@@ -245,7 +245,7 @@
   Template _findExpressionTemplate(String source) {
     Template template = templateManager.lookupExpressionTemplate(source);
     if (template == null) {
-      MiniJsParser parser = new MiniJsParser(source);
+      MiniJsParser parser = MiniJsParser(source);
       Expression expression = parser.expression();
       template = templateManager.defineExpressionTemplate(source, expression);
     }
@@ -255,7 +255,7 @@
   Template _findStatementTemplate(String source) {
     Template template = templateManager.lookupStatementTemplate(source);
     if (template == null) {
-      MiniJsParser parser = new MiniJsParser(source);
+      MiniJsParser parser = MiniJsParser(source);
       Statement statement = parser.statement();
       template = templateManager.defineStatementTemplate(source, statement);
     }
@@ -266,20 +266,18 @@
    * Creates an Expression template without caching the result.
    */
   Template uncachedExpressionTemplate(String source) {
-    MiniJsParser parser = new MiniJsParser(source);
+    MiniJsParser parser = MiniJsParser(source);
     Expression expression = parser.expression();
-    return new Template(source, expression,
-        isExpression: true, forceCopy: false);
+    return Template(source, expression, isExpression: true, forceCopy: false);
   }
 
   /**
    * Creates a Statement template without caching the result.
    */
   Template uncachedStatementTemplate(String source) {
-    MiniJsParser parser = new MiniJsParser(source);
+    MiniJsParser parser = MiniJsParser(source);
     Statement statement = parser.statement();
-    return new Template(source, statement,
-        isExpression: false, forceCopy: false);
+    return Template(source, statement, isExpression: false, forceCopy: false);
   }
 
   /**
@@ -288,11 +286,11 @@
    * context that expects a template.
    */
   Template expressionTemplateYielding(Node ast) {
-    return new Template.withExpressionResult(ast);
+    return Template.withExpressionResult(ast);
   }
 
   Template statementTemplateYielding(Node ast) {
-    return new Template.withStatementResult(ast);
+    return Template.withStatementResult(ast);
   }
 
   /// Creates a literal js string from [value].
@@ -309,7 +307,7 @@
     // > closing quote code points, U+005C (REVERSE SOLIDUS),
     // > U+000D (CARRIAGE RETURN), U+2028 (LINE SEPARATOR),
     // > U+2029 (PARAGRAPH SEPARATOR), and U+000A (LINE FEED).
-    var re = new RegExp('[\n\r$quoteReplace\b\f\t\v\u2028\u2029]');
+    var re = RegExp('[\n\r$quoteReplace\b\f\t\v\u2028\u2029]');
     escaped = escaped.replaceAllMapped(re, (m) {
       switch (m.group(0)) {
         case "\n":
@@ -342,7 +340,7 @@
           return r"\v";
       }
     });
-    LiteralString result = new LiteralString('$quote$escaped$quote');
+    LiteralString result = LiteralString('$quote$escaped$quote');
     // We don't escape quotes of a different style under the assumption that the
     // string is wrapped into quotes. Verify that assumption.
     assert(result.value.codeUnitAt(0) == quote.codeUnitAt(0));
@@ -356,25 +354,30 @@
   /// contain newlines or backslashes. For escaping the string use
   /// [escapedString].
   LiteralString string(String value, [String quote = '"']) =>
-      new LiteralString('$quote$value$quote');
+      LiteralString('$quote$value$quote');
 
-  LiteralNumber number(num value) => new LiteralNumber('$value');
+  LiteralNumber number(num value) => LiteralNumber('$value');
 
-  LiteralBool boolean(bool value) => new LiteralBool(value);
+  LiteralNumber uint64(int value) {
+    BigInt uint64Value = new BigInt.from(value).toUnsigned(64);
+    return LiteralNumber('$uint64Value');
+  }
+
+  LiteralBool boolean(bool value) => LiteralBool(value);
 
   ArrayInitializer numArray(Iterable<int> list) =>
-      new ArrayInitializer(list.map(number).toList());
+      ArrayInitializer(list.map(number).toList());
 
   ArrayInitializer stringArray(Iterable<String> list) =>
-      new ArrayInitializer(list.map(string).toList());
+      ArrayInitializer(list.map(string).toList());
 
-  Comment comment(String text) => new Comment(text);
+  Comment comment(String text) => Comment(text);
   CommentExpression commentExpression(String text, Expression expression) =>
-      new CommentExpression(text, expression);
+      CommentExpression(text, expression);
 
   Call propertyCall(
       Expression receiver, String fieldName, List<Expression> arguments) {
-    return new Call(new PropertyAccess.field(receiver, fieldName), arguments);
+    return Call(PropertyAccess.field(receiver, fieldName), arguments);
   }
 }
 
@@ -409,7 +412,7 @@
 
     // Replace non-tabs with spaces, giving a print indent that matches the text
     // for tabbing.
-    String spaces = prefix.replaceAll(new RegExp(r'[^\t]'), ' ');
+    String spaces = prefix.replaceAll(RegExp(r'[^\t]'), ' ');
     return 'Error in MiniJsParser:\n${src}\n$spaces^\n$spaces$message\n';
   }
 }
@@ -538,7 +541,7 @@
     return "Unknown: $cat";
   }
 
-  static const CATEGORIES = const <int>[
+  static const CATEGORIES = <int>[
     OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 0-7
     OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE, // 8-13
     OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 14-21
@@ -794,7 +797,7 @@
   }
 
   void error(String message) {
-    throw new MiniJsParserError(this, message);
+    throw MiniJsParserError(this, message);
   }
 
   /// Returns either the name for the hole, or its integer position.
@@ -819,28 +822,28 @@
     String last = lastToken;
     if (acceptCategory(ALPHA)) {
       if (last == "true") {
-        return new LiteralBool(true);
+        return LiteralBool(true);
       } else if (last == "false") {
-        return new LiteralBool(false);
+        return LiteralBool(false);
       } else if (last == "null") {
-        return new LiteralNull();
+        return LiteralNull();
       } else if (last == "function") {
         return parseFunctionExpression();
       } else if (last == "this") {
-        return new This();
+        return This();
       } else if (last == "super") {
-        return new Super();
+        return Super();
       } else if (last == "class") {
         return parseClass();
       } else {
-        return new Identifier(last);
+        return Identifier(last);
       }
     } else if (acceptCategory(LPAREN)) {
       return parseExpressionOrArrowFunction();
     } else if (acceptCategory(STRING)) {
-      return new LiteralString(last);
+      return LiteralString(last);
     } else if (acceptCategory(NUMERIC)) {
-      return new LiteralNumber(last);
+      return LiteralNumber(last);
     } else if (acceptCategory(LBRACE)) {
       return parseObjectInitializer();
     } else if (acceptCategory(LSQUARE)) {
@@ -848,7 +851,7 @@
 
       while (true) {
         if (acceptCategory(COMMA)) {
-          values.add(new ArrayHole());
+          values.add(ArrayHole());
           continue;
         }
         if (acceptCategory(RSQUARE)) break;
@@ -856,13 +859,13 @@
         if (acceptCategory(RSQUARE)) break;
         expectCategory(COMMA);
       }
-      return new ArrayInitializer(values);
+      return ArrayInitializer(values);
     } else if (last != null && last.startsWith("/")) {
       String regexp = getDelimited(lastPosition);
       getToken();
       String flags = lastToken;
       if (!acceptCategory(ALPHA)) flags = "";
-      Expression expression = new RegExpLiteral(regexp + flags);
+      Expression expression = RegExpLiteral(regexp + flags);
       return expression;
     } else if (acceptCategory(HASH)) {
       return parseInterpolatedExpression();
@@ -873,13 +876,13 @@
   }
 
   InterpolatedExpression parseInterpolatedExpression() {
-    var expression = new InterpolatedExpression(parseHash());
+    var expression = InterpolatedExpression(parseHash());
     interpolatedValues.add(expression);
     return expression;
   }
 
   InterpolatedIdentifier parseInterpolatedIdentifier() {
-    var id = new InterpolatedIdentifier(parseHash());
+    var id = InterpolatedIdentifier(parseHash());
     interpolatedValues.add(id);
     return id;
   }
@@ -888,7 +891,7 @@
     if (acceptCategory(HASH)) {
       return parseInterpolatedIdentifier();
     } else {
-      var id = new Identifier(lastToken);
+      var id = Identifier(lastToken);
       expectCategory(ALPHA);
       return id;
     }
@@ -907,7 +910,7 @@
       return parseArrowFunctionBody(<Parameter>[]);
     }
     if (acceptCategory(ELLIPSIS)) {
-      var params = <Parameter>[new RestParameter(parseParameter())];
+      var params = <Parameter>[RestParameter(parseParameter())];
       expectCategory(RPAREN);
       expectCategory(ARROW);
       return parseArrowFunctionBody(params);
@@ -917,13 +920,13 @@
       if (acceptCategory(ELLIPSIS)) {
         var params = <Parameter>[];
         _expressionToParameterList(expression, params);
-        params.add(new RestParameter(parseParameter()));
+        params.add(RestParameter(parseParameter()));
         expectCategory(RPAREN);
         expectCategory(ARROW);
         return parseArrowFunctionBody(params);
       }
       Expression right = parseAssignment();
-      expression = new Binary(',', expression, right);
+      expression = Binary(',', expression, right);
     }
     expectCategory(RPAREN);
     if (acceptCategory(ARROW)) {
@@ -949,7 +952,7 @@
       _expressionToParameterList(node.left, params);
       _expressionToParameterList(node.right, params);
     } else if (node is InterpolatedExpression) {
-      params.add(new InterpolatedParameter(node.nameOrPosition));
+      params.add(InterpolatedParameter(node.nameOrPosition));
     } else {
       error("Expected arrow function parameter list");
     }
@@ -962,14 +965,14 @@
     } else {
       body = parseAssignment();
     }
-    return new ArrowFun(params, body);
+    return ArrowFun(params, body);
   }
 
   Expression parseFunctionExpression() {
     String last = lastToken;
     if (acceptCategory(ALPHA)) {
       String functionName = last;
-      return new NamedFunction(new Identifier(functionName), parseFun());
+      return NamedFunction(Identifier(functionName), parseFun());
     }
     return parseFun();
   }
@@ -981,7 +984,7 @@
     if (!acceptCategory(RPAREN)) {
       for (;;) {
         if (acceptCategory(ELLIPSIS)) {
-          params.add(new RestParameter(parseParameter()));
+          params.add(RestParameter(parseParameter()));
           expectCategory(RPAREN);
           break;
         }
@@ -1008,21 +1011,21 @@
     }
     expectCategory(LBRACE);
     Block block = parseBlock();
-    return new Fun(params, block, asyncModifier: asyncModifier);
+    return Fun(params, block, asyncModifier: asyncModifier);
   }
 
   /** Parse parameter name or interpolated parameter. */
   Identifier parseParameter() {
     if (acceptCategory(HASH)) {
       var nameOrPosition = parseHash();
-      var parameter = new InterpolatedParameter(nameOrPosition);
+      var parameter = InterpolatedParameter(nameOrPosition);
       interpolatedValues.add(parameter);
       return parameter;
     } else {
       // TODO(jmesserly): validate this is not a keyword
       String argumentName = lastToken;
       expectCategory(ALPHA);
-      return new Identifier(argumentName);
+      return Identifier(argumentName);
     }
   }
 
@@ -1040,7 +1043,7 @@
       if (acceptCategory(RBRACE)) break;
       expectCategory(COMMA);
     }
-    return new ObjectInitializer(properties);
+    return ObjectInitializer(properties);
   }
 
   Expression parseMember() {
@@ -1051,7 +1054,7 @@
       } else if (acceptCategory(LSQUARE)) {
         Expression inBraces = parseExpression();
         expectCategory(RSQUARE);
-        receiver = new PropertyAccess(receiver, inBraces);
+        receiver = PropertyAccess(receiver, inBraces);
       } else {
         break;
       }
@@ -1068,7 +1071,7 @@
         if (!acceptCategory(RPAREN)) {
           while (true) {
             if (acceptCategory(ELLIPSIS)) {
-              arguments.add(new Spread(parseAssignment()));
+              arguments.add(Spread(parseAssignment()));
               expectCategory(RPAREN);
               break;
             }
@@ -1077,14 +1080,13 @@
             expectCategory(COMMA);
           }
         }
-        receiver = constructor
-            ? new New(receiver, arguments)
-            : new Call(receiver, arguments);
+        receiver =
+            constructor ? New(receiver, arguments) : Call(receiver, arguments);
         constructor = false;
       } else if (!constructor && acceptCategory(LSQUARE)) {
         Expression inBraces = parseExpression();
         expectCategory(RSQUARE);
-        receiver = new PropertyAccess(receiver, inBraces);
+        receiver = PropertyAccess(receiver, inBraces);
       } else if (!constructor && acceptCategory(DOT)) {
         receiver = getDotRhs(receiver);
       } else {
@@ -1099,9 +1101,9 @@
   Expression getDotRhs(Expression receiver) {
     if (acceptCategory(HASH)) {
       var nameOrPosition = parseHash();
-      InterpolatedSelector property = new InterpolatedSelector(nameOrPosition);
+      InterpolatedSelector property = InterpolatedSelector(nameOrPosition);
       interpolatedValues.add(property);
-      return new PropertyAccess(receiver, property);
+      return PropertyAccess(receiver, property);
     }
     String identifier = lastToken;
     // In ES5 keywords like delete and continue are allowed as property
@@ -1113,7 +1115,7 @@
     } else {
       expectCategory(ALPHA);
     }
-    return new PropertyAccess.field(receiver, identifier);
+    return PropertyAccess.field(receiver, identifier);
   }
 
   Expression parsePostfix() {
@@ -1124,7 +1126,7 @@
     if (lastCategory == SYMBOL &&
         !skippedNewline &&
         (acceptString("++") || acceptString("--"))) {
-      return new Postfix(operator, expression);
+      return Postfix(operator, expression);
     }
     // If we don't accept '++' or '--' due to skippedNewline a newline, no other
     // part of the parser will accept the token and we will get an error at the
@@ -1137,8 +1139,8 @@
     if (lastCategory == SYMBOL &&
         UNARY_OPERATORS.contains(operator) &&
         (acceptString("++") || acceptString("--") || acceptString('await'))) {
-      if (operator == "await") return new Await(parsePostfix());
-      return new Prefix(operator, parsePostfix());
+      if (operator == "await") return Await(parsePostfix());
+      return Prefix(operator, parsePostfix());
     }
     return parsePostfix();
   }
@@ -1150,8 +1152,8 @@
         operator != "++" &&
         operator != "--") {
       expectCategory(SYMBOL);
-      if (operator == "await") return new Await(parsePostfix());
-      return new Prefix(operator, parseUnaryLow());
+      if (operator == "await") return Await(parsePostfix());
+      return Prefix(operator, parseUnaryLow());
     }
     return parseUnaryHigh();
   }
@@ -1170,17 +1172,17 @@
       }
       expectCategory(SYMBOL);
       if (rhs == null || BINARY_PRECEDENCE[symbol] >= minPrecedence) {
-        if (rhs != null) lhs = new Binary(lastSymbol, lhs, rhs);
+        if (rhs != null) lhs = Binary(lastSymbol, lhs, rhs);
         minPrecedence = BINARY_PRECEDENCE[symbol];
         rhs = parseUnaryLow();
         lastSymbol = symbol;
       } else {
         Expression higher = parseBinary(BINARY_PRECEDENCE[symbol]);
-        rhs = new Binary(symbol, rhs, higher);
+        rhs = Binary(symbol, rhs, higher);
       }
     }
     if (rhs == null) return lhs;
-    return new Binary(lastSymbol, lhs, rhs);
+    return Binary(lastSymbol, lhs, rhs);
   }
 
   Expression parseConditional() {
@@ -1189,7 +1191,7 @@
     Expression ifTrue = parseAssignment();
     expectCategory(COLON);
     Expression ifFalse = parseAssignment();
-    return new Conditional(lhs, ifTrue, ifFalse);
+    return Conditional(lhs, ifTrue, ifFalse);
   }
 
   Expression parseLeftHandSide() => parseConditional();
@@ -1200,12 +1202,12 @@
     if (acceptCategory(ASSIGNMENT)) {
       Expression rhs = parseAssignment();
       if (assignmentOperator == "=") {
-        return new Assignment(lhs, rhs);
+        return Assignment(lhs, rhs);
       } else {
         // Handle +=, -=, etc.
         String operator =
             assignmentOperator.substring(0, assignmentOperator.length - 1);
-        return new Assignment.compound(lhs, operator, rhs);
+        return Assignment.compound(lhs, operator, rhs);
       }
     }
     return lhs;
@@ -1215,7 +1217,7 @@
     Expression expression = parseAssignment();
     while (acceptCategory(COMMA)) {
       Expression right = parseAssignment();
-      expression = new Binary(',', expression, right);
+      expression = Binary(',', expression, right);
     }
     return expression;
   }
@@ -1228,17 +1230,17 @@
     do {
       VariableBinding declarator;
       if (firstIdentifier != null) {
-        declarator = new Identifier(firstIdentifier);
+        declarator = Identifier(firstIdentifier);
         firstIdentifier = null;
       } else {
         declarator = parseVariableBinding();
       }
 
       var initializer = acceptString("=") ? parseAssignment() : null;
-      initialization.add(new VariableInitialization(declarator, initializer));
+      initialization.add(VariableInitialization(declarator, initializer));
     } while (acceptCategory(COMMA));
 
-    return new VariableDeclarationList(keyword, initialization);
+    return VariableDeclarationList(keyword, initialization);
   }
 
   VariableBinding parseVariableBinding() {
@@ -1289,12 +1291,12 @@
       if (acceptString("=")) {
         defaultValue = parseExpression();
       }
-      variables.add(new DestructuredVariable(
+      variables.add(DestructuredVariable(
           name: name, structure: structure, defaultValue: defaultValue));
     } while (acceptCategory(COMMA));
 
     expectCategory(RSQUARE);
-    return new ArrayBindingPattern(variables);
+    return ArrayBindingPattern(variables);
   }
 
   ObjectBindingPattern parseObjectBindingPattern() {
@@ -1309,12 +1311,12 @@
       } else if (acceptString("=")) {
         defaultValue = parseExpression();
       }
-      variables.add(new DestructuredVariable(
+      variables.add(DestructuredVariable(
           name: name, structure: structure, defaultValue: defaultValue));
     } while (acceptCategory(COMMA));
 
     expectCategory(RBRACE);
-    return new ObjectBindingPattern(variables);
+    return ObjectBindingPattern(variables);
   }
 
   Expression parseVarDeclarationOrExpression() {
@@ -1358,13 +1360,13 @@
       Statement statement = parseStatement();
       statements.add(statement);
     }
-    return new Block(statements);
+    return Block(statements);
   }
 
   Statement parseStatement() {
     if (acceptCategory(LBRACE)) return parseBlock();
 
-    if (acceptCategory(SEMICOLON)) return new EmptyStatement();
+    if (acceptCategory(SEMICOLON)) return EmptyStatement();
 
     if (lastCategory == ALPHA) {
       if (acceptString('return')) return parseReturn();
@@ -1372,16 +1374,16 @@
       if (acceptString('throw')) return parseThrow();
 
       if (acceptString('break')) {
-        return parseBreakOrContinue((label) => new Break(label));
+        return parseBreakOrContinue((label) => Break(label));
       }
 
       if (acceptString('continue')) {
-        return parseBreakOrContinue((label) => new Continue(label));
+        return parseBreakOrContinue((label) => Continue(label));
       }
 
       if (acceptString('debugger')) {
         expectSemicolon();
-        return new DebuggerStatement();
+        return DebuggerStatement();
       }
 
       if (acceptString('if')) return parseIfThenElse();
@@ -1390,7 +1392,7 @@
 
       if (acceptString('function')) return parseFunctionDeclaration();
 
-      if (acceptString('class')) return new ClassDeclaration(parseClass());
+      if (acceptString('class')) return ClassDeclaration(parseClass());
 
       if (acceptString('try')) return parseTry();
 
@@ -1398,7 +1400,7 @@
       if (keyword != null) {
         Expression declarations = parseVariableDeclarationList(keyword);
         expectSemicolon();
-        return new ExpressionStatement(declarations);
+        return ExpressionStatement(declarations);
       }
 
       if (acceptString('while')) return parseWhile();
@@ -1423,7 +1425,7 @@
     Expression expression = parseExpression();
 
     if (expression is Identifier && acceptCategory(COLON)) {
-      return new LabeledStatement(expression.name, parseStatement());
+      return LabeledStatement(expression.name, parseStatement());
     }
 
     expectSemicolon();
@@ -1434,34 +1436,34 @@
       if (expression is InterpolatedExpression) {
         assert(identical(interpolatedValues.last, expression));
         InterpolatedStatement statement =
-            new InterpolatedStatement(expression.nameOrPosition);
+            InterpolatedStatement(expression.nameOrPosition);
         interpolatedValues[interpolatedValues.length - 1] = statement;
         return statement;
       }
     }
 
-    return new ExpressionStatement(expression);
+    return ExpressionStatement(expression);
   }
 
   Statement parseReturn() {
-    if (acceptSemicolon()) return new Return();
+    if (acceptSemicolon()) return Return();
     Expression expression = parseExpression();
     expectSemicolon();
-    return new Return(expression);
+    return Return(expression);
   }
 
   Statement parseYield() {
     bool hasStar = acceptString('*');
     Expression expression = parseExpression();
     expectSemicolon();
-    return new DartYield(expression, hasStar);
+    return DartYield(expression, hasStar);
   }
 
   Statement parseThrow() {
     if (skippedNewline) error('throw expression must be on same line');
     Expression expression = parseExpression();
     expectSemicolon();
-    return new Throw(expression);
+    return Throw(expression);
   }
 
   Statement parseBreakOrContinue(Statement Function(String) constructor) {
@@ -1482,9 +1484,9 @@
     if (acceptString('else')) {
       // Resolves dangling else by binding 'else' to closest 'if'.
       Statement elseStatement = parseStatement();
-      return new If(condition, thenStatement, elseStatement);
+      return If(condition, thenStatement, elseStatement);
     } else {
-      return new If.noElse(condition, thenStatement);
+      return If.noElse(condition, thenStatement);
     }
   }
 
@@ -1511,7 +1513,7 @@
         expectCategory(RPAREN);
       }
       Statement body = parseStatement();
-      return new For(init, condition, update, body);
+      return For(init, condition, update, body);
     }
 
     expectCategory(LPAREN);
@@ -1528,13 +1530,13 @@
         Expression objectExpression = parseExpression();
         expectCategory(RPAREN);
         Statement body = parseStatement();
-        return new ForIn(_createVariableDeclarationList(keyword, identifier),
+        return ForIn(_createVariableDeclarationList(keyword, identifier),
             objectExpression, body);
       } else if (acceptString('of')) {
         Expression iterableExpression = parseAssignment();
         expectCategory(RPAREN);
         Statement body = parseStatement();
-        return new ForOf(_createVariableDeclarationList(keyword, identifier),
+        return ForOf(_createVariableDeclarationList(keyword, identifier),
             iterableExpression, body);
       }
       var declarations = parseVariableDeclarationList(keyword, identifier);
@@ -1549,15 +1551,15 @@
 
   static VariableDeclarationList _createVariableDeclarationList(
       String keyword, String identifier) {
-    return new VariableDeclarationList(keyword,
-        [new VariableInitialization(new Identifier(identifier), null)]);
+    return VariableDeclarationList(
+        keyword, [VariableInitialization(Identifier(identifier), null)]);
   }
 
   Statement parseFunctionDeclaration() {
     String name = lastToken;
     expectCategory(ALPHA);
     var fun = parseFun();
-    return new FunctionDeclaration(new Identifier(name), fun);
+    return FunctionDeclaration(Identifier(name), fun);
   }
 
   Statement parseTry() {
@@ -1572,7 +1574,7 @@
     } else {
       if (catchPart == null) error("expected 'finally'");
     }
-    return new Try(body, catchPart, finallyPart);
+    return Try(body, catchPart, finallyPart);
   }
 
   SwitchCase parseSwitchClause() {
@@ -1592,7 +1594,7 @@
         lastToken != 'default') {
       statements.add(parseStatement());
     }
-    return new SwitchCase(expression, new Block(statements));
+    return SwitchCase(expression, Block(statements));
   }
 
   Statement parseWhile() {
@@ -1600,7 +1602,7 @@
     Expression condition = parseExpression();
     expectCategory(RPAREN);
     Statement body = parseStatement();
-    return new While(condition, body);
+    return While(condition, body);
   }
 
   Statement parseDo() {
@@ -1611,7 +1613,7 @@
     Expression condition = parseExpression();
     expectCategory(RPAREN);
     expectSemicolon();
-    return new Do(body, condition);
+    return Do(body, condition);
   }
 
   Statement parseSwitch() {
@@ -1619,12 +1621,12 @@
     Expression key = parseExpression();
     expectCategory(RPAREN);
     expectCategory(LBRACE);
-    var clauses = new List<SwitchCase>();
+    var clauses = List<SwitchCase>();
     while (lastCategory != RBRACE) {
       clauses.add(parseSwitchClause());
     }
     expectCategory(RBRACE);
-    return new Switch(key, clauses);
+    return Switch(key, clauses);
   }
 
   Catch parseCatch() {
@@ -1634,7 +1636,7 @@
     expectCategory(RPAREN);
     expectCategory(LBRACE);
     Block body = parseBlock();
-    return new Catch(new Identifier(identifier), body);
+    return Catch(Identifier(identifier), body);
   }
 
   ClassExpression parseClass() {
@@ -1644,12 +1646,12 @@
       heritage = parseConditional();
     }
     expectCategory(LBRACE);
-    var methods = new List<Method>();
+    var methods = List<Method>();
     while (lastCategory != RBRACE) {
       methods.add(parseMethodOrProperty(onlyMethods: true) as Method);
     }
     expectCategory(RBRACE);
-    return new ClassExpression(name, heritage, methods);
+    return ClassExpression(name, heritage, methods);
   }
 
   /**
@@ -1663,7 +1665,7 @@
    * - property names: `#: ...`
    * - entire methods: `#`
    */
-  Property parseMethodOrProperty({bool onlyMethods: false}) {
+  Property parseMethodOrProperty({bool onlyMethods = false}) {
     bool isStatic = acceptString('static');
 
     bool isGetter = lastToken == 'get';
@@ -1675,13 +1677,13 @@
       if (lastCategory == COLON) {
         // That wasn't a accessor but the 'get' or 'set' property: retropedal.
         isGetter = isSetter = false;
-        name = new LiteralString('"$token"');
+        name = LiteralString('"$token"');
       }
     }
     if (acceptCategory(HASH)) {
       if (lastCategory != LPAREN && (onlyMethods || lastCategory != COLON)) {
         // Interpolated method
-        var member = new InterpolatedMethod(parseHash());
+        var member = InterpolatedMethod(parseHash());
         interpolatedValues.add(member);
         return member;
       }
@@ -1692,10 +1694,10 @@
 
     if (!onlyMethods && acceptCategory(COLON)) {
       Expression value = parseAssignment();
-      return new Property(name, value);
+      return Property(name, value);
     } else {
       var fun = parseFun();
-      return new Method(name, fun,
+      return Method(name, fun,
           isGetter: isGetter, isSetter: isSetter, isStatic: isStatic);
     }
   }
@@ -1703,10 +1705,10 @@
   Expression parsePropertyName() {
     String identifier = lastToken;
     if (acceptCategory(STRING)) {
-      return new LiteralString(identifier);
+      return LiteralString(identifier);
     } else if (acceptCategory(ALPHA) || acceptCategory(SYMBOL)) {
       // ALPHA or a SYMBOL, e.g. void
-      return new LiteralString('"$identifier"');
+      return LiteralString('"$identifier"');
     } else if (acceptCategory(LSQUARE)) {
       var expr = parseAssignment();
       expectCategory(RSQUARE);
diff --git a/pkg/dev_compiler/lib/src/js_ast/js_types.dart b/pkg/dev_compiler/lib/src/js_ast/js_types.dart
index 6217798b..e45c96c 100644
--- a/pkg/dev_compiler/lib/src/js_ast/js_types.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/js_types.dart
@@ -4,9 +4,9 @@
 
 part of js_ast;
 
-final _any = new AnyTypeRef._();
-final _unknown = new UnknownTypeRef._();
-final _null = new NullTypeRef();
+final _any = AnyTypeRef._();
+final _unknown = UnknownTypeRef._();
+final _null = NullTypeRef();
 
 /// JavaScript type reference, designed to support a subset of the type systems
 /// of the Closure Compiler and TypeScript:
@@ -26,58 +26,57 @@
 
   factory TypeRef.any() => _any;
 
-  factory TypeRef.void_() => new TypeRef.named('void');
+  factory TypeRef.void_() => TypeRef.named('void');
 
   factory TypeRef.unknown() => _unknown;
 
   factory TypeRef.generic(TypeRef rawType, Iterable<TypeRef> typeArgs) {
     if (typeArgs.isEmpty) {
-      throw new ArgumentError.value(typeArgs, "typeArgs", "is empty");
+      throw ArgumentError.value(typeArgs, "typeArgs", "is empty");
     }
-    return new GenericTypeRef(rawType, typeArgs.toList());
+    return GenericTypeRef(rawType, typeArgs.toList());
   }
 
-  factory TypeRef.array([TypeRef elementType]) => new ArrayTypeRef(elementType);
+  factory TypeRef.array([TypeRef elementType]) => ArrayTypeRef(elementType);
 
   factory TypeRef.object([TypeRef keyType, TypeRef valueType]) {
     // TODO(ochafik): Roll out a dedicated ObjectTypeRef?
-    var rawType = new TypeRef.named('Object');
+    var rawType = TypeRef.named('Object');
     return keyType == null && valueType == null
         ? rawType
-        : new GenericTypeRef(rawType, [keyType ?? _any, valueType ?? _any]);
+        : GenericTypeRef(rawType, [keyType ?? _any, valueType ?? _any]);
   }
 
   factory TypeRef.function(
           [TypeRef returnType, Map<Identifier, TypeRef> paramTypes]) =>
-      new FunctionTypeRef(returnType, paramTypes);
+      FunctionTypeRef(returnType, paramTypes);
 
   factory TypeRef.record(Map<Identifier, TypeRef> types) =>
-      new RecordTypeRef(types);
+      RecordTypeRef(types);
 
-  factory TypeRef.string() => new TypeRef.named('string');
+  factory TypeRef.string() => TypeRef.named('string');
 
-  factory TypeRef.number() => new TypeRef.named('number');
+  factory TypeRef.number() => TypeRef.named('number');
 
-  factory TypeRef.undefined() => new TypeRef.named('undefined');
+  factory TypeRef.undefined() => TypeRef.named('undefined');
 
-  factory TypeRef.boolean() => new TypeRef.named('boolean');
+  factory TypeRef.boolean() => TypeRef.named('boolean');
 
-  factory TypeRef.qualified(List<Identifier> path) =>
-      new QualifiedTypeRef(path);
+  factory TypeRef.qualified(List<Identifier> path) => QualifiedTypeRef(path);
 
   factory TypeRef.named(String name) =>
-      new TypeRef.qualified(<Identifier>[new Identifier(name)]);
+      TypeRef.qualified(<Identifier>[Identifier(name)]);
 
   bool get isAny => this is AnyTypeRef;
   bool get isUnknown => this is UnknownTypeRef;
   bool get isNull => this is NullTypeRef;
 
-  TypeRef or(TypeRef other) => new UnionTypeRef([this, other]);
+  TypeRef or(TypeRef other) => UnionTypeRef([this, other]);
 
-  TypeRef orUndefined() => or(new TypeRef.undefined());
+  TypeRef orUndefined() => or(TypeRef.undefined());
   TypeRef orNull() => or(_null);
 
-  TypeRef toOptional() => new OptionalTypeRef(this);
+  TypeRef toOptional() => OptionalTypeRef(this);
 }
 
 class AnyTypeRef extends TypeRef {
@@ -86,12 +85,12 @@
   factory AnyTypeRef() => _any;
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitAnyTypeRef(this);
   void visitChildren(NodeVisitor visitor) {}
-  _clone() => new AnyTypeRef();
+  _clone() => AnyTypeRef();
 }
 
 class NullTypeRef extends QualifiedTypeRef {
-  NullTypeRef() : super([new Identifier("null")]);
-  _clone() => new NullTypeRef();
+  NullTypeRef() : super([Identifier("null")]);
+  _clone() => NullTypeRef();
 }
 
 class UnknownTypeRef extends TypeRef {
@@ -100,7 +99,7 @@
   factory UnknownTypeRef() => _unknown;
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitUnknownTypeRef(this);
   void visitChildren(NodeVisitor visitor) {}
-  _clone() => new UnknownTypeRef();
+  _clone() => UnknownTypeRef();
 }
 
 class QualifiedTypeRef extends TypeRef {
@@ -110,7 +109,7 @@
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitQualifiedTypeRef(this);
   void visitChildren(NodeVisitor visitor) =>
       path.forEach((p) => p.accept(visitor));
-  _clone() => new QualifiedTypeRef(path);
+  _clone() => QualifiedTypeRef(path);
 }
 
 class ArrayTypeRef extends TypeRef {
@@ -121,7 +120,7 @@
     elementType.accept(visitor);
   }
 
-  _clone() => new ArrayTypeRef(elementType);
+  _clone() => ArrayTypeRef(elementType);
 }
 
 class GenericTypeRef extends TypeRef {
@@ -135,7 +134,7 @@
     typeArgs.forEach((p) => p.accept(visitor));
   }
 
-  _clone() => new GenericTypeRef(rawType, typeArgs);
+  _clone() => GenericTypeRef(rawType, typeArgs);
 }
 
 class UnionTypeRef extends TypeRef {
@@ -147,12 +146,12 @@
     types.forEach((p) => p.accept(visitor));
   }
 
-  _clone() => new UnionTypeRef(types);
+  _clone() => UnionTypeRef(types);
 
   @override
   TypeRef or(TypeRef other) {
     if (types.contains(other)) return this;
-    return new UnionTypeRef([]
+    return UnionTypeRef([]
       ..addAll(types)
       ..add(other));
   }
@@ -167,7 +166,7 @@
     type.accept(visitor);
   }
 
-  _clone() => new OptionalTypeRef(type);
+  _clone() => OptionalTypeRef(type);
 
   @override
   TypeRef orUndefined() => this;
@@ -182,7 +181,7 @@
     types.values.forEach((p) => p.accept(visitor));
   }
 
-  _clone() => new RecordTypeRef(types);
+  _clone() => RecordTypeRef(types);
 }
 
 class FunctionTypeRef extends TypeRef {
@@ -199,5 +198,5 @@
     });
   }
 
-  _clone() => new FunctionTypeRef(returnType, paramTypes);
+  _clone() => FunctionTypeRef(returnType, paramTypes);
 }
diff --git a/pkg/dev_compiler/lib/src/js_ast/nodes.dart b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
index 2f7f188..2af42b1 100644
--- a/pkg/dev_compiler/lib/src/js_ast/nodes.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
@@ -273,19 +273,19 @@
   bool get isCommaOperator => false;
 
   Statement toStatement() {
-    throw new UnsupportedError('toStatement');
+    throw UnsupportedError('toStatement');
   }
 
   Statement toReturn() {
-    throw new UnsupportedError('toReturn');
+    throw UnsupportedError('toReturn');
   }
 
   // For debugging
   String toString() {
-    var context = new SimpleJavaScriptPrintingContext();
-    var opts = new JavaScriptPrintingOptions(allowKeywordsInProperties: true);
+    var context = SimpleJavaScriptPrintingContext();
+    var opts = JavaScriptPrintingOptions(allowKeywordsInProperties: true);
     context.buffer.write('js_ast `');
-    accept(new Printer(opts, context));
+    accept(Printer(opts, context));
     context.buffer.write('`');
     return context.getText();
   }
@@ -311,15 +311,15 @@
     for (ModuleItem statement in body) statement.accept(visitor);
   }
 
-  Program _clone() => new Program(body);
+  Program _clone() => Program(body);
 }
 
 abstract class Statement extends ModuleItem {
   static Statement from(List<Statement> statements) {
     // TODO(jmesserly): empty block singleton? Should this use empty statement?
-    if (statements.length == 0) return new Block([]);
+    if (statements.length == 0) return Block([]);
     if (statements.length == 1) return statements[0];
-    return new Block(statements);
+    return Block(statements);
   }
 
   /// True if this declares any name from [names].
@@ -340,13 +340,13 @@
   /// If this statement [shadows] any name from [names], this will wrap it in a
   /// new scoped [Block].
   Statement toScopedBlock(Set<String> names) {
-    return shadows(names) ? new Block([this], isScope: true) : this;
+    return shadows(names) ? Block([this], isScope: true) : this;
   }
 
   Statement toStatement() => this;
-  Statement toReturn() => new Block([this, new Return()]);
+  Statement toReturn() => Block([this, Return()]);
 
-  Block toBlock() => new Block([this]);
+  Block toBlock() => Block([this]);
 }
 
 class Block extends Statement {
@@ -355,7 +355,7 @@
   /// True to preserve this [Block] for scoping reasons.
   final bool isScope;
 
-  Block(this.statements, {this.isScope: false}) {
+  Block(this.statements, {this.isScope = false}) {
     assert(statements.every((s) => s is Statement));
   }
   Block.empty()
@@ -377,7 +377,7 @@
   Block toScopedBlock(Set<String> names) {
     var scoped = statements.any((s) => s.shadows(names));
     if (scoped == isScope) return this;
-    return new Block(statements, isScope: scoped)
+    return Block(statements, isScope: scoped)
       ..sourceInformation = sourceInformation;
   }
 
@@ -386,7 +386,7 @@
     for (Statement statement in statements) statement.accept(visitor);
   }
 
-  Block _clone() => new Block(statements);
+  Block _clone() => Block(statements);
 }
 
 class ExpressionStatement extends Statement {
@@ -404,7 +404,7 @@
     expression.accept(visitor);
   }
 
-  ExpressionStatement _clone() => new ExpressionStatement(expression);
+  ExpressionStatement _clone() => ExpressionStatement(expression);
 }
 
 class EmptyStatement extends Statement {
@@ -412,7 +412,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitEmptyStatement(this);
   void visitChildren(NodeVisitor visitor) {}
-  EmptyStatement _clone() => new EmptyStatement();
+  EmptyStatement _clone() => EmptyStatement();
 }
 
 class If extends Statement {
@@ -437,7 +437,7 @@
     if (otherwise != null) otherwise.accept(visitor);
   }
 
-  If _clone() => new If(condition, then, otherwise);
+  If _clone() => If(condition, then, otherwise);
 }
 
 abstract class Loop extends Statement {
@@ -461,7 +461,7 @@
     body.accept(visitor);
   }
 
-  For _clone() => new For(init, condition, update, body);
+  For _clone() => For(init, condition, update, body);
 }
 
 class ForIn extends Loop {
@@ -480,7 +480,7 @@
     body.accept(visitor);
   }
 
-  ForIn _clone() => new ForIn(leftHandSide, object, body);
+  ForIn _clone() => ForIn(leftHandSide, object, body);
 }
 
 class ForOf extends Loop {
@@ -499,7 +499,7 @@
     body.accept(visitor);
   }
 
-  ForIn _clone() => new ForIn(leftHandSide, iterable, body);
+  ForIn _clone() => ForIn(leftHandSide, iterable, body);
 }
 
 class While extends Loop {
@@ -514,7 +514,7 @@
     body.accept(visitor);
   }
 
-  While _clone() => new While(condition, body);
+  While _clone() => While(condition, body);
 }
 
 class Do extends Loop {
@@ -529,7 +529,7 @@
     condition.accept(visitor);
   }
 
-  Do _clone() => new Do(body, condition);
+  Do _clone() => Do(body, condition);
 }
 
 class Continue extends Statement {
@@ -540,7 +540,7 @@
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitContinue(this);
   void visitChildren(NodeVisitor visitor) {}
 
-  Continue _clone() => new Continue(targetLabel);
+  Continue _clone() => Continue(targetLabel);
 }
 
 class Break extends Statement {
@@ -551,7 +551,7 @@
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitBreak(this);
   void visitChildren(NodeVisitor visitor) {}
 
-  Break _clone() => new Break(targetLabel);
+  Break _clone() => Break(targetLabel);
 }
 
 class Return extends Statement {
@@ -570,7 +570,7 @@
     if (value != null) value.accept(visitor);
   }
 
-  Return _clone() => new Return(value);
+  Return _clone() => Return(value);
 
   static bool foundIn(Node node) {
     _returnFinder.found = false;
@@ -579,7 +579,7 @@
   }
 }
 
-final _returnFinder = new _ReturnFinder();
+final _returnFinder = _ReturnFinder();
 
 class _ReturnFinder extends BaseVisitor {
   bool found = false;
@@ -603,7 +603,7 @@
     expression.accept(visitor);
   }
 
-  Throw _clone() => new Throw(expression);
+  Throw _clone() => Throw(expression);
 }
 
 class Try extends Statement {
@@ -623,7 +623,7 @@
     if (finallyPart != null) finallyPart.accept(visitor);
   }
 
-  Try _clone() => new Try(body, catchPart, finallyPart);
+  Try _clone() => Try(body, catchPart, finallyPart);
 }
 
 class Catch extends Node {
@@ -639,7 +639,7 @@
     body.accept(visitor);
   }
 
-  Catch _clone() => new Catch(declaration, body);
+  Catch _clone() => Catch(declaration, body);
 }
 
 class Switch extends Statement {
@@ -655,7 +655,7 @@
     for (var clause in cases) clause.accept(visitor);
   }
 
-  Switch _clone() => new Switch(key, cases);
+  Switch _clone() => Switch(key, cases);
 }
 
 class SwitchCase extends Node {
@@ -674,7 +674,7 @@
     body.accept(visitor);
   }
 
-  SwitchCase _clone() => new SwitchCase(expression, body);
+  SwitchCase _clone() => SwitchCase(expression, body);
 }
 
 class FunctionDeclaration extends Statement {
@@ -690,7 +690,7 @@
     function.accept(visitor);
   }
 
-  FunctionDeclaration _clone() => new FunctionDeclaration(name, function);
+  FunctionDeclaration _clone() => FunctionDeclaration(name, function);
 }
 
 class LabeledStatement extends Statement {
@@ -705,7 +705,7 @@
     body.accept(visitor);
   }
 
-  LabeledStatement _clone() => new LabeledStatement(label, body);
+  LabeledStatement _clone() => LabeledStatement(label, body);
 }
 
 class LiteralStatement extends Statement {
@@ -716,7 +716,7 @@
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralStatement(this);
   void visitChildren(NodeVisitor visitor) {}
 
-  LiteralStatement _clone() => new LiteralStatement(code);
+  LiteralStatement _clone() => LiteralStatement(code);
 }
 
 // Not a real JavaScript node, but represents the yield statement from a dart
@@ -734,7 +734,7 @@
     expression.accept(visitor);
   }
 
-  DartYield _clone() => new DartYield(expression, hasStar);
+  DartYield _clone() => DartYield(expression, hasStar);
 }
 
 abstract class Expression extends Node {
@@ -743,28 +743,28 @@
   factory Expression.binary(List<Expression> exprs, String op) {
     Expression comma = null;
     for (var node in exprs) {
-      comma = (comma == null) ? node : new Binary(op, comma, node);
+      comma = (comma == null) ? node : Binary(op, comma, node);
     }
     return comma;
   }
 
   int get precedenceLevel;
 
-  Statement toStatement() => new ExpressionStatement(toVoidExpression());
-  Statement toReturn() => new Return(this);
+  Statement toStatement() => ExpressionStatement(toVoidExpression());
+  Statement toReturn() => Return(this);
 
   // TODO(jmesserly): make this return a Yield?
-  Statement toYieldStatement({bool star: false}) =>
-      new ExpressionStatement(new Yield(this, star: star));
+  Statement toYieldStatement({bool star = false}) =>
+      ExpressionStatement(Yield(this, star: star));
 
   Expression toVoidExpression() => this;
   Expression toAssignExpression(Expression left, [String op]) =>
-      new Assignment.compound(left, op, this);
+      Assignment.compound(left, op, this);
 
   // TODO(jmesserly): make this work for more cases?
   Statement toVariableDeclaration(VariableBinding name) =>
-      new VariableDeclarationList(
-          'let', [new VariableInitialization(name, this)]).toStatement();
+      VariableDeclarationList('let', [VariableInitialization(name, this)])
+          .toStatement();
 }
 
 class LiteralExpression extends Expression {
@@ -782,8 +782,7 @@
     }
   }
 
-  LiteralExpression _clone() =>
-      new LiteralExpression.withData(template, inputs);
+  LiteralExpression _clone() => LiteralExpression.withData(template, inputs);
 
   // Code that uses JS must take care of operator precedences, and
   // put parenthesis if needed.
@@ -823,7 +822,7 @@
   }
 
   VariableDeclarationList _clone() =>
-      new VariableDeclarationList(keyword, declarations);
+      VariableDeclarationList(keyword, declarations);
 
   int get precedenceLevel => EXPRESSION;
 }
@@ -847,7 +846,7 @@
     if (value != null) value.accept(visitor);
   }
 
-  Assignment _clone() => new Assignment.compound(leftHandSide, op, value);
+  Assignment _clone() => Assignment.compound(leftHandSide, op, value);
 }
 
 class VariableInitialization extends Expression {
@@ -860,8 +859,7 @@
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitVariableInitialization(this);
 
-  VariableInitialization _clone() =>
-      new VariableInitialization(declaration, value);
+  VariableInitialization _clone() => VariableInitialization(declaration, value);
 
   int get precedenceLevel => ASSIGNMENT;
 
@@ -921,7 +919,7 @@
   @override
   int get precedenceLevel => PRIMARY;
   @override
-  Node _clone() => new DestructuredVariable(
+  Node _clone() => DestructuredVariable(
       name: name,
       property: property,
       structure: structure,
@@ -946,7 +944,7 @@
   final Identifier name;
   SimpleBindingPattern(Identifier name)
       : name = name,
-        super([new DestructuredVariable(name: name)]);
+        super([DestructuredVariable(name: name)]);
 
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitSimpleBindingPattern(this);
@@ -958,7 +956,7 @@
   @override
   int get precedenceLevel => PRIMARY;
   @override
-  Node _clone() => new SimpleBindingPattern(name);
+  Node _clone() => SimpleBindingPattern(name);
 }
 
 class ObjectBindingPattern extends BindingPattern {
@@ -970,7 +968,7 @@
   @override
   int get precedenceLevel => PRIMARY;
   @override
-  Node _clone() => new ObjectBindingPattern(variables);
+  Node _clone() => ObjectBindingPattern(variables);
 }
 
 class ArrayBindingPattern extends BindingPattern {
@@ -981,7 +979,7 @@
   @override
   int get precedenceLevel => PRIMARY;
   @override
-  Node _clone() => new ArrayBindingPattern(variables);
+  Node _clone() => ArrayBindingPattern(variables);
 }
 
 class Conditional extends Expression {
@@ -999,7 +997,7 @@
     otherwise.accept(visitor);
   }
 
-  Conditional _clone() => new Conditional(condition, then, otherwise);
+  Conditional _clone() => Conditional(condition, then, otherwise);
 
   int get precedenceLevel => ASSIGNMENT;
 }
@@ -1017,7 +1015,7 @@
     for (Expression arg in arguments) arg.accept(visitor);
   }
 
-  Call _clone() => new Call(target, arguments);
+  Call _clone() => Call(target, arguments);
 
   int get precedenceLevel => CALL;
 }
@@ -1027,7 +1025,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitNew(this);
 
-  New _clone() => new New(target, arguments);
+  New _clone() => New(target, arguments);
 
   int get precedenceLevel => ACCESS;
 }
@@ -1041,7 +1039,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitBinary(this);
 
-  Binary _clone() => new Binary(op, left, right);
+  Binary _clone() => Binary(op, left, right);
 
   void visitChildren(NodeVisitor visitor) {
     left.accept(visitor);
@@ -1055,26 +1053,26 @@
     var l = left.toVoidExpression();
     var r = right.toVoidExpression();
     if (l == left && r == right) return this;
-    return new Binary(',', l, r);
+    return Binary(',', l, r);
   }
 
   Statement toStatement() {
     if (!isCommaOperator) return super.toStatement();
-    return new Block([left.toStatement(), right.toStatement()]);
+    return Block([left.toStatement(), right.toStatement()]);
   }
 
   Statement toReturn() {
     if (!isCommaOperator) return super.toReturn();
-    return new Block([left.toStatement(), right.toReturn()]);
+    return Block([left.toStatement(), right.toReturn()]);
   }
 
-  Statement toYieldStatement({bool star: false}) {
+  Statement toYieldStatement({bool star = false}) {
     if (!isCommaOperator) return super.toYieldStatement(star: star);
-    return new Block([left.toStatement(), right.toYieldStatement(star: star)]);
+    return Block([left.toStatement(), right.toYieldStatement(star: star)]);
   }
 
   List<Expression> commaToExpressionList() {
-    if (!isCommaOperator) throw new StateError('not a comma expression');
+    if (!isCommaOperator) throw StateError('not a comma expression');
     var exprs = <Expression>[];
     _flattenComma(exprs, left);
     _flattenComma(exprs, right);
@@ -1142,7 +1140,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitPrefix(this);
 
-  Prefix _clone() => new Prefix(op, argument);
+  Prefix _clone() => Prefix(op, argument);
 
   void visitChildren(NodeVisitor visitor) {
     argument.accept(visitor);
@@ -1159,7 +1157,7 @@
   int get precedenceLevel => SPREAD;
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitSpread(this);
-  Spread _clone() => new Spread(argument);
+  Spread _clone() => Spread(argument);
 }
 
 class Postfix extends Expression {
@@ -1170,7 +1168,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitPostfix(this);
 
-  Postfix _clone() => new Postfix(op, argument);
+  Postfix _clone() => Postfix(op, argument);
 
   void visitChildren(NodeVisitor visitor) {
     argument.accept(visitor);
@@ -1188,16 +1186,16 @@
   final bool allowRename;
   final TypeRef type;
 
-  Identifier(this.name, {this.allowRename: true, this.type}) {
+  Identifier(this.name, {this.allowRename = true, this.type}) {
     if (!_identifierRE.hasMatch(name)) {
-      throw new ArgumentError.value(name, "name", "not a valid identifier");
+      throw ArgumentError.value(name, "name", "not a valid identifier");
     }
   }
-  static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$');
+  static RegExp _identifierRE = RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$');
 
   bool shadows(Set<String> names) => names.contains(name);
 
-  Identifier _clone() => new Identifier(name, allowRename: allowRename);
+  Identifier _clone() => Identifier(name, allowRename: allowRename);
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitIdentifier(this);
   int get precedenceLevel => PRIMARY;
   void visitChildren(NodeVisitor visitor) {}
@@ -1212,7 +1210,7 @@
 
   bool shadows(Set<String> names) => names.contains(parameter.name);
 
-  RestParameter _clone() => new RestParameter(parameter);
+  RestParameter _clone() => RestParameter(parameter);
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitRestParameter(this);
   void visitChildren(NodeVisitor visitor) {
     parameter.accept(visitor);
@@ -1223,7 +1221,7 @@
 
 class This extends Expression {
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitThis(this);
-  This _clone() => new This();
+  This _clone() => This();
   int get precedenceLevel => PRIMARY;
   void visitChildren(NodeVisitor visitor) {}
 
@@ -1234,7 +1232,7 @@
   }
 }
 
-final _thisFinder = new _ThisFinder();
+final _thisFinder = _ThisFinder();
 
 class _ThisFinder extends BaseVisitor {
   bool found = false;
@@ -1251,7 +1249,7 @@
 // it anywhere that `this` is accepted.
 class Super extends Expression {
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitSuper(this);
-  Super _clone() => new Super();
+  Super _clone() => Super();
   int get precedenceLevel => PRIMARY;
   void visitChildren(NodeVisitor visitor) {}
 }
@@ -1273,8 +1271,7 @@
     function.accept(visitor);
   }
 
-  NamedFunction _clone() =>
-      new NamedFunction(name, function, immediatelyInvoked);
+  NamedFunction _clone() => NamedFunction(name, function, immediatelyInvoked);
 
   int get precedenceLevel =>
       immediatelyInvoked ? EXPRESSION : PRIMARY_LOW_PRECEDENCE;
@@ -1306,8 +1303,8 @@
   final AsyncModifier asyncModifier;
 
   Fun(this.params, this.body,
-      {this.isGenerator: false,
-      this.asyncModifier: const AsyncModifier.sync(),
+      {this.isGenerator = false,
+      this.asyncModifier = const AsyncModifier.sync(),
       this.typeParams,
       this.returnType});
 
@@ -1318,8 +1315,8 @@
     body.accept(visitor);
   }
 
-  Fun _clone() => new Fun(params, body,
-      isGenerator: isGenerator, asyncModifier: asyncModifier);
+  Fun _clone() =>
+      Fun(params, body, isGenerator: isGenerator, asyncModifier: asyncModifier);
 
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 }
@@ -1343,7 +1340,7 @@
 
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 
-  ArrowFun _clone() => new ArrowFun(params, body);
+  ArrowFun _clone() => ArrowFun(params, body);
 }
 
 /**
@@ -1382,9 +1379,9 @@
 
   PropertyAccess(this.receiver, this.selector);
   PropertyAccess.field(this.receiver, String fieldName)
-      : selector = new LiteralString('"$fieldName"');
+      : selector = LiteralString('"$fieldName"');
   PropertyAccess.indexed(this.receiver, int index)
-      : selector = new LiteralNumber('$index');
+      : selector = LiteralNumber('$index');
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitAccess(this);
 
@@ -1393,7 +1390,7 @@
     selector.accept(visitor);
   }
 
-  PropertyAccess _clone() => new PropertyAccess(receiver, selector);
+  PropertyAccess _clone() => PropertyAccess(receiver, selector);
 
   int get precedenceLevel => ACCESS;
 }
@@ -1411,14 +1408,14 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralBool(this);
   // [visitChildren] inherited from [Literal].
-  LiteralBool _clone() => new LiteralBool(value);
+  LiteralBool _clone() => LiteralBool(value);
 }
 
 class LiteralNull extends Literal {
   LiteralNull();
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralNull(this);
-  LiteralNull _clone() => new LiteralNull();
+  LiteralNull _clone() => LiteralNull();
 }
 
 class LiteralString extends Literal {
@@ -1440,7 +1437,7 @@
   String get valueWithoutQuotes => value.substring(1, value.length - 1);
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralString(this);
-  LiteralString _clone() => new LiteralString(value);
+  LiteralString _clone() => LiteralString(value);
 }
 
 class LiteralNumber extends Literal {
@@ -1449,7 +1446,7 @@
   LiteralNumber(this.value);
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitLiteralNumber(this);
-  LiteralNumber _clone() => new LiteralNumber(value);
+  LiteralNumber _clone() => LiteralNumber(value);
 
   /**
    * Use a different precedence level depending on whether the value contains a
@@ -1462,7 +1459,7 @@
   final List<Expression> elements;
   final bool multiline;
 
-  ArrayInitializer(this.elements, {this.multiline: false});
+  ArrayInitializer(this.elements, {this.multiline = false});
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayInitializer(this);
 
@@ -1470,7 +1467,7 @@
     for (Expression element in elements) element.accept(visitor);
   }
 
-  ArrayInitializer _clone() => new ArrayInitializer(elements);
+  ArrayInitializer _clone() => ArrayInitializer(elements);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1484,7 +1481,7 @@
 
   void visitChildren(NodeVisitor visitor) {}
 
-  ArrayHole _clone() => new ArrayHole();
+  ArrayHole _clone() => ArrayHole();
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1496,7 +1493,7 @@
   /**
    * Constructs a new object-initializer containing the given [properties].
    */
-  ObjectInitializer(this.properties, {bool multiline: false})
+  ObjectInitializer(this.properties, {bool multiline = false})
       : _multiline = multiline;
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitObjectInitializer(this);
@@ -1505,7 +1502,7 @@
     for (Property init in properties) init.accept(visitor);
   }
 
-  ObjectInitializer _clone() => new ObjectInitializer(properties);
+  ObjectInitializer _clone() => ObjectInitializer(properties);
 
   int get precedenceLevel => PRIMARY;
   /**
@@ -1531,7 +1528,7 @@
     value.accept(visitor);
   }
 
-  Property _clone() => new Property(name, value);
+  Property _clone() => Property(name, value);
 }
 
 // TODO(jmesserly): parser does not support this yet.
@@ -1568,7 +1565,7 @@
     }
   }
 
-  TemplateString _clone() => new TemplateString(strings, interpolations);
+  TemplateString _clone() => TemplateString(strings, interpolations);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1587,7 +1584,7 @@
     template.accept(visitor);
   }
 
-  TaggedTemplate _clone() => new TaggedTemplate(tag, template);
+  TaggedTemplate _clone() => TaggedTemplate(tag, template);
 
   int get precedenceLevel => CALL;
 }
@@ -1602,7 +1599,7 @@
    */
   final bool star;
 
-  Yield(this.value, {this.star: false});
+  Yield(this.value, {this.star = false});
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitYield(this);
 
@@ -1610,7 +1607,7 @@
     if (value != null) value.accept(visitor);
   }
 
-  Yield _clone() => new Yield(value);
+  Yield _clone() => Yield(value);
 
   int get precedenceLevel => YIELD;
 }
@@ -1622,7 +1619,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitClassDeclaration(this);
   visitChildren(NodeVisitor visitor) => classExpr.accept(visitor);
-  ClassDeclaration _clone() => new ClassDeclaration(classExpr);
+  ClassDeclaration _clone() => ClassDeclaration(classExpr);
 }
 
 class ClassExpression extends Expression {
@@ -1659,9 +1656,9 @@
   }
 
   @override
-  ClassDeclaration toStatement() => new ClassDeclaration(this);
+  ClassDeclaration toStatement() => ClassDeclaration(this);
 
-  ClassExpression _clone() => new ClassExpression(name, heritage, methods,
+  ClassExpression _clone() => ClassExpression(name, heritage, methods,
       typeParams: typeParams, fields: fields);
 
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
@@ -1675,7 +1672,7 @@
   final bool isStatic;
 
   Method(this.name, this.function,
-      {this.isGetter: false, this.isSetter: false, this.isStatic: false}) {
+      {this.isGetter = false, this.isSetter = false, this.isStatic = false}) {
     assert(!isGetter || function.params.length == 0);
     assert(!isSetter || function.params.length == 1);
     assert(!isGetter && !isSetter || !function.isGenerator);
@@ -1690,7 +1687,7 @@
     function.accept(visitor);
   }
 
-  Method _clone() => new Method(name, function,
+  Method _clone() => Method(name, function,
       isGetter: isGetter, isSetter: isSetter, isStatic: isStatic);
 }
 
@@ -1710,7 +1707,7 @@
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedExpression(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedExpression _clone() => new InterpolatedExpression(nameOrPosition);
+  InterpolatedExpression _clone() => InterpolatedExpression(nameOrPosition);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1722,7 +1719,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitInterpolatedLiteral(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition);
+  InterpolatedLiteral _clone() => InterpolatedLiteral(nameOrPosition);
 }
 
 class InterpolatedParameter extends Expression
@@ -1744,7 +1741,7 @@
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedParameter(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedParameter _clone() => new InterpolatedParameter(nameOrPosition);
+  InterpolatedParameter _clone() => InterpolatedParameter(nameOrPosition);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1757,7 +1754,7 @@
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedSelector(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedSelector _clone() => new InterpolatedSelector(nameOrPosition);
+  InterpolatedSelector _clone() => InterpolatedSelector(nameOrPosition);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1770,7 +1767,7 @@
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedStatement(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedStatement _clone() => new InterpolatedStatement(nameOrPosition);
+  InterpolatedStatement _clone() => InterpolatedStatement(nameOrPosition);
 }
 
 // TODO(jmesserly): generalize this to InterpolatedProperty?
@@ -1783,7 +1780,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitInterpolatedMethod(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedMethod _clone() => new InterpolatedMethod(nameOrPosition);
+  InterpolatedMethod _clone() => InterpolatedMethod(nameOrPosition);
 
   int get precedenceLevel => PRIMARY;
   Expression get name => throw _unsupported;
@@ -1793,7 +1790,7 @@
   bool get isStatic => throw _unsupported;
   Fun get function => throw _unsupported;
   Error get _unsupported =>
-      new UnsupportedError('$runtimeType does not support this member.');
+      UnsupportedError('$runtimeType does not support this member.');
 }
 
 class InterpolatedIdentifier extends Expression
@@ -1809,7 +1806,7 @@
   T accept<T>(NodeVisitor<T> visitor) =>
       visitor.visitInterpolatedIdentifier(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedIdentifier _clone() => new InterpolatedIdentifier(nameOrPosition);
+  InterpolatedIdentifier _clone() => InterpolatedIdentifier(nameOrPosition);
 
   int get precedenceLevel => PRIMARY;
   String get name => throw '$runtimeType does not support this member.';
@@ -1829,7 +1826,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitRegExpLiteral(this);
   void visitChildren(NodeVisitor visitor) {}
-  RegExpLiteral _clone() => new RegExpLiteral(pattern);
+  RegExpLiteral _clone() => RegExpLiteral(pattern);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1849,7 +1846,7 @@
   int get precedenceLevel => UNARY;
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitAwait(this);
   void visitChildren(NodeVisitor visitor) => expression.accept(visitor);
-  Await _clone() => new Await(expression);
+  Await _clone() => Await(expression);
 }
 
 /**
@@ -1864,7 +1861,7 @@
   Comment(this.comment);
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitComment(this);
-  Comment _clone() => new Comment(comment);
+  Comment _clone() => Comment(comment);
 
   void visitChildren(NodeVisitor visitor) {}
 }
@@ -1883,14 +1880,14 @@
 
   int get precedenceLevel => PRIMARY;
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitCommentExpression(this);
-  CommentExpression _clone() => new CommentExpression(comment, expression);
+  CommentExpression _clone() => CommentExpression(comment, expression);
 
   void visitChildren(NodeVisitor visitor) => expression.accept(visitor);
 }
 
 class DebuggerStatement extends Statement {
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitDebuggerStatement(this);
-  DebuggerStatement _clone() => new DebuggerStatement();
+  DebuggerStatement _clone() => DebuggerStatement();
   void visitChildren(NodeVisitor visitor) {}
 }
 
@@ -1933,7 +1930,7 @@
     from.accept(visitor);
   }
 
-  ImportDeclaration _clone() => new ImportDeclaration(
+  ImportDeclaration _clone() => ImportDeclaration(
       defaultBinding: defaultBinding, namedImports: namedImports, from: from);
 }
 
@@ -1950,7 +1947,7 @@
   /** True if this is an `export default`. */
   final bool isDefault;
 
-  ExportDeclaration(this.exported, {this.isDefault: false}) {
+  ExportDeclaration(this.exported, {this.isDefault = false}) {
     assert(exported is ClassDeclaration ||
             exported is FunctionDeclaration ||
             isDefault
@@ -1963,7 +1960,7 @@
   ///
   /// This can be useful for lowering to other module formats.
   List<Identifier> get exportedNames {
-    if (isDefault) return [new Identifier('default')];
+    if (isDefault) return [Identifier('default')];
 
     var exported = this.exported;
     if (exported is ClassDeclaration) return [exported.classExpr.name];
@@ -1977,13 +1974,13 @@
       if (exported.exportStar) return null;
       return exported.exports.map((e) => e.name).toList();
     }
-    throw new StateError('invalid export declaration');
+    throw StateError('invalid export declaration');
   }
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitExportDeclaration(this);
   visitChildren(NodeVisitor visitor) => exported.accept(visitor);
   ExportDeclaration _clone() =>
-      new ExportDeclaration(exported, isDefault: isDefault);
+      ExportDeclaration(exported, isDefault: isDefault);
 }
 
 class ExportClause extends Node {
@@ -1994,7 +1991,7 @@
 
   /** The `export * from 'name.js'` form. */
   ExportClause.star(LiteralString from)
-      : this([new NameSpecifier.star()], from: from);
+      : this([NameSpecifier.star()], from: from);
 
   /** True if this is an `export *`. */
   bool get exportStar => exports.length == 1 && exports[0].isStar;
@@ -2005,7 +2002,7 @@
     if (from != null) from.accept(visitor);
   }
 
-  ExportClause _clone() => new ExportClause(exports, from: from);
+  ExportClause _clone() => ExportClause(exports, from: from);
 }
 
 /** An import or export specifier. */
@@ -2021,7 +2018,7 @@
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitNameSpecifier(this);
   void visitChildren(NodeVisitor visitor) {}
-  NameSpecifier _clone() => new NameSpecifier(name, asName: asName);
+  NameSpecifier _clone() => NameSpecifier(name, asName: asName);
 }
 
 // TODO(jmesserly): should this be related to [Program]?
@@ -2039,5 +2036,5 @@
     for (ModuleItem item in body) item.accept(visitor);
   }
 
-  Module _clone() => new Module(body);
+  Module _clone() => Module(body);
 }
diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart
index 58c8bbb..da72745 100644
--- a/pkg/dev_compiler/lib/src/js_ast/printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart
@@ -16,12 +16,12 @@
   final bool allowKeywordsInProperties;
 
   JavaScriptPrintingOptions(
-      {this.shouldCompressOutput: false,
-      this.minifyLocalVariables: false,
-      this.preferSemicolonToNewlineInMinifiedOutput: false,
-      this.emitTypes: false,
-      this.allowKeywordsInProperties: false,
-      this.allowSingleLineIfStatements: false});
+      {this.shouldCompressOutput = false,
+      this.minifyLocalVariables = false,
+      this.preferSemicolonToNewlineInMinifiedOutput = false,
+      this.emitTypes = false,
+      this.allowKeywordsInProperties = false,
+      this.allowSingleLineIfStatements = false});
 }
 
 /// An environment in which JavaScript printing is done.  Provides emitting of
@@ -47,7 +47,7 @@
 
 /// A simple implementation of [JavaScriptPrintingContext] suitable for tests.
 class SimpleJavaScriptPrintingContext extends JavaScriptPrintingContext {
-  final StringBuffer buffer = new StringBuffer();
+  final StringBuffer buffer = StringBuffer();
 
   void emit(String string) {
     buffer.write(string);
@@ -79,15 +79,15 @@
   /// Whether the next call to [indent] should just be a no-op.
   bool _skipNextIndent = false;
 
-  static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]');
-  static final expressionContinuationRegExp = new RegExp(r'^[-+([]');
+  static final identifierCharacterRegExp = RegExp(r'^[a-zA-Z_0-9$]');
+  static final expressionContinuationRegExp = RegExp(r'^[-+([]');
 
   Printer(JavaScriptPrintingOptions options, JavaScriptPrintingContext context,
       {LocalNamer localNamer})
       : options = options,
         context = context,
         shouldCompressOutput = options.shouldCompressOutput,
-        danglingElseVisitor = new DanglingElseVisitor(context),
+        danglingElseVisitor = DanglingElseVisitor(context),
         localNamer = determineRenamer(localNamer, options) {
     context.printer = this;
   }
@@ -96,8 +96,8 @@
       LocalNamer localNamer, JavaScriptPrintingOptions options) {
     if (localNamer != null) return localNamer;
     return (options.shouldCompressOutput && options.minifyLocalVariables)
-        ? new MinifyRenamer()
-        : new IdentityNamer();
+        ? MinifyRenamer()
+        : IdentityNamer();
   }
 
   // The current indentation string.
@@ -317,7 +317,7 @@
     if (hasElse) {
       bool needsBraces = node.then.accept(danglingElseVisitor) || then is Do;
       if (needsBraces) {
-        then = new Block(<Statement>[then]);
+        then = Block(<Statement>[then]);
       }
     }
     if (shouldIndent) indent();
@@ -1210,7 +1210,7 @@
   }
 
   void propertyNameOut(Expression node,
-      {bool inMethod: false, bool inAccess: false}) {
+      {bool inMethod = false, bool inAccess = false}) {
     if (node is LiteralNumber) {
       LiteralNumber nameNumber = node;
       if (inAccess) out('[');
@@ -1296,7 +1296,7 @@
 
   /// This is unused, see [nameSpecifierOut].
   visitNameSpecifier(NameSpecifier node) {
-    throw new UnsupportedError('visitNameSpecifier');
+    throw UnsupportedError('visitNameSpecifier');
   }
 
   nameSpecifierOut(NameSpecifier node, bool export) {
@@ -1427,8 +1427,8 @@
 
   VarCollector()
       : nested = false,
-        vars = new Set<String>(),
-        params = new Set<String>();
+        vars = Set<String>(),
+        params = Set<String>();
 
   void forEachVar(void fn(String v)) => vars.forEach(fn);
   void forEachParam(void fn(String p)) => params.forEach(fn);
@@ -1565,9 +1565,9 @@
   int variableNumber = 0;
 
   void enterScope(Node node) {
-    var vars = new VarCollector();
+    var vars = VarCollector();
     node.accept(vars);
-    maps.add(new Map<String, String>());
+    maps.add(Map<String, String>());
     variableNumberStack.add(variableNumber);
     parameterNumberStack.add(parameterNumber);
     vars.forEachVar(declareVariable);
@@ -1648,7 +1648,7 @@
     String newName;
     if (n < LETTERS) {
       // Start naming variables a, b, c, ..., z, A, B, C, ..., Z.
-      newName = new String.fromCharCodes([nthLetter(n)]);
+      newName = String.fromCharCodes([nthLetter(n)]);
     } else {
       // Then name variables a0, a1, a2, ..., a9, b0, b1, ..., Z9, aa0, aa1, ...
       // For all functions with fewer than 500 locals this is just as compact
@@ -1671,9 +1671,9 @@
         codes.add(nthLetter((n ~/ nameSpaceSize) % LETTERS));
       }
       codes.add(charCodes.$0 + digit);
-      newName = new String.fromCharCodes(codes);
+      newName = String.fromCharCodes(codes);
     }
-    assert(new RegExp(r'[a-zA-Z][a-zA-Z0-9]*').hasMatch(newName));
+    assert(RegExp(r'[a-zA-Z][a-zA-Z0-9]*').hasMatch(newName));
     maps.last[oldName] = newName;
     return newName;
   }
diff --git a/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart b/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
index 4474cae..af5a5b6 100644
--- a/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
@@ -33,7 +33,7 @@
   int _column = 0;
 
   /// The source_maps builder we write JavaScript code to.
-  final sourceMap = new SourceMapBuilder();
+  final sourceMap = SourceMapBuilder();
 
   /// The last marked line in the buffer.
   int _previousDartOffset = -1;
@@ -75,7 +75,7 @@
       _mark(srcInfo.end);
       emit('*/');
     } else if (srcInfo is! NodeEnd) {
-      throw new StateError(
+      throw StateError(
           'wrong kind of source map data: `$srcInfo` <${srcInfo.runtimeType}>');
     }
 
@@ -101,7 +101,7 @@
     } else if (srcInfo is NodeEnd) {
       dartEnd = srcInfo.end;
     } else if (srcInfo is! SourceLocation && srcInfo is! HoverComment) {
-      throw new StateError(
+      throw StateError(
           'wrong kind of source map data: `$srcInfo` <${srcInfo.runtimeType}>');
     }
 
@@ -113,8 +113,8 @@
         if (column >= 0) {
           // Adjust the colum, because any ending brace or semicolon is already in
           // the output.
-          var jsEnd = new SourceLocation(buffer.length - 1,
-              line: _line, column: column);
+          var jsEnd =
+              SourceLocation(buffer.length - 1, line: _line, column: column);
           _mark(dartEnd, jsEnd);
         }
       } else {
@@ -168,7 +168,7 @@
   }
 
   SourceLocation _getJSLocation() =>
-      new SourceLocation(buffer.length, line: _line, column: _column);
+      SourceLocation(buffer.length, line: _line, column: _column);
 }
 
 const int _LF = 10;
diff --git a/pkg/dev_compiler/lib/src/js_ast/template.dart b/pkg/dev_compiler/lib/src/js_ast/template.dart
index 5a06359..6475446 100644
--- a/pkg/dev_compiler/lib/src/js_ast/template.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/template.dart
@@ -5,8 +5,8 @@
 part of js_ast;
 
 class TemplateManager {
-  Map<String, Template> expressionTemplates = new Map<String, Template>();
-  Map<String, Template> statementTemplates = new Map<String, Template>();
+  Map<String, Template> expressionTemplates = Map<String, Template>();
+  Map<String, Template> statementTemplates = Map<String, Template>();
 
   TemplateManager();
 
@@ -16,7 +16,7 @@
 
   Template defineExpressionTemplate(String source, Node ast) {
     Template template =
-        new Template(source, ast, isExpression: true, forceCopy: false);
+        Template(source, ast, isExpression: true, forceCopy: false);
     expressionTemplates[source] = template;
     return template;
   }
@@ -27,7 +27,7 @@
 
   Template defineStatementTemplate(String source, Node ast) {
     Template template =
-        new Template(source, ast, isExpression: false, forceCopy: false);
+        Template(source, ast, isExpression: false, forceCopy: false);
     statementTemplates[source] = template;
     return template;
   }
@@ -54,7 +54,7 @@
   bool get isPositional => holeNames == null;
 
   Template(this.source, this.ast,
-      {this.isExpression: true, this.forceCopy: false}) {
+      {this.isExpression = true, this.forceCopy = false}) {
     _compile();
   }
 
@@ -79,13 +79,13 @@
   }
 
   bool _checkNoPlaceholders() {
-    var generator = new InstantiatorGeneratorVisitor(false);
+    var generator = InstantiatorGeneratorVisitor(false);
     generator.compile(ast);
     return generator.analysis.count == 0;
   }
 
   void _compile() {
-    var generator = new InstantiatorGeneratorVisitor(forceCopy);
+    var generator = InstantiatorGeneratorVisitor(forceCopy);
     instantiator = generator.compile(ast);
     positionalArgumentCount = generator.analysis.count;
     Set<String> names = generator.analysis.holeNames;
@@ -120,7 +120,7 @@
       }
       return instantiator(arguments) as Node;
     }
-    throw new ArgumentError.value(arguments, 'must be a List or Map');
+    throw ArgumentError.value(arguments, 'must be a List or Map');
   }
 }
 
@@ -139,7 +139,7 @@
 class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
   final bool forceCopy;
 
-  final analysis = new InterpolatedNodeAnalysis();
+  final analysis = InterpolatedNodeAnalysis();
 
   /**
    * The entire tree is cloned if [forceCopy] is true.
@@ -173,7 +173,7 @@
   }
 
   Instantiator visitNode(Node node) {
-    throw new UnimplementedError('visit${node.runtimeType}');
+    throw UnimplementedError('visit${node.runtimeType}');
   }
 
   Instantiator<Expression> visitInterpolatedExpression(
@@ -182,8 +182,8 @@
     return (arguments) {
       var value = arguments[nameOrPosition];
       if (value is Expression) return value;
-      if (value is String) return new Identifier(value);
-      throw new StateError(
+      if (value is String) return Identifier(value);
+      throw StateError(
           'Interpolated value #$nameOrPosition is not an Expression: $value');
     };
   }
@@ -195,8 +195,8 @@
         var value = arguments[nameOrPosition];
         Expression toExpression(item) {
           if (item is Expression) return item;
-          if (item is String) return new Identifier(item);
-          throw new StateError('Interpolated value #$nameOrPosition is not '
+          if (item is String) return Identifier(item);
+          throw StateError('Interpolated value #$nameOrPosition is not '
               'an Expression or List of Expressions: $value');
         }
 
@@ -225,7 +225,7 @@
     return (arguments) {
       var value = arguments[nameOrPosition];
       if (value is Literal) return value;
-      throw new StateError(
+      throw StateError(
           'Interpolated value #$nameOrPosition is not a Literal: $value');
     };
   }
@@ -237,8 +237,8 @@
 
       Parameter toIdentifier(item) {
         if (item is Parameter) return item;
-        if (item is String) return new Identifier(item);
-        throw new StateError(
+        if (item is String) return Identifier(item);
+        throw StateError(
             'Interpolated value #$nameOrPosition is not an Identifier'
             ' or List of Identifiers: $value');
       }
@@ -257,8 +257,8 @@
     return (arguments) {
       var value = arguments[nameOrPosition];
       if (value is Expression) return value;
-      if (value is String) return new LiteralString('"$value"');
-      throw new StateError(
+      if (value is String) return LiteralString('"$value"');
+      throw StateError(
           'Interpolated value #$nameOrPosition is not a selector: $value');
     };
   }
@@ -269,7 +269,7 @@
     return (arguments) {
       var value = arguments[nameOrPosition];
       if (value is Node) return value.toStatement();
-      throw new StateError(
+      throw StateError(
           'Interpolated value #$nameOrPosition is not a Statement: $value');
     };
   }
@@ -280,8 +280,7 @@
       var value = arguments[nameOrPosition];
       Method toMethod(item) {
         if (item is Method) return item;
-        throw new StateError(
-            'Interpolated value #$nameOrPosition is not a Method '
+        throw StateError('Interpolated value #$nameOrPosition is not a Method '
             'or List of Methods: $value');
       }
 
@@ -296,8 +295,8 @@
     return (arguments) {
       var item = arguments[nameOrPosition];
       if (item is Identifier) return item;
-      if (item is String) return new Identifier(item);
-      throw new StateError('Interpolated value #$nameOrPosition is not a '
+      if (item is String) return Identifier(item);
+      throw StateError('Interpolated value #$nameOrPosition is not a '
           'Identifier or String: $item');
     };
   }
@@ -310,7 +309,7 @@
         Statement toStatement(item) {
           if (item is Statement) return item;
           if (item is Expression) return item.toStatement();
-          throw new StateError('Interpolated value #$nameOrPosition is not '
+          throw StateError('Interpolated value #$nameOrPosition is not '
               'a Statement or List of Statements: $value');
         }
 
@@ -323,7 +322,7 @@
 
   Instantiator<Program> visitProgram(Program node) {
     var instantiators = node.body.map(visitSplayableStatement).toList();
-    return (a) => new Program(splayStatements(instantiators, a));
+    return (a) => Program(splayStatements(instantiators, a));
   }
 
   List<Statement> splayStatements(List<Instantiator> instantiators, arguments) {
@@ -344,7 +343,7 @@
 
   Instantiator<Block> visitBlock(Block node) {
     var instantiators = node.statements.map(visitSplayableStatement).toList();
-    return (a) => new Block(splayStatements(instantiators, a));
+    return (a) => Block(splayStatements(instantiators, a));
   }
 
   Instantiator<Statement> visitExpressionStatement(ExpressionStatement node) {
@@ -353,10 +352,10 @@
   }
 
   Instantiator<DebuggerStatement> visitDebuggerStatement(node) =>
-      (a) => new DebuggerStatement();
+      (a) => DebuggerStatement();
 
   Instantiator<EmptyStatement> visitEmptyStatement(EmptyStatement node) =>
-      (a) => new EmptyStatement();
+      (a) => EmptyStatement();
 
   Instantiator<Statement> visitIf(If node) {
     var condition = node.condition;
@@ -378,8 +377,8 @@
       if (value is bool) {
         return value ? makeThen(arguments) : makeOtherwise(arguments);
       }
-      var cond = value is String ? new Identifier(value) : value as Expression;
-      return new If(cond, makeThen(arguments), makeOtherwise(arguments));
+      var cond = value is String ? Identifier(value) : value as Expression;
+      return If(cond, makeThen(arguments), makeOtherwise(arguments));
     };
   }
 
@@ -387,7 +386,7 @@
     Instantiator<Expression> makeCondition = visit(node.condition);
     Instantiator<Statement> makeThen = visit(node.then);
     Instantiator<Statement> makeOtherwise = visit(node.otherwise);
-    return (a) => new If(makeCondition(a), makeThen(a), makeOtherwise(a));
+    return (a) => If(makeCondition(a), makeThen(a), makeOtherwise(a));
   }
 
   Instantiator<Statement> visitFor(For node) {
@@ -395,7 +394,7 @@
     Instantiator<Expression> makeCondition = visitNullable(node.condition);
     Instantiator<Expression> makeUpdate = visitNullable(node.update);
     Instantiator<Statement> makeBody = visit(node.body);
-    return (a) => new For(makeInit(a), makeCondition(a),
+    return (a) => For(makeInit(a), makeCondition(a),
         makeUpdate(a)?.toVoidExpression(), makeBody(a));
   }
 
@@ -403,74 +402,73 @@
     Instantiator<Expression> makeLeftHandSide = visit(node.leftHandSide);
     Instantiator<Expression> makeObject = visit(node.object);
     Instantiator<Statement> makeBody = visit(node.body);
-    return (a) => new ForIn(makeLeftHandSide(a), makeObject(a), makeBody(a));
+    return (a) => ForIn(makeLeftHandSide(a), makeObject(a), makeBody(a));
   }
 
   Instantiator<ForOf> visitForOf(ForOf node) {
     Instantiator<Expression> makeLeftHandSide = visit(node.leftHandSide);
     Instantiator<Expression> makeObject = visit(node.iterable);
     Instantiator<Statement> makeBody = visit(node.body);
-    return (a) => new ForOf(makeLeftHandSide(a), makeObject(a), makeBody(a));
+    return (a) => ForOf(makeLeftHandSide(a), makeObject(a), makeBody(a));
   }
 
   Instantiator<While> visitWhile(While node) {
     Instantiator<Expression> makeCondition = visit(node.condition);
     Instantiator<Statement> makeBody = visit(node.body);
-    return (a) => new While(makeCondition(a), makeBody(a));
+    return (a) => While(makeCondition(a), makeBody(a));
   }
 
   Instantiator<Do> visitDo(Do node) {
     Instantiator<Statement> makeBody = visit(node.body);
     Instantiator<Expression> makeCondition = visit(node.condition);
-    return (a) => new Do(makeBody(a), makeCondition(a));
+    return (a) => Do(makeBody(a), makeCondition(a));
   }
 
   Instantiator<Continue> visitContinue(Continue node) =>
-      (a) => new Continue(node.targetLabel);
+      (a) => Continue(node.targetLabel);
 
-  Instantiator<Break> visitBreak(Break node) =>
-      (a) => new Break(node.targetLabel);
+  Instantiator<Break> visitBreak(Break node) => (a) => Break(node.targetLabel);
 
   Instantiator<Statement> visitReturn(Return node) {
-    if (node.value == null) return (args) => new Return();
+    if (node.value == null) return (args) => Return();
     Instantiator<Expression> makeExpression = visit(node.value);
     return (a) => makeExpression(a).toReturn();
   }
 
   Instantiator<DartYield> visitDartYield(DartYield node) {
     Instantiator<Expression> makeExpression = visit(node.expression);
-    return (a) => new DartYield(makeExpression(a), node.hasStar);
+    return (a) => DartYield(makeExpression(a), node.hasStar);
   }
 
   Instantiator<Throw> visitThrow(Throw node) {
     Instantiator<Expression> makeExpression = visit(node.expression);
-    return (a) => new Throw(makeExpression(a));
+    return (a) => Throw(makeExpression(a));
   }
 
   Instantiator<Try> visitTry(Try node) {
     Instantiator<Block> makeBody = visit(node.body);
     Instantiator<Catch> makeCatch = visitNullable(node.catchPart);
     Instantiator<Block> makeFinally = visitNullable(node.finallyPart);
-    return (a) => new Try(makeBody(a), makeCatch(a), makeFinally(a));
+    return (a) => Try(makeBody(a), makeCatch(a), makeFinally(a));
   }
 
   Instantiator<Catch> visitCatch(Catch node) {
     Instantiator<Identifier> makeDeclaration = visit(node.declaration);
     Instantiator<Block> makeBody = visit(node.body);
-    return (a) => new Catch(makeDeclaration(a), makeBody(a));
+    return (a) => Catch(makeDeclaration(a), makeBody(a));
   }
 
   Instantiator<Switch> visitSwitch(Switch node) {
     Instantiator<Expression> makeKey = visit(node.key);
     var makeCases = node.cases.map(visitSwitchCase).toList();
-    return (a) => new Switch(makeKey(a), makeCases.map((m) => m(a)).toList());
+    return (a) => Switch(makeKey(a), makeCases.map((m) => m(a)).toList());
   }
 
   Instantiator<SwitchCase> visitSwitchCase(SwitchCase node) {
     Instantiator<Expression> makeExpression = visitNullable(node.expression);
     Instantiator<Block> makeBody = visit(node.body);
     return (arguments) {
-      return new SwitchCase(makeExpression(arguments), makeBody(arguments));
+      return SwitchCase(makeExpression(arguments), makeBody(arguments));
     };
   }
 
@@ -478,12 +476,12 @@
       FunctionDeclaration node) {
     Instantiator<Identifier> makeName = visit(node.name);
     Instantiator<Fun> makeFunction = visit(node.function);
-    return (a) => new FunctionDeclaration(makeName(a), makeFunction(a));
+    return (a) => FunctionDeclaration(makeName(a), makeFunction(a));
   }
 
   Instantiator<LabeledStatement> visitLabeledStatement(LabeledStatement node) {
     Instantiator<Statement> makeBody = visit(node.body);
-    return (a) => new LabeledStatement(node.label, makeBody(a));
+    return (a) => LabeledStatement(node.label, makeBody(a));
   }
 
   Instantiator visitLiteralStatement(LiteralStatement node) => visitNode(node);
@@ -494,7 +492,7 @@
       VariableDeclarationList node) {
     var declarationMakers =
         node.declarations.map(visitVariableInitialization).toList();
-    return (a) => new VariableDeclarationList(
+    return (a) => VariableDeclarationList(
         node.keyword, declarationMakers.map((m) => m(a)).toList());
   }
 
@@ -512,15 +510,14 @@
       VariableInitialization node) {
     Instantiator<VariableBinding> makeDeclaration = visit(node.declaration);
     Instantiator<Expression> makeValue = visitNullable(node.value);
-    return (a) => new VariableInitialization(makeDeclaration(a), makeValue(a));
+    return (a) => VariableInitialization(makeDeclaration(a), makeValue(a));
   }
 
   Instantiator<Conditional> visitConditional(Conditional cond) {
     Instantiator<Expression> makeCondition = visit(cond.condition);
     Instantiator<Expression> makeThen = visit(cond.then);
     Instantiator<Expression> makeOtherwise = visit(cond.otherwise);
-    return (a) =>
-        new Conditional(makeCondition(a), makeThen(a), makeOtherwise(a));
+    return (a) => Conditional(makeCondition(a), makeThen(a), makeOtherwise(a));
   }
 
   Instantiator<Call> visitNew(New node) => handleCallOrNew(node, true);
@@ -536,7 +533,7 @@
     return (a) {
       var target = makeTarget(a);
       var callArgs = splayNodes<Expression>(argumentMakers, a);
-      return isNew ? new New(target, callArgs) : new Call(target, callArgs);
+      return isNew ? New(target, callArgs) : Call(target, callArgs);
     };
   }
 
@@ -544,117 +541,117 @@
     Instantiator<Expression> makeLeft = visit(node.left);
     Instantiator<Expression> makeRight = visit(node.right);
     String op = node.op;
-    return (a) => new Binary(op, makeLeft(a), makeRight(a));
+    return (a) => Binary(op, makeLeft(a), makeRight(a));
   }
 
   Instantiator<Prefix> visitPrefix(Prefix node) {
     Instantiator<Expression> makeOperand = visit(node.argument);
     String op = node.op;
-    return (a) => new Prefix(op, makeOperand(a));
+    return (a) => Prefix(op, makeOperand(a));
   }
 
   Instantiator<Postfix> visitPostfix(Postfix node) {
     Instantiator<Expression> makeOperand = visit(node.argument);
     String op = node.op;
-    return (a) => new Postfix(op, makeOperand(a));
+    return (a) => Postfix(op, makeOperand(a));
   }
 
-  Instantiator<This> visitThis(This node) => (a) => new This();
-  Instantiator<Super> visitSuper(Super node) => (a) => new Super();
+  Instantiator<This> visitThis(This node) => (a) => This();
+  Instantiator<Super> visitSuper(Super node) => (a) => Super();
 
   Instantiator<Identifier> visitIdentifier(Identifier node) =>
-      (a) => new Identifier(node.name);
+      (a) => Identifier(node.name);
 
   Instantiator<Spread> visitSpread(Spread node) {
     var maker = visit(node.argument);
-    return (a) => new Spread(maker(a) as Expression);
+    return (a) => Spread(maker(a) as Expression);
   }
 
   Instantiator<Yield> visitYield(Yield node) {
     var maker = visitNullable(node.value);
-    return (a) => new Yield(maker(a) as Expression, star: node.star);
+    return (a) => Yield(maker(a) as Expression, star: node.star);
   }
 
   Instantiator<RestParameter> visitRestParameter(RestParameter node) {
     var maker = visit(node.parameter);
-    return (a) => new RestParameter(maker(a) as Identifier);
+    return (a) => RestParameter(maker(a) as Identifier);
   }
 
   Instantiator<PropertyAccess> visitAccess(PropertyAccess node) {
     Instantiator<Expression> makeReceiver = visit(node.receiver);
     Instantiator<Expression> makeSelector = visit(node.selector);
-    return (a) => new PropertyAccess(makeReceiver(a), makeSelector(a));
+    return (a) => PropertyAccess(makeReceiver(a), makeSelector(a));
   }
 
   Instantiator<NamedFunction> visitNamedFunction(NamedFunction node) {
     Instantiator<Identifier> makeDeclaration = visit(node.name);
     Instantiator<Fun> makeFunction = visit(node.function);
-    return (a) => new NamedFunction(makeDeclaration(a), makeFunction(a));
+    return (a) => NamedFunction(makeDeclaration(a), makeFunction(a));
   }
 
   Instantiator<Fun> visitFun(Fun node) {
     var paramMakers = node.params.map(visitSplayable).toList();
     Instantiator<Block> makeBody = visit(node.body);
-    return (a) => new Fun(splayNodes(paramMakers, a), makeBody(a),
+    return (a) => Fun(splayNodes(paramMakers, a), makeBody(a),
         isGenerator: node.isGenerator, asyncModifier: node.asyncModifier);
   }
 
   Instantiator<ArrowFun> visitArrowFun(ArrowFun node) {
     var paramMakers = node.params.map(visitSplayable).toList();
     Instantiator makeBody = visit(node.body as Node);
-    return (a) => new ArrowFun(splayNodes(paramMakers, a), makeBody(a));
+    return (a) => ArrowFun(splayNodes(paramMakers, a), makeBody(a));
   }
 
   Instantiator<LiteralBool> visitLiteralBool(LiteralBool node) =>
-      (a) => new LiteralBool(node.value);
+      (a) => LiteralBool(node.value);
 
   Instantiator<LiteralString> visitLiteralString(LiteralString node) =>
-      (a) => new LiteralString(node.value);
+      (a) => LiteralString(node.value);
 
   Instantiator<LiteralNumber> visitLiteralNumber(LiteralNumber node) =>
-      (a) => new LiteralNumber(node.value);
+      (a) => LiteralNumber(node.value);
 
   Instantiator<LiteralNull> visitLiteralNull(LiteralNull node) =>
-      (a) => new LiteralNull();
+      (a) => LiteralNull();
 
   Instantiator<ArrayInitializer> visitArrayInitializer(ArrayInitializer node) {
     var makers = node.elements.map(visitSplayableExpression).toList();
-    return (a) => new ArrayInitializer(splayNodes(makers, a));
+    return (a) => ArrayInitializer(splayNodes(makers, a));
   }
 
   Instantiator visitArrayHole(ArrayHole node) {
-    return (arguments) => new ArrayHole();
+    return (arguments) => ArrayHole();
   }
 
   Instantiator<ObjectInitializer> visitObjectInitializer(
       ObjectInitializer node) {
     var propertyMakers = node.properties.map(visitSplayable).toList();
-    return (a) => new ObjectInitializer(splayNodes(propertyMakers, a));
+    return (a) => ObjectInitializer(splayNodes(propertyMakers, a));
   }
 
   Instantiator<Property> visitProperty(Property node) {
     Instantiator<Expression> makeName = visit(node.name);
     Instantiator<Expression> makeValue = visit(node.value);
-    return (a) => new Property(makeName(a), makeValue(a));
+    return (a) => Property(makeName(a), makeValue(a));
   }
 
   Instantiator<RegExpLiteral> visitRegExpLiteral(RegExpLiteral node) =>
-      (a) => new RegExpLiteral(node.pattern);
+      (a) => RegExpLiteral(node.pattern);
 
   Instantiator<TemplateString> visitTemplateString(TemplateString node) {
     var makeElements = node.interpolations.map(visit).toList();
-    return (a) => new TemplateString(node.strings, splayNodes(makeElements, a));
+    return (a) => TemplateString(node.strings, splayNodes(makeElements, a));
   }
 
   Instantiator<TaggedTemplate> visitTaggedTemplate(TaggedTemplate node) {
     Instantiator<Expression> makeTag = visit(node.tag);
     var makeTemplate = visitTemplateString(node.template);
-    return (a) => new TaggedTemplate(makeTag(a), makeTemplate(a));
+    return (a) => TaggedTemplate(makeTag(a), makeTemplate(a));
   }
 
   Instantiator visitClassDeclaration(ClassDeclaration node) {
     var makeClass = visitClassExpression(node.classExpr);
-    return (a) => new ClassDeclaration(makeClass(a));
+    return (a) => ClassDeclaration(makeClass(a));
   }
 
   Instantiator<ClassExpression> visitClassExpression(ClassExpression node) {
@@ -662,73 +659,72 @@
     Instantiator<Identifier> makeName = visit(node.name);
     Instantiator<Expression> makeHeritage = visit(node.heritage);
 
-    return (a) => new ClassExpression(
+    return (a) => ClassExpression(
         makeName(a), makeHeritage(a), splayNodes(makeMethods, a));
   }
 
   Instantiator<Method> visitMethod(Method node) {
     Instantiator<Expression> makeName = visit(node.name);
     Instantiator<Fun> makeFunction = visit(node.function);
-    return (a) => new Method(makeName(a), makeFunction(a),
+    return (a) => Method(makeName(a), makeFunction(a),
         isGetter: node.isGetter,
         isSetter: node.isSetter,
         isStatic: node.isStatic);
   }
 
   Instantiator<Comment> visitComment(Comment node) =>
-      (a) => new Comment(node.comment);
+      (a) => Comment(node.comment);
 
   Instantiator<CommentExpression> visitCommentExpression(
       CommentExpression node) {
     Instantiator<Expression> makeExpr = visit(node.expression);
-    return (a) => new CommentExpression(node.comment, makeExpr(a));
+    return (a) => CommentExpression(node.comment, makeExpr(a));
   }
 
   Instantiator<Await> visitAwait(Await node) {
     Instantiator<Expression> makeExpr = visit(node.expression);
-    return (a) => new Await(makeExpr(a));
+    return (a) => Await(makeExpr(a));
   }
 
   // Note: these are not supported yet in the interpolation grammar.
-  Instantiator visitModule(Module node) => throw new UnimplementedError();
+  Instantiator visitModule(Module node) => throw UnimplementedError();
   Instantiator visitNameSpecifier(NameSpecifier node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitImportDeclaration(ImportDeclaration node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitExportDeclaration(ExportDeclaration node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitExportClause(ExportClause node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
-  Instantiator visitAnyTypeRef(AnyTypeRef node) =>
-      throw new UnimplementedError();
+  Instantiator visitAnyTypeRef(AnyTypeRef node) => throw UnimplementedError();
 
   Instantiator visitUnknownTypeRef(UnknownTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitArrayTypeRef(ArrayTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitFunctionTypeRef(FunctionTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitGenericTypeRef(GenericTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitQualifiedTypeRef(QualifiedTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitOptionalTypeRef(OptionalTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitRecordTypeRef(RecordTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   Instantiator visitUnionTypeRef(UnionTypeRef node) =>
-      throw new UnimplementedError();
+      throw UnimplementedError();
 
   @override
   Instantiator<DestructuredVariable> visitDestructuredVariable(
@@ -738,7 +734,7 @@
     Instantiator<BindingPattern> makeStructure = visitNullable(node.structure);
     Instantiator<Expression> makeDefaultValue =
         visitNullable(node.defaultValue);
-    return (a) => new DestructuredVariable(
+    return (a) => DestructuredVariable(
         name: makeName(a),
         property: makeProperty(a),
         structure: makeStructure(a),
@@ -749,18 +745,18 @@
   Instantiator<ArrayBindingPattern> visitArrayBindingPattern(
       ArrayBindingPattern node) {
     List<Instantiator> makeVars = node.variables.map(this.visit).toList();
-    return (a) => new ArrayBindingPattern(splayNodes(makeVars, a));
+    return (a) => ArrayBindingPattern(splayNodes(makeVars, a));
   }
 
   @override
   Instantiator visitObjectBindingPattern(ObjectBindingPattern node) {
     List<Instantiator> makeVars = node.variables.map(this.visit).toList();
-    return (a) => new ObjectBindingPattern(splayNodes(makeVars, a));
+    return (a) => ObjectBindingPattern(splayNodes(makeVars, a));
   }
 
   @override
   Instantiator visitSimpleBindingPattern(SimpleBindingPattern node) =>
-      (a) => new SimpleBindingPattern(new Identifier(node.name.name));
+      (a) => SimpleBindingPattern(Identifier(node.name.name));
 }
 
 /**
@@ -768,8 +764,8 @@
  * [InterpolatedNode]s, and the names of the named interpolated nodes.
  */
 class InterpolatedNodeAnalysis extends BaseVisitor {
-  final Set<Node> containsInterpolatedNode = new Set<Node>();
-  final Set<String> holeNames = new Set<String>();
+  final Set<Node> containsInterpolatedNode = Set<Node>();
+  final Set<String> holeNames = Set<String>();
   int count = 0;
 
   InterpolatedNodeAnalysis();
diff --git a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart b/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
index f0252c7..5123482 100644
--- a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
@@ -123,7 +123,7 @@
 }
 
 class ClosureTypePrinter extends _TypePrinterBase implements NodeVisitor {
-  final _buffer = new StringBuffer();
+  final _buffer = StringBuffer();
 
   @override
   void out(String s) => _buffer.write(s);
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index cd9aaf9..3b47f14 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -67,7 +67,7 @@
   Uri result = Uri.base.resolve(s);
   if (windows && result.scheme.length == 1) {
     // Assume c: or similar --- interpret as file path.
-    return new Uri.file(s, windows: true);
+    return Uri.file(s, windows: true);
   }
   return result;
 }
@@ -110,7 +110,7 @@
 Future<CompilerResult> _compile(List<String> args,
     {fe.InitializedCompilerState compilerState}) async {
   // TODO(jmesserly): refactor options to share code with dartdevc CLI.
-  var argParser = new ArgParser(allowTrailingOptions: true)
+  var argParser = ArgParser(allowTrailingOptions: true)
     ..addFlag('help',
         abbr: 'h', help: 'Display this message.', negatable: false)
     ..addOption('out', abbr: 'o', help: 'Output file (required).')
@@ -164,7 +164,7 @@
 
   if (argResults['help'] as bool || args.isEmpty) {
     print(_usageMessage(argParser));
-    return new CompilerResult.noState(true);
+    return CompilerResult.noState(true);
   }
 
   var moduleFormat = parseModuleFormatOption(argResults).first;
@@ -207,7 +207,7 @@
   // lib folder). The following [FileSystem] will resolve those references to
   // the correct location and keeps the real file location hidden from the
   // front end.
-  var fileSystem = new MultiRootFileSystem(
+  var fileSystem = MultiRootFileSystem(
       customScheme, multiRoots, StandardFileSystem.instance);
 
   var oldCompilerState = compilerState;
@@ -216,21 +216,21 @@
       stringToUri(sdkSummaryPath),
       stringToUri(packageFile),
       summaryUris,
-      new DevCompilerTarget(),
+      DevCompilerTarget(),
       fileSystem: fileSystem);
   fe.DdcResult result = await fe.compile(compilerState, inputs, errorHandler);
   if (result == null || !succeeded) {
-    return new CompilerResult(compilerState, false);
+    return CompilerResult(compilerState, false);
   }
 
   var component = result.component;
   var emitMetadata = argResults['emit-metadata'] as bool;
   if (!emitMetadata && _checkForDartMirrorsImport(component)) {
-    return new CompilerResult(compilerState, false);
+    return CompilerResult(compilerState, false);
   }
 
   String output = argResults['out'];
-  var file = new File(output);
+  var file = File(output);
   await file.parent.create(recursive: true);
 
   // Output files can be written in parallel, so collect the futures.
@@ -245,17 +245,17 @@
     if (identical(compilerState, oldCompilerState)) {
       component.unbindCanonicalNames();
     }
-    var sink = new File(path.withoutExtension(output) + '.dill').openWrite();
-    new kernel.BinaryPrinter(sink).writeComponentFile(component);
+    var sink = File(path.withoutExtension(output) + '.dill').openWrite();
+    kernel.BinaryPrinter(sink).writeComponentFile(component);
     outFiles.add(sink.flush().then((_) => sink.close()));
   }
   if (argResults['summarize-text'] as bool) {
-    var sink = new File(output + '.txt').openWrite();
-    new kernel.Printer(sink, showExternal: false).writeComponentFile(component);
+    var sink = File(output + '.txt').openWrite();
+    kernel.Printer(sink, showExternal: false).writeComponentFile(component);
     outFiles.add(sink.flush().then((_) => sink.close()));
   }
 
-  var compiler = new ProgramCompiler(component,
+  var compiler = ProgramCompiler(component,
       declaredVariables: declaredVariables,
       emitMetadata: emitMetadata,
       enableAsserts: argResults['enable-asserts'] as bool);
@@ -271,11 +271,11 @@
   outFiles.add(file.writeAsString(jsCode.code));
   if (jsCode.sourceMap != null) {
     outFiles.add(
-        new File(output + '.map').writeAsString(json.encode(jsCode.sourceMap)));
+        File(output + '.map').writeAsString(json.encode(jsCode.sourceMap)));
   }
 
   await Future.wait(outFiles);
-  return new CompilerResult(compilerState, true);
+  return CompilerResult(compilerState, true);
 }
 
 /// The output of compiling a JavaScript module in a particular format.
@@ -297,25 +297,24 @@
 }
 
 JSCode jsProgramToCode(JS.Program moduleTree, ModuleFormat format,
-    {bool buildSourceMap: false,
+    {bool buildSourceMap = false,
     String jsUrl,
     String mapUrl,
     String customScheme}) {
-  var opts = new JS.JavaScriptPrintingOptions(
+  var opts = JS.JavaScriptPrintingOptions(
       allowKeywordsInProperties: true, allowSingleLineIfStatements: true);
   JS.SimpleJavaScriptPrintingContext printer;
   SourceMapBuilder sourceMap;
   if (buildSourceMap) {
-    var sourceMapContext = new SourceMapPrintingContext();
+    var sourceMapContext = SourceMapPrintingContext();
     sourceMap = sourceMapContext.sourceMap;
     printer = sourceMapContext;
   } else {
-    printer = new JS.SimpleJavaScriptPrintingContext();
+    printer = JS.SimpleJavaScriptPrintingContext();
   }
 
   var tree = transformModuleFormat(format, moduleTree);
-  tree.accept(
-      new JS.Printer(opts, printer, localNamer: new JS.TemporaryNamer(tree)));
+  tree.accept(JS.Printer(opts, printer, localNamer: JS.TemporaryNamer(tree)));
 
   Map builtMap;
   if (buildSourceMap && sourceMap != null) {
@@ -332,7 +331,7 @@
 
   var text = printer.getText();
 
-  return new JSCode(text, builtMap);
+  return JSCode(text, builtMap);
 }
 
 /// This was copied from module_compiler.dart.
@@ -343,7 +342,7 @@
 // TODO(sigmund): delete bazelMappings - customScheme should be used instead.
 Map placeSourceMap(Map sourceMap, String sourceMapPath,
     Map<String, String> bazelMappings, String customScheme) {
-  var map = new Map.from(sourceMap);
+  var map = Map.from(sourceMap);
   // Convert to a local file path if it's not.
   sourceMapPath = path.fromUri(_sourceToUri(sourceMapPath, customScheme));
   var sourceMapDir = path.dirname(path.absolute(sourceMapPath));
@@ -394,7 +393,7 @@
   }
   // Assume a file path.
   // TODO(jmesserly): shouldn't this be `path.toUri(path.absolute)`?
-  return new Uri.file(path.absolute(source));
+  return Uri.file(path.absolute(source));
 }
 
 /// Parses Dart's non-standard `-Dname=value` syntax for declared variables,
@@ -408,7 +407,7 @@
       var eq = rest.indexOf('=');
       if (eq <= 0) {
         var kind = eq == 0 ? 'name' : 'value';
-        throw new FormatException('no $kind given to -D option `$arg`');
+        throw FormatException('no $kind given to -D option `$arg`');
       }
       var name = rest.substring(0, eq);
       var value = rest.substring(eq + 1);
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 6a21ffb..3d6f202 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -42,17 +42,17 @@
   ///
   /// We sometimes special case codegen for a single library, as it simplifies
   /// name scoping requirements.
-  final _libraries = new Map<Library, JS.Identifier>.identity();
+  final _libraries = Map<Library, JS.Identifier>.identity();
 
   /// Maps a library URI import, that is not in [_libraries], to the
   /// corresponding Kernel summary module we imported it with.
-  final _importToSummary = new Map<Library, Component>.identity();
+  final _importToSummary = Map<Library, Component>.identity();
 
   /// Maps a summary to the file URI we used to load it from disk.
-  final _summaryToUri = new Map<Component, Uri>.identity();
+  final _summaryToUri = Map<Component, Uri>.identity();
 
   /// Imported libraries, and the temporaries used to refer to them.
-  final _imports = new Map<Library, JS.TemporaryId>();
+  final _imports = Map<Library, JS.TemporaryId>();
 
   /// The variable for the current catch clause
   VariableDeclaration _catchParameter;
@@ -61,7 +61,7 @@
   JS.TemporaryId _asyncStarController;
 
   JS.Identifier _extensionSymbolsModule;
-  final _extensionSymbols = new Map<String, JS.TemporaryId>();
+  final _extensionSymbols = Map<String, JS.TemporaryId>();
 
   Set<Class> _pendingClasses;
 
@@ -119,13 +119,13 @@
 
   /// Information about virtual fields for all libraries in the current build
   /// unit.
-  final virtualFields = new VirtualFieldModel();
+  final virtualFields = VirtualFieldModel();
 
   final JSTypeRep _typeRep;
 
   bool _superAllowed = true;
 
-  final _superHelpers = new Map<String, JS.Method>();
+  final _superHelpers = Map<String, JS.Method>();
 
   final bool emitMetadata;
   final bool enableAsserts;
@@ -171,14 +171,14 @@
   /// statement that is not a loop body is the outermost non-labeled statement
   /// that it encloses.  A [BreakStatement] targeting this statement can be
   /// compiled to `break` either with or without a label.
-  final _effectiveTargets = new HashMap<LabeledStatement, Statement>.identity();
+  final _effectiveTargets = HashMap<LabeledStatement, Statement>.identity();
 
   /// A map from effective targets to their label names.
   ///
   /// If the target needs to be labeled when compiled to JS, because it was
   /// targeted by a break or continue with a label, then this map contains the
   /// label name that was assigned to it.
-  final _labelNames = new HashMap<Statement, String>.identity();
+  final _labelNames = HashMap<Statement, String>.identity();
 
   final Class _jsArrayClass;
   final Class privateSymbolClass;
@@ -187,6 +187,7 @@
   final Class linkedHashSetImplClass;
   final Class identityHashSetImplClass;
   final Class syncIterableClass;
+  final Class asyncStarImplClass;
 
   /// The dart:async `StreamIterator<T>` type.
   final Class _asyncStreamIteratorClass;
@@ -196,18 +197,18 @@
   final NullableInference _nullableInference;
 
   factory ProgramCompiler(Component component,
-      {bool emitMetadata: false,
-      bool replCompile: false,
-      bool enableAsserts: true,
-      Map<String, String> declaredVariables: const {}}) {
-    var coreTypes = new CoreTypes(component);
-    var types = new TypeSchemaEnvironment(
-        coreTypes, new ClassHierarchy(component), true);
-    var constants = new DevCompilerConstants(types, declaredVariables);
-    var nativeTypes = new NativeTypeSet(coreTypes, constants);
-    var jsTypeRep = new JSTypeRep(types);
-    return new ProgramCompiler._(coreTypes, coreTypes.index, nativeTypes,
-        constants, types, jsTypeRep, new NullableInference(jsTypeRep),
+      {bool emitMetadata = false,
+      bool replCompile = false,
+      bool enableAsserts = true,
+      Map<String, String> declaredVariables = const {}}) {
+    var coreTypes = CoreTypes(component);
+    var types =
+        TypeSchemaEnvironment(coreTypes, ClassHierarchy(component), true);
+    var constants = DevCompilerConstants(types, declaredVariables);
+    var nativeTypes = NativeTypeSet(coreTypes, constants);
+    var jsTypeRep = JSTypeRep(types);
+    return ProgramCompiler._(coreTypes, coreTypes.index, nativeTypes, constants,
+        types, jsTypeRep, NullableInference(jsTypeRep),
         emitMetadata: emitMetadata,
         enableAsserts: enableAsserts,
         replCompile: replCompile);
@@ -226,7 +227,8 @@
         linkedHashSetImplClass = sdk.getClass('dart:collection', '_HashSet'),
         identityHashSetImplClass =
             sdk.getClass('dart:collection', '_IdentityHashSet'),
-        syncIterableClass = sdk.getClass('dart:_js_helper', 'SyncIterable');
+        syncIterableClass = sdk.getClass('dart:_js_helper', 'SyncIterable'),
+        asyncStarImplClass = sdk.getClass('dart:async', '_AsyncStarImpl');
 
   ClassHierarchy get hierarchy => types.hierarchy;
 
@@ -235,7 +237,7 @@
   JS.Program emitModule(
       Component buildUnit, List<Component> summaries, List<Uri> summaryUris) {
     if (moduleItems.isNotEmpty) {
-      throw new StateError('Can only call emitModule once.');
+      throw StateError('Can only call emitModule once.');
     }
     _component = buildUnit;
 
@@ -255,33 +257,33 @@
     if (ddcRuntime != null) {
       // Don't allow these to be renamed when we're building the SDK.
       // There is JS code in dart:* that depends on their names.
-      runtimeModule = new JS.Identifier('dart');
-      _extensionSymbolsModule = new JS.Identifier('dartx');
+      runtimeModule = JS.Identifier('dart');
+      _extensionSymbolsModule = JS.Identifier('dartx');
       _nullableInference.allowNotNullDeclarations = true;
     } else {
       // Otherwise allow these to be renamed so users can write them.
-      runtimeModule = new JS.TemporaryId('dart');
-      _extensionSymbolsModule = new JS.TemporaryId('dartx');
+      runtimeModule = JS.TemporaryId('dart');
+      _extensionSymbolsModule = JS.TemporaryId('dartx');
     }
-    _typeTable = new TypeTable(runtimeModule);
+    _typeTable = TypeTable(runtimeModule);
 
     // Initialize our library variables.
     var items = <JS.ModuleItem>[];
     var exports = <JS.NameSpecifier>[];
     // TODO(jmesserly): this is a performance optimization for V8 to prevent it
     // from treating our Dart library objects as JS Maps.
-    var root = new JS.Identifier('_root');
+    var root = JS.Identifier('_root');
     items.add(js.statement('const # = Object.create(null)', [root]));
 
     void emitLibrary(JS.Identifier id) {
       items.add(js.statement('const # = Object.create(#)', [id, root]));
-      exports.add(new JS.NameSpecifier(id));
+      exports.add(JS.NameSpecifier(id));
     }
 
     for (var library in libraries) {
       var libraryTemp = library == ddcRuntime
           ? runtimeModule
-          : new JS.TemporaryId(jsLibraryName(library));
+          : JS.TemporaryId(jsLibraryName(library));
       _libraries[library] = libraryTemp;
       emitLibrary(libraryTemp);
     }
@@ -290,11 +292,11 @@
     // TODO(jmesserly): find a cleaner design for this.
     if (ddcRuntime != null) emitLibrary(_extensionSymbolsModule);
 
-    items.add(new JS.ExportDeclaration(new JS.ExportClause(exports)));
+    items.add(JS.ExportDeclaration(JS.ExportClause(exports)));
 
     // Collect all class/type Element -> Node mappings
     // in case we need to forward declare any classes.
-    _pendingClasses = new HashSet.identity();
+    _pendingClasses = HashSet.identity();
     for (var l in libraries) {
       _pendingClasses.addAll(l.classes);
     }
@@ -317,7 +319,7 @@
     // Initialize extension symbols
     _extensionSymbols.forEach((name, id) {
       JS.Expression value =
-          new JS.PropertyAccess(_extensionSymbolsModule, _propertyName(name));
+          JS.PropertyAccess(_extensionSymbolsModule, _propertyName(name));
       if (ddcRuntime != null) {
         value = js.call('# = Symbol(#)', [value, js.string("dartx.$name")]);
       }
@@ -332,7 +334,7 @@
     _copyAndFlattenBlocks(items, moduleItems);
 
     // Build the module.
-    return new JS.Program(items, name: buildUnit.root.name);
+    return JS.Program(items, name: buildUnit.root.name);
   }
 
   /// Flattens blocks in [items] to a single list.
@@ -354,7 +356,7 @@
     // It's either one of the libraries in this module, or it's an import.
     return _libraries[library] ??
         _imports.putIfAbsent(
-            library, () => new JS.TemporaryId(jsLibraryName(library)));
+            library, () => JS.TemporaryId(jsLibraryName(library)));
   }
 
   String _libraryToModule(Library library) {
@@ -379,7 +381,7 @@
   }
 
   void _finishImports(List<JS.ModuleItem> items) {
-    var modules = new Map<String, List<Library>>();
+    var modules = Map<String, List<Library>>();
 
     for (var import in _imports.keys) {
       modules.putIfAbsent(_libraryToModule(import), () => []).add(import);
@@ -400,13 +402,13 @@
       //     import {foo as foo$} from 'foo'; // if rename was needed
       //
       var imports =
-          libraries.map((l) => new JS.NameSpecifier(_imports[l])).toList();
+          libraries.map((l) => JS.NameSpecifier(_imports[l])).toList();
       if (module == coreModuleName) {
-        imports.add(new JS.NameSpecifier(runtimeModule));
-        imports.add(new JS.NameSpecifier(_extensionSymbolsModule));
+        imports.add(JS.NameSpecifier(runtimeModule));
+        imports.add(JS.NameSpecifier(_extensionSymbolsModule));
       }
 
-      items.add(new JS.ImportDeclaration(
+      items.add(JS.ImportDeclaration(
           namedImports: imports, from: js.string(module, "'")));
     });
   }
@@ -529,13 +531,13 @@
     // https://github.com/dart-lang/sdk/issues/31003
     var className = c.typeParameters.isNotEmpty
         ? (c == _jsArrayClass
-            ? new JS.Identifier(c.name)
-            : new JS.TemporaryId(getLocalClassName(c)))
+            ? JS.Identifier(c.name)
+            : JS.TemporaryId(getLocalClassName(c)))
         : _emitTopLevelName(c);
 
     var savedClassProperties = _classProperties;
     _classProperties =
-        new ClassPropertyModel.build(types, _extensionTypes, virtualFields, c);
+        ClassPropertyModel.build(types, _extensionTypes, virtualFields, c);
 
     var jsCtors = _defineConstructors(c, className);
     var jsMethods = _emitClassMethods(c);
@@ -595,7 +597,7 @@
       jsFormals,
       _typeTable.discharge(formals),
       body,
-      className ?? new JS.Identifier(name)
+      className ?? JS.Identifier(name)
     ]);
 
     var genericArgs = [typeConstructor];
@@ -613,12 +615,11 @@
   JS.Statement _emitClassStatement(Class c, JS.Expression className,
       JS.Expression heritage, List<JS.Method> methods) {
     if (c.typeParameters.isNotEmpty) {
-      return new JS.ClassExpression(
-              className as JS.Identifier, heritage, methods)
+      return JS.ClassExpression(className as JS.Identifier, heritage, methods)
           .toStatement();
     }
-    var classExpr = new JS.ClassExpression(
-        new JS.TemporaryId(getLocalClassName(c)), heritage, methods);
+    var classExpr = JS.ClassExpression(
+        JS.TemporaryId(getLocalClassName(c)), heritage, methods);
     return js.statement('# = #;', [className, classExpr]);
   }
 
@@ -638,7 +639,7 @@
     }
 
     bool shouldDefer(InterfaceType t) {
-      var visited = new Set<DartType>();
+      var visited = Set<DartType>();
       bool defer(DartType t) {
         if (t is InterfaceType) {
           var tc = t.classNode;
@@ -717,7 +718,7 @@
           ctorBody.add(_emitSuperConstructorCall(className, name, jsParams));
         }
         body.add(_addConstructorToClass(
-            className, name, new JS.Fun(jsParams, new JS.Block(ctorBody))));
+            className, name, JS.Fun(jsParams, JS.Block(ctorBody))));
       }
     }
 
@@ -760,8 +761,8 @@
         //     mixinMembers(C, class C$ extends M { <methods>  });
         mixinBody.add(runtimeStatement('mixinMembers(#, #)', [
           classExpr,
-          new JS.ClassExpression(
-              new JS.TemporaryId(getLocalClassName(c)), mixinClass, methods)
+          JS.ClassExpression(
+              JS.TemporaryId(getLocalClassName(c)), mixinClass, methods)
         ]));
       }
 
@@ -779,14 +780,14 @@
       var m = mixins[i];
       var mixinName =
           getLocalClassName(superclass) + '_' + getLocalClassName(m.classNode);
-      var mixinId = new JS.TemporaryId(mixinName + '\$');
+      var mixinId = JS.TemporaryId(mixinName + '\$');
       // Bind the mixin class to a name to workaround a V8 bug with es6 classes
       // and anonymous function names.
       // TODO(leafp:) Eliminate this once the bug is fixed:
       // https://bugs.chromium.org/p/v8/issues/detail?id=7069
       body.add(js.statement("const # = #", [
         mixinId,
-        new JS.ClassExpression(new JS.TemporaryId(mixinName), baseClass, [])
+        JS.ClassExpression(JS.TemporaryId(mixinName), baseClass, [])
       ]));
 
       emitMixinConstructors(mixinId, m);
@@ -997,10 +998,10 @@
     }
     if (c.enclosingLibrary == coreTypes.asyncLibrary) {
       if (c == coreTypes.futureOrClass) {
-        var typeParam = new TypeParameterType(c.typeParameters[0]);
+        var typeParam = TypeParameterType(c.typeParameters[0]);
         var typeT = visitTypeParameterType(typeParam);
         var futureOfT = visitInterfaceType(
-            new InterfaceType(coreTypes.futureClass, [typeParam]));
+            InterfaceType(coreTypes.futureClass, [typeParam]));
         body.add(js.statement('''
             #.is = function is_FutureOr(o) {
               return #.is(o) || #.is(o);
@@ -1034,7 +1035,7 @@
     if (isClassSymbol == null) {
       // TODO(jmesserly): we could export these symbols, if we want to mark
       // implemented interfaces for user-defined classes.
-      var id = new JS.TemporaryId("_is_${getLocalClassName(c)}_default");
+      var id = JS.TemporaryId("_is_${getLocalClassName(c)}_default");
       moduleItems.add(
           js.statement('const # = Symbol(#);', [id, js.string(id.name, "'")]));
       isClassSymbol = id;
@@ -1098,8 +1099,8 @@
       body.add(js.statement('#[#.metadata] = #;', [
         className,
         runtimeModule,
-        _arrowFunctionWithLetScope(() => new JS.ArrayInitializer(
-            metadata.map(_instantiateAnnotation).toList()))
+        _arrowFunctionWithLetScope(() =>
+            JS.ArrayInitializer(metadata.map(_instantiateAnnotation).toList()))
       ]));
     }
   }
@@ -1129,7 +1130,7 @@
         runtimeModule,
         helperName,
         className,
-        new JS.ArrayInitializer(names, multiline: names.length > 4)
+        JS.ArrayInitializer(names, multiline: names.length > 4)
       ]));
     }
 
@@ -1159,11 +1160,11 @@
         var proto = c == coreTypes.objectClass
             ? js.call('Object.create(null)')
             : runtimeCall('get${name}s(#.__proto__)', [className]);
-        elements.insert(0, new JS.Property(_propertyName('__proto__'), proto));
+        elements.insert(0, JS.Property(_propertyName('__proto__'), proto));
       }
       body.add(runtimeStatement('set${name}Signature(#, () => #)', [
         className,
-        new JS.ObjectInitializer(elements, multiline: elements.length > 1)
+        JS.ObjectInitializer(elements, multiline: elements.length > 1)
       ]));
     }
 
@@ -1229,12 +1230,12 @@
         } else {
           type = _emitAnnotatedFunctionType(reifiedType, member);
         }
-        var property = new JS.Property(_declareMemberName(member), type);
+        var property = JS.Property(_declareMemberName(member), type);
         var signatures = getSignatureList(member);
         signatures.add(property);
         if (!member.isStatic &&
             (extMethods.contains(name) || extAccessors.contains(name))) {
-          signatures.add(new JS.Property(
+          signatures.add(JS.Property(
               _declareMemberName(member, useExtension: true), type));
         }
       }
@@ -1259,20 +1260,20 @@
       var memberName = _declareMemberName(field);
       var fieldSig = _emitFieldSignature(field, c);
       (isStatic ? staticFields : instanceFields)
-          .add(new JS.Property(memberName, fieldSig));
+          .add(JS.Property(memberName, fieldSig));
     }
     emitSignature('Field', instanceFields);
     emitSignature('StaticField', staticFields);
 
     if (emitMetadata) {
       var constructors = <JS.Property>[];
-      var allConstructors = new List<Member>.from(c.constructors)
+      var allConstructors = List<Member>.from(c.constructors)
         ..addAll(c.procedures.where((p) => p.isFactory));
       for (var ctor in allConstructors) {
         var memberName = _constructorName(ctor.name.name);
         var type = _emitAnnotatedFunctionType(
             ctor.function.functionType.withoutTypeParameters, ctor);
-        constructors.add(new JS.Property(memberName, type));
+        constructors.add(JS.Property(memberName, type));
       }
       emitSignature('Constructor', constructors);
     }
@@ -1294,7 +1295,7 @@
     if (emitMetadata && annotations != null && annotations.isNotEmpty) {
       var savedUri = _currentUri;
       _currentUri = field.enclosingClass.fileUri;
-      args.add(new JS.ArrayInitializer(
+      args.add(JS.ArrayInitializer(
           annotations.map(_instantiateAnnotation).toList()));
       _currentUri = savedUri;
     }
@@ -1315,11 +1316,11 @@
       reifyParameter(VariableDeclaration p) =>
           isCovariant(p) ? coreTypes.objectClass.thisType : p.type;
       reifyNamedParameter(VariableDeclaration p) =>
-          new NamedType(p.name, reifyParameter(p));
+          NamedType(p.name, reifyParameter(p));
 
       // TODO(jmesserly): do covariant type parameter bounds also need to be
       // reified as `Object`?
-      result = new FunctionType(
+      result = FunctionType(
           f.positionalParameters.map(reifyParameter).toList(), f.returnType,
           namedParameters: f.namedParameters.map(reifyNamedParameter).toList()
             ..sort(),
@@ -1332,8 +1333,8 @@
 
   DartType _getTypeFromClass(DartType type, Class superclass, Class subclass) {
     if (identical(superclass, subclass)) return type;
-    return Substitution
-        .fromSupertype(hierarchy.getClassAsInstanceOf(subclass, superclass))
+    return Substitution.fromSupertype(
+            hierarchy.getClassAsInstanceOf(subclass, superclass))
         .substituteType(type);
   }
 
@@ -1351,7 +1352,7 @@
     _currentUri = savedUri;
     end ??= _nodeEnd(node.enclosingClass.fileEndOffset);
 
-    return new JS.Fun(params, new JS.Block(body))..sourceInformation = end;
+    return JS.Fun(params, JS.Block(body))..sourceInformation = end;
   }
 
   List<JS.Statement> _emitConstructorBody(
@@ -1517,7 +1518,7 @@
       Expression init, List<Expression> annotations) {
     // explicitly initialize to null, to avoid getting `undefined`.
     // TODO(jmesserly): do this only for vars that aren't definitely assigned.
-    if (init == null) return new JS.LiteralNull();
+    if (init == null) return JS.LiteralNull();
     return _annotatedNullCheck(annotations)
         ? notNull(init)
         : _visitExpression(init);
@@ -1564,8 +1565,8 @@
     if (c == coreTypes.objectClass) {
       // Dart does not use ES6 constructors.
       // Add an error to catch any invalid usage.
-      jsMethods.add(
-          new JS.Method(_propertyName('constructor'), js.fun(r'''function() {
+      jsMethods
+          .add(JS.Method(_propertyName('constructor'), js.fun(r'''function() {
                   throw Error("use `new " + #.typeName(#.getReifiedType(this)) +
                       ".new(...)` to create a Dart object");
               }''', [runtimeModule, runtimeModule])));
@@ -1582,8 +1583,8 @@
       }
     }
 
-    var getters = new Map<String, Procedure>();
-    var setters = new Map<String, Procedure>();
+    var getters = Map<String, Procedure>();
+    var setters = Map<String, Procedure>();
     for (var m in c.procedures) {
       if (m.isAbstract) continue;
       if (m.isGetter) {
@@ -1672,7 +1673,7 @@
       fn = _emitFunction(member.function, member.name.name);
     }
 
-    return new JS.Method(_declareMemberName(member), fn,
+    return JS.Method(_declareMemberName(member), fn,
         isGetter: member.isGetter,
         isSetter: member.isSetter,
         isStatic: member.isStatic)
@@ -1682,11 +1683,10 @@
   JS.Fun _emitNativeFunctionBody(Procedure node) {
     String name = getAnnotationName(node, isJSAnnotation) ?? node.name.name;
     if (node.isGetter) {
-      return new JS.Fun([], js.block('{ return this.#; }', [name]));
+      return JS.Fun([], js.block('{ return this.#; }', [name]));
     } else if (node.isSetter) {
       var params = _emitParameters(node.function);
-      return new JS.Fun(
-          params, js.block('{ this.# = #; }', [name, params.last]));
+      return JS.Fun(params, js.block('{ this.# = #; }', [name, params.last]));
     } else {
       return js.fun(
           'function (...args) { return this.#.apply(this, args); }', name);
@@ -1722,12 +1722,12 @@
       var setterType = substituteType(superMember.setterType);
       if (types.isTop(setterType)) return const [];
       return [
-        new JS.Method(
+        JS.Method(
             name,
             js.fun('function(x) { return super.# = #; }',
-                [name, _emitImplicitCast(new JS.Identifier('x'), setterType)]),
+                [name, _emitImplicitCast(JS.Identifier('x'), setterType)]),
             isSetter: true),
-        new JS.Method(name, js.fun('function() { return super.#; }', [name]),
+        JS.Method(name, js.fun('function() { return super.#; }', [name]),
             isGetter: true)
       ];
     }
@@ -1742,11 +1742,11 @@
     _emitCovarianceBoundsCheck(typeParameters, body);
 
     var typeFormals = _emitTypeFormals(typeParameters);
-    var jsParams = new List<JS.Parameter>.from(typeFormals);
+    var jsParams = List<JS.Parameter>.from(typeFormals);
     var positionalParameters = function.positionalParameters;
     for (var i = 0, n = positionalParameters.length; i < n; i++) {
       var param = positionalParameters[i];
-      var jsParam = new JS.Identifier(param.name);
+      var jsParam = JS.Identifier(param.name);
       jsParams.add(jsParam);
 
       if (isCovariant(param) &&
@@ -1772,7 +1772,7 @@
           name,
           namedArgumentTemp,
           _emitImplicitCast(
-              new JS.PropertyAccess(namedArgumentTemp, name), paramType.type)
+              JS.PropertyAccess(namedArgumentTemp, name), paramType.type)
         ]));
       }
     }
@@ -1781,7 +1781,7 @@
 
     if (namedParameters.isNotEmpty) jsParams.add(namedArgumentTemp);
     body.add(js.statement('return super.#(#);', [name, jsParams]));
-    return [new JS.Method(name, new JS.Fun(jsParams, new JS.Block(body)))];
+    return [JS.Method(name, JS.Fun(jsParams, JS.Block(body)))];
   }
 
   /// Emits a Dart factory constructor to a JS static method.
@@ -1789,8 +1789,8 @@
     if (isUnsupportedFactoryConstructor(node)) return null;
 
     var function = node.function;
-    return new JS.Method(_constructorName(node.name.name),
-        new JS.Fun(_emitParameters(function), _emitFunctionBody(function)),
+    return JS.Method(_constructorName(node.name.name),
+        JS.Fun(_emitParameters(function), _emitFunctionBody(function)),
         isStatic: true)
       ..sourceInformation = _nodeEnd(node.fileEndOffset);
   }
@@ -1812,19 +1812,18 @@
     var name = _declareMemberName(field);
 
     var getter = js.fun('function() { return this[#]; }', [virtualField]);
-    var jsGetter = new JS.Method(name, getter, isGetter: true)
+    var jsGetter = JS.Method(name, getter, isGetter: true)
       ..sourceInformation = _nodeStart(field);
 
-    var args =
-        field.isFinal ? [new JS.Super(), name] : [new JS.This(), virtualField];
+    var args = field.isFinal ? [JS.Super(), name] : [JS.This(), virtualField];
 
-    JS.Expression value = new JS.Identifier('value');
+    JS.Expression value = JS.Identifier('value');
     if (!field.isFinal && field.isGenericCovariantImpl) {
       value = _emitImplicitCast(value, field.type);
     }
     args.add(value);
 
-    var jsSetter = new JS.Method(
+    var jsSetter = JS.Method(
         name, js.fun('function(value) { #[#] = #; }', args),
         isSetter: true)
       ..sourceInformation = _nodeStart(field);
@@ -1846,15 +1845,15 @@
 
     var name = getAnnotationName(field, isJSName) ?? field.name.name;
     // Generate getter
-    var fn = new JS.Fun([], js.block('{ return this.#; }', [name]));
-    var method = new JS.Method(_declareMemberName(field), fn, isGetter: true);
+    var fn = JS.Fun([], js.block('{ return this.#; }', [name]));
+    var method = JS.Method(_declareMemberName(field), fn, isGetter: true);
     jsMethods.add(method);
 
     // Generate setter
     if (!field.isFinal) {
-      var value = new JS.TemporaryId('value');
-      fn = new JS.Fun([value], js.block('{ this.# = #; }', [name, value]));
-      method = new JS.Method(_declareMemberName(field), fn, isSetter: true);
+      var value = JS.TemporaryId('value');
+      fn = JS.Fun([value], js.block('{ this.# = #; }', [name, value]));
+      method = JS.Method(_declareMemberName(field), fn, isSetter: true);
       jsMethods.add(method);
     }
 
@@ -1876,7 +1875,7 @@
           _classProperties.inheritedSetters.contains(name)) {
         // Generate a setter that forwards to super.
         var fn = js.fun('function(value) { super[#] = value; }', [memberName]);
-        return new JS.Method(memberName, fn, isSetter: true);
+        return JS.Method(memberName, fn, isSetter: true);
       }
     } else {
       assert(method.isSetter);
@@ -1884,7 +1883,7 @@
           _classProperties.inheritedGetters.contains(name)) {
         // Generate a getter that forwards to super.
         var fn = js.fun('function() { return super[#]; }', [memberName]);
-        return new JS.Method(memberName, fn, isGetter: true);
+        return JS.Method(memberName, fn, isGetter: true);
       }
     }
     return null;
@@ -1905,8 +1904,7 @@
     // If a parent had an `iterator` (concrete or abstract) or implements
     // Iterable, we know the adapter is already there, so we can skip it as a
     // simple code size optimization.
-    var parent =
-        hierarchy.getDispatchTarget(c.superclass, new Name('iterator'));
+    var parent = hierarchy.getDispatchTarget(c.superclass, Name('iterator'));
     if (parent != null) return null;
 
     var parentIterable =
@@ -1920,7 +1918,7 @@
 
     // Otherwise, emit the adapter method, which wraps the Dart iterator in
     // an ES6 iterator.
-    return new JS.Method(
+    return JS.Method(
         js.call('Symbol.iterator'),
         js.call('function() { return new #.JsIterator(this.#); }', [
           runtimeModule,
@@ -2001,16 +1999,16 @@
     for (var field in fields) {
       _currentUri = field.fileUri;
       var access = emitFieldName(field);
-      accessors.add(new JS.Method(access, _emitStaticFieldInitializer(field),
-          isGetter: true)
-        ..sourceInformation = _hoverComment(
-            new JS.PropertyAccess(objExpr, access),
-            field.fileOffset,
-            field.name.name.length));
+      accessors.add(
+          JS.Method(access, _emitStaticFieldInitializer(field), isGetter: true)
+            ..sourceInformation = _hoverComment(
+                JS.PropertyAccess(objExpr, access),
+                field.fileOffset,
+                field.name.name.length));
 
       // TODO(jmesserly): currently uses a dummy setter to indicate writable.
       if (!field.isFinal && !field.isConst) {
-        accessors.add(new JS.Method(access, js.call('function(_) {}') as JS.Fun,
+        accessors.add(JS.Method(access, js.call('function(_) {}') as JS.Fun,
             isSetter: true));
       }
     }
@@ -2021,11 +2019,10 @@
   }
 
   JS.Fun _emitStaticFieldInitializer(Field field) {
-    return new JS.Fun(
+    return JS.Fun(
         [],
-        new JS.Block(_withLetScope(() => [
-              new JS.Return(
-                  _visitInitializer(field.initializer, field.annotations))
+        JS.Block(_withLetScope(() => [
+              JS.Return(_visitInitializer(field.initializer, field.annotations))
             ])));
   }
 
@@ -2049,11 +2046,11 @@
     var letVars = _initLetVariables();
 
     _letVariables = savedLetVariables;
-    return new JS.ArrowFun(
-        [], letVars == null ? expr : new JS.Block([letVars, expr.toReturn()]));
+    return JS.ArrowFun(
+        [], letVars == null ? expr : JS.Block([letVars, expr.toReturn()]));
   }
 
-  JS.PropertyAccess _emitTopLevelName(NamedNode n, {String suffix: ''}) {
+  JS.PropertyAccess _emitTopLevelName(NamedNode n, {String suffix = ''}) {
     return _emitJSInterop(n) ?? _emitTopLevelNameNoInterop(n, suffix: suffix);
   }
 
@@ -2110,7 +2107,7 @@
   /// helper, that checks for null. The user defined method is called '=='.
   ///
   JS.Expression _emitMemberName(String name,
-      {bool isStatic: false,
+      {bool isStatic = false,
       bool useExtension,
       Member member,
       Class memberClass}) {
@@ -2128,9 +2125,9 @@
         var parts = runtimeName.split('.');
         if (parts.length < 2) return _propertyName(runtimeName);
 
-        JS.Expression result = new JS.Identifier(parts[0]);
+        JS.Expression result = JS.Identifier(parts[0]);
         for (int i = 1; i < parts.length; i++) {
-          result = new JS.PropertyAccess(result, _propertyName(parts[i]));
+          result = JS.PropertyAccess(result, _propertyName(parts[i]));
         }
         return result;
       }
@@ -2159,7 +2156,7 @@
   JS.TemporaryId _getExtensionSymbolInternal(String name) {
     return _extensionSymbols.putIfAbsent(
         name,
-        () => new JS.TemporaryId(
+        () => JS.TemporaryId(
             '\$${JS.friendlyNameForDartOperator[name] ?? name}'));
   }
 
@@ -2195,7 +2192,7 @@
     return _extensionTypes.isNativeInterface(c);
   }
 
-  var _forwardingCache = new HashMap<Class, Map<String, Member>>();
+  var _forwardingCache = HashMap<Class, Map<String, Member>>();
 
   Member _lookupForwardedMember(Class c, String name) {
     // We only care about public methods.
@@ -2206,8 +2203,8 @@
     return map.putIfAbsent(
         name,
         () =>
-            hierarchy.getDispatchTarget(c, new Name(name)) ??
-            hierarchy.getDispatchTarget(c, new Name(name), setter: true));
+            hierarchy.getDispatchTarget(c, Name(name)) ??
+            hierarchy.getDispatchTarget(c, Name(name), setter: true));
   }
 
   JS.Expression _emitStaticMemberName(String name, [NamedNode member]) {
@@ -2247,7 +2244,7 @@
     var name = getAnnotationName(n, isPublicJSAnnotation);
     if (name != null) {
       if (name.contains('.')) {
-        throw new UnsupportedError(
+        throw UnsupportedError(
             'static members do not support "." in their names. '
             'See https://github.com/dart-lang/sdk/issues/27926');
       }
@@ -2258,8 +2255,8 @@
   }
 
   JS.PropertyAccess _emitTopLevelNameNoInterop(NamedNode n,
-      {String suffix: ''}) {
-    return new JS.PropertyAccess(emitLibraryName(getLibrary(n)),
+      {String suffix = ''}) {
+    return JS.PropertyAccess(emitLibraryName(getLibrary(n)),
         _emitTopLevelMemberName(n, suffix: suffix));
   }
 
@@ -2267,7 +2264,7 @@
   ///
   /// NOTE: usually you should use [_emitTopLevelName] instead of this. This
   /// function does not handle JS interop.
-  JS.Expression _emitTopLevelMemberName(NamedNode n, {String suffix: ''}) {
+  JS.Expression _emitTopLevelMemberName(NamedNode n, {String suffix = ''}) {
     var name = getJSExportName(n) ?? getTopLevelName(n);
     return _propertyName(name + suffix);
   }
@@ -2291,7 +2288,7 @@
     if (parts.isEmpty) parts = [''];
     JS.PropertyAccess access;
     for (var part in parts) {
-      access = new JS.PropertyAccess(
+      access = JS.PropertyAccess(
           access ?? runtimeCall('global'), js.escapedString(part, "'"));
     }
     return access;
@@ -2321,7 +2318,7 @@
     _currentUri = node.fileUri;
 
     var name = node.name.name;
-    var result = new JS.Method(
+    var result = JS.Method(
         _propertyName(name), _emitFunction(node.function, node.name.name),
         isGetter: node.isGetter, isSetter: node.isSetter)
       ..sourceInformation = _nodeEnd(node.fileEndOffset);
@@ -2360,7 +2357,7 @@
   }
 
   JS.Expression _emitFunctionTagged(JS.Expression fn, FunctionType type,
-      {bool topLevel: false}) {
+      {bool topLevel = false}) {
     var lazy = topLevel && !_typeIsLoaded(type);
     var typeRep = visitFunctionType(type, lazy: lazy);
     return runtimeCall(lazy ? 'lazyFn(#, #)' : 'fn(#, #)', [fn, typeRep]);
@@ -2407,7 +2404,7 @@
   visitBottomType(type) => runtimeCall('bottom');
 
   @override
-  visitInterfaceType(type, {bool lowerGeneric: false}) {
+  visitInterfaceType(type, {bool lowerGeneric = false}) {
     var c = type.classNode;
     _declareBeforeUse(c);
 
@@ -2470,7 +2467,7 @@
   visitVectorType(type) => defaultDartType(type);
 
   @override
-  visitFunctionType(type, {Member member, bool lazy: false}) {
+  visitFunctionType(type, {Member member, bool lazy = false}) {
     var requiredTypes =
         type.positionalParameters.take(type.requiredParameterCount).toList();
     var function = member?.function;
@@ -2538,7 +2535,7 @@
       // TODO(jmesserly): should we disable source info for annotations?
       var savedUri = _currentUri;
       _currentUri = member.enclosingClass.fileUri;
-      result = new JS.ArrayInitializer(
+      result = JS.ArrayInitializer(
           [result]..addAll(annotations.map(_instantiateAnnotation)));
       _currentUri = savedUri;
     }
@@ -2552,7 +2549,7 @@
 
   JS.Expression _emitConstructorName(InterfaceType type, Member c) {
     return _emitJSInterop(type.classNode) ??
-        new JS.PropertyAccess(
+        JS.PropertyAccess(
             _emitConstructorAccess(type), _constructorName(c.name.name));
   }
 
@@ -2570,7 +2567,7 @@
       // TODO(jmesserly): should we disable source info for annotations?
       var savedUri = _currentUri;
       _currentUri = member.enclosingClass.fileUri;
-      result = new JS.ArrayInitializer(
+      result = JS.ArrayInitializer(
           [result]..addAll(metadata.map(_instantiateAnnotation)));
       _currentUri = savedUri;
     }
@@ -2578,8 +2575,8 @@
   }
 
   JS.ObjectInitializer _emitTypeProperties(Iterable<NamedType> types) {
-    return new JS.ObjectInitializer(types
-        .map((t) => new JS.Property(_propertyName(t.name), _emitType(t.type)))
+    return JS.ObjectInitializer(types
+        .map((t) => JS.Property(_propertyName(t.name), _emitType(t.type)))
         .toList());
   }
 
@@ -2593,7 +2590,7 @@
       }
       result.add(type);
     }
-    return new JS.ArrayInitializer(result);
+    return JS.ArrayInitializer(result);
   }
 
   @override
@@ -2601,11 +2598,11 @@
 
   JS.Identifier _emitTypeParameter(TypeParameter t) {
     _typeParamInConst?.add(t);
-    return new JS.Identifier(getTypeParameterName(t));
+    return JS.Identifier(getTypeParameterName(t));
   }
 
   @override
-  visitTypedefType(type, {bool lowerGeneric: false}) {
+  visitTypedefType(type, {bool lowerGeneric = false}) {
     var args = type.typeArguments;
     List<JS.Expression> jsArgs = null;
     if (args.any((a) => a != const DynamicType())) {
@@ -2616,7 +2613,7 @@
     if (jsArgs != null) {
       var genericName =
           _emitTopLevelNameNoInterop(type.typedefNode, suffix: '\$');
-      var typeRep = new JS.Call(genericName, jsArgs);
+      var typeRep = JS.Call(genericName, jsArgs);
       return _cacheTypes ? _typeTable.nameType(type, typeRep) : typeRep;
     }
 
@@ -2640,23 +2637,23 @@
 
     JS.Block code = isSync
         ? _emitFunctionBody(f)
-        : new JS.Block([
+        : JS.Block([
             _emitGeneratorFunction(f, name).toReturn()
               ..sourceInformation = _nodeStart(f)
           ]);
 
     code = super.exitFunction(name, formals, code);
 
-    return new JS.Fun(formals, code);
+    return JS.Fun(formals, code);
   }
 
   List<JS.Parameter> _emitParameters(FunctionNode f) {
     var positional = f.positionalParameters;
-    var result = new List<JS.Parameter>.from(positional.map(_emitVariableDef));
+    var result = List<JS.Parameter>.from(positional.map(_emitVariableDef));
     if (positional.isNotEmpty &&
         f.requiredParameterCount == positional.length &&
         positional.last.annotations.any(isJsRestAnnotation)) {
-      result.last = new JS.RestParameter(result.last);
+      result.last = JS.RestParameter(result.last);
     }
     if (f.namedParameters.isNotEmpty) result.add(namedArgumentTemp);
     return result;
@@ -2673,7 +2670,7 @@
 
   List<JS.Identifier> _emitTypeFormals(List<TypeParameter> typeFormals) {
     return typeFormals
-        .map((t) => new JS.Identifier(getTypeParameterName(t)))
+        .map((t) => JS.Identifier(getTypeParameterName(t)))
         .toList();
   }
 
@@ -2684,7 +2681,7 @@
     emitGeneratorFn(List<JS.Parameter> getParameters(JS.Block jsBody)) {
       var savedController = _asyncStarController;
       _asyncStarController = function.asyncMarker == AsyncMarker.AsyncStar
-          ? new JS.TemporaryId('stream')
+          ? JS.TemporaryId('stream')
           : null;
 
       JS.Expression gen;
@@ -2694,14 +2691,13 @@
         // TODO(jmesserly): this will emit argument initializers (for default
         // values) inside the generator function body. Is that the best place?
         var jsBody = _emitFunctionBody(function);
-        var genFn =
-            new JS.Fun(getParameters(jsBody), jsBody, isGenerator: true);
+        var genFn = JS.Fun(getParameters(jsBody), jsBody, isGenerator: true);
 
         // Name the function if possible, to get better stack traces.
         gen = genFn;
         if (name != null) {
-          gen = new JS.NamedFunction(
-              new JS.TemporaryId(JS.friendlyNameForDartOperator[name] ?? name),
+          gen = JS.NamedFunction(
+              JS.TemporaryId(JS.friendlyNameForDartOperator[name] ?? name),
               genFn);
         }
 
@@ -2739,23 +2735,23 @@
       var returnType =
           _getExpectedReturnType(function, coreTypes.iterableClass);
       var syncIterable =
-          _emitType(new InterfaceType(syncIterableClass, [returnType]));
+          _emitType(InterfaceType(syncIterableClass, [returnType]));
       return js.call('new #.new(#)', [syncIterable, gen]);
     }
 
     if (function.asyncMarker == AsyncMarker.AsyncStar) {
-      // `async*` uses the `dart.asyncStar` helper, and also has an extra
-      // `stream` parameter to the generator, which is used for passing values
-      // to the `_AsyncStarStreamController` implementation type.
+      // `async*` uses the `_AsyncStarImpl<T>` helper class. The generator
+      // callback takes an instance of this class.
       //
       // `yield` is specially generated inside `async*` by visitYieldStatement.
       // `await` is generated as `yield`.
       //
-      // dart:_runtime/generators.dart has an example of the generated code.
+      // _AsyncStarImpl has an example of the generated code.
       var gen = emitGeneratorFn((_) => [_asyncStarController]);
 
       var returnType = _getExpectedReturnType(function, coreTypes.streamClass);
-      return runtimeCall('asyncStar(#, #)', [_emitType(returnType), gen]);
+      var asyncStarImpl = InterfaceType(asyncStarImplClass, [returnType]);
+      return js.call('new #.new(#).stream', [_emitType(asyncStarImpl), gen]);
     }
 
     assert(function.asyncMarker == AsyncMarker.Async);
@@ -2794,7 +2790,7 @@
       return block;
     });
 
-    return new JS.Block(block);
+    return JS.Block(block);
   }
 
   List<JS.Statement> _withCurrentFunction(
@@ -2836,11 +2832,11 @@
     }
 
     for (var p in f.positionalParameters.take(f.requiredParameterCount)) {
-      var jsParam = new JS.Identifier(p.name);
+      var jsParam = JS.Identifier(p.name);
       initParameter(p, jsParam);
     }
     for (var p in f.positionalParameters.skip(f.requiredParameterCount)) {
-      var jsParam = new JS.Identifier(p.name);
+      var jsParam = JS.Identifier(p.name);
       var defaultValue = _defaultParamValue(p);
       if (defaultValue != null) {
         body.add(js.statement(
@@ -2897,7 +2893,7 @@
       var value = p.initializer;
       return _isJSUndefined(value) ? null : _visitExpression(value);
     } else {
-      return new JS.LiteralNull();
+      return JS.LiteralNull();
     }
   }
 
@@ -2915,7 +2911,7 @@
     for (var t in typeFormals) {
       if (t.isGenericCovariantImpl && !types.isTop(t.bound)) {
         body.add(runtimeStatement('checkTypeBound(#, #, #)', [
-          _emitType(new TypeParameterType(t)),
+          _emitType(TypeParameterType(t)),
           _emitType(t.bound),
           _propertyName(t.name)
         ]));
@@ -2931,7 +2927,7 @@
 
     // The statement might be the target of a break or continue with a label.
     var name = _labelNames[s];
-    if (name != null) result = new JS.LabeledStatement(name, result);
+    if (name != null) result = JS.LabeledStatement(name, result);
     return result;
   }
 
@@ -2945,7 +2941,7 @@
       // (sync*/async/async*). Our code generator assumes it can emit names for
       // named argument initialization, and sync* functions also emit locally
       // modified parameters into the function's scope.
-      var parameterNames = new HashSet<String>()
+      var parameterNames = HashSet<String>()
         ..addAll(f.positionalParameters.map((p) => p.name))
         ..addAll(f.namedParameters.map((p) => p.name));
 
@@ -3013,7 +3009,7 @@
   /// end of `.bar` to ensure `foo.bar` has a hover tooltip.
   NodeEnd _nodeEnd(int endOffset) {
     var loc = _getLocation(endOffset);
-    return loc != null ? new NodeEnd(loc) : null;
+    return loc != null ? NodeEnd(loc) : null;
   }
 
   /// Combines [_nodeStart] with the variable name length to produce a hoverable
@@ -3023,7 +3019,7 @@
   NodeSpan _variableSpan(int offset, int nameLength) {
     var start = _getLocation(offset);
     var end = _getLocation(offset + nameLength);
-    return start != null && end != null ? new NodeSpan(start, end) : null;
+    return start != null && end != null ? NodeSpan(start, end) : null;
   }
 
   SourceLocation _getLocation(int offset) {
@@ -3032,7 +3028,7 @@
     if (fileUri == null) return null;
     var loc = _component.getLocation(fileUri, offset);
     if (loc == null) return null;
-    return new SourceLocation(offset,
+    return SourceLocation(offset,
         sourceUrl: fileUri, line: loc.line - 1, column: loc.column - 1);
   }
 
@@ -3045,9 +3041,7 @@
   HoverComment _hoverComment(JS.Expression expr, int offset, int nameLength) {
     var start = _getLocation(offset);
     var end = _getLocation(offset + nameLength);
-    return start != null && end != null
-        ? new HoverComment(expr, start, end)
-        : null;
+    return start != null && end != null ? HoverComment(expr, start, end) : null;
   }
 
   @override
@@ -3077,23 +3071,23 @@
     // slightly different (in Dart, there is a nested scope), but that's handled
     // by _emitFunctionBody.
     var isScope = !identical(node.parent, _currentFunction);
-    return new JS.Block(node.statements.map(_visitStatement).toList(),
+    return JS.Block(node.statements.map(_visitStatement).toList(),
         isScope: isScope);
   }
 
   @override
-  visitEmptyStatement(EmptyStatement node) => new JS.EmptyStatement();
+  visitEmptyStatement(EmptyStatement node) => JS.EmptyStatement();
 
   @override
   visitAssertBlock(AssertBlock node) {
     // AssertBlocks are introduced by the VM-specific async elimination
     // transformation.  We do not expect them to arise here.
-    throw new UnsupportedError('compilation of an assert block');
+    throw UnsupportedError('compilation of an assert block');
   }
 
   @override
   visitAssertStatement(AssertStatement node) {
-    if (!enableAsserts) return new JS.EmptyStatement();
+    if (!enableAsserts) return JS.EmptyStatement();
     var condition = node.condition;
     var conditionType = condition.getStaticType(types);
     var jsCondition = _visitExpression(condition);
@@ -3165,11 +3159,11 @@
   visitBreakStatement(BreakStatement node) {
     // Can it be compiled to a break without a label?
     if (_currentBreakTargets.contains(node.target)) {
-      return new JS.Break(null);
+      return JS.Break(null);
     }
     // Can it be compiled to a continue without a label?
     if (_currentContinueTargets.contains(node.target)) {
-      return new JS.Continue(null);
+      return JS.Continue(null);
     }
 
     // Ensure the effective target is labeled.  Labels are named globally per
@@ -3187,10 +3181,10 @@
       current = (current as LabeledStatement).body;
     }
     if (identical(current, target)) {
-      return new JS.Break(name);
+      return JS.Break(name);
     }
     // Otherwise it is a continue.
-    return new JS.Continue(name);
+    return JS.Continue(name);
   }
 
   // Labeled loop bodies can be the target of a continue without a label
@@ -3234,7 +3228,7 @@
     return translateLoop(node, () {
       var condition = _visitTest(node.condition);
       var body = _visitScope(effectiveBodyOf(node, node.body));
-      return new JS.While(condition, body);
+      return JS.While(condition, body);
     });
   }
 
@@ -3243,31 +3237,30 @@
     return translateLoop(node, () {
       var body = _visitScope(effectiveBodyOf(node, node.body));
       var condition = _visitTest(node.condition);
-      return new JS.Do(body, condition);
+      return JS.Do(body, condition);
     });
   }
 
   @override
   JS.For visitForStatement(ForStatement node) {
     return translateLoop(node, () {
-      emitForInitializer(VariableDeclaration v) =>
-          new JS.VariableInitialization(_emitVariableDef(v),
-              _visitInitializer(v.initializer, v.annotations));
+      emitForInitializer(VariableDeclaration v) => JS.VariableInitialization(
+          _emitVariableDef(v), _visitInitializer(v.initializer, v.annotations));
 
       var init = node.variables.map(emitForInitializer).toList();
       var initList =
-          init.isEmpty ? null : new JS.VariableDeclarationList('let', init);
+          init.isEmpty ? null : JS.VariableDeclarationList('let', init);
       var updates = node.updates;
       JS.Expression update;
       if (updates.isNotEmpty) {
-        update = new JS.Expression.binary(
-                updates.map(_visitExpression).toList(), ',')
-            .toVoidExpression();
+        update =
+            JS.Expression.binary(updates.map(_visitExpression).toList(), ',')
+                .toVoidExpression();
       }
       var condition = _visitTest(node.condition);
       var body = _visitScope(effectiveBodyOf(node, node.body));
 
-      return new JS.For(initList, condition, update, body);
+      return JS.For(initList, condition, update, body);
     });
   }
 
@@ -3283,11 +3276,11 @@
 
       var init = js.call('let #', _emitVariableDef(node.variable));
       if (_annotatedNullCheck(node.variable.annotations)) {
-        body = new JS.Block(
+        body = JS.Block(
             [_nullParameterCheck(_emitVariableRef(node.variable)), body]);
       }
 
-      return new JS.ForOf(init, iterable, body);
+      return JS.ForOf(init, iterable, body);
     });
   }
 
@@ -3310,14 +3303,14 @@
     // TODO(jmesserly): we may want a helper if these become common. For now the
     // full desugaring seems okay.
     var streamIterator = _asyncStreamIteratorClass.rawType;
-    var createStreamIter = new JS.Call(
+    var createStreamIter = JS.Call(
         _emitConstructorName(
             streamIterator,
             _asyncStreamIteratorClass.procedures
                 .firstWhere((p) => p.isFactory && p.name.name == '')),
         [_visitExpression(node.iterable)]);
 
-    var iter = new JS.TemporaryId('iter');
+    var iter = JS.TemporaryId('iter');
     return js.statement(
         '{'
         '  let # = #;'
@@ -3328,12 +3321,12 @@
         [
           iter,
           createStreamIter,
-          new JS.Yield(js.call('#.moveNext()', iter))
+          JS.Yield(js.call('#.moveNext()', iter))
             ..sourceInformation = _nodeStart(node.variable),
           _emitVariableDef(node.variable),
           iter,
           _visitStatement(node.body),
-          new JS.Yield(js.call('#.cancel()', iter))
+          JS.Yield(js.call('#.cancel()', iter))
             ..sourceInformation = _nodeStart(node.variable)
         ]);
   }
@@ -3341,7 +3334,7 @@
   @override
   visitSwitchStatement(SwitchStatement node) {
     var cases = <JS.SwitchCase>[];
-    var emptyBlock = new JS.Block.empty();
+    var emptyBlock = JS.Block.empty();
     for (var c in node.cases) {
       // TODO(jmesserly): make sure we are statically checking fall through
       var body = _visitStatement(c.body).toBlock();
@@ -3350,12 +3343,12 @@
           expressions.isNotEmpty && !c.isDefault ? expressions.last : null;
       for (var e in expressions) {
         var jsExpr = _visitExpression(e);
-        cases.add(new JS.SwitchCase(jsExpr, e == last ? body : emptyBlock));
+        cases.add(JS.SwitchCase(jsExpr, e == last ? body : emptyBlock));
       }
-      if (c.isDefault) cases.add(new JS.SwitchCase.defaultCase(body));
+      if (c.isDefault) cases.add(JS.SwitchCase.defaultCase(body));
     }
 
-    return new JS.Switch(_visitExpression(node.expression), cases);
+    return JS.Switch(_visitExpression(node.expression), cases);
   }
 
   @override
@@ -3375,7 +3368,7 @@
       var fromIndex = switchCases.indexOf(switchCase);
       var toIndex = switchCases.indexOf(node.target);
       if (toIndex == fromIndex + 1) {
-        return new JS.Comment('continue to next case');
+        return JS.Comment('continue to next case');
       }
     }
     return _emitInvalidNode(
@@ -3385,7 +3378,7 @@
 
   @override
   visitIfStatement(IfStatement node) {
-    return new JS.If(_visitTest(node.condition), _visitScope(node.then),
+    return JS.If(_visitTest(node.condition), _visitScope(node.then),
         _visitScope(node.otherwise));
   }
 
@@ -3399,7 +3392,7 @@
     var result = _visitStatement(stmt);
     if (result is JS.ExpressionStatement &&
         result.expression is JS.VariableDeclarationList) {
-      return new JS.Block([result]);
+      return JS.Block([result]);
     }
     return result;
   }
@@ -3411,7 +3404,7 @@
 
   @override
   visitTryCatch(TryCatch node) {
-    return new JS.Try(
+    return JS.Try(
         _visitStatement(node.body).toBlock(), _visitCatch(node.catches), null);
   }
 
@@ -3424,7 +3417,7 @@
       // Special case for a single catch.
       _catchParameter = clauses.single.exception;
     } else {
-      _catchParameter = new VariableDeclaration('#e');
+      _catchParameter = VariableDeclaration('#e');
     }
 
     JS.Statement catchBody =
@@ -3435,14 +3428,14 @@
 
     var catchVarDecl = _emitVariableRef(_catchParameter);
     _catchParameter = savedCatch;
-    return new JS.Catch(catchVarDecl, catchBody.toBlock());
+    return JS.Catch(catchVarDecl, catchBody.toBlock());
   }
 
   JS.Statement _catchClauseGuard(Catch node, JS.Statement otherwise) {
     var body = <JS.Statement>[];
 
     var savedCatch = _catchParameter;
-    var vars = new HashSet<String>();
+    var vars = HashSet<String>();
     if (node.exception != null) {
       var name = node.exception;
       if (name == _catchParameter) {
@@ -3466,13 +3459,13 @@
 
     body.add(_visitStatement(node.body).toScopedBlock(vars));
     _catchParameter = savedCatch;
-    var then = new JS.Block(body);
+    var then = JS.Block(body);
 
     if (types.isTop(node.guard)) return then;
 
     // TODO(jmesserly): this is inconsistent with [visitIsExpression], which
     // has special case for typeof.
-    return new JS.If(
+    return JS.If(
         js.call('#.is(#)',
             [_emitType(node.guard), _emitVariableRef(_catchParameter)]),
         then,
@@ -3490,9 +3483,9 @@
       // Kernel represents Dart try/catch/finally as try/catch nested inside of
       // try/finally.  Flatten that pattern in the output into JS try/catch/
       // finally.
-      return new JS.Try(body.body, body.catchPart, finallyBlock);
+      return JS.Try(body.body, body.catchPart, finallyBlock);
     }
-    return new JS.Try(body.toBlock(), null, finallyBlock);
+    return JS.Try(body.toBlock(), null, finallyBlock);
   }
 
   @override
@@ -3515,7 +3508,7 @@
         _asyncStarController,
         helperName,
         jsExpr,
-        new JS.Yield(null)..sourceInformation = _nodeStart(node)
+        JS.Yield(null)..sourceInformation = _nodeStart(node)
       ]);
     }
     // A normal yield in a sync*
@@ -3541,10 +3534,10 @@
     if (JS.This.foundIn(fn)) {
       declareFn = js.statement('const # = #.bind(this);', [name, fn]);
     } else {
-      declareFn = new JS.FunctionDeclaration(name, fn);
+      declareFn = JS.FunctionDeclaration(name, fn);
     }
     if (_reifyFunctionType(func)) {
-      declareFn = new JS.Block([
+      declareFn = JS.Block([
         declareFn,
         _emitFunctionTagged(_emitVariableRef(node.variable), func.functionType)
             .toStatement()
@@ -3580,9 +3573,9 @@
     var name = v.name;
     if (name == null || name.startsWith('#')) {
       name = name == null ? 't${_tempVariables.length}' : name.substring(1);
-      return _tempVariables.putIfAbsent(v, () => new JS.TemporaryId(name));
+      return _tempVariables.putIfAbsent(v, () => JS.TemporaryId(name));
     }
-    return new JS.Identifier(name);
+    return JS.Identifier(name);
   }
 
   /// Emits the declaration of a variable.
@@ -3595,10 +3588,10 @@
 
   JS.Statement _initLetVariables() {
     if (_letVariables.isEmpty) return null;
-    var result = new JS.VariableDeclarationList(
+    var result = JS.VariableDeclarationList(
             'let',
             _letVariables
-                .map((v) => new JS.VariableInitialization(v, null))
+                .map((v) => JS.VariableInitialization(v, null))
                 .toList())
         .toStatement();
     _letVariables.clear();
@@ -3667,7 +3660,7 @@
     if (_reifyTearoff(member)) {
       return runtimeCall('bind(#, #)', [jsReceiver, jsName]);
     } else {
-      return new JS.PropertyAccess(jsReceiver, jsName);
+      return JS.PropertyAccess(jsReceiver, jsName);
     }
   }
 
@@ -3770,7 +3763,7 @@
         return _emitDynamicInvoke(jsReceiver, null, args, arguments);
       } else if (_isDirectCallable(receiverType)) {
         // Call methods on function types should be handled as function calls.
-        return new JS.Call(jsReceiver, args);
+        return JS.Call(jsReceiver, args);
       }
     }
 
@@ -3840,7 +3833,7 @@
 
   JS.Expression _getImplicitCallTarget(InterfaceType from) {
     var c = from.classNode;
-    var member = hierarchy.getInterfaceMember(c, new Name("call"));
+    var member = hierarchy.getInterfaceMember(c, Name("call"));
     if (member is Procedure && !member.isAccessor && !usesJSInterop(c)) {
       return _emitMemberName('call', member: member);
     }
@@ -4188,18 +4181,18 @@
   @override
   visitSuperMethodInvocation(SuperMethodInvocation node) {
     var target = node.interfaceTarget;
-    return new JS.Call(_emitSuperTarget(target),
+    return JS.Call(_emitSuperTarget(target),
         _emitArgumentList(node.arguments, target: target));
   }
 
   /// Emits the [JS.PropertyAccess] for accessors or method calls to
   /// [jsTarget].[jsName], replacing `super` if it is not allowed in scope.
-  JS.PropertyAccess _emitSuperTarget(Member member, {bool setter: false}) {
+  JS.PropertyAccess _emitSuperTarget(Member member, {bool setter = false}) {
     var jsName = _emitMemberName(member.name.name, member: member);
     if (member is Field && !virtualFields.isVirtual(member)) {
-      return new JS.PropertyAccess(new JS.This(), jsName);
+      return JS.PropertyAccess(JS.This(), jsName);
     }
-    if (_superAllowed) return new JS.PropertyAccess(new JS.Super(), jsName);
+    if (_superAllowed) return JS.PropertyAccess(JS.Super(), jsName);
 
     // If we can't emit `super` in this context, generate a helper that does it
     // for us, and call the helper.
@@ -4216,13 +4209,13 @@
                 : 'function() { return super[#]; }',
             [jsName]);
 
-        return new JS.Method(new JS.TemporaryId(name), fn,
+        return JS.Method(JS.TemporaryId(name), fn,
             isGetter: !setter, isSetter: setter);
       } else {
         var function = member.function;
         var params = _emitTypeFormals(function.typeParameters);
         for (var param in function.positionalParameters) {
-          params.add(new JS.Identifier(param.name));
+          params.add(JS.Identifier(param.name));
         }
         if (function.namedParameters.isNotEmpty) {
           params.add(namedArgumentTemp);
@@ -4231,10 +4224,10 @@
         var fn = js.fun(
             'function(#) { return super[#](#); }', [params, jsName, params]);
         name = JS.friendlyNameForDartOperator[name] ?? name;
-        return new JS.Method(new JS.TemporaryId(name), fn);
+        return JS.Method(JS.TemporaryId(name), fn);
       }
     });
-    return new JS.PropertyAccess(new JS.This(), jsMethod.name);
+    return JS.PropertyAccess(JS.This(), jsMethod.name);
   }
 
   @override
@@ -4270,7 +4263,7 @@
 
     var fn = _emitStaticTarget(target);
     var args = _emitArgumentList(node.arguments, target: target);
-    return new JS.Call(fn, args);
+    return JS.Call(fn, args);
   }
 
   bool _isDebuggerCall(Procedure target) {
@@ -4306,10 +4299,10 @@
         // coerces to true (the default value of `when`).
         ? (args[0].name == 'when'
             ? jsArgs[0].value
-            : new JS.ObjectInitializer(jsArgs))
+            : JS.ObjectInitializer(jsArgs))
         // If we have both `message` and `when` arguments, evaluate them in
         // order, then extract the `when` argument.
-        : js.call('#.when', new JS.ObjectInitializer(jsArgs));
+        : js.call('#.when', JS.ObjectInitializer(jsArgs));
     return isStatement
         ? js.statement('if (#) debugger;', when)
         : js.call('# && (() => { debugger; return true })()', when);
@@ -4329,14 +4322,14 @@
           return runtimeCall('global.#.#', [nativeName[0], memberName]);
         }
       }
-      return new JS.PropertyAccess(_emitStaticClassName(c),
+      return JS.PropertyAccess(_emitStaticClassName(c),
           _emitStaticMemberName(target.name.name, target));
     }
     return _emitTopLevelName(target);
   }
 
   List<JS.Expression> _emitArgumentList(Arguments node,
-      {bool types: true, Member target}) {
+      {bool types = true, Member target}) {
     types = types && _reifyGenericFunction(target);
     var args = <JS.Expression>[];
     if (types) {
@@ -4348,21 +4341,20 @@
       if (arg is StaticInvocation &&
           isJSSpreadInvocation(arg.target) &&
           arg.arguments.positional.length == 1) {
-        args.add(new JS.Spread(_visitExpression(arg.arguments.positional[0])));
+        args.add(JS.Spread(_visitExpression(arg.arguments.positional[0])));
       } else {
         args.add(_visitExpression(arg));
       }
     }
     if (node.named.isNotEmpty) {
-      args.add(new JS.ObjectInitializer(
-          node.named.map(_emitNamedExpression).toList()));
+      args.add(
+          JS.ObjectInitializer(node.named.map(_emitNamedExpression).toList()));
     }
     return args;
   }
 
   JS.Property _emitNamedExpression(NamedExpression arg) {
-    return new JS.Property(
-        _propertyName(arg.name), _visitExpression(arg.value));
+    return JS.Property(_propertyName(arg.name), _visitExpression(arg.value));
   }
 
   /// Emits code for the `JS(...)` macro.
@@ -4378,7 +4370,7 @@
         source = code.expressions.map((e) => (e as StringLiteral).value).join();
       } else {
         if (args.length > 2) {
-          throw new ArgumentError(
+          throw ArgumentError(
               "Can't mix template args and string interpolation in JS calls: "
               "`$node`");
         }
@@ -4468,8 +4460,8 @@
       return _emitJSDoubleEq(jsArgs, negated: negated);
     }
     var code = negated ? '!#' : '#';
-    return js.call(code,
-        new JS.Call(_emitTopLevelName(coreTypes.identicalProcedure), jsArgs));
+    return js.call(
+        code, JS.Call(_emitTopLevelName(coreTypes.identicalProcedure), jsArgs));
   }
 
   @override
@@ -4477,7 +4469,7 @@
     var ctor = node.target;
     var args = node.arguments;
     JS.Expression emitNew() {
-      return new JS.New(_emitConstructorName(node.constructedType, ctor),
+      return JS.New(_emitConstructorName(node.constructedType, ctor),
           _emitArgumentList(args, types: false));
     }
 
@@ -4494,7 +4486,7 @@
 
     var type = ctorClass.typeParameters.isEmpty
         ? ctorClass.rawType
-        : new InterfaceType(ctorClass, args.types);
+        : InterfaceType(ctorClass, args.types);
 
     if (isFromEnvironmentInvocation(coreTypes, node)) {
       var value = _constants.evaluate(node);
@@ -4535,7 +4527,7 @@
     }
 
     JS.Expression emitNew() {
-      return new JS.Call(_emitConstructorName(type, ctor),
+      return JS.Call(_emitConstructorName(type, ctor),
           _emitArgumentList(args, types: false));
     }
 
@@ -4545,7 +4537,7 @@
   JS.Expression _emitJSInteropNew(Member ctor, Arguments args) {
     var ctorClass = ctor.enclosingClass;
     if (isJSAnonymousType(ctorClass)) return _emitObjectLiteral(args);
-    return new JS.New(_emitConstructorName(ctorClass.rawType, ctor),
+    return JS.New(_emitConstructorName(ctorClass.rawType, ctor),
         _emitArgumentList(args, types: false));
   }
 
@@ -4554,7 +4546,7 @@
     if (typeArgs.isEmpty) return _emitType(type);
     identity ??= _typeRep.isPrimitive(typeArgs[0]);
     var c = identity ? identityHashMapImplClass : linkedHashMapImplClass;
-    return _emitType(new InterfaceType(c, typeArgs));
+    return _emitType(InterfaceType(c, typeArgs));
   }
 
   JS.Expression _emitSetImplType(InterfaceType type, {bool identity}) {
@@ -4562,7 +4554,7 @@
     if (typeArgs.isEmpty) return _emitType(type);
     identity ??= _typeRep.isPrimitive(typeArgs[0]);
     var c = identity ? identityHashSetImplClass : linkedHashSetImplClass;
-    return _emitType(new InterfaceType(c, typeArgs));
+    return _emitType(InterfaceType(c, typeArgs));
   }
 
   JS.Expression _emitObjectLiteral(Arguments node) {
@@ -4624,7 +4616,7 @@
           : runtimeCall('str(#)', jsExpr));
     }
     if (parts.isEmpty) return js.string('');
-    return new JS.Expression.binary(parts, '+');
+    return JS.Expression.binary(parts, '+');
   }
 
   @override
@@ -4736,7 +4728,7 @@
     // params are available.
     if (_currentFunction == null || usesTypeParams) return jsExpr;
 
-    var temp = new JS.TemporaryId('const');
+    var temp = JS.TemporaryId('const');
     moduleItems.add(js.statement('let #;', [temp]));
     return js.call('# || (# = #)', [temp, temp, jsExpr]);
   }
@@ -4753,7 +4745,7 @@
   }
 
   @override
-  visitThisExpression(ThisExpression node) => new JS.This();
+  visitThisExpression(ThisExpression node) => JS.This();
 
   @override
   visitRethrow(Rethrow node) {
@@ -4782,7 +4774,7 @@
   }
 
   JS.Expression _emitList(DartType itemType, List<JS.Expression> items) {
-    var list = new JS.ArrayInitializer(items);
+    var list = JS.ArrayInitializer(items);
 
     // TODO(jmesserly): analyzer will usually infer `List<Object>` because
     // that is the least upper bound of the element types. So we rarely
@@ -4790,7 +4782,7 @@
     if (itemType == const DynamicType()) return list;
 
     // Call `new JSArray<E>.of(list)`
-    var arrayType = new InterfaceType(_jsArrayClass, [itemType]);
+    var arrayType = InterfaceType(_jsArrayClass, [itemType]);
     return js.call('#.of(#)', [_emitType(arrayType), list]);
   }
 
@@ -4802,7 +4794,7 @@
         entries.add(_visitExpression(e.key));
         entries.add(_visitExpression(e.value));
       }
-      return new JS.ArrayInitializer(entries);
+      return JS.ArrayInitializer(entries);
     }
 
     if (!node.isConst) {
@@ -4819,7 +4811,7 @@
 
   @override
   visitAwaitExpression(AwaitExpression node) =>
-      new JS.Yield(_visitExpression(node.operand));
+      JS.Yield(_visitExpression(node.operand));
 
   @override
   visitFunctionExpression(FunctionExpression node) {
@@ -4847,7 +4839,7 @@
 
     // Convert `function(...) { ... }` to `(...) => ...`
     // This is for readability, but it also ensures correct `this` binding.
-    return new JS.ArrowFun(f.params, body,
+    return JS.ArrowFun(f.params, body,
         typeParams: f.typeParams, returnType: f.returnType);
   }
 
@@ -4855,16 +4847,16 @@
   visitStringLiteral(StringLiteral node) => js.escapedString(node.value, '"');
 
   @override
-  visitIntLiteral(IntLiteral node) => js.number(node.value);
+  visitIntLiteral(IntLiteral node) => js.uint64(node.value);
 
   @override
   visitDoubleLiteral(DoubleLiteral node) => js.number(node.value);
 
   @override
-  visitBoolLiteral(BoolLiteral node) => new JS.LiteralBool(node.value);
+  visitBoolLiteral(BoolLiteral node) => JS.LiteralBool(node.value);
 
   @override
-  visitNullLiteral(NullLiteral node) => new JS.LiteralNull();
+  visitNullLiteral(NullLiteral node) => JS.LiteralNull();
 
   @override
   visitLet(Let node) {
@@ -4874,7 +4866,7 @@
     var temp = _tempVariables.remove(v);
     if (temp != null) {
       if (_letVariables != null) {
-        init = new JS.Assignment(temp, init);
+        init = JS.Assignment(temp, init);
         _letVariables.add(temp);
       } else {
         // TODO(jmesserly): make sure this doesn't happen on any performance
@@ -4882,10 +4874,10 @@
         //
         // Annotations on a top-level, non-lazy function type should be the only
         // remaining use.
-        return new JS.Call(new JS.ArrowFun([temp], body), [init]);
+        return JS.Call(JS.ArrowFun([temp], body), [init]);
       }
     }
-    return new JS.Binary(',', init, body);
+    return JS.Binary(',', init, body);
   }
 
   @override
@@ -4970,7 +4962,7 @@
   }
 
   @override
-  visitNullConstant(NullConstant node) => new JS.LiteralNull();
+  visitNullConstant(NullConstant node) => JS.LiteralNull();
   @override
   visitBoolConstant(BoolConstant node) => js.boolean(node.value);
   @override
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index fb88289..79448fc 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -18,8 +18,8 @@
 
   DevCompilerConstants(
       TypeEnvironment types, Map<String, String> declaredVariables)
-      : _visitor = new _ConstantVisitor(types.coreTypes),
-        _evaluator = new _ConstantEvaluator(types, declaredVariables);
+      : _visitor = _ConstantVisitor(types.coreTypes),
+        _evaluator = _ConstantEvaluator(types, declaredVariables);
 
   /// Determines if an expression is constant.
   bool isConstant(Expression e) => _visitor.isConstant(e);
@@ -31,7 +31,7 @@
   ///
   /// To avoid performance costs associated with try+catch on invalid constant
   /// evaluation, call this after [isConstant] is known to be true.
-  Constant evaluate(Expression e, {bool cache: false}) {
+  Constant evaluate(Expression e, {bool cache = false}) {
     if (e == null) return null;
 
     try {
@@ -181,15 +181,15 @@
 
   _ConstantEvaluator(TypeEnvironment types, this.declaredVariables,
       {bool enableAsserts})
-      : unavailableConstant = new InstanceConstant(
+      : unavailableConstant = InstanceConstant(
             types.coreTypes.index
                 .getClass('dart:core', '_ConstantExpressionError')
                 .reference,
             [],
             {}),
-        super(new _ConstantsBackend(types.coreTypes), types, types.coreTypes,
-            true, enableAsserts, const _ErrorReporter()) {
-    env = new EvaluationEnvironment();
+        super(_ConstantsBackend(types.coreTypes), types, types.coreTypes, true,
+            enableAsserts, const _ErrorReporter()) {
+    env = EvaluationEnvironment();
   }
 
   @override
@@ -249,11 +249,11 @@
       var targetClass = target.enclosingClass;
 
       if (targetClass == coreTypes.stringClass) {
-        if (value != null) return canonicalize(new StringConstant(value));
+        if (value != null) return canonicalize(StringConstant(value));
         return defaultArg ?? nullConstant;
       } else if (targetClass == coreTypes.intClass) {
         var intValue = int.parse(value ?? '', onError: (_) => null);
-        if (intValue != null) return canonicalize(new IntConstant(intValue));
+        if (intValue != null) return canonicalize(IntConstant(intValue));
         return defaultArg ?? nullConstant;
       } else if (targetClass == coreTypes.boolClass) {
         if (value == "true") return trueConstant;
@@ -279,7 +279,7 @@
       var d = constant.value;
       if (d.isFinite) {
         var i = d.toInt();
-        if (d == i.toDouble()) return super.canonicalize(new IntConstant(i));
+        if (d == i.toDouble()) return super.canonicalize(IntConstant(i));
       }
     }
     return super.canonicalize(constant);
@@ -301,11 +301,11 @@
   @override
   buildConstantForNative(
           nativeName, typeArguments, positionalArguments, namedArguments) =>
-      throw new StateError('unreachable'); // DDC does not use VM native syntax
+      throw StateError('unreachable'); // DDC does not use VM native syntax
 
   @override
   buildSymbolConstant(StringConstant value) {
-    return new InstanceConstant(
+    return InstanceConstant(
         coreTypes.internalSymbolClass.reference,
         const <DartType>[],
         <Reference, Constant>{symbolNameField.reference: value});
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index b9b6412..27b4e85 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -17,7 +17,7 @@
   return null;
 }
 
-final Pattern _syntheticTypeCharacters = new RegExp('[&^#.]');
+final Pattern _syntheticTypeCharacters = RegExp('[&^#.]');
 
 String _escapeIdentifier(String identifier) {
   // Remove the special characters used to encode mixin application class names
@@ -138,7 +138,7 @@
 
 List<Class> getSuperclasses(Class c) {
   var result = <Class>[];
-  var visited = new HashSet<Class>();
+  var visited = HashSet<Class>();
   while (c != null && visited.add(c)) {
     for (var m = c.mixedInClass; m != null; m = m.mixedInClass) {
       result.add(m);
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index cde8c08..1daac64 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -30,11 +30,11 @@
 
   // Abstract types that may be implemented by both native and non-native
   // classes.
-  final _extensibleTypes = new HashSet<Class>.identity();
+  final _extensibleTypes = HashSet<Class>.identity();
 
   // Concrete native types.
-  final _nativeTypes = new HashSet<Class>.identity();
-  final _pendingLibraries = new HashSet<Library>.identity();
+  final _nativeTypes = HashSet<Class>.identity();
+  final _pendingLibraries = HashSet<Library>.identity();
 
   NativeTypeSet(this.coreTypes, this.constants) {
     // First, core types:
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
index edf71af..8e212cf 100644
--- a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -36,7 +36,7 @@
   /// [allowNotNullDeclarations].
   bool allowPackageMetaAnnotations = false;
 
-  final _variableInference = new _NullableVariableInference();
+  final _variableInference = _NullableVariableInference();
 
   NullableInference(this.jsTypeRep)
       : types = jsTypeRep.types,
@@ -276,19 +276,19 @@
   NullableInference _nullInference;
 
   /// Variables that are currently believed to be not-null.
-  final _notNullLocals = new HashSet<VariableDeclaration>.identity();
+  final _notNullLocals = HashSet<VariableDeclaration>.identity();
 
   /// For each variable currently believed to be not-null ([_notNullLocals]),
   /// this collects variables that it is assigned to, so we update them if we
   /// later determine that the variable can be null.
   final _assignedTo =
-      new HashMap<VariableDeclaration, List<VariableDeclaration>>.identity();
+      HashMap<VariableDeclaration, List<VariableDeclaration>>.identity();
 
   /// All functions that have been analyzed with [analyzeFunction].
   ///
   /// In practice this will include the outermost function (typically a
   /// [Procedure]) as well as an local functions it contains.
-  final _functions = new HashSet<FunctionNode>.identity();
+  final _functions = HashSet<FunctionNode>.identity();
 
   /// The current variable we are setting/initializing, so we can track if it
   /// is [_assignedTo] from another variable.
diff --git a/pkg/dev_compiler/lib/src/kernel/property_model.dart b/pkg/dev_compiler/lib/src/kernel/property_model.dart
index 1edc3b7..4242554 100644
--- a/pkg/dev_compiler/lib/src/kernel/property_model.dart
+++ b/pkg/dev_compiler/lib/src/kernel/property_model.dart
@@ -21,10 +21,10 @@
 /// which members are private and thus, could not be overridden outside of the
 /// current library.
 class VirtualFieldModel {
-  final _modelForLibrary = new HashMap<Library, _LibraryVirtualFieldModel>();
+  final _modelForLibrary = HashMap<Library, _LibraryVirtualFieldModel>();
 
   _LibraryVirtualFieldModel _getModel(Library library) => _modelForLibrary
-      .putIfAbsent(library, () => new _LibraryVirtualFieldModel.build(library));
+      .putIfAbsent(library, () => _LibraryVirtualFieldModel.build(library));
 
   /// Returns true if a field is virtual.
   bool isVirtual(Field field) =>
@@ -39,7 +39,7 @@
   ///
   /// This means we must generate them as virtual fields using a property pair
   /// in JavaScript.
-  final _overriddenPrivateFields = new HashSet<Field>();
+  final _overriddenPrivateFields = HashSet<Field>();
 
   /// Private classes that can be extended outside of this library.
   ///
@@ -53,7 +53,7 @@
   ///     class C extends _A {}
   ///
   /// The class _A must treat is "x" as virtual, however _B does not.
-  final _extensiblePrivateClasses = new HashSet<Class>();
+  final _extensiblePrivateClasses = HashSet<Class>();
 
   _LibraryVirtualFieldModel.build(Library library) {
     var allClasses = library.classes;
@@ -62,7 +62,7 @@
     // From there, visit all immediate private types in this library, and so on
     // from those private types, marking them as extensible.
     var classesToVisit =
-        new Queue<Class>.from(allClasses.where((c) => !c.name.startsWith('_')));
+        Queue<Class>.from(allClasses.where((c) => !c.name.startsWith('_')));
     while (classesToVisit.isNotEmpty) {
       var c = classesToVisit.removeFirst();
 
@@ -84,12 +84,12 @@
     // time.
     Map<String, Field> getInstanceFieldMap(Class c) {
       var instanceFields = c.fields.where((f) => !f.isStatic);
-      return new HashMap.fromIterables(
+      return HashMap.fromIterables(
           instanceFields.map((f) => f.name.name), instanceFields);
     }
 
-    var allFields = new HashMap.fromIterables(
-        allClasses, allClasses.map(getInstanceFieldMap));
+    var allFields =
+        HashMap.fromIterables(allClasses, allClasses.map(getInstanceFieldMap));
 
     for (var class_ in allClasses) {
       Set<Class> superclasses = null;
@@ -113,7 +113,7 @@
         }
 
         if (superclasses == null) {
-          superclasses = new Set();
+          superclasses = Set();
           void collectSupertypes(Class c) {
             if (!superclasses.add(c)) return;
             var s = c.superclass;
@@ -189,16 +189,16 @@
   /// The set of inherited getters, used because JS getters/setters are paired,
   /// so if we're generating a setter we may need to emit a getter that calls
   /// super.
-  final inheritedGetters = new HashSet<String>();
+  final inheritedGetters = HashSet<String>();
 
   /// The set of inherited setters, used because JS getters/setters are paired,
   /// so if we're generating a getter we may need to emit a setter that calls
   /// super.
-  final inheritedSetters = new HashSet<String>();
+  final inheritedSetters = HashSet<String>();
 
-  final extensionMethods = new Set<String>();
+  final extensionMethods = Set<String>();
 
-  final extensionAccessors = new Set<String>();
+  final extensionAccessors = Set<String>();
 
   ClassPropertyModel.build(this.types, this.extensionTypes,
       VirtualFieldModel fieldModel, Class class_) {
@@ -231,7 +231,7 @@
 
     _collectExtensionMembers(class_);
 
-    var virtualAccessorNames = new HashSet<String>()
+    var virtualAccessorNames = HashSet<String>()
       ..addAll(inheritedGetters)
       ..addAll(inheritedSetters)
       ..addAll(extensionAccessors);
@@ -247,7 +247,7 @@
           fieldModel.isVirtual(field) ||
           field.isCovariant ||
           field.isGenericCovariantImpl) {
-        virtualFields[field] = new JS.TemporaryId(name);
+        virtualFields[field] = JS.TemporaryId(name);
       }
     }
   }
@@ -260,23 +260,23 @@
     // Find all generic interfaces that could be used to call into members of
     // this class. This will help us identify which parameters need checks
     // for soundness.
-    var allNatives = new HashSet<String>();
+    var allNatives = HashSet<String>();
     _collectNativeMembers(class_, allNatives);
     if (allNatives.isEmpty) return;
 
     // For members on this class, check them against all generic interfaces.
-    var seenConcreteMembers = new HashSet<String>();
+    var seenConcreteMembers = HashSet<String>();
     _findExtensionMembers(class_, seenConcreteMembers, allNatives);
 
     // For members of the superclass, we may need to add checks because this
     // class adds a new unsafe interface. Collect those checks.
-    var visited = new HashSet<Class>()..add(class_);
-    var existingMembers = new HashSet<String>();
+    var visited = HashSet<Class>()..add(class_);
+    var existingMembers = HashSet<String>();
 
     void visitImmediateSuper(Class c) {
       // For members of mixins/supertypes, check them against new interfaces,
       // and also record any existing checks they already had.
-      var oldCovariant = new HashSet<String>();
+      var oldCovariant = HashSet<String>();
       _collectNativeMembers(c, oldCovariant);
       var newCovariant = allNatives.difference(oldCovariant);
       if (newCovariant.isEmpty) return;
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 5996ea5..33329bb 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -85,31 +85,31 @@
           .getClass('dart:core', '_Invocation')
           .constructors
           .firstWhere((c) => c.name.name == name);
-      return new ConstructorInvocation(ctor, new Arguments(positional));
+      return ConstructorInvocation(ctor, Arguments(positional));
     }
 
     if (name.startsWith('get:')) {
-      return createInvocation('getter', [new SymbolLiteral(name.substring(4))]);
+      return createInvocation('getter', [SymbolLiteral(name.substring(4))]);
     }
     if (name.startsWith('set:')) {
       return createInvocation('setter', [
-        new SymbolLiteral(name.substring(4) + '='),
+        SymbolLiteral(name.substring(4) + '='),
         arguments.positional.single
       ]);
     }
-    var ctorArgs = <Expression>[new SymbolLiteral(name)];
+    var ctorArgs = <Expression>[SymbolLiteral(name)];
     bool isGeneric = arguments.types.isNotEmpty;
     if (isGeneric) {
-      ctorArgs.add(new ListLiteral(
-          arguments.types.map((t) => new TypeLiteral(t)).toList()));
+      ctorArgs.add(
+          ListLiteral(arguments.types.map((t) => TypeLiteral(t)).toList()));
     } else {
-      ctorArgs.add(new NullLiteral());
+      ctorArgs.add(NullLiteral());
     }
-    ctorArgs.add(new ListLiteral(arguments.positional));
+    ctorArgs.add(ListLiteral(arguments.positional));
     if (arguments.named.isNotEmpty) {
-      ctorArgs.add(new MapLiteral(
+      ctorArgs.add(MapLiteral(
           arguments.named
-              .map((n) => new MapEntry(new SymbolLiteral(n.name), n.value))
+              .map((n) => MapEntry(SymbolLiteral(n.name), n.value))
               .toList(),
           keyType: coreTypes.symbolClass.rawType));
     }
@@ -119,17 +119,17 @@
   @override
   Expression instantiateNoSuchMethodError(CoreTypes coreTypes,
       Expression receiver, String name, Arguments arguments, int offset,
-      {bool isMethod: false,
-      bool isGetter: false,
-      bool isSetter: false,
-      bool isField: false,
-      bool isLocalVariable: false,
-      bool isDynamic: false,
-      bool isSuper: false,
-      bool isStatic: false,
-      bool isConstructor: false,
-      bool isTopLevel: false}) {
+      {bool isMethod = false,
+      bool isGetter = false,
+      bool isSetter = false,
+      bool isField = false,
+      bool isLocalVariable = false,
+      bool isDynamic = false,
+      bool isSuper = false,
+      bool isStatic = false,
+      bool isConstructor = false,
+      bool isTopLevel = false}) {
     // TODO(sigmund): implement;
-    return new InvalidExpression(null);
+    return InvalidExpression(null);
   }
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/type_table.dart b/pkg/dev_compiler/lib/src/kernel/type_table.dart
index d3f4ff7..313e8c9 100644
--- a/pkg/dev_compiler/lib/src/kernel/type_table.dart
+++ b/pkg/dev_compiler/lib/src/kernel/type_table.dart
@@ -9,7 +9,7 @@
 import '../compiler/js_names.dart' as JS;
 
 Set<TypeParameter> freeTypeParameters(DartType t) {
-  var result = new Set<TypeParameter>();
+  var result = Set<TypeParameter>();
   void find(DartType t) {
     if (t is TypeParameterType) {
       result.add(t.parameter);
@@ -63,7 +63,7 @@
 
   bool isNamed(DartType type) => _names.containsKey(type);
 
-  String _typeString(DartType type, {bool flat: false}) {
+  String _typeString(DartType type, {bool flat = false}) {
     if (type is InterfaceType) {
       var name = type.classNode.name;
       var typeArgs = type.typeArguments;
@@ -103,7 +103,7 @@
   /// Heuristically choose a good name for the cache and generator
   /// variables.
   JS.TemporaryId chooseTypeName(DartType type) {
-    return new JS.TemporaryId(_typeString(type));
+    return JS.TemporaryId(_typeString(type));
   }
 }
 
@@ -150,7 +150,7 @@
   /// parameter.
   final _scopeDependencies = <TypeParameter, List<DartType>>{};
 
-  TypeTable(JS.Identifier runtime) : _generators = new _GeneratorTable(runtime);
+  TypeTable(JS.Identifier runtime) : _generators = _GeneratorTable(runtime);
 
   /// Emit a list of statements declaring the cache variables and generator
   /// definitions tracked by the table.  If [formals] is present, only
@@ -200,9 +200,9 @@
   /// type itself. This allows better integration with `lazyFn`, avoiding an
   /// extra level of indirection.
   JS.Expression nameFunctionType(FunctionType type, JS.Expression typeRep,
-      {bool lazy: false}) {
+      {bool lazy = false}) {
     if (!_generators.isNamed(type) && recordScopeDependencies(type)) {
-      return lazy ? new JS.ArrowFun([], typeRep) : typeRep;
+      return lazy ? JS.ArrowFun([], typeRep) : typeRep;
     }
     var name = _generators._nameType(type, typeRep);
     return lazy ? name : js.call('#()', [name]);
diff --git a/pkg/dev_compiler/test/child_server_process.dart b/pkg/dev_compiler/test/child_server_process.dart
index 8a6f85e..f274290 100644
--- a/pkg/dev_compiler/test/child_server_process.dart
+++ b/pkg/dev_compiler/test/child_server_process.dart
@@ -9,7 +9,7 @@
   /// [IOSink]s like [stdout] don't like to be piped more than one [Stream], but
   /// we want to pipe many of them (basically, every standard output and error
   /// of every child process we open), so we pipe to an accommodating consumer.
-  static final _consoleOut = new _MultipleStreamConsumer(stdout);
+  static final _consoleOut = _MultipleStreamConsumer(stdout);
 
   final Process process;
   final String host;
@@ -19,20 +19,20 @@
   get httpUri => Uri.parse('http://$host:$port');
 
   static build(Future<Process> builder(String host, int port),
-      {int defaultPort: 1024,
-      int maxPort: 65535,
-      String host: '0.0.0.0'}) async {
+      {int defaultPort = 1024,
+      int maxPort = 65535,
+      String host = '0.0.0.0'}) async {
     var port = await _findUnusedPort(defaultPort, maxPort);
     var p = (await builder(host, port))
       ..stdout.pipe(_consoleOut)
       ..stderr.pipe(_consoleOut);
     await _waitForServer(host, port);
-    return new ChildServerProcess._(p, host, port);
+    return ChildServerProcess._(p, host, port);
   }
 
   static _waitForServer(String host, int port,
-      {int attempts: 10,
-      Duration retryDelay: const Duration(seconds: 1)}) async {
+      {int attempts = 10,
+      Duration retryDelay = const Duration(seconds: 1)}) async {
     var lastError;
     for (int i = 0; i < attempts; i++) {
       try {
@@ -40,10 +40,10 @@
         return;
       } catch (e) {
         lastError = e;
-        await new Future.delayed(retryDelay);
+        await Future.delayed(retryDelay);
       }
     }
-    throw new StateError(
+    throw StateError(
         'Failed to connect to $host:$port after $attempts attempts; '
         'Last error:\n$lastError');
   }
@@ -59,7 +59,7 @@
         lastError = e;
       }
     }
-    throw new StateError(
+    throw StateError(
         'Failed to find an unused port between $fromPort and $toPort; '
         'Last error:\n$lastError');
   }
diff --git a/pkg/dev_compiler/test/closure/closure_annotation_test.dart b/pkg/dev_compiler/test/closure/closure_annotation_test.dart
index 7c3ae32..e3347c6 100644
--- a/pkg/dev_compiler/test/closure/closure_annotation_test.dart
+++ b/pkg/dev_compiler/test/closure/closure_annotation_test.dart
@@ -11,36 +11,35 @@
 
 void main() {
   group('ClosureAnnotation', () {
-    var anyType = new TypeRef.any();
-    var unknownType = new TypeRef.unknown();
-    var numberType = new TypeRef.number();
-    var stringType = new TypeRef.string();
-    var booleanType = new TypeRef.boolean();
-    var fooType =
-        new TypeRef.qualified([new Identifier("foo"), new Identifier("Foo")]);
-    var barType = new TypeRef.named("Bar");
-    var bazType = new TypeRef.named("Baz");
-    var bamType = new TypeRef.named("Bam");
-    var batType = new TypeRef.named("Bat");
+    var anyType = TypeRef.any();
+    var unknownType = TypeRef.unknown();
+    var numberType = TypeRef.number();
+    var stringType = TypeRef.string();
+    var booleanType = TypeRef.boolean();
+    var fooType = TypeRef.qualified([Identifier("foo"), Identifier("Foo")]);
+    var barType = TypeRef.named("Bar");
+    var bazType = TypeRef.named("Baz");
+    var bamType = TypeRef.named("Bam");
+    var batType = TypeRef.named("Bat");
 
     test('gives empty comment when no has no meaningful info', () {
-      expect(new ClosureAnnotation().toString(), "");
-      expect(new ClosureAnnotation(type: anyType).toString(), "");
-      expect(new ClosureAnnotation(type: unknownType).toString(), "");
+      expect(ClosureAnnotation().toString(), "");
+      expect(ClosureAnnotation(type: anyType).toString(), "");
+      expect(ClosureAnnotation(type: unknownType).toString(), "");
     });
 
     test('gives single line comment when it fits', () {
-      expect(new ClosureAnnotation(type: numberType).toString(),
+      expect(ClosureAnnotation(type: numberType).toString(),
           "/** @type {number} */");
-      expect(new ClosureAnnotation(paramTypes: {'foo': anyType}).toString(),
+      expect(ClosureAnnotation(paramTypes: {'foo': anyType}).toString(),
           "/** @param {*} foo */");
-      expect(new ClosureAnnotation(paramTypes: {'foo': unknownType}).toString(),
+      expect(ClosureAnnotation(paramTypes: {'foo': unknownType}).toString(),
           "/** @param {?} foo */");
     });
 
     test('gives multiple line comment when it it does not fit on one line', () {
       expect(
-          new ClosureAnnotation(
+          ClosureAnnotation(
               returnType: stringType,
               paramTypes: {'foo': numberType}).toString(),
           "/**\n"
@@ -51,7 +50,7 @@
 
     test('inserts indentation', () {
       expect(
-          new ClosureAnnotation(
+          ClosureAnnotation(
               returnType: stringType,
               paramTypes: {'foo': numberType}).toString("  "),
           "/**\n" // No indent on first line.
@@ -62,23 +61,20 @@
 
     test('compresses @type, @final, @const, @private, @protected, @typedef',
         () {
-      expect(new ClosureAnnotation(type: stringType).toString(),
+      expect(ClosureAnnotation(type: stringType).toString(),
           "/** @type {string} */");
-      expect(new ClosureAnnotation(type: stringType, isConst: true).toString(),
+      expect(ClosureAnnotation(type: stringType, isConst: true).toString(),
           "/** @const {string} */");
-      expect(new ClosureAnnotation(type: stringType, isFinal: true).toString(),
+      expect(ClosureAnnotation(type: stringType, isFinal: true).toString(),
           "/** @final {string} */");
-      expect(
-          new ClosureAnnotation(type: stringType, isPrivate: true).toString(),
+      expect(ClosureAnnotation(type: stringType, isPrivate: true).toString(),
           "/** @private {string} */");
-      expect(
-          new ClosureAnnotation(type: stringType, isTypedef: true).toString(),
+      expect(ClosureAnnotation(type: stringType, isTypedef: true).toString(),
           "/** @typedef {string} */");
-      expect(
-          new ClosureAnnotation(type: stringType, isProtected: true).toString(),
+      expect(ClosureAnnotation(type: stringType, isProtected: true).toString(),
           "/** @protected {string} */");
       expect(
-          new ClosureAnnotation(
+          ClosureAnnotation(
                   type: stringType,
                   isPrivate: true,
                   isConst: true,
@@ -91,7 +87,7 @@
 
     test('supports a full constructor annotation', () {
       expect(
-          new ClosureAnnotation(
+          ClosureAnnotation(
               returnType: booleanType,
               throwsType: bamType,
               thisType: fooType,
diff --git a/pkg/dev_compiler/test/closure/closure_type_test.dart b/pkg/dev_compiler/test/closure/closure_type_test.dart
index b21d9d2..c8b7c62 100644
--- a/pkg/dev_compiler/test/closure/closure_type_test.dart
+++ b/pkg/dev_compiler/test/closure/closure_type_test.dart
@@ -22,65 +22,61 @@
 
   group('ClosureType', () {
     test('supports simple types', () {
-      expectToString(new ClosureType.number(), "number",
+      expectToString(ClosureType.number(), "number",
           nullable: "?number", nonNullable: "number");
-      expectToString(new ClosureType.boolean(), "boolean",
+      expectToString(ClosureType.boolean(), "boolean",
           nullable: "?boolean", nonNullable: "boolean");
-      expectToString(new ClosureType.string(), "string",
+      expectToString(ClosureType.string(), "string",
           nullable: "string", nonNullable: "!string");
-      expectToString(new ClosureType.type("foo.Bar"), "foo.Bar",
+      expectToString(ClosureType.type("foo.Bar"), "foo.Bar",
           nullable: "foo.Bar", nonNullable: "!foo.Bar");
     });
 
     test('supports array types', () {
-      expectToString(new ClosureType.array(), "Array<*>",
+      expectToString(ClosureType.array(), "Array<*>",
           nullable: "Array<*>", nonNullable: "!Array<*>");
-      expectToString(
-          new ClosureType.array(new ClosureType.type("Foo")), "Array<Foo>",
+      expectToString(ClosureType.array(ClosureType.type("Foo")), "Array<Foo>",
           nullable: "Array<Foo>", nonNullable: "!Array<Foo>");
     });
 
     test('supports map types', () {
       expectToString(
-          new ClosureType.map(
-              new ClosureType.type("Foo"), new ClosureType.type("Bar")),
+          ClosureType.map(ClosureType.type("Foo"), ClosureType.type("Bar")),
           "Object<Foo, Bar>",
           nullable: "Object<Foo, Bar>",
           nonNullable: "!Object<Foo, Bar>");
-      expectToString(new ClosureType.map(), "Object<*, *>",
+      expectToString(ClosureType.map(), "Object<*, *>",
           nullable: "Object<*, *>", nonNullable: "!Object<*, *>");
     });
 
     test('supports function types', () {
-      expectToString(new ClosureType.function(), "Function",
+      expectToString(ClosureType.function(), "Function",
           nullable: "Function", nonNullable: "!Function");
-      expectToString(new ClosureType.function([new ClosureType.number()]),
-          "function(number)");
-      expectToString(new ClosureType.function(null, new ClosureType.number()),
+      expectToString(
+          ClosureType.function([ClosureType.number()]), "function(number)");
+      expectToString(ClosureType.function(null, ClosureType.number()),
           "function(...*):number");
       expectToString(
-          new ClosureType.function(
-              [new ClosureType.number(), new ClosureType.string()],
-              new ClosureType.boolean()),
+          ClosureType.function([ClosureType.number(), ClosureType.string()],
+              ClosureType.boolean()),
           "function(number, string):boolean");
     });
 
     test('supports union types', () {
-      expectToString(new ClosureType.number().or(new ClosureType.boolean()),
-          "(number|boolean)");
       expectToString(
-          new ClosureType.number().orUndefined(), "(number|undefined)");
+          ClosureType.number().or(ClosureType.boolean()), "(number|boolean)");
+      expectToString(ClosureType.number().orUndefined(), "(number|undefined)");
     });
 
     test('supports record types', () {
       expectToString(
-          new ClosureType.record(
-              {'x': new ClosureType.number(), 'y': new ClosureType.boolean()}),
+          ClosureType.record(
+              {'x': ClosureType.number(), 'y': ClosureType.boolean()}),
           "{x: number, y: boolean}");
     });
 
     test('supports optional pseudo-types', () {
-      expectToString(new ClosureType.number().toOptional(), "number=");
+      expectToString(ClosureType.number().toOptional(), "number=");
     });
   });
 }
diff --git a/pkg/dev_compiler/test/codegen/BenchmarkBase.dart b/pkg/dev_compiler/test/codegen/BenchmarkBase.dart
index c6612c7..05dde11 100644
--- a/pkg/dev_compiler/test/codegen/BenchmarkBase.dart
+++ b/pkg/dev_compiler/test/codegen/BenchmarkBase.dart
@@ -56,7 +56,7 @@
   static double measureFor(Function f, int timeMinimum) {
     int time = 0;
     int iter = 0;
-    Stopwatch watch = new Stopwatch();
+    Stopwatch watch = Stopwatch();
     watch.start();
     int elapsed = 0;
     while (elapsed < timeMinimum) {
diff --git a/pkg/dev_compiler/test/codegen/closure.dart b/pkg/dev_compiler/test/codegen/closure.dart
index 0093013..9d3294b 100644
--- a/pkg/dev_compiler/test/codegen/closure.dart
+++ b/pkg/dev_compiler/test/codegen/closure.dart
@@ -18,7 +18,7 @@
 
   Foo(this.i, this.v);
 
-  factory Foo.build() => new Foo(1, null);
+  factory Foo.build() => Foo(1, null);
 
   untyped_method(a, b) {}
 
diff --git a/pkg/dev_compiler/test/codegen/destructuring.dart b/pkg/dev_compiler/test/codegen/destructuring.dart
index 60cbe62..dd8745e 100644
--- a/pkg/dev_compiler/test/codegen/destructuring.dart
+++ b/pkg/dev_compiler/test/codegen/destructuring.dart
@@ -11,14 +11,14 @@
 f_sync(int a, b, [c = 1]) sync* {}
 f_async(int a, b, [c = 1]) async* {}
 
-g(int a, b, {c: 1}) {
+g(int a, b, {c = 1}) {
   f(a, b, c);
 }
 
-external g_ext(int a, b, {c: 1});
-g_nat(int a, b, {c: 1}) native "g_nat";
-g_sync(int a, b, {c: 1}) sync* {}
-g_async(int a, b, {c: 1}) async* {}
+external g_ext(int a, b, {c = 1});
+g_nat(int a, b, {c = 1}) native "g_nat";
+g_sync(int a, b, {c = 1}) sync* {}
+g_async(int a, b, {c = 1}) async* {}
 
 r(int a, @rest others) {
   r(a, spread(others));
@@ -37,11 +37,11 @@
   f(let, function, arguments);
 }
 
-invalid_names3({int let, function, arguments: 2}) {
+invalid_names3({int let, function, arguments = 2}) {
   f(let, function, arguments);
 }
 
 names_clashing_with_object_props(
-    {int constructor, valueOf, hasOwnProperty: 2}) {
+    {int constructor, valueOf, hasOwnProperty = 2}) {
   f(constructor, valueOf, hasOwnProperty);
 }
diff --git a/pkg/dev_compiler/test/codegen/equality_test.dart b/pkg/dev_compiler/test/codegen/equality_test.dart
index d77a155..cd1d90d7 100644
--- a/pkg/dev_compiler/test/codegen/equality_test.dart
+++ b/pkg/dev_compiler/test/codegen/equality_test.dart
@@ -26,7 +26,7 @@
 T hideNull<T>(T x) => x;
 
 /// Generate undefined at a type
-T getUndefined<T>() => (new List(1))[0];
+T getUndefined<T>() => (List(1))[0];
 
 main() {
   group('Enum equality', () {
@@ -95,8 +95,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -120,8 +120,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -146,8 +146,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -186,8 +186,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -285,8 +285,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -310,8 +310,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -336,8 +336,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -376,8 +376,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -475,8 +475,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -500,8 +500,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -526,8 +526,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -566,8 +566,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -665,8 +665,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -690,8 +690,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -716,8 +716,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -756,8 +756,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -855,8 +855,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -880,8 +880,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -906,8 +906,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -946,8 +946,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -982,12 +982,12 @@
   group('Object equality', () {
     // Test equality of two objects, various types, nullable
     test('Equal object/object (nullable)', () {
-      _Jake e1 = hideNull(new _Jake());
-      _Elwood e2 = hideNull(new _Elwood());
+      _Jake e1 = hideNull(_Jake());
+      _Elwood e2 = hideNull(_Elwood());
       dynamic d1 = hideNull(e1);
-      dynamic d2 = hideNull(new _Elwood());
+      dynamic d2 = hideNull(_Elwood());
       Object o1 = hideNull(e1);
-      Object o2 = hideNull(new _Elwood());
+      Object o2 = hideNull(_Elwood());
       expect(e1 == e1, true);
       expect(e1 == d1, true);
       expect(e1 == o1, true);
@@ -1011,12 +1011,12 @@
 
     // Test equality of two objects, various types, non-nullable
     test('Equal object/object (non-null)', () {
-      _Jake e1 = new _Jake();
-      _Elwood e2 = new _Elwood();
+      _Jake e1 = _Jake();
+      _Elwood e2 = _Elwood();
       dynamic d1 = e1;
-      dynamic d2 = new _Elwood();
+      dynamic d2 = _Elwood();
       Object o1 = e1;
-      Object o2 = new _Elwood();
+      Object o2 = _Elwood();
       expect(e1 == e1, true);
       expect(e1 == d1, true);
       expect(e1 == o1, true);
@@ -1040,13 +1040,13 @@
 
     // Test equality of object and other types (static, nullable)
     test('Equal object/other (static, nullable)', () {
-      _Jake e1 = hideNull(new _Jake());
+      _Jake e1 = hideNull(_Jake());
       String s1 = hideNull("hello");
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -1065,13 +1065,13 @@
 
     // Test equality of object and other types (static, non-null)
     test('Equal object/other (static, non-null)', () {
-      _Jake e1 = new _Jake();
+      _Jake e1 = _Jake();
       String s1 = "hello";
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -1090,14 +1090,14 @@
 
     // Test equality of object and other types (dynamic, nullable)
     test('Equal object/other (dynamic, nullable)', () {
-      _Jake e1 = hideNull(new _Jake());
-      dynamic d1 = hideNull(new _Jake());
+      _Jake e1 = hideNull(_Jake());
+      dynamic d1 = hideNull(_Jake());
       dynamic s1 = hideNull("hello");
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
@@ -1130,14 +1130,14 @@
 
     // Test equality of object and other types (dynamic, non-null)
     test('Equal object/other (dynamic, non-null)', () {
-      _Jake e1 = new _Jake();
-      dynamic d1 = new _Jake();
+      _Jake e1 = _Jake();
+      dynamic d1 = _Jake();
       String s1 = "hello";
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(e1 == s1, false);
       expect(e1 == s2, false);
diff --git a/pkg/dev_compiler/test/codegen/identity_test.dart b/pkg/dev_compiler/test/codegen/identity_test.dart
index 0c42bc6..3ca0dad 100644
--- a/pkg/dev_compiler/test/codegen/identity_test.dart
+++ b/pkg/dev_compiler/test/codegen/identity_test.dart
@@ -26,7 +26,7 @@
 T hideNull<T>(T x) => x;
 
 /// Generate undefined at a type
-T getUndefined<T>() => (new List(1))[0];
+T getUndefined<T>() => (List(1))[0];
 
 main() {
   group('Enum identity', () {
@@ -95,8 +95,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -120,8 +120,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -146,8 +146,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -186,8 +186,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -285,8 +285,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -310,8 +310,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -336,8 +336,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -376,8 +376,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -475,8 +475,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -500,8 +500,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -526,8 +526,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -566,8 +566,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -665,8 +665,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -690,8 +690,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -716,8 +716,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -756,8 +756,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -855,8 +855,8 @@
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -880,8 +880,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -906,8 +906,8 @@
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -946,8 +946,8 @@
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -982,12 +982,12 @@
   group('Object identity', () {
     // Test identity of two objects, various types, nullable
     test('Identical object/object (nullable)', () {
-      _Jake e1 = hideNull(new _Jake());
-      _Elwood e2 = hideNull(new _Elwood());
+      _Jake e1 = hideNull(_Jake());
+      _Elwood e2 = hideNull(_Elwood());
       dynamic d1 = hideNull(e1);
-      dynamic d2 = hideNull(new _Elwood());
+      dynamic d2 = hideNull(_Elwood());
       Object o1 = hideNull(e1);
-      Object o2 = hideNull(new _Elwood());
+      Object o2 = hideNull(_Elwood());
       expect(identical(e1, e1), true);
       expect(identical(e1, d1), true);
       expect(identical(e1, o1), true);
@@ -1011,12 +1011,12 @@
 
     // Test identity of two objects, various types, non-nullable
     test('Identical object/object (non-null)', () {
-      _Jake e1 = new _Jake();
-      _Elwood e2 = new _Elwood();
+      _Jake e1 = _Jake();
+      _Elwood e2 = _Elwood();
       dynamic d1 = e1;
-      dynamic d2 = new _Elwood();
+      dynamic d2 = _Elwood();
       Object o1 = e1;
-      Object o2 = new _Elwood();
+      Object o2 = _Elwood();
       expect(identical(e1, e1), true);
       expect(identical(e1, d1), true);
       expect(identical(e1, o1), true);
@@ -1040,13 +1040,13 @@
 
     // Test identity of object and other types (static, nullable)
     test('Identical object/other (static, nullable)', () {
-      _Jake e1 = hideNull(new _Jake());
+      _Jake e1 = hideNull(_Jake());
       String s1 = hideNull("hello");
       String s2 = hideNull("");
       int i1 = hideNull(3);
       int i2 = hideNull(0);
-      List l1 = hideNull(new List(3));
-      BluesBrother b1 = hideNull(new _Norman());
+      List l1 = hideNull(List(3));
+      BluesBrother b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -1065,13 +1065,13 @@
 
     // Test identity of object and other types (static, non-null)
     test('Identical object/other (static, non-null)', () {
-      _Jake e1 = new _Jake();
+      _Jake e1 = _Jake();
       String s1 = "hello";
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -1090,14 +1090,14 @@
 
     // Test identity of object and other types (dynamic, nullable)
     test('Identical object/other (dynamic, nullable)', () {
-      _Jake e1 = hideNull(new _Jake());
-      dynamic d1 = hideNull(new _Jake());
+      _Jake e1 = hideNull(_Jake());
+      dynamic d1 = hideNull(_Jake());
       dynamic s1 = hideNull("hello");
       dynamic s2 = hideNull("");
       dynamic i1 = hideNull(3);
       dynamic i2 = hideNull(0);
-      dynamic l1 = hideNull(new List(3));
-      dynamic b1 = hideNull(new _Norman());
+      dynamic l1 = hideNull(List(3));
+      dynamic b1 = hideNull(_Norman());
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
@@ -1130,14 +1130,14 @@
 
     // Test identity of object and other types (dynamic, non-null)
     test('Identical object/other (dynamic, non-null)', () {
-      _Jake e1 = new _Jake();
-      dynamic d1 = new _Jake();
+      _Jake e1 = _Jake();
+      dynamic d1 = _Jake();
       String s1 = "hello";
       String s2 = "";
       int i1 = 3;
       int i2 = 0;
-      List l1 = new List(3);
-      BluesBrother b1 = new _Norman();
+      List l1 = List(3);
+      BluesBrother b1 = _Norman();
 
       expect(identical(e1, s1), false);
       expect(identical(e1, s2), false);
diff --git a/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart b/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
index d74dfce..42b2417 100644
--- a/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
+++ b/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
@@ -39,7 +39,7 @@
     final r = sqrt(i) * SCALE_FACTOR;
     final x = centerX + r * cos(theta);
     final y = centerY - r * sin(theta);
-    new SunflowerSeed(x, y, SEED_RADIUS).draw(context);
+    SunflowerSeed(x, y, SEED_RADIUS).draw(context);
   }
   notes.text = "$seeds seeds";
 }
diff --git a/pkg/dev_compiler/test/codegen/unresolved_names.dart b/pkg/dev_compiler/test/codegen/unresolved_names.dart
index 171243a..2a14b21 100644
--- a/pkg/dev_compiler/test/codegen/unresolved_names.dart
+++ b/pkg/dev_compiler/test/codegen/unresolved_names.dart
@@ -3,8 +3,8 @@
 class C {}
 
 main() {
-  new Foo();
-  new C.bar();
+  Foo();
+  C.bar();
   print(baz);
   print(C.quux);
 }
diff --git a/pkg/dev_compiler/test/codegen_test.dart b/pkg/dev_compiler/test/codegen_test.dart
index d8327f4..0d5df3f 100644
--- a/pkg/dev_compiler/test/codegen_test.dart
+++ b/pkg/dev_compiler/test/codegen_test.dart
@@ -36,7 +36,7 @@
 import 'multitest.dart' show extractTestsFromMultitest, isMultiTest;
 import 'testing.dart' show repoDirectory, testDirectory;
 
-final ArgParser argParser = new ArgParser()
+final ArgParser argParser = ArgParser()
   ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null);
 
 /// The `test/codegen` directory.
@@ -65,19 +65,19 @@
 main(List<String> arguments) {
   if (arguments == null) arguments = [];
   ArgResults args = argParser.parse(arguments);
-  filePattern = new RegExp(args.rest.length > 0 ? args.rest[0] : '.');
+  filePattern = RegExp(args.rest.length > 0 ? args.rest[0] : '.');
 
   var sdkDir = path.join(repoDirectory, 'gen', 'patched_sdk');
   var sdkSummaryFile =
       path.join(testDirectory, '..', 'gen', 'sdk', 'ddc_sdk.sum');
 
-  var summaryPaths = new Directory(path.join(codegenOutputDir, 'pkg'))
+  var summaryPaths = Directory(path.join(codegenOutputDir, 'pkg'))
       .listSync()
       .map((e) => e.path)
       .where((p) => p.endsWith('.sum'))
       .toList();
 
-  var sharedCompiler = new ModuleCompiler(new AnalyzerOptions.basic(
+  var sharedCompiler = ModuleCompiler(AnalyzerOptions.basic(
       dartSdkSummaryPath: sdkSummaryFile, summaryPaths: summaryPaths));
 
   var testDirs = ['language', 'corelib_2', 'lib'];
@@ -89,14 +89,14 @@
 
   // Our default compiler options. Individual tests can override these.
   var defaultOptions = ['--no-source-map', '--no-summarize'];
-  var compileArgParser = new ArgParser();
+  var compileArgParser = ArgParser();
   defineAnalysisArguments(compileArgParser, ddc: true);
   AnalyzerOptions.addArguments(compileArgParser);
   CompilerOptions.addArguments(compileArgParser);
   addModuleFormatOptions(compileArgParser);
 
   var testFileOptionsMatcher =
-      new RegExp(r'// (compile options: |SharedOptions=)(.*)', multiLine: true);
+      RegExp(r'// (compile options: |SharedOptions=)(.*)', multiLine: true);
 
   // Ignore dart2js options that we don't support in DDC.
   var ignoreOptions = [
@@ -122,7 +122,7 @@
     var name = path.withoutExtension(relativePath);
     test('dartdevc $name', () {
       // Check if we need to use special compile options.
-      var contents = new File(testFile).readAsStringSync();
+      var contents = File(testFile).readAsStringSync();
       var match = testFileOptionsMatcher.firstMatch(contents);
 
       var args = defaultOptions.toList();
@@ -132,22 +132,22 @@
       }
 
       ArgResults argResults = compileArgParser.parse(args);
-      var analyzerOptions = new AnalyzerOptions.fromArguments(argResults,
+      var analyzerOptions = AnalyzerOptions.fromArguments(argResults,
           dartSdkSummaryPath: sdkSummaryFile, summaryPaths: summaryPaths);
 
-      var options = new CompilerOptions.fromArguments(argResults);
+      var options = CompilerOptions.fromArguments(argResults);
 
       var moduleFormat = parseModuleFormatOption(argResults).first;
 
       // Collect any other files we've imported.
-      var files = new Set<String>();
+      var files = Set<String>();
       _collectTransitiveImports(contents, files, from: testFile);
-      var unit = new BuildUnit(
+      var unit = BuildUnit(
           name, path.dirname(testFile), files.toList(), _moduleForLibrary);
 
       var compiler = sharedCompiler;
       if (analyzerOptions.declaredVariables.isNotEmpty) {
-        compiler = new ModuleCompiler(analyzerOptions);
+        compiler = ModuleCompiler(analyzerOptions);
       }
       JSModuleFile module = null;
       var exception, stackTrace;
@@ -220,14 +220,14 @@
 
   String errors = result.errors.join('\n');
   if (errors.isNotEmpty && !errors.endsWith('\n')) errors += '\n';
-  new File(outPath + '.txt').writeAsStringSync(errors);
+  File(outPath + '.txt').writeAsStringSync(errors);
 
   if (result.isValid) {
     result.writeCodeSync(format, outPath + '.js');
   }
 
   if (result.summaryBytes != null) {
-    new File(outPath + '.sum').writeAsBytesSync(result.summaryBytes);
+    File(outPath + '.sum').writeAsBytesSync(result.summaryBytes);
   }
 
   // Write the expectation file if needed.
@@ -236,7 +236,7 @@
   if (expectPath != null) {
     _ensureDirectory(path.dirname(expectPath));
 
-    var expectFile = new File(expectPath + '.js');
+    var expectFile = File(expectPath + '.js');
     if (result.isValid) {
       result.writeCodeSync(format, expectFile.path);
     } else {
@@ -251,8 +251,8 @@
   var files = ['sunflower', 'circle', 'painter']
       .map((f) => path.join(baseDir, '$f.dart'))
       .toList();
-  var input = new BuildUnit('sunflower', baseDir, files, _moduleForLibrary);
-  var options = new CompilerOptions(summarizeApi: false);
+  var input = BuildUnit('sunflower', baseDir, files, _moduleForLibrary);
+  var options = CompilerOptions(summarizeApi: false);
 
   var built = compiler.compile(input, options);
   _writeModule(path.join(outputDir, 'sunflower', 'sunflower'),
@@ -264,7 +264,7 @@
   if (scheme == 'package') {
     return source.uri.pathSegments.first;
   }
-  throw new Exception('Module not found for library "${source.fullName}"');
+  throw Exception('Module not found for library "${source.fullName}"');
 }
 
 void _writeRuntimeStatus(Map<String, Set<Expectation>> testFiles) {
@@ -294,7 +294,7 @@
 
     runtimeStatus[name] = status.map((s) => '$s').join(',');
   });
-  new File(path.join(codegenOutputDir, 'test_status.js')).writeAsStringSync('''
+  File(path.join(codegenOutputDir, 'test_status.js')).writeAsStringSync('''
 define([], function() {
   'use strict';
   return ${new JsonEncoder.withIndent(' ').convert(runtimeStatus)};
@@ -316,17 +316,17 @@
           'tests', dirParts[0] + suffix, path.joinAll(dirParts.skip(1)));
       var inputPath = path.join(testDirectory, '..', '..', '..', sdkTestDir);
 
-      if (!new Directory(inputPath).existsSync()) continue;
+      if (!Directory(inputPath).existsSync()) continue;
 
       var browsers = Platform.environment['DDC_BROWSERS'];
       var runtime = browsers == 'Firefox' ? 'firefox' : 'chrome';
-      var config = new OptionsParser()
+      var config = OptionsParser()
           .parse('-m release -c dartdevc --use-sdk --strong'.split(' ')
             ..addAll(['-r', runtime, '--suite_dir', sdkTestDir]))
           .single;
 
-      var testSuite = new StandardTestSuite.forDirectory(
-          config, new test_dart.Path(sdkTestDir));
+      var testSuite =
+          StandardTestSuite.forDirectory(config, test_dart.Path(sdkTestDir));
       var expectations = testSuite.readExpectations();
 
       for (var file in _listFiles(inputPath, recursive: true)) {
@@ -347,10 +347,10 @@
               // integration.
               contents += '\nfinal _usesUnittestPackage = true;\n';
             }
-            new File(outputPath).writeAsStringSync(contents);
+            File(outputPath).writeAsStringSync(contents);
           }
 
-          var contents = new File(file).readAsStringSync();
+          var contents = File(file).readAsStringSync();
           if (isMultiTest(contents)) {
             // It's a multitest, so expand it and add all of the variants.
             var tests = <String, String>{};
@@ -378,7 +378,7 @@
           _writeTest(outputPath, contents);
         } else {
           // Copy the non-test file over, in case it is used as an import.
-          new File(file).copySync(outputPath);
+          File(file).copySync(outputPath);
         }
       }
     }
@@ -389,9 +389,9 @@
     var relativePath = path.relative(file, from: codegenDir);
     var outputPath = path.join(codegenTestDir, relativePath);
 
-    new File(file).copySync(outputPath);
+    File(file).copySync(outputPath);
     if (file.endsWith(".dart")) {
-      testFiles[outputPath] = new Set()..add(Expectation.pass);
+      testFiles[outputPath] = Set()..add(Expectation.pass);
     }
   }
 
@@ -400,12 +400,12 @@
 
 /// Recursively creates [dir] if it doesn't exist.
 void _ensureDirectory(String dir) {
-  new Directory(dir).createSync(recursive: true);
+  Directory(dir).createSync(recursive: true);
 }
 
 /// Lists all of the files within [dir] that match [filePattern].
-Iterable<String> _listFiles(String dir, {bool recursive: false}) {
-  return new Directory(dir)
+Iterable<String> _listFiles(String dir, {bool recursive = false}) {
+  return Directory(dir)
       .listSync(recursive: recursive, followLinks: false)
       .where((e) => e is File && filePattern.hasMatch(e.path))
       .map((f) => f.path);
@@ -433,7 +433,7 @@
         continue;
       }
 
-      var f = new File(path.join(path.dirname(from), uri));
+      var f = File(path.join(path.dirname(from), uri));
       if (f.existsSync()) {
         _collectTransitiveImports(f.readAsStringSync(), libraries,
             packageRoot: packageRoot, from: f.path);
diff --git a/pkg/dev_compiler/test/js/builder_test.dart b/pkg/dev_compiler/test/js/builder_test.dart
index 6604d4a..d294048 100644
--- a/pkg/dev_compiler/test/js/builder_test.dart
+++ b/pkg/dev_compiler/test/js/builder_test.dart
@@ -1,10 +1,10 @@
 import 'package:dev_compiler/src/js_ast/js_ast.dart';
 import 'package:test/test.dart';
 
-final _prenumberedPlaceholders = new RegExp(r'#\d+');
+final _prenumberedPlaceholders = RegExp(r'#\d+');
 
 MiniJsParser _parser(String src) =>
-    new MiniJsParser(src.replaceAll(_prenumberedPlaceholders, '#'));
+    MiniJsParser(src.replaceAll(_prenumberedPlaceholders, '#'));
 
 _check(Node node, String expected) =>
     expect(node.toString(), 'js_ast `$expected`');
diff --git a/pkg/dev_compiler/test/multitest.dart b/pkg/dev_compiler/test/multitest.dart
index 18a4391..f498744 100644
--- a/pkg/dev_compiler/test/multitest.dart
+++ b/pkg/dev_compiler/test/multitest.dart
@@ -6,7 +6,7 @@
 // dart-lang/sdk/tools/testing/dart/multitest.dart
 library dev_compiler.test.tools.multitest;
 
-final validMultitestOutcomes = new Set<String>.from([
+final validMultitestOutcomes = Set<String>.from([
   'ok',
   'compile-time error',
   'runtime error',
@@ -22,9 +22,9 @@
 
 // Require at least one non-space character before '//#'
 // Handle both //# and the legacy /// multitest regexp patterns.
-final _multiTestRegExp = new RegExp(r"\S *//[#/] \w+:(.*)");
+final _multiTestRegExp = RegExp(r"\S *//[#/] \w+:(.*)");
 
-final _multiTestRegExpSeperator = new RegExp(r"//[#/]");
+final _multiTestRegExpSeperator = RegExp(r"//[#/]");
 
 bool isMultiTest(String contents) => _multiTestRegExp.hasMatch(contents);
 
@@ -91,25 +91,25 @@
 
   // Create the set of multitests, which will have a new test added each
   // time we see a multitest line with a new key.
-  var testsAsLines = new Map<String, List<String>>();
-  var outcomes = new Map<String, Set<String>>();
+  var testsAsLines = Map<String, List<String>>();
+  var outcomes = Map<String, Set<String>>();
 
   // Add the default case with key "none".
-  testsAsLines['none'] = new List<String>();
-  outcomes['none'] = new Set<String>();
+  testsAsLines['none'] = List<String>();
+  outcomes['none'] = Set<String>();
 
   int lineCount = 0;
   for (String line in lines) {
     lineCount++;
-    var annotation = new _Annotation.from(line);
+    var annotation = _Annotation.from(line);
     if (annotation != null) {
       testsAsLines.putIfAbsent(
-          annotation.key, () => new List<String>.from(testsAsLines["none"]));
+          annotation.key, () => List<String>.from(testsAsLines["none"]));
       // Add line to test with annotation.key as key, empty line to the rest.
       for (var key in testsAsLines.keys) {
         testsAsLines[key].add(annotation.key == key ? line : "");
       }
-      outcomes.putIfAbsent(annotation.key, () => new Set<String>());
+      outcomes.putIfAbsent(annotation.key, () => Set<String>());
       if (annotation.rest != 'continued') {
         for (String nextOutcome in annotation.outcomesList) {
           if (validMultitestOutcomes.contains(nextOutcome)) {
@@ -178,7 +178,7 @@
       return null;
     }
 
-    var annotation = new _Annotation();
+    var annotation = _Annotation();
     annotation.key = parts[0];
     annotation.rest = parts[1];
     annotation.outcomesList =
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index dadc9018..4a986e2 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -469,7 +469,7 @@
 /// inference.
 Future expectNotNull(String code, String expectedNotNull) async {
   var component = await kernelCompile(code);
-  var collector = new NotNullCollector();
+  var collector = NotNullCollector();
   component.accept(collector);
   var actualNotNull =
       collector.notNullExpressions.map((e) => e.toString()).join(', ');
@@ -478,7 +478,7 @@
 
 /// Given the Dart [code], expects all the expressions inferred to be not-null.
 Future expectAllNotNull(String code) async {
-  (await kernelCompile(code)).accept(new ExpectAllNotNull());
+  (await kernelCompile(code)).accept(ExpectAllNotNull());
 }
 
 bool useAnnotations = false;
@@ -489,9 +489,8 @@
 
   @override
   visitComponent(Component node) {
-    inference ??= new NullableInference(new JSTypeRep(
-      new TypeSchemaEnvironment(
-          new CoreTypes(node), new ClassHierarchy(node), true),
+    inference ??= NullableInference(JSTypeRep(
+      TypeSchemaEnvironment(CoreTypes(node), ClassHierarchy(node), true),
     ));
 
     if (useAnnotations) {
@@ -543,7 +542,7 @@
 }
 
 fe.InitializedCompilerState _compilerState;
-final _fileSystem = new MemoryFileSystem(new Uri.file('/memory/'));
+final _fileSystem = MemoryFileSystem(Uri.file('/memory/'));
 
 Future<Component> kernelCompile(String code) async {
   var succeeded = true;
@@ -553,17 +552,17 @@
     }
   }
 
-  var sdkUri = new Uri.file('/memory/dart_sdk.dill');
+  var sdkUri = Uri.file('/memory/dart_sdk.dill');
   var sdkFile = _fileSystem.entityForUri(sdkUri);
   if (!await sdkFile.exists()) {
-    sdkFile.writeAsBytesSync(new File(defaultSdkSummaryPath).readAsBytesSync());
+    sdkFile.writeAsBytesSync(File(defaultSdkSummaryPath).readAsBytesSync());
   }
-  var packagesUri = new Uri.file('/memory/.packages');
+  var packagesUri = Uri.file('/memory/.packages');
   var packagesFile = _fileSystem.entityForUri(packagesUri);
   if (!await packagesFile.exists()) {
     packagesFile.writeAsStringSync('meta:/memory/meta/lib');
     _fileSystem
-        .entityForUri(new Uri.file('/memory/meta/lib/meta.dart'))
+        .entityForUri(Uri.file('/memory/meta/lib/meta.dart'))
         .writeAsStringSync('''
 class _NotNull { const _NotNull(); }
 const notNull = const _NotNull();
@@ -572,10 +571,10 @@
     ''');
   }
 
-  var mainUri = new Uri.file('/memory/test.dart');
+  var mainUri = Uri.file('/memory/test.dart');
   _fileSystem.entityForUri(mainUri).writeAsStringSync(code);
   _compilerState = await fe.initializeCompiler(
-      _compilerState, sdkUri, packagesUri, [], new DevCompilerTarget(),
+      _compilerState, sdkUri, packagesUri, [], DevCompilerTarget(),
       fileSystem: _fileSystem);
   fe.DdcResult result =
       await fe.compile(_compilerState, [mainUri], errorHandler);
diff --git a/pkg/dev_compiler/test/options/options_test.dart b/pkg/dev_compiler/test/options/options_test.dart
index 73da211..c553d95 100644
--- a/pkg/dev_compiler/test/options/options_test.dart
+++ b/pkg/dev_compiler/test/options/options_test.dart
@@ -24,20 +24,20 @@
 
 main() {
   test('basic', () {
-    var options = new AnalyzerOptions.basic();
-    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
+    var options = AnalyzerOptions.basic();
+    var compiler = ModuleCompiler(options, analysisRoot: optionsDir);
     var processors = compiler.context.analysisOptions.errorProcessors;
     expect(processors, hasLength(1));
     expect(processors[0].code, CompileTimeErrorCode.UNDEFINED_CLASS.name);
   });
 
   test('basic sdk summary', () {
-    expect(new File(sdkSummaryFile).existsSync(), isTrue);
-    var options = new AnalyzerOptions.basic(dartSdkSummaryPath: sdkSummaryFile);
-    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
+    expect(File(sdkSummaryFile).existsSync(), isTrue);
+    var options = AnalyzerOptions.basic(dartSdkSummaryPath: sdkSummaryFile);
+    var compiler = ModuleCompiler(options, analysisRoot: optionsDir);
     var context = compiler.context;
     var sdk = context.sourceFactory.dartSdk;
-    expect(sdk, new isInstanceOf<SummaryBasedDartSdk>());
+    expect(sdk, isInstanceOf<SummaryBasedDartSdk>());
     var processors = context.analysisOptions.errorProcessors;
     expect(processors, hasLength(1));
     expect(processors[0].code, CompileTimeErrorCode.UNDEFINED_CLASS.name);
@@ -48,8 +48,8 @@
     //TODO(danrubel) remove sdkSummaryArgs once all SDKs have summary file
     args.addAll(sdkSummaryArgs);
     var argResults = ddcArgParser().parse(args);
-    var options = new AnalyzerOptions.fromArguments(argResults);
-    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
+    var options = AnalyzerOptions.fromArguments(argResults);
+    var compiler = ModuleCompiler(options, analysisRoot: optionsDir);
     var processors = compiler.context.analysisOptions.errorProcessors;
     expect(processors, hasLength(1));
     expect(processors[0].code, CompileTimeErrorCode.UNDEFINED_CLASS.name);
@@ -57,13 +57,13 @@
 
   test('fromArgs options file 2', () {
     var optionsFile2 = path.join(optionsDir, 'analysis_options_2.yaml');
-    expect(new File(optionsFile2).existsSync(), isTrue);
+    expect(File(optionsFile2).existsSync(), isTrue);
     var args = <String>['--$analysisOptionsFileOption', optionsFile2];
     //TODO(danrubel) remove sdkSummaryArgs once all SDKs have summary file
     args.addAll(sdkSummaryArgs);
     var argResults = ddcArgParser().parse(args);
-    var options = new AnalyzerOptions.fromArguments(argResults);
-    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
+    var options = AnalyzerOptions.fromArguments(argResults);
+    var compiler = ModuleCompiler(options, analysisRoot: optionsDir);
     var processors = compiler.context.analysisOptions.errorProcessors;
     expect(processors, hasLength(1));
     expect(processors[0].code, CompileTimeErrorCode.DUPLICATE_DEFINITION.name);
@@ -78,7 +78,7 @@
     ];
 
     var argResults = ddcArgParser().parse(args);
-    var options = new AnalyzerOptions.fromArguments(argResults);
+    var options = AnalyzerOptions.fromArguments(argResults);
     expect(options.summaryPaths,
         orderedEquals(['normal', 'custom/path', 'another', 'custom/path2']));
     expect(options.customSummaryModules['custom/path'], equals('module'));
diff --git a/pkg/dev_compiler/test/sourcemap/common.dart b/pkg/dev_compiler/test/sourcemap/common.dart
index 3170c17..c934036 100644
--- a/pkg/dev_compiler/test/sourcemap/common.dart
+++ b/pkg/dev_compiler/test/sourcemap/common.dart
@@ -38,7 +38,7 @@
   String get name => "setup";
 
   Future<Result<Data>> run(TestDescription input, ChainContext context) async {
-    Data data = new Data()..uri = input.uri;
+    Data data = Data()..uri = input.uri;
     if (context is ChainContextWithCleanupHelper) {
       context.cleanupHelper[input] = data;
     }
@@ -89,7 +89,7 @@
   var outerDir = sdkRoot.path;
   for (var outDir in const ["out/ReleaseX64", "xcodebuild/ReleaseX64"]) {
     var tryPath = path.join(outerDir, outDir, relative);
-    File file = new File(tryPath);
+    File file = File(tryPath);
     if (file.existsSync()) return file;
   }
   throw "Couldn't find $relative. Try building more targets.";
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 4efd79a..afb62f9 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -32,15 +32,15 @@
   String get name => "compile";
 
   Future<Result<Data>> run(Data data, ChainContext context) async {
-    var dartScriptAbsolute = new File.fromUri(data.uri).absolute;
+    var dartScriptAbsolute = File.fromUri(data.uri).absolute;
     var inputFile = dartScriptAbsolute.path;
 
     data.outDir = await Directory.systemTemp.createTemp("ddc_step_test");
-    data.code = new AnnotatedCode.fromText(
-        new File(inputFile).readAsStringSync(), commentStart, commentEnd);
+    data.code = AnnotatedCode.fromText(
+        File(inputFile).readAsStringSync(), commentStart, commentEnd);
     var outDirUri = data.outDir.uri;
     var testFile = outDirUri.resolve("test.dart");
-    new File.fromUri(testFile).writeAsStringSync(data.code.sourceCode);
+    File.fromUri(testFile).writeAsStringSync(data.code.sourceCode);
     var outputFilename = "js.js";
     var outputFile = outDirUri.resolve(outputFilename);
     var outWrapperPath = outDirUri.resolve("wrapper.js");
@@ -62,7 +62,7 @@
 
   Future<Result<Data>> run(Data data, ChainContext context) async {
     data.outDir = await Directory.systemTemp.createTemp("stacktrace-test");
-    String code = await new File.fromUri(data.uri).readAsString();
+    String code = await File.fromUri(data.uri).readAsString();
     Test test = processTestCode(code, knownMarkers);
     await testStackTrace(test, marker, _compile,
         jsPreambles: _getPreambles,
@@ -74,15 +74,15 @@
   }
 
   Future<bool> _compile(String input, String output) async {
-    var outWrapperPath = _getWrapperPathFromDirectoryFile(new Uri.file(input));
-    await runner.run(new Uri.file(input), new Uri.file(output), outWrapperPath);
+    var outWrapperPath = _getWrapperPathFromDirectoryFile(Uri.file(input));
+    await runner.run(Uri.file(input), Uri.file(output), outWrapperPath);
     return true;
   }
 
   List<String> _getPreambles(String input, String output) {
     return [
       '--module',
-      _getWrapperPathFromDirectoryFile(new Uri.file(input)).toFilePath(),
+      _getWrapperPathFromDirectoryFile(Uri.file(input)).toFilePath(),
       '--'
     ];
   }
@@ -108,7 +108,7 @@
 Directory _cachedDdcDir;
 Directory getDdcDir() {
   Directory search() {
-    Directory dir = new File.fromUri(Platform.script).parent;
+    Directory dir = File.fromUri(Platform.script).parent;
     Uri dirUrl = dir.uri;
     if (dirUrl.pathSegments.contains("dev_compiler")) {
       for (int i = dirUrl.pathSegments.length - 2; i >= 0; --i) {
@@ -151,10 +151,9 @@
   String jsRootDart =
       "/root_dart/${new File(path.relative(sdkJsFile.path, from: sdkPath.path))
       .uri}";
-  new File.fromUri(outputFile.resolve("$outputFilename.html.js"))
-      .writeAsStringSync(
-          jsContent.replaceFirst("from 'dart_sdk'", "from '$jsRootDart'"));
-  new File.fromUri(outputFile.resolve("$outputFilename.html.html"))
+  File.fromUri(outputFile.resolve("$outputFilename.html.js")).writeAsStringSync(
+      jsContent.replaceFirst("from 'dart_sdk'", "from '$jsRootDart'"));
+  File.fromUri(outputFile.resolve("$outputFilename.html.html"))
       .writeAsStringSync(getWrapperHtmlContent(
           jsRootDart, "/root_build/$outputFilename.html.js"));
 
@@ -192,6 +191,6 @@
 Uri selfUri = currentMirrorSystem()
     .findLibrary(#dev_compiler.test.sourcemap.ddc_common)
     .uri;
-String d8Preambles = new File.fromUri(
+String d8Preambles = File.fromUri(
         selfUri.resolve('../../tool/input_sdk/private/preambles/d8.js'))
     .readAsStringSync();
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
index 29e48cf..729cca6 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
@@ -12,7 +12,7 @@
 
 Future<ChainContext> createContext(
     Chain suite, Map<String, String> environment) async {
-  return new SourceMapContext(environment);
+  return SourceMapContext(environment);
 }
 
 class SourceMapContext extends ChainContextWithCleanupHelper {
@@ -23,9 +23,9 @@
 
   List<Step> get steps => _steps ??= <Step>[
         const Setup(),
-        new Compile(new DevCompilerRunner(environment.containsKey("debug"))),
+        Compile(DevCompilerRunner(environment.containsKey("debug"))),
         const StepWithD8(),
-        new CheckSteps(environment.containsKey("debug")),
+        CheckSteps(environment.containsKey("debug")),
       ];
 
   bool debugging() => environment.containsKey("debug");
@@ -66,8 +66,8 @@
           "${args.reduce((value, element) => '$value "$element"')}";
     }
 
-    var jsContent = new File.fromUri(outputFile).readAsStringSync();
-    new File.fromUri(outputFile).writeAsStringSync(jsContent.replaceFirst(
+    var jsContent = File.fromUri(outputFile).readAsStringSync();
+    File.fromUri(outputFile).writeAsStringSync(jsContent.replaceFirst(
         "from 'dart_sdk'", "from '${uriPathForwardSlashed(jsSdkPath)}'"));
 
     if (debugging) {
@@ -78,7 +78,7 @@
     var inputFileName = inputFile.pathSegments.last;
     var inputFileNameNoExt =
         inputFileName.substring(0, inputFileName.lastIndexOf("."));
-    new File.fromUri(outWrapperFile).writeAsStringSync(
+    File.fromUri(outWrapperFile).writeAsStringSync(
         getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
   }
 }
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index 0870331..bb23866 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -15,7 +15,7 @@
 
 Future<ChainContext> createContext(
     Chain suite, Map<String, String> environment) async {
-  return new SourceMapContext(environment);
+  return SourceMapContext(environment);
 }
 
 class SourceMapContext extends ChainContextWithCleanupHelper
@@ -30,9 +30,9 @@
   List<Step> get steps {
     return _steps ??= <Step>[
       const Setup(),
-      new Compile(new DevCompilerRunner(this, debugging())),
+      Compile(DevCompilerRunner(this, debugging())),
       const StepWithD8(),
-      new CheckSteps(debugging()),
+      CheckSteps(debugging()),
     ];
   }
 
@@ -82,8 +82,8 @@
           "${args.reduce((value, element) => '$value "$element"')}";
     }
 
-    var jsContent = new File.fromUri(outputFile).readAsStringSync();
-    new File.fromUri(outputFile).writeAsStringSync(jsContent.replaceFirst(
+    var jsContent = File.fromUri(outputFile).readAsStringSync();
+    File.fromUri(outputFile).writeAsStringSync(jsContent.replaceFirst(
         "from 'dart_sdk'", "from '${uriPathForwardSlashed(jsSdkPath)}'"));
 
     if (debugging) {
@@ -94,7 +94,7 @@
     var inputFileName = inputFile.pathSegments.last;
     var inputFileNameNoExt =
         inputFileName.substring(0, inputFileName.lastIndexOf("."));
-    new File.fromUri(outWrapperFile).writeAsStringSync(
+    File.fromUri(outWrapperFile).writeAsStringSync(
         getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
   }
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
index d612c00..c4b1fae 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
@@ -6,7 +6,7 @@
 
 Future<ChainContext> createContext(
     Chain suite, Map<String, String> environment) async {
-  return new StackTraceContext();
+  return StackTraceContext();
 }
 
 class StackTraceContext extends ChainContextWithCleanupHelper {
@@ -14,7 +14,7 @@
     const Setup(),
     const SetCwdToSdkRoot(),
     const TestStackTrace(
-        const ddc.DevCompilerRunner(false), "ddc.", const ["ddc.", "ddk."]),
+        ddc.DevCompilerRunner(false), "ddc.", ["ddc.", "ddk."]),
   ];
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
index b300829..65fb257 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
@@ -7,7 +7,7 @@
 
 Future<ChainContext> createContext(
     Chain suite, Map<String, String> environment) async {
-  return new StackTraceContext();
+  return StackTraceContext();
 }
 
 class StackTraceContext extends ChainContextWithCleanupHelper
@@ -20,8 +20,8 @@
     return _steps ??= <Step>[
       const Setup(),
       const SetCwdToSdkRoot(),
-      new TestStackTrace(new ddk.DevCompilerRunner(this, false), "ddk.",
-          const ["ddk.", "ddc."]),
+      TestStackTrace(
+          ddk.DevCompilerRunner(this, false), "ddk.", const ["ddk.", "ddc."]),
     ];
   }
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart
index a92e371..a624b2e 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  /*1:main*/ test(new Class());
+  /*1:main*/ test(Class());
 }
 
 test(c) {
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart
index 298a7b5..21fc03c 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart
@@ -9,7 +9,7 @@
 main() {
   confuse('').trim(); // includes some code above the interceptors
   confuse([]).length;
-  confuse(new MyType()).length;
+  confuse(MyType()).length;
   confuse(null). /*1:main*/ length; // called through the interceptor
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart
index 9ef071d..fde3136 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart
@@ -4,7 +4,7 @@
 
 main() {
   // ignore: UNUSED_LOCAL_VARIABLE
-  var c = /*ddc.1:main*/ new /*ddk.1:main*/ Class();
+  var /*ddc.1:main*/ c = /*ddk.1:main*/ Class();
 }
 
 class Class {
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
index c3cf435..907777c 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
@@ -9,7 +9,7 @@
 
 test /*ddk.2:test*/ () /*ddc.2:test*/ async {
   // ignore: UNUSED_LOCAL_VARIABLE
-  var c = new /*3:test*/ Class();
+  var c = /*3:test*/ Class();
 }
 
 class Class {
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart
index 8b08113..4261c48 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  var c = new Class();
+  var c = Class();
   c. /*1:main*/ test();
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart b/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart
index 785c76b..69b242d 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  /* bl */ var foo = new /*sl:1*/ Foo();
+  /* bl */ var foo = /*sl:1*/ Foo();
   foo.foo = foo. /*sl:2*/ fooMethod;
   foo /*sl:3*/ .fooMethod();
   // Stepping into this doesn't really work because what it does is something
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart b/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart
index 430f29c..31e4aa7 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart
@@ -4,7 +4,7 @@
 
 main() {
   /*bl*/
-  Foo foo = new Foo();
+  Foo foo = Foo();
   foo.foo();
   /*nbb:0:1*/
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
index ff8c7cd..b84e3fa 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
@@ -21,7 +21,7 @@
 }
 
 main() {
-  Class3 c = new Class3();
+  Class3 c = Class3();
   c[42];
   c.code();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart
index 4dc4f138..d529139 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart
@@ -14,7 +14,7 @@
 }
 
 main() {
-  Class2 c = new Class2();
+  Class2 c = Class2();
   c[42];
   c.code();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart
index 5bf49df..c3d7835 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart
@@ -14,7 +14,7 @@
 }
 
 main() {
-  /*bl*/ /*sl:1*/ Class2 c = new Class2();
+  /*bl*/ /*sl:1*/ Class2 c = Class2();
   c /*sl:2*/ [42];
   c /*sl:3*/ .code();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart
index c06c0a5..f6b3b13 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart
@@ -4,7 +4,7 @@
 
 main() {
   // ignore: unused_local_variable
-  Foo foo = new Foo();
+  Foo foo = Foo();
 }
 
 class Foo {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart
index 934da67..26508de 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  Foo foo = new Foo();
+  Foo foo = Foo();
   foo.foo();
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart
index ba99e1c..0233caa4 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  Foo foo = new Foo();
+  Foo foo = Foo();
   foo.foo();
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart
index 1ee465e..32ddfc4 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart
@@ -4,7 +4,7 @@
 
 main() {
   // ignore: unused_local_variable
-  Foo foo = new Foo.named();
+  Foo foo = Foo.named();
 }
 
 class Foo {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart
index 671bbf0..8bf01a3 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart
@@ -5,12 +5,12 @@
 /*Debugger:stepOver*/
 main() {
   /*bl*/
-  /*sl:1*/ Foo foo = new Foo(1, 2);
+  /*sl:1*/ Foo foo = Foo(1, 2);
   /*sl:2*/ print(foo.x);
   /*sl:3*/ print(foo.y);
   /*sl:4*/ print(foo.z);
 
-  /*sl:5*/ foo = new Foo.named();
+  /*sl:5*/ foo = Foo.named();
   /*sl:6*/ print(foo.x);
   /*sl:7*/ print(foo.y);
   /*sl:8*/ print(foo.z);
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart
index f4f9d6f..f3f17c1 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart
@@ -5,7 +5,7 @@
 /*nb*/
 main() {
   /*bl*/
-  Foo foo = new /*sl:1*/ Foo(1, 2);
+  Foo foo = /*sl:1*/ Foo(1, 2);
   /*s:5*/ print(foo.x);
   /*s:6*/ print(foo.y);
   /*s:7*/ print(foo.z);
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
index 20ad5ea..061bfde 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  Bar bar = new Bar();
+  Bar bar = Bar();
   bar.doStuff();
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart b/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart
index da061d2..8bcca4b 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  new Foo();
+  Foo();
   // Comment to push the ending brace back a bit.
 /*s:2*/
 }
diff --git a/pkg/dev_compiler/test/worker/worker_test.dart b/pkg/dev_compiler/test/worker/worker_test.dart
index d4caa69..dd4b5cc 100644
--- a/pkg/dev_compiler/test/worker/worker_test.dart
+++ b/pkg/dev_compiler/test/worker/worker_test.dart
@@ -13,7 +13,7 @@
 import 'package:path/path.dart' show join, joinAll;
 import 'package:test/test.dart';
 
-File file(String path) => new File(joinAll(path.split('/'))).absolute;
+File file(String path) => File(joinAll(path.split('/'))).absolute;
 
 main() {
   var dartdevc = join('bin', 'dartdevc.dart');
@@ -49,9 +49,9 @@
     test('can compile in worker mode', () async {
       var args = executableArgs.toList()..add('--persistent_worker');
       var process = await Process.start(Platform.executable, args);
-      var messageGrouper = new AsyncMessageGrouper(process.stdout);
+      var messageGrouper = AsyncMessageGrouper(process.stdout);
 
-      var request = new WorkRequest();
+      var request = WorkRequest();
       request.arguments.addAll(compilerArgs);
       process.stdin.add(protoToDelimitedBuffer(request));
 
@@ -89,7 +89,7 @@
     });
 
     test('unknown options', () {
-      var args = new List<String>.from(executableArgs)
+      var args = List<String>.from(executableArgs)
         ..add('--does-not-exist')
         ..addAll(compilerArgs);
       var result = Process.runSync(Platform.executable, args);
@@ -102,7 +102,7 @@
     });
 
     test('unknown options ignored', () {
-      var args = new List<String>.from(executableArgs)
+      var args = List<String>.from(executableArgs)
         ..add('--does-not-exist')
         ..add('--ignore-unrecognized-flags')
         ..addAll(compilerArgs);
@@ -367,7 +367,7 @@
 Future<WorkResponse> _readResponse(MessageGrouper messageGrouper) async {
   var buffer = (await messageGrouper.next) as List<int>;
   try {
-    return new WorkResponse.fromBuffer(buffer);
+    return WorkResponse.fromBuffer(buffer);
   } catch (_) {
     var bufferAsString =
         buffer == null ? '' : 'String: ${utf8.decode(buffer)}\n';
diff --git a/pkg/dev_compiler/tool/build_pkgs.dart b/pkg/dev_compiler/tool/build_pkgs.dart
index 57c7e30..1f083fe 100755
--- a/pkg/dev_compiler/tool/build_pkgs.dart
+++ b/pkg/dev_compiler/tool/build_pkgs.dart
@@ -38,7 +38,7 @@
 /// summaries for the test packages against that SDK summary. Otherwise, skips
 /// generating kernel summaries.
 Future main(List<String> arguments) async {
-  var argParser = new ArgParser();
+  var argParser = ArgParser();
   argParser.addOption("analyzer-sdk",
       help: "Path to SDK analyzer summary '.sum' file");
   argParser.addOption("kernel-sdk",
@@ -129,7 +129,7 @@
     {List<String> libs = const [], List<String> deps = const []}) async {
   makeArgs(bool kernel) {
     var pkgDirectory = p.join(outputDirectory, kernel ? 'pkg_kernel' : 'pkg');
-    new Directory(pkgDirectory).createSync(recursive: true);
+    Directory(pkgDirectory).createSync(recursive: true);
 
     var args = [
       '--dart-sdk-summary=${kernel ? kernelSummary : analyzerSummary}',
diff --git a/pkg/dev_compiler/tool/global_compile.dart b/pkg/dev_compiler/tool/global_compile.dart
index 1f344c5..ec294b5 100644
--- a/pkg/dev_compiler/tool/global_compile.dart
+++ b/pkg/dev_compiler/tool/global_compile.dart
@@ -15,7 +15,7 @@
 
 void main(List<String> args) {
   // Parse flags.
-  var parser = new ArgParser()
+  var parser = ArgParser()
     ..addOption('out',
         help: 'Output file (defaults to "out.js")',
         abbr: 'o',
@@ -64,8 +64,8 @@
   }
 
   // Compute the transitive closure
-  var total = new Stopwatch()..start();
-  var partial = new Stopwatch()..start();
+  var total = Stopwatch()..start();
+  var partial = Stopwatch()..start();
 
   // TODO(vsm): We're using the analyzer just to compute the import/export/part
   // dependence graph.  This is expensive.  Is there a lighterweight way to do
@@ -78,21 +78,20 @@
   print('Computed global build graph in $graphTime seconds');
 
   // Prepend Dart runtime files to the output
-  var out = new File(outfile);
+  var out = File(outfile);
   var dartLibrary =
-      new File(path.join(ddcPath, 'lib', 'js', 'legacy', 'dart_library.js'))
+      File(path.join(ddcPath, 'lib', 'js', 'legacy', 'dart_library.js'))
           .readAsStringSync();
   out.writeAsStringSync(dartLibrary);
-  var dartSdk =
-      new File(path.join(ddcPath, 'lib', 'js', 'legacy', 'dart_sdk.js'))
-          .readAsStringSync();
+  var dartSdk = File(path.join(ddcPath, 'lib', 'js', 'legacy', 'dart_sdk.js'))
+      .readAsStringSync();
   out.writeAsStringSync(dartSdk, mode: FileMode.APPEND);
 
   // Linearize module concatenation for deterministic output
-  var last = new Future.value();
+  var last = Future.value();
   for (var module in orderedModules) {
     linearizerMap[module] = last;
-    var completer = new Completer();
+    var completer = Completer();
     completerMap[module] = completer;
     last = completer.future;
   }
@@ -101,7 +100,7 @@
   var tmpdir = (tmp == null)
       ? Directory.systemTemp
           .createTempSync(outfile.replaceAll(path.separator, '__'))
-      : new Directory(tmp)
+      : Directory(tmp)
     ..createSync();
   for (var module in orderedModules) {
     var file = tmpdir.path + path.separator + module + '.js';
@@ -135,7 +134,7 @@
         print(result.stdout);
 
         // Schedule module append once the previous module is written
-        var codefile = new File(file);
+        var codefile = File(file);
         linearizerMap[module]
             .then((_) => codefile.readAsString())
             .then((code) =>
@@ -157,24 +156,24 @@
   });
 }
 
-final inputSet = new Set<String>();
-final dependenceMap = new Map<String, Set<String>>();
-final transitiveDependenceMap = new Map<String, Set<String>>();
-final fileMap = new Map<String, Set<String>>();
+final inputSet = Set<String>();
+final dependenceMap = Map<String, Set<String>>();
+final transitiveDependenceMap = Map<String, Set<String>>();
+final fileMap = Map<String, Set<String>>();
 
-final readyMap = new Map<String, Future>();
-final linearizerMap = new Map<String, Future>();
-final completerMap = new Map<String, Completer>();
+final readyMap = Map<String, Future>();
+final linearizerMap = Map<String, Future>();
+final completerMap = Map<String, Completer>();
 
-final orderedModules = new List<String>();
-final visitedModules = new Set<String>();
+final orderedModules = List<String>();
+final visitedModules = Set<String>();
 
 void orderModules(
     [String module = ENTRY, List<String> stack, Set<String> visited]) {
   if (stack == null) {
     assert(visited == null);
-    stack = new List<String>();
-    visited = new Set<String>();
+    stack = List<String>();
+    visited = Set<String>();
   }
   if (visited.contains(module)) return;
   visited.add(module);
@@ -196,7 +195,7 @@
 
 void computeTransitiveDependences() {
   for (var module in orderedModules) {
-    var transitiveSet = new Set<String>();
+    var transitiveSet = Set<String>();
     if (dependenceMap.containsKey(module)) {
       transitiveSet.addAll(dependenceMap[module]);
       for (var dependence in dependenceMap[module]) {
@@ -222,7 +221,7 @@
   inputSet.add(file);
 
   var module = getModule(file);
-  fileMap.putIfAbsent(module, () => new Set<String>());
+  fileMap.putIfAbsent(module, () => Set<String>());
   return fileMap[module].add(file);
 }
 
@@ -230,7 +229,7 @@
   var fromModule = getModule(from);
   var toModule = getModule(to);
   if (fromModule == toModule || toModule == 'dart') return;
-  dependenceMap.putIfAbsent(fromModule, () => new Set<String>());
+  dependenceMap.putIfAbsent(fromModule, () => Set<String>());
   dependenceMap[fromModule].add(toModule);
 }
 
@@ -259,7 +258,7 @@
   if (uri.startsWith('package:')) {
     uri = path.join(packageRoot, uri.substring(8));
   }
-  return new File(uri).readAsStringSync();
+  return File(uri).readAsStringSync();
 }
 
 void transitiveFiles(String entryPoint, String root, String packageRoot) {
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
index 8d7ad6e..6e5eb6d 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
@@ -119,7 +119,7 @@
     if (arguments == null) {
       return _wrapToDart(JS('', 'new #()', ctor));
     }
-    var unwrapped = new List.from(arguments.map(_convertToJS));
+    var unwrapped = List.from(arguments.map(_convertToJS));
     return _wrapToDart(JS('', 'new #(...#)', ctor, unwrapped));
   }
 
@@ -136,7 +136,7 @@
    */
   factory JsObject.fromBrowserObject(object) {
     if (object is num || object is String || object is bool || object == null) {
-      throw new ArgumentError("object cannot be a num, string, bool, or null");
+      throw ArgumentError("object cannot be a num, string, bool, or null");
     }
     return _wrapToDart(_convertToJS(object));
   }
@@ -152,13 +152,13 @@
    */
   factory JsObject.jsify(object) {
     if ((object is! Map) && (object is! Iterable)) {
-      throw new ArgumentError("object must be a Map or Iterable");
+      throw ArgumentError("object must be a Map or Iterable");
     }
     return _wrapToDart(_convertDataTree(object));
   }
 
   static _convertDataTree(data) {
-    var _convertedObjects = new HashMap.identity();
+    var _convertedObjects = HashMap.identity();
 
     _convert(o) {
       if (_convertedObjects.containsKey(o)) {
@@ -192,7 +192,7 @@
    */
   dynamic operator [](Object property) {
     if (property is! String && property is! num) {
-      throw new ArgumentError("property is not a String or num");
+      throw ArgumentError("property is not a String or num");
     }
     return _convertToDart(JS('', '#[#]', _jsObject, property));
   }
@@ -205,7 +205,7 @@
    */
   void operator []=(Object property, value) {
     if (property is! String && property is! num) {
-      throw new ArgumentError("property is not a String or num");
+      throw ArgumentError("property is not a String or num");
     }
     JS('', '#[#] = #', _jsObject, property, _convertToJS(value));
   }
@@ -223,7 +223,7 @@
    */
   bool hasProperty(property) {
     if (property is! String && property is! num) {
-      throw new ArgumentError("property is not a String or num");
+      throw ArgumentError("property is not a String or num");
     }
     return JS('bool', '# in #', property, _jsObject);
   }
@@ -235,7 +235,7 @@
    */
   void deleteProperty(property) {
     if (property is! String && property is! num) {
-      throw new ArgumentError("property is not a String or num");
+      throw ArgumentError("property is not a String or num");
     }
     JS('bool', 'delete #[#]', _jsObject, property);
   }
@@ -268,12 +268,12 @@
    */
   dynamic callMethod(method, [List args]) {
     if (method is! String && method is! num) {
-      throw new ArgumentError("method is not a String or num");
+      throw ArgumentError("method is not a String or num");
     }
-    if (args != null) args = new List.from(args.map(_convertToJS));
+    if (args != null) args = List.from(args.map(_convertToJS));
     var fn = JS('', '#[#]', _jsObject, method);
     if (JS('bool', 'typeof(#) !== "function"', fn)) {
-      throw new NoSuchMethodError(_jsObject, new Symbol(method), args, {});
+      throw NoSuchMethodError(_jsObject, Symbol(method), args, {});
     }
     return _convertToDart(JS('', '#.apply(#, #)', fn, _jsObject, args));
   }
@@ -288,7 +288,7 @@
    * with the value of this passed as the first argument.
    */
   factory JsFunction.withThis(Function f) {
-    return new JsFunction._fromJs(JS(
+    return JsFunction._fromJs(JS(
         '',
         'function(/*...arguments*/) {'
         '  let args = [#(this)];'
@@ -314,7 +314,7 @@
       '#.apply(#, #)',
       _jsObject,
       _convertToJS(thisArg),
-      args == null ? null : new List.from(args.map(_convertToJS))));
+      args == null ? null : List.from(args.map(_convertToJS))));
 }
 
 // TODO(jmesserly): this is totally unnecessary in dev_compiler.
@@ -336,22 +336,22 @@
 
   _checkIndex(int index) {
     if (index is int && (index < 0 || index >= length)) {
-      throw new RangeError.range(index, 0, length);
+      throw RangeError.range(index, 0, length);
     }
   }
 
   _checkInsertIndex(int index) {
     if (index is int && (index < 0 || index >= length + 1)) {
-      throw new RangeError.range(index, 0, length);
+      throw RangeError.range(index, 0, length);
     }
   }
 
   static _checkRange(int start, int end, int length) {
     if (start < 0 || start > length) {
-      throw new RangeError.range(start, 0, length);
+      throw RangeError.range(start, 0, length);
     }
     if (end < start || end > length) {
-      throw new RangeError.range(end, start, length);
+      throw RangeError.range(end, start, length);
     }
   }
 
@@ -382,7 +382,7 @@
     if (JS('bool', 'typeof # === "number" && (# >>> 0) === #', len, len, len)) {
       return JS('int', '#', len);
     }
-    throw new StateError('Bad JsArray length');
+    throw StateError('Bad JsArray length');
   }
 
   void set length(int length) {
@@ -398,7 +398,7 @@
   void addAll(Iterable<E> iterable) {
     var list = (JS('bool', '# instanceof Array', iterable))
         ? iterable
-        : new List.from(iterable);
+        : List.from(iterable);
     callMethod('push', list);
   }
 
@@ -413,7 +413,7 @@
   }
 
   E removeLast() {
-    if (length == 0) throw new RangeError(-1);
+    if (length == 0) throw RangeError(-1);
     return callMethod('pop') as E;
   }
 
@@ -426,7 +426,7 @@
     _checkRange(start, end, this.length);
     int length = end - start;
     if (length == 0) return;
-    if (skipCount < 0) throw new ArgumentError(skipCount);
+    if (skipCount < 0) throw ArgumentError(skipCount);
     var args = <Object>[start, length]
       ..addAll(iterable.skip(skipCount).take(length));
     callMethod('splice', args);
@@ -481,7 +481,7 @@
   } else {
     // TODO(jmesserly): for now, we wrap other objects, to keep compatibility
     // with the original dart:js behavior.
-    return _putIfAbsent(_jsProxies, o, (o) => new _DartObject(o));
+    return _putIfAbsent(_jsProxies, o, (o) => _DartObject(o));
   }
 }
 
@@ -507,7 +507,7 @@
     return o;
   } else if (JS('!', '# instanceof Date', o)) {
     num ms = JS('!', '#.getTime()', o);
-    return new DateTime.fromMillisecondsSinceEpoch(ms);
+    return DateTime.fromMillisecondsSinceEpoch(ms);
   } else if (o is _DartObject &&
       !identical(dart.getReifiedType(o), dart.jsobject)) {
     return o._dartObj;
@@ -520,12 +520,12 @@
 
 Object _wrapToDartHelper(o) {
   if (JS('bool', 'typeof # == "function"', o)) {
-    return new JsFunction._fromJs(o);
+    return JsFunction._fromJs(o);
   }
   if (JS('bool', '# instanceof Array', o)) {
-    return new JsArray._fromJs(o);
+    return JsArray._fromJs(o);
   }
-  return new JsObject._fromJs(o);
+  return JsObject._fromJs(o);
 }
 
 final _dartProxies = JS('', 'new WeakMap()');
@@ -557,7 +557,7 @@
 /// are more compatible with JavaScript.
 F allowInterop<F extends Function>(F f) => f;
 
-Expando<Function> _interopCaptureThisExpando = new Expando<Function>();
+Expando<Function> _interopCaptureThisExpando = Expando<Function>();
 
 /// Returns a [Function] that when called from JavaScript captures its 'this'
 /// binding and calls [f] with the value of this passed as the first argument.
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/js_util/dart2js/js_util_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/js_util/dart2js/js_util_dart2js.dart
index 0dfb1e5..b67c538 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/js_util/dart2js/js_util_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/js_util/dart2js/js_util_dart2js.dart
@@ -24,13 +24,13 @@
 /// JavaScript type, and all other objects are proxied.
 jsify(object) {
   if ((object is! Map) && (object is! Iterable)) {
-    throw new ArgumentError("object must be a Map or Iterable");
+    throw ArgumentError("object must be a Map or Iterable");
   }
   return _convertDataTree(object);
 }
 
 _convertDataTree(data) {
-  var _convertedObjects = new HashMap.identity();
+  var _convertedObjects = HashMap.identity();
 
   _convert(o) {
     if (_convertedObjects.containsKey(o)) {
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
index 1dabfb7..0c5a8a6 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
@@ -4,7 +4,8 @@
 
 // Patch file for the dart:async library.
 
-import 'dart:_js_helper' show patch, setTraceForException, ReifyFunctionTypes;
+import 'dart:_js_helper'
+    show notNull, patch, setTraceForException, ReifyFunctionTypes;
 import 'dart:_isolate_helper'
     show TimerImpl, global, leaveJsAsync, enterJsAsync;
 import 'dart:_foreign_helper' show JS, JSExportName;
@@ -13,6 +14,17 @@
 typedef void _Callback();
 typedef void _TakeCallback(_Callback callback);
 
+/// This function adapts ES6 generators to implement Dart's async/await.
+///
+/// It's designed to interact with Dart's Future and follow Dart async/await
+/// semantics.
+///
+/// See https://github.com/dart-lang/sdk/issues/27315 for ideas on reconciling
+/// Dart's Future and ES6 Promise. At that point we should use native JS
+/// async/await.
+///
+/// Inspired by `co`: https://github.com/tj/co/blob/master/index.js, which is a
+/// stepping stone for ES async/await.
 @JSExportName('async')
 @ReifyFunctionTypes(false)
 _async<T>(Function() initGenerator) {
@@ -25,10 +37,10 @@
     if (value is _Future) {
       f = value;
     } else if (value is Future) {
-      f = new _Future();
+      f = _Future();
       _Future._chainForeignFuture(value, f);
     } else {
-      f = new _Future.value(value);
+      f = _Future.value(value);
     }
     f = JS('', '#', f._thenNoZoneRegistration(onValue, onError));
     return f;
@@ -59,7 +71,7 @@
     onValue = zone.registerUnaryCallback(onValue);
     onError = zone.registerUnaryCallback(onError);
   }
-  var asyncFuture = new _Future<T>();
+  var asyncFuture = _Future<T>();
   var body = () {
     try {
       iter = JS('', '#[Symbol.iterator]()', initGenerator());
@@ -203,7 +215,7 @@
   static Timer _createTimer(Duration duration, void callback()) {
     int milliseconds = duration.inMilliseconds;
     if (milliseconds < 0) milliseconds = 0;
-    return new TimerImpl(milliseconds, callback);
+    return TimerImpl(milliseconds, callback);
   }
 
   @patch
@@ -211,7 +223,7 @@
       Duration duration, void callback(Timer timer)) {
     int milliseconds = duration.inMilliseconds;
     if (milliseconds < 0) milliseconds = 0;
-    return new TimerImpl.periodic(milliseconds, callback);
+    return TimerImpl.periodic(milliseconds, callback);
   }
 }
 
@@ -220,3 +232,273 @@
   setTraceForException(error, stackTrace);
   dart.throw_(error);
 }
+
+/// Used by the compiler to implement `async*` functions.
+///
+/// This is inspired by _AsyncStarStreamController in dart-lang/sdk's
+/// runtime/lib/core_patch.dart
+///
+/// Given input like:
+///
+///     foo() async* {
+///       yield 1;
+///       yield* bar();
+///       print(await baz());
+///     }
+///
+/// This compiles to:
+///
+///     function foo() {
+///       return new (AsyncStarImplOfT()).new(function*(stream) {
+///         if (stream.add(1)) return;
+///         yield;
+///         if (stream.addStream(bar()) return;
+///         yield;
+///         print(yield baz());
+///      });
+///     }
+///
+class _AsyncStarImpl<T> {
+  StreamController<T> controller;
+  Object Function(_AsyncStarImpl<T>) initGenerator;
+  @notNull
+  bool isSuspendedAtYieldStar = false;
+  @notNull
+  bool onListenReceived = false;
+  @notNull
+  bool isScheduled = false;
+  @notNull
+  bool isSuspendedAtYield = false;
+
+  /// Whether we're suspended at an `await`.
+  @notNull
+  bool isSuspendedAtAwait = false;
+
+  Completer cancellationCompleter;
+  Object jsIterator;
+
+  Null Function(Object, StackTrace) _handleErrorCallback;
+  void Function([Object]) _runBodyCallback;
+
+  _AsyncStarImpl(this.initGenerator) {
+    controller = StreamController(
+        onListen: JS('!', 'this.onListen.bind(this)'),
+        onResume: JS('!', 'this.onResume.bind(this)'),
+        onCancel: JS('!', 'this.onCancel.bind(this)'));
+    jsIterator = JS('!', '#[Symbol.iterator]()', initGenerator(this));
+  }
+
+  /// The stream produced by this `async*` function.
+  Stream<T> get stream => controller.stream;
+
+  /// Returns the callback used for error handling.
+  ///
+  /// This callback throws the error back into the user code, at the appropriate
+  /// location (e.g. `await` `yield` or `yield*`). This gives user code a chance
+  /// to handle it try-catch. If they do not handle, the error gets routed to
+  /// the [stream] as an error via [addError].
+  ///
+  /// As a performance optimization, this callback is only bound once to the
+  /// current [Zone]. This works because a single subscription stream should
+  /// always be running in its original zone. An `async*` method will always
+  /// save/restore the zone that was active when `listen()` was first called,
+  /// similar to a stream. This follows from section 16.14 of the Dart 4th
+  /// edition spec:
+  ///
+  /// > If `f` is marked `async*` (9), then a fresh instance `s` implementing
+  /// > the built-in class `Stream` is associated with the invocation and
+  /// > immediately returned. When `s` is listened to, execution of the body of
+  /// > `f` will begin.
+  ///
+  Null Function(Object, StackTrace) get handleError {
+    if (_handleErrorCallback == null) {
+      _handleErrorCallback = (error, StackTrace stackTrace) {
+        try {
+          JS('', '#.throw(#)', jsIterator, error);
+        } catch (e) {
+          addError(e, stackTrace);
+        }
+      };
+      var zone = Zone.current;
+      if (!identical(zone, Zone.root)) {
+        _handleErrorCallback = zone.bindBinaryCallback(_handleErrorCallback);
+      }
+    }
+    return _handleErrorCallback;
+  }
+
+  void scheduleGenerator() {
+    // TODO(jmesserly): is this isPaused check in the right place? Assuming the
+    // async* Stream yields, then is paused (by other code), the body will
+    // already be scheduled. This will cause at least one more iteration to
+    // run (adding another data item to the Stream) before actually pausing.
+    // It could be fixed by moving the `isPaused` check inside `runBody`.
+    if (isScheduled ||
+        controller.isPaused ||
+        isSuspendedAtYieldStar ||
+        isSuspendedAtAwait) {
+      return;
+    }
+    isScheduled = true;
+    // Capture the current zone. See comment on [handleError] for more
+    // information about this optimization.
+    var zone = Zone.current;
+    if (_runBodyCallback == null) {
+      _runBodyCallback = JS('!', '#.bind(this)', runBody);
+      if (!identical(zone, Zone.root)) {
+        var registered = zone.registerUnaryCallback(_runBodyCallback);
+        _runBodyCallback = ([arg]) => zone.runUnaryGuarded(registered, arg);
+      }
+    }
+    zone.scheduleMicrotask(_runBodyCallback);
+  }
+
+  void runBody(awaitValue) {
+    isScheduled = false;
+    isSuspendedAtYield = false;
+    isSuspendedAtAwait = false;
+
+    Object iterResult;
+    try {
+      iterResult = JS('', '#.next(#)', jsIterator, awaitValue);
+    } catch (e, s) {
+      addError(e, s);
+      close();
+      return null;
+    }
+
+    if (JS('!', '#.done', iterResult)) {
+      close();
+      return null;
+    }
+
+    // If we're suspended at a yield/yield*, we're done for now.
+    if (isSuspendedAtYield || isSuspendedAtYieldStar) return null;
+
+    // Handle `await`: if we get a value passed to `yield` it means we are
+    // waiting on this Future. Make sure to prevent scheduling, and pass the
+    // value back as the result of the `yield`.
+    //
+    // TODO(jmesserly): is the timing here correct? The assumption here is
+    // that we should schedule `await` in `async*` the same as in `async`.
+    isSuspendedAtAwait = true;
+    FutureOr<Object> value = JS('', '#.value', iterResult);
+
+    // TODO(jmesserly): this logic was copied from `async` function impl.
+    _Future f;
+    if (value is _Future) {
+      f = value;
+    } else if (value is Future) {
+      f = _Future();
+      _Future._chainForeignFuture(value, f);
+    } else {
+      f = _Future.value(value);
+    }
+    f._thenNoZoneRegistration(_runBodyCallback, handleError);
+  }
+
+  /// Adds element to [stream] and returns true if the caller should terminate
+  /// execution of the generator.
+  ///
+  /// This is called from generated code like this:
+  ///
+  ///     if (controller.add(1)) return;
+  ///     yield;
+  //
+  // TODO(hausner): Per spec, the generator should be suspended before exiting
+  // when the stream is closed. We could add a getter like this:
+  //
+  //     get isCancelled => controller.hasListener;
+  //
+  // The generator would translate a 'yield e' statement to
+  //
+  //     controller.add(1);
+  //     suspend; // this is `yield` in JS.
+  //     if (controller.isCancelled) return;
+  bool add(T event) {
+    if (!onListenReceived) _fatal("yield before stream is listened to");
+    if (isSuspendedAtYield) _fatal("unexpected yield");
+    // If stream is cancelled, tell caller to exit the async generator.
+    if (!controller.hasListener) {
+      return true;
+    }
+    controller.add(event);
+    scheduleGenerator();
+    isSuspendedAtYield = true;
+    return false;
+  }
+
+  /// Adds the elements of [stream] into this [controller]'s stream, and returns
+  /// true if the caller should terminate execution of the generator.
+  ///
+  /// The generator will be scheduled again when all of the elements of the
+  /// added stream have been consumed.
+  bool addStream(Stream<T> stream) {
+    if (!onListenReceived) _fatal("yield* before stream is listened to");
+    // If stream is cancelled, tell caller to exit the async generator.
+    if (!controller.hasListener) return true;
+    isSuspendedAtYieldStar = true;
+    var whenDoneAdding = controller.addStream(stream, cancelOnError: false);
+    whenDoneAdding.then((_) {
+      isSuspendedAtYieldStar = false;
+      scheduleGenerator();
+      if (!isScheduled) isSuspendedAtYield = true;
+    }, onError: handleError);
+    return false;
+  }
+
+  void addError(Object error, StackTrace stackTrace) {
+    if (cancellationCompleter != null && !cancellationCompleter.isCompleted) {
+      // If the stream has been cancelled, complete the cancellation future
+      // with the error.
+      cancellationCompleter.completeError(error, stackTrace);
+      return;
+    }
+    // If stream is cancelled, tell caller to exit the async generator.
+    if (!controller.hasListener) return;
+    controller.addError(error, stackTrace);
+    // No need to schedule the generator body here. This code is only
+    // called from the catch clause of the implicit try-catch-finally
+    // around the generator body. That is, we are on the error path out
+    // of the generator and do not need to run the generator again.
+  }
+
+  close() {
+    if (cancellationCompleter != null && !cancellationCompleter.isCompleted) {
+      // If the stream has been cancelled, complete the cancellation future
+      // with the error.
+      cancellationCompleter.complete();
+    }
+    controller.close();
+  }
+
+  onListen() {
+    assert(!onListenReceived);
+    onListenReceived = true;
+    scheduleGenerator();
+  }
+
+  onResume() {
+    if (isSuspendedAtYield) {
+      scheduleGenerator();
+    }
+  }
+
+  onCancel() {
+    if (controller.isClosed) {
+      return null;
+    }
+    if (cancellationCompleter == null) {
+      cancellationCompleter = Completer();
+      // Only resume the generator if it is suspended at a yield.
+      // Cancellation does not affect an async generator that is
+      // suspended at an await.
+      if (isSuspendedAtYield) {
+        scheduleGenerator();
+      }
+    }
+    return cancellationCompleter.future;
+  }
+
+  _fatal(String message) => throw StateError(message);
+}
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/cli_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/cli_patch.dart
index 6921e60..b1c3841 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/cli_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/cli_patch.dart
@@ -6,5 +6,5 @@
 
 @patch
 void _waitForEvent(int timeoutMillis) {
-  throw new UnsupportedError("waitForEvent");
+  throw UnsupportedError("waitForEvent");
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
index 4af9548..ae91eda 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
@@ -30,18 +30,18 @@
       if (hashCode == null) {
         if (equals == null) {
           if (identical(K, String) || identical(K, int)) {
-            return new IdentityMap<K, V>();
+            return IdentityMap<K, V>();
           }
-          return new LinkedMap<K, V>();
+          return LinkedMap<K, V>();
         }
         hashCode = dart.hashCode;
       } else if (identical(identityHashCode, hashCode) &&
           identical(identical, equals)) {
-        return new IdentityMap<K, V>();
+        return IdentityMap<K, V>();
       }
-      return new CustomHashMap<K, V>(equals ?? dart.equals, hashCode);
+      return CustomHashMap<K, V>(equals ?? dart.equals, hashCode);
     }
-    return new CustomKeyHashMap<K, V>(
+    return CustomKeyHashMap<K, V>(
         equals ?? dart.equals, hashCode ?? dart.hashCode, isValidKey);
   }
 
@@ -60,18 +60,18 @@
       if (hashCode == null) {
         if (equals == null) {
           if (identical(K, String) || identical(K, int)) {
-            return new IdentityMap<K, V>();
+            return IdentityMap<K, V>();
           }
-          return new LinkedMap<K, V>();
+          return LinkedMap<K, V>();
         }
         hashCode = dart.hashCode;
       } else if (identical(identityHashCode, hashCode) &&
           identical(identical, equals)) {
-        return new IdentityMap<K, V>();
+        return IdentityMap<K, V>();
       }
-      return new CustomHashMap<K, V>(equals ?? dart.equals, hashCode);
+      return CustomHashMap<K, V>(equals ?? dart.equals, hashCode);
     }
-    return new CustomKeyHashMap<K, V>(
+    return CustomKeyHashMap<K, V>(
         equals ?? dart.equals, hashCode ?? dart.hashCode, isValidKey);
   }
 
@@ -90,19 +90,19 @@
       if (hashCode == null) {
         if (equals == null) {
           if (identical(E, String) || identical(E, int)) {
-            return new _IdentityHashSet<E>();
+            return _IdentityHashSet<E>();
           }
-          return new _HashSet<E>();
+          return _HashSet<E>();
         }
         hashCode = dart.hashCode;
       } else if (identical(identityHashCode, hashCode) &&
           identical(identical, equals)) {
-        return new _IdentityHashSet<E>();
+        return _IdentityHashSet<E>();
       }
-      return new _CustomHashSet<E>(
+      return _CustomHashSet<E>(
           equals ?? dart.equals, hashCode ?? dart.hashCode);
     }
-    return new _CustomKeyHashSet<E>(
+    return _CustomKeyHashSet<E>(
         equals ?? dart.equals, hashCode ?? dart.hashCode, isValidKey);
   }
 
@@ -121,19 +121,19 @@
       if (hashCode == null) {
         if (equals == null) {
           if (identical(E, String) || identical(E, int)) {
-            return new _IdentityHashSet<E>();
+            return _IdentityHashSet<E>();
           }
-          return new _HashSet<E>();
+          return _HashSet<E>();
         }
         hashCode = dart.hashCode;
       } else if (identical(identityHashCode, hashCode) &&
           identical(identical, equals)) {
-        return new _IdentityHashSet<E>();
+        return _IdentityHashSet<E>();
       }
-      return new _CustomHashSet<E>(
+      return _CustomHashSet<E>(
           equals ?? dart.equals, hashCode ?? dart.hashCode);
     }
-    return new _CustomKeyHashSet<E>(
+    return _CustomKeyHashSet<E>(
         equals ?? dart.equals, hashCode ?? dart.hashCode, isValidKey);
   }
 
@@ -173,9 +173,9 @@
 
   _HashSet();
 
-  Set<E> _newSet() => new _HashSet<E>();
+  Set<E> _newSet() => _HashSet<E>();
 
-  Set<R> _newSimilarSet<R>() => new _HashSet<R>();
+  Set<R> _newSimilarSet<R>() => _HashSet<R>();
 
   bool contains(Object key) {
     if (key == null) {
@@ -313,9 +313,9 @@
 
   _IdentityHashSet();
 
-  Set<E> _newSet() => new _IdentityHashSet<E>();
+  Set<E> _newSet() => _IdentityHashSet<E>();
 
-  Set<R> _newSimilarSet<R>() => new _IdentityHashSet<R>();
+  Set<R> _newSimilarSet<R>() => _IdentityHashSet<R>();
 
   bool contains(Object element) {
     return JS('', '#.has(#)', _map, element);
@@ -366,9 +366,9 @@
   _CustomKeyHashSet(_Equality<E> equals, _Hasher<E> hashCode, this._validKey)
       : super(equals, hashCode);
 
-  Set<E> _newSet() => new _CustomKeyHashSet<E>(_equals, _hashCode, _validKey);
+  Set<E> _newSet() => _CustomKeyHashSet<E>(_equals, _hashCode, _validKey);
 
-  Set<R> _newSimilarSet<R>() => new _HashSet<R>();
+  Set<R> _newSimilarSet<R>() => _HashSet<R>();
 
   bool contains(Object element) {
     // TODO(jmesserly): there is a subtle difference here compared to Dart 1.
@@ -417,8 +417,8 @@
 
   _CustomHashSet(this._equals, this._hashCode);
 
-  Set<E> _newSet() => new _CustomHashSet<E>(_equals, _hashCode);
-  Set<R> _newSimilarSet<R>() => new _HashSet<R>();
+  Set<E> _newSet() => _CustomHashSet<E>(_equals, _hashCode);
+  Set<R> _newSimilarSet<R>() => _HashSet<R>();
 
   bool contains(Object key) {
     if (key is E) {
@@ -525,7 +525,7 @@
   @notNull
   bool get isNotEmpty => JS('bool', '#.size != 0', _map);
 
-  Iterator<E> get iterator => new DartIterator<E>(_jsIterator());
+  Iterator<E> get iterator => DartIterator<E>(_jsIterator());
 
   @JSExportName('Symbol.iterator')
   _jsIterator() {
@@ -544,7 +544,7 @@
     }''',
         modifications,
         self._modifications,
-        new ConcurrentModificationError(self),
+        ConcurrentModificationError(self),
         iterator);
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
index 18a077e..cfaa3fc 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
@@ -36,7 +36,7 @@
     parsed = JS('=Object|JSExtendableArray|Null|bool|num|String',
         'JSON.parse(#)', source);
   } catch (e) {
-    throw new FormatException(JS('String', 'String(#)', e));
+    throw FormatException(JS('String', 'String(#)', e));
   }
 
   if (reviver == null) {
@@ -78,7 +78,7 @@
 
     // Otherwise it is a plain object, so copy to a JSON map, so we process
     // and revive all entries recursively.
-    _JsonMap map = new _JsonMap(e);
+    _JsonMap map = _JsonMap(e);
     var processed = map._processed;
     List<String> keys = map._computeKeys();
     for (int i = 0; i < keys.length; i++) {
@@ -108,7 +108,7 @@
   // TODO(sra): Replace this test with cheaper '#.constructor === Array' when
   // bug https://code.google.com/p/v8/issues/detail?id=621 is fixed.
   if (JS('bool', 'Object.getPrototypeOf(#) !== Array.prototype', object)) {
-    return new _JsonMap(object);
+    return _JsonMap(object);
   }
 
   // Update the elements in place since JS arrays are Dart lists.
@@ -159,12 +159,12 @@
 
   Iterable<String> get keys {
     if (_isUpgraded) return _upgradedMap.keys;
-    return new _JsonMapKeyIterable(this);
+    return _JsonMapKeyIterable(this);
   }
 
   Iterable get values {
     if (_isUpgraded) return _upgradedMap.values;
-    return new MappedIterable(_computeKeys(), (each) => this[each]);
+    return MappedIterable(_computeKeys(), (each) => this[each]);
   }
 
   operator []=(key, value) {
@@ -251,7 +251,7 @@
       // Check if invoking the callback function changed
       // the key set. If so, throw an exception.
       if (!identical(keys, _data)) {
-        throw new ConcurrentModificationError(this);
+        throw ConcurrentModificationError(this);
       }
     }
   }
@@ -361,7 +361,7 @@
 class JsonDecoder {
   @patch
   StringConversionSink startChunkedConversion(Sink<Object> sink) {
-    return new _JsonDecoderSink(_reviver, sink);
+    return _JsonDecoderSink(_reviver, sink);
   }
 }
 
@@ -376,7 +376,7 @@
   final _Reviver _reviver;
   final Sink<Object> _sink;
 
-  _JsonDecoderSink(this._reviver, this._sink) : super(new StringBuffer(''));
+  _JsonDecoderSink(this._reviver, this._sink) : super(StringBuffer(''));
 
   void close() {
     super.close();
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index 13b9a49..74f55ac 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -116,7 +116,7 @@
   void operator []=(Object object, T value) {
     var values = Primitives.getProperty(object, _EXPANDO_PROPERTY_NAME);
     if (values == null) {
-      values = new Object();
+      values = Object();
       Primitives.setProperty(object, _EXPANDO_PROPERTY_NAME, values);
     }
     Primitives.setProperty(values, _getKey(), value);
@@ -154,7 +154,7 @@
   @patch
   factory int.fromEnvironment(String name, {int defaultValue}) {
     // ignore: const_constructor_throws_exception
-    throw new UnsupportedError(
+    throw UnsupportedError(
         'int.fromEnvironment can only be used as a const constructor');
   }
 }
@@ -230,12 +230,12 @@
 class DateTime {
   @patch
   DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch,
-      {bool isUtc: false})
+      {bool isUtc = false})
       : this._withValue(millisecondsSinceEpoch, isUtc: isUtc);
 
   @patch
   DateTime.fromMicrosecondsSinceEpoch(int microsecondsSinceEpoch,
-      {bool isUtc: false})
+      {bool isUtc = false})
       : this._withValue(
             _microsecondInRoundedMilliseconds(microsecondsSinceEpoch),
             isUtc: isUtc);
@@ -245,9 +245,8 @@
       int second, int millisecond, int microsecond, bool isUtc)
       // checkBool is manually inlined here because dart2js doesn't inline it
       // and [isUtc] is usually a constant.
-      : this.isUtc = isUtc is bool
-            ? isUtc
-            : throw new ArgumentError.value(isUtc, 'isUtc'),
+      : this.isUtc =
+            isUtc is bool ? isUtc : throw ArgumentError.value(isUtc, 'isUtc'),
         _value = checkInt(Primitives.valueFromDecomposedDate(
             year,
             month,
@@ -292,25 +291,23 @@
 
   @patch
   Duration get timeZoneOffset {
-    if (isUtc) return new Duration();
-    return new Duration(minutes: Primitives.getTimeZoneOffsetInMinutes(this));
+    if (isUtc) return Duration();
+    return Duration(minutes: Primitives.getTimeZoneOffsetInMinutes(this));
   }
 
   @patch
   DateTime add(Duration duration) {
-    return new DateTime._withValue(_value + duration.inMilliseconds,
-        isUtc: isUtc);
+    return DateTime._withValue(_value + duration.inMilliseconds, isUtc: isUtc);
   }
 
   @patch
   DateTime subtract(Duration duration) {
-    return new DateTime._withValue(_value - duration.inMilliseconds,
-        isUtc: isUtc);
+    return DateTime._withValue(_value - duration.inMilliseconds, isUtc: isUtc);
   }
 
   @patch
   Duration difference(DateTime other) {
-    return new Duration(milliseconds: _value - other._value);
+    return Duration(milliseconds: _value - other._value);
   }
 
   @patch
@@ -371,27 +368,26 @@
     } else {
       int length = JS('!', '#', _length);
       if (_length == null || length < 0) {
-        throw new ArgumentError(
-            "Length must be a non-negative integer: $_length");
+        throw ArgumentError("Length must be a non-negative integer: $_length");
       }
       list = JS('', 'new Array(#)', length);
       JS('', '#.fill(null)', list);
       JSArray.markFixedList(list);
     }
-    return new JSArray<E>.of(list);
+    return JSArray<E>.of(list);
   }
 
   @patch
-  factory List.filled(@nullCheck int length, E fill, {bool growable: false}) {
-    var list = new JSArray<E>.of(JS('', 'new Array(#)', length));
+  factory List.filled(@nullCheck int length, E fill, {bool growable = false}) {
+    var list = JSArray<E>.of(JS('', 'new Array(#)', length));
     JS('', '#.fill(#)', list, fill);
     if (!growable) JSArray.markFixedList(list);
     return list;
   }
 
   @patch
-  factory List.from(Iterable elements, {bool growable: true}) {
-    var list = new JSArray<E>.of(JS('', '[]'));
+  factory List.from(Iterable elements, {bool growable = true}) {
+    var list = JSArray<E>.of(JS('', '[]'));
     // Specialize the copy loop for the case that doesn't need a
     // runtime check.
     if (elements is Iterable<E>) {
@@ -409,7 +405,7 @@
 
   @patch
   factory List.unmodifiable(Iterable elements) {
-    var list = new List<E>.from(elements);
+    var list = List<E>.from(elements);
     JSArray.markUnmodifiableList(list);
     return list;
   }
@@ -419,7 +415,7 @@
 class Map<K, V> {
   @patch
   factory Map.unmodifiable(Map other) {
-    return new UnmodifiableMapView<K, V>(new Map<K, V>.from(other));
+    return UnmodifiableMapView<K, V>(Map<K, V>.from(other));
   }
 
   @patch
@@ -448,7 +444,7 @@
   @patch
   factory String.fromEnvironment(String name, {String defaultValue}) {
     // ignore: const_constructor_throws_exception
-    throw new UnsupportedError(
+    throw UnsupportedError(
         'String.fromEnvironment can only be used as a const constructor');
   }
 
@@ -473,14 +469,14 @@
 
   static String _stringFromIterable(
       Iterable<int> charCodes, int start, int end) {
-    if (start < 0) throw new RangeError.range(start, 0, charCodes.length);
+    if (start < 0) throw RangeError.range(start, 0, charCodes.length);
     if (end != null && end < start) {
-      throw new RangeError.range(end, start, charCodes.length);
+      throw RangeError.range(end, start, charCodes.length);
     }
     var it = charCodes.iterator;
     for (int i = 0; i < start; i++) {
       if (!it.moveNext()) {
-        throw new RangeError.range(start, 0, i);
+        throw RangeError.range(start, 0, i);
       }
     }
     var list = <int>[];
@@ -489,7 +485,7 @@
     } else {
       for (int i = start; i < end; i++) {
         if (!it.moveNext()) {
-          throw new RangeError.range(end, start, i);
+          throw RangeError.range(end, start, i);
         }
         list.add(it.current);
       }
@@ -501,9 +497,9 @@
 @patch
 class bool {
   @patch
-  factory bool.fromEnvironment(String name, {bool defaultValue: false}) {
+  factory bool.fromEnvironment(String name, {bool defaultValue = false}) {
     // ignore: const_constructor_throws_exception
-    throw new UnsupportedError(
+    throw UnsupportedError(
         'bool.fromEnvironment can only be used as a const constructor');
   }
 
@@ -515,8 +511,8 @@
 class RegExp {
   @patch
   factory RegExp(String source,
-          {bool multiLine: false, bool caseSensitive: true}) =>
-      new JSSyntaxRegExp(source,
+          {bool multiLine = false, bool caseSensitive = true}) =>
+      JSSyntaxRegExp(source,
           multiLine: multiLine, caseSensitive: caseSensitive);
 
   @patch
@@ -546,7 +542,7 @@
 
   @patch
   void writeCharCode(int charCode) {
-    _writeString(new String.fromCharCode(charCode));
+    _writeString(String.fromCharCode(charCode));
   }
 
   @patch
@@ -628,7 +624,7 @@
 
   @patch
   String toString() {
-    StringBuffer sb = new StringBuffer('');
+    StringBuffer sb = StringBuffer('');
     String comma = '';
     if (_arguments != null) {
       for (var argument in _arguments) {
@@ -670,7 +666,7 @@
   static Uri get base {
     String uri = Primitives.currentUri();
     if (uri != null) return Uri.parse(uri);
-    throw new UnsupportedError("'Uri.base' is not supported");
+    throw UnsupportedError("'Uri.base' is not supported");
   }
 }
 
@@ -688,7 +684,7 @@
   // Matches a String that _uriEncodes to itself regardless of the kind of
   // component.  This corresponds to [_unreservedTable], i.e. characters that
   // are not encoded by any encoding table.
-  static final RegExp _needsNoEncoding = new RegExp(r'^[\-\.0-9A-Z_a-z~]*$');
+  static final RegExp _needsNoEncoding = RegExp(r'^[\-\.0-9A-Z_a-z~]*$');
 
   /**
    * This is the internal implementation of JavaScript's encodeURI function.
@@ -704,7 +700,7 @@
 
     // Encode the string into bytes then generate an ASCII only string
     // by percent encoding selected bytes.
-    StringBuffer result = new StringBuffer('');
+    StringBuffer result = StringBuffer('');
     var bytes = encoding.encode(text);
     for (int i = 0; i < bytes.length; i++) {
       int byte = bytes[i];
@@ -810,12 +806,12 @@
   static const int _digitBase = 1 << _digitBits;
   static const int _digitMask = (1 << _digitBits) - 1;
 
-  static final _BigIntImpl zero = new _BigIntImpl._fromInt(0);
-  static final _BigIntImpl one = new _BigIntImpl._fromInt(1);
-  static final _BigIntImpl two = new _BigIntImpl._fromInt(2);
+  static final _BigIntImpl zero = _BigIntImpl._fromInt(0);
+  static final _BigIntImpl one = _BigIntImpl._fromInt(1);
+  static final _BigIntImpl two = _BigIntImpl._fromInt(2);
 
   static final _BigIntImpl _minusOne = -one;
-  static final _BigIntImpl _bigInt10000 = new _BigIntImpl._fromInt(10000);
+  static final _BigIntImpl _bigInt10000 = _BigIntImpl._fromInt(10000);
 
   // Result cache for last _divRem call.
   // Result cache for last _divRem call.
@@ -870,7 +866,7 @@
   static _BigIntImpl parse(String source, {int radix}) {
     var result = _tryParse(source, radix: radix);
     if (result == null) {
-      throw new FormatException("Could not parse BigInt", source);
+      throw FormatException("Could not parse BigInt", source);
     }
     return result;
   }
@@ -891,7 +887,7 @@
     for (int i = 0; i < source.length; i++) {
       part = part * 10 + source.codeUnitAt(i) - _0;
       if (++digitInPartCount == 4) {
-        result = result * _bigInt10000 + new _BigIntImpl._fromInt(part);
+        result = result * _bigInt10000 + _BigIntImpl._fromInt(part);
         part = 0;
         digitInPartCount = 0;
       }
@@ -932,7 +928,7 @@
     int hexDigitsPerChunk = _digitBits ~/ 4;
     int sourceLength = source.length - startPos;
     int chunkCount = (sourceLength / hexDigitsPerChunk).ceil();
-    var digits = new Uint16List(chunkCount);
+    var digits = Uint16List(chunkCount);
 
     int lastDigitLength = sourceLength - (chunkCount - 1) * hexDigitsPerChunk;
     int digitIndex = digits.length - 1;
@@ -955,7 +951,7 @@
       digits[digitIndex--] = chunk;
     }
     if (digits.length == 1 && digits[0] == 0) return zero;
-    return new _BigIntImpl._(isNegative, digits.length, digits);
+    return _BigIntImpl._(isNegative, digits.length, digits);
   }
 
   /// Parses the given [source] as a [radix] literal.
@@ -964,11 +960,11 @@
   /// this function returns `null`.
   static _BigIntImpl _parseRadix(String source, int radix, bool isNegative) {
     var result = zero;
-    var base = new _BigIntImpl._fromInt(radix);
+    var base = _BigIntImpl._fromInt(radix);
     for (int i = 0; i < source.length; i++) {
       var digitValue = _codeUnitToRadixValue(source.codeUnitAt(i));
       if (digitValue >= radix) return null;
-      result = result * base + new _BigIntImpl._fromInt(digitValue);
+      result = result * base + _BigIntImpl._fromInt(digitValue);
     }
     if (isNegative) return -result;
     return result;
@@ -982,7 +978,7 @@
   static _BigIntImpl _tryParse(String source, {int radix}) {
     if (source == "") return null;
 
-    var re = new RegExp(r'^\s*([+-]?)((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$',
+    var re = RegExp(r'^\s*([+-]?)((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$',
         caseSensitive: false);
     var match = re.firstMatch(source);
     int signIndex = 1;
@@ -1010,10 +1006,10 @@
     }
 
     if (radix is! int) {
-      throw new ArgumentError.value(radix, 'radix', 'is not an integer');
+      throw ArgumentError.value(radix, 'radix', 'is not an integer');
     }
     if (radix < 2 || radix > 36) {
-      throw new RangeError.range(radix, 2, 36, 'radix');
+      throw RangeError.range(radix, 2, 36, 'radix');
     }
     if (radix == 10 && decimalMatch != null) {
       return _parseDecimal(decimalMatch, isNegative);
@@ -1049,7 +1045,7 @@
   /// digits.
   static Uint16List _cloneDigits(
       Uint16List digits, int from, int to, int length) {
-    var resultDigits = new Uint16List(length);
+    var resultDigits = Uint16List(length);
     var n = to - from;
     for (var i = 0; i < n; i++) {
       resultDigits[i] = digits[from + i];
@@ -1065,10 +1061,9 @@
 
     // Given this order dart2js will use the `_fromInt` for smaller value and
     // then use the bit-manipulating `_fromDouble` for all other values.
-    if (value.abs() < 0x100000000)
-      return new _BigIntImpl._fromInt(value.toInt());
-    if (value is double) return new _BigIntImpl._fromDouble(value);
-    return new _BigIntImpl._fromInt(value);
+    if (value.abs() < 0x100000000) return _BigIntImpl._fromInt(value.toInt());
+    if (value is double) return _BigIntImpl._fromDouble(value);
+    return _BigIntImpl._fromInt(value);
   }
 
   factory _BigIntImpl._fromInt(int value) {
@@ -1079,43 +1074,43 @@
       // positive.
       const int minInt64 = -0x80000000 * 0x100000000;
       if (value == minInt64) {
-        var digits = new Uint16List(4);
+        var digits = Uint16List(4);
         digits[3] = 0x8000;
-        return new _BigIntImpl._(true, 4, digits);
+        return _BigIntImpl._(true, 4, digits);
       }
       value = -value;
     }
     if (value < _digitBase) {
-      var digits = new Uint16List(1);
+      var digits = Uint16List(1);
       digits[0] = value;
-      return new _BigIntImpl._(isNegative, 1, digits);
+      return _BigIntImpl._(isNegative, 1, digits);
     }
     if (value <= 0xFFFFFFFF) {
-      var digits = new Uint16List(2);
+      var digits = Uint16List(2);
       digits[0] = value & _digitMask;
       digits[1] = value >> _digitBits;
-      return new _BigIntImpl._(isNegative, 2, digits);
+      return _BigIntImpl._(isNegative, 2, digits);
     }
 
     var bits = value.bitLength;
-    var digits = new Uint16List((bits - 1) ~/ _digitBits + 1);
+    var digits = Uint16List((bits - 1) ~/ _digitBits + 1);
     var i = 0;
     while (value != 0) {
       digits[i++] = value & _digitMask;
       value = value ~/ _digitBase;
     }
-    return new _BigIntImpl._(isNegative, digits.length, digits);
+    return _BigIntImpl._(isNegative, digits.length, digits);
   }
 
   /// An 8-byte Uint8List we can reuse for [_fromDouble] to avoid generating
   /// garbage.
-  static final Uint8List _bitsForFromDouble = new Uint8List(8);
+  static final Uint8List _bitsForFromDouble = Uint8List(8);
 
   factory _BigIntImpl._fromDouble(double value) {
     const int exponentBias = 1075;
 
     if (value.isNaN || value.isInfinite) {
-      throw new ArgumentError("Value must be finite: $value");
+      throw ArgumentError("Value must be finite: $value");
     }
     bool isNegative = value < 0;
     if (isNegative) value = -value;
@@ -1134,14 +1129,14 @@
 
     assert(_digitBits == 16);
     // The significant bits are in 0 .. 52.
-    var unshiftedDigits = new Uint16List(4);
+    var unshiftedDigits = Uint16List(4);
     unshiftedDigits[0] = (bits[1] << 8) + bits[0];
     unshiftedDigits[1] = (bits[3] << 8) + bits[2];
     unshiftedDigits[2] = (bits[5] << 8) + bits[4];
     // Don't forget to add the hidden bit.
     unshiftedDigits[3] = 0x10 | (bits[6] & 0xF);
 
-    var unshiftedBig = new _BigIntImpl._normalized(false, 4, unshiftedDigits);
+    var unshiftedBig = _BigIntImpl._normalized(false, 4, unshiftedDigits);
     _BigIntImpl absResult = unshiftedBig;
     if (exponent < 0) {
       absResult = unshiftedBig >> -exponent;
@@ -1160,7 +1155,7 @@
    */
   _BigIntImpl operator -() {
     if (_used == 0) return this;
-    return new _BigIntImpl._(!_isNegative, _used, _digits);
+    return _BigIntImpl._(!_isNegative, _used, _digits);
   }
 
   /**
@@ -1178,11 +1173,11 @@
     }
     final resultUsed = used + n;
     final digits = _digits;
-    final resultDigits = new Uint16List(resultUsed);
+    final resultDigits = Uint16List(resultUsed);
     for (int i = used - 1; i >= 0; i--) {
       resultDigits[i + n] = digits[i];
     }
-    return new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+    return _BigIntImpl._(_isNegative, resultUsed, resultDigits);
   }
 
   /// Same as [_dlShift] but works on the decomposed big integers.
@@ -1219,11 +1214,11 @@
       return _isNegative ? _minusOne : zero;
     }
     final digits = _digits;
-    final resultDigits = new Uint16List(resultUsed);
+    final resultDigits = Uint16List(resultUsed);
     for (var i = n; i < used; i++) {
       resultDigits[i - n] = digits[i];
     }
-    final result = new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+    final result = _BigIntImpl._(_isNegative, resultUsed, resultDigits);
     if (_isNegative) {
       // Round down if any bit was shifted out.
       for (var i = 0; i < n; i++) {
@@ -1271,7 +1266,7 @@
    */
   _BigIntImpl operator <<(int shiftAmount) {
     if (shiftAmount < 0) {
-      throw new ArgumentError("shift-amount must be posititve $shiftAmount");
+      throw ArgumentError("shift-amount must be posititve $shiftAmount");
     }
     if (_isZero) return this;
     final digitShift = shiftAmount ~/ _digitBits;
@@ -1280,9 +1275,9 @@
       return _dlShift(digitShift);
     }
     var resultUsed = _used + digitShift + 1;
-    var resultDigits = new Uint16List(resultUsed);
+    var resultDigits = Uint16List(resultUsed);
     _lsh(_digits, _used, shiftAmount, resultDigits);
-    return new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+    return _BigIntImpl._(_isNegative, resultUsed, resultDigits);
   }
 
   // resultDigits[0..resultUsed-1] = xDigits[0..xUsed-1] << n.
@@ -1335,7 +1330,7 @@
    */
   _BigIntImpl operator >>(int shiftAmount) {
     if (shiftAmount < 0) {
-      throw new ArgumentError("shift-amount must be posititve $shiftAmount");
+      throw ArgumentError("shift-amount must be posititve $shiftAmount");
     }
     if (_isZero) return this;
     final digitShift = shiftAmount ~/ _digitBits;
@@ -1349,9 +1344,9 @@
       return _isNegative ? _minusOne : zero;
     }
     final digits = _digits;
-    final resultDigits = new Uint16List(resultUsed);
+    final resultDigits = Uint16List(resultUsed);
     _rsh(digits, used, shiftAmount, resultDigits);
-    final result = new _BigIntImpl._(_isNegative, resultUsed, resultDigits);
+    final result = _BigIntImpl._(_isNegative, resultUsed, resultDigits);
     if (_isNegative) {
       // Round down if any bit was shifted out.
       if ((digits[digitShift] & ((1 << bitShift) - 1)) != 0) {
@@ -1464,9 +1459,9 @@
       return _isNegative == isNegative ? this : -this;
     }
     var resultUsed = used + 1;
-    var resultDigits = new Uint16List(resultUsed);
+    var resultDigits = Uint16List(resultUsed);
     _absAdd(_digits, used, other._digits, otherUsed, resultDigits);
-    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+    return _BigIntImpl._(isNegative, resultUsed, resultDigits);
   }
 
   /// Returns `abs(this) - abs(other)` with sign set according to [isNegative].
@@ -1483,9 +1478,9 @@
     if (otherUsed == 0) {
       return _isNegative == isNegative ? this : -this;
     }
-    var resultDigits = new Uint16List(used);
+    var resultDigits = Uint16List(used);
     _absSub(_digits, used, other._digits, otherUsed, resultDigits);
-    return new _BigIntImpl._(isNegative, used, resultDigits);
+    return _BigIntImpl._(isNegative, used, resultDigits);
   }
 
   /// Returns `abs(this) & abs(other)` with sign set according to [isNegative].
@@ -1493,11 +1488,11 @@
     var resultUsed = _min(_used, other._used);
     var digits = _digits;
     var otherDigits = other._digits;
-    var resultDigits = new Uint16List(resultUsed);
+    var resultDigits = Uint16List(resultUsed);
     for (var i = 0; i < resultUsed; i++) {
       resultDigits[i] = digits[i] & otherDigits[i];
     }
-    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+    return _BigIntImpl._(isNegative, resultUsed, resultDigits);
   }
 
   /// Returns `abs(this) &~ abs(other)` with sign set according to [isNegative].
@@ -1505,7 +1500,7 @@
     var resultUsed = _used;
     var digits = _digits;
     var otherDigits = other._digits;
-    var resultDigits = new Uint16List(resultUsed);
+    var resultDigits = Uint16List(resultUsed);
     var m = _min(resultUsed, other._used);
     for (var i = 0; i < m; i++) {
       resultDigits[i] = digits[i] & ~otherDigits[i];
@@ -1513,7 +1508,7 @@
     for (var i = m; i < resultUsed; i++) {
       resultDigits[i] = digits[i];
     }
-    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+    return _BigIntImpl._(isNegative, resultUsed, resultDigits);
   }
 
   /// Returns `abs(this) | abs(other)` with sign set according to [isNegative].
@@ -1523,7 +1518,7 @@
     var resultUsed = _max(used, otherUsed);
     var digits = _digits;
     var otherDigits = other._digits;
-    var resultDigits = new Uint16List(resultUsed);
+    var resultDigits = Uint16List(resultUsed);
     var l, m;
     if (used < otherUsed) {
       l = other;
@@ -1539,7 +1534,7 @@
     for (var i = m; i < resultUsed; i++) {
       resultDigits[i] = lDigits[i];
     }
-    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+    return _BigIntImpl._(isNegative, resultUsed, resultDigits);
   }
 
   /// Returns `abs(this) ^ abs(other)` with sign set according to [isNegative].
@@ -1549,7 +1544,7 @@
     var resultUsed = _max(used, otherUsed);
     var digits = _digits;
     var otherDigits = other._digits;
-    var resultDigits = new Uint16List(resultUsed);
+    var resultDigits = Uint16List(resultUsed);
     var l, m;
     if (used < otherUsed) {
       l = other;
@@ -1565,7 +1560,7 @@
     for (var i = m; i < resultUsed; i++) {
       resultDigits[i] = lDigits[i];
     }
-    return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
+    return _BigIntImpl._(isNegative, resultUsed, resultDigits);
   }
 
   /**
@@ -1791,13 +1786,13 @@
     var resultUsed = used + otherUsed;
     var digits = _digits;
     var otherDigits = other._digits;
-    var resultDigits = new Uint16List(resultUsed);
+    var resultDigits = Uint16List(resultUsed);
     var i = 0;
     while (i < otherUsed) {
       _mulAdd(otherDigits[i], digits, 0, resultDigits, i, used);
       i++;
     }
-    return new _BigIntImpl._(
+    return _BigIntImpl._(
         _isNegative != other._isNegative, resultUsed, resultDigits);
   }
 
@@ -1842,7 +1837,7 @@
     var lastQuo_used = _lastQuoRemUsed - _lastRemUsed;
     var quo_digits = _cloneDigits(
         _lastQuoRemDigits, _lastRemUsed, _lastQuoRemUsed, lastQuo_used);
-    var quo = new _BigIntImpl._(false, lastQuo_used, quo_digits);
+    var quo = _BigIntImpl._(false, lastQuo_used, quo_digits);
     if ((_isNegative != other._isNegative) && (quo._used > 0)) {
       quo = -quo;
     }
@@ -1861,7 +1856,7 @@
     // denormalized _lastQuoRem_digits[0.._lastRem_used-1] with proper sign.
     var remDigits =
         _cloneDigits(_lastQuoRemDigits, 0, _lastRemUsed, _lastRemUsed);
-    var rem = new _BigIntImpl._(false, _lastRemUsed, remDigits);
+    var rem = _BigIntImpl._(false, _lastRemUsed, remDigits);
     if (_lastRem_nsh > 0) {
       rem = rem >> _lastRem_nsh; // Denormalize remainder.
     }
@@ -1901,9 +1896,9 @@
     Uint16List yDigits;
     int yUsed;
     if (nsh > 0) {
-      yDigits = new Uint16List(other._used + 5);
+      yDigits = Uint16List(other._used + 5);
       yUsed = _lShiftDigits(other._digits, other._used, nsh, yDigits);
-      resultDigits = new Uint16List(_used + 5);
+      resultDigits = Uint16List(_used + 5);
       resultUsed = _lShiftDigits(_digits, _used, nsh, resultDigits);
     } else {
       yDigits = other._digits;
@@ -1915,7 +1910,7 @@
     var i = resultUsed;
     var j = i - yUsed;
     // tmpDigits is a temporary array of i (resultUsed) digits.
-    var tmpDigits = new Uint16List(i);
+    var tmpDigits = Uint16List(i);
     var tmpUsed = _dlShiftDigits(yDigits, yUsed, j, tmpDigits);
     // Explicit first division step in case normalized dividend is larger or
     // equal to shifted normalized divisor.
@@ -1930,7 +1925,7 @@
     }
 
     // Negate y so we can later use _mulAdd instead of non-existent _mulSub.
-    var nyDigits = new Uint16List(yUsed + 2);
+    var nyDigits = Uint16List(yUsed + 2);
     nyDigits[yUsed] = 1;
     _absSub(nyDigits, yUsed + 1, yDigits, yUsed, nyDigits);
     // nyDigits is read-only and has yUsed digits (possibly including several
@@ -2138,7 +2133,7 @@
 
   _BigIntImpl pow(int exponent) {
     if (exponent < 0) {
-      throw new ArgumentError("Exponent must not be negative: $exponent");
+      throw ArgumentError("Exponent must not be negative: $exponent");
     }
     if (exponent == 0) return one;
 
@@ -2168,10 +2163,10 @@
     _BigIntImpl exponent = bigExponent;
     _BigIntImpl modulus = bigModulus;
     if (exponent._isNegative) {
-      throw new ArgumentError("exponent must be positive: $exponent");
+      throw ArgumentError("exponent must be positive: $exponent");
     }
     if (modulus <= zero) {
-      throw new ArgumentError("modulus must be strictly positive: $modulus");
+      throw ArgumentError("modulus must be strictly positive: $modulus");
     }
     if (exponent._isZero) return one;
 
@@ -2179,10 +2174,10 @@
     final modulusUsed2p4 = 2 * modulusUsed + 4;
     final exponentBitlen = exponent.bitLength;
     if (exponentBitlen <= 0) return one;
-    _BigIntReduction z = new _BigIntClassic(modulus);
-    var resultDigits = new Uint16List(modulusUsed2p4);
-    var result2Digits = new Uint16List(modulusUsed2p4);
-    var gDigits = new Uint16List(modulusUsed);
+    _BigIntReduction z = _BigIntClassic(modulus);
+    var resultDigits = Uint16List(modulusUsed2p4);
+    var result2Digits = Uint16List(modulusUsed2p4);
+    var gDigits = Uint16List(modulusUsed);
     var gUsed = z.convert(this, gDigits);
     // Initialize result with g.
     // Copy leading zero if any.
@@ -2225,14 +2220,14 @@
     if (inv) {
       if ((yUsed == 1) && (yDigits[0] == 1)) return one;
       if ((yUsed == 0) || (yDigits[0].isEven && xDigits[0].isEven)) {
-        throw new Exception("Not coprime");
+        throw Exception("Not coprime");
       }
     } else {
       if (x._isZero) {
-        throw new ArgumentError.value(0, "this", "must not be zero");
+        throw ArgumentError.value(0, "this", "must not be zero");
       }
       if (y._isZero) {
-        throw new ArgumentError.value(0, "other", "must not be zero");
+        throw ArgumentError.value(0, "other", "must not be zero");
       }
       if (((xUsed == 1) && (xDigits[0] == 1)) ||
           ((yUsed == 1) && (yDigits[0] == 1))) return one;
@@ -2268,15 +2263,15 @@
     var aDigits, bDigits, cDigits, dDigits;
     bool aIsNegative, bIsNegative, cIsNegative, dIsNegative;
     if (ac) {
-      aDigits = new Uint16List(abcdLen);
+      aDigits = Uint16List(abcdLen);
       aIsNegative = false;
       aDigits[0] = 1;
-      cDigits = new Uint16List(abcdLen);
+      cDigits = Uint16List(abcdLen);
       cIsNegative = false;
     }
-    bDigits = new Uint16List(abcdLen);
+    bDigits = Uint16List(abcdLen);
     bIsNegative = false;
-    dDigits = new Uint16List(abcdLen);
+    dDigits = Uint16List(abcdLen);
     dIsNegative = false;
     dDigits[0] = 1;
 
@@ -2421,13 +2416,13 @@
       if (shiftAmount > 0) {
         maxUsed = _lShiftDigits(vDigits, maxUsed, shiftAmount, vDigits);
       }
-      return new _BigIntImpl._(false, maxUsed, vDigits);
+      return _BigIntImpl._(false, maxUsed, vDigits);
     }
     // No inverse if v != 1.
     var i = maxUsed - 1;
     while ((i > 0) && (vDigits[i] == 0)) --i;
     if ((i != 0) || (vDigits[0] != 1)) {
-      throw new Exception("Not coprime");
+      throw Exception("Not coprime");
     }
 
     if (dIsNegative) {
@@ -2453,7 +2448,7 @@
         _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
       }
     }
-    return new _BigIntImpl._(false, maxUsed, dDigits);
+    return _BigIntImpl._(false, maxUsed, dDigits);
   }
 
   /**
@@ -2468,7 +2463,7 @@
   _BigIntImpl modInverse(BigInt bigInt) {
     _BigIntImpl modulus = bigInt;
     if (modulus <= zero) {
-      throw new ArgumentError("Modulus must be strictly positive: $modulus");
+      throw ArgumentError("Modulus must be strictly positive: $modulus");
     }
     if (modulus == one) return zero;
     var tmp = this;
@@ -2579,7 +2574,7 @@
     if (_used <= _simpleValidIntDigits) return true;
     var asInt = toInt();
     if (!asInt.toDouble().isFinite) return false;
-    return this == new _BigIntImpl._fromInt(asInt);
+    return this == _BigIntImpl._fromInt(asInt);
   }
 
   int toInt() {
@@ -2607,7 +2602,7 @@
     if (_isZero) return 0.0;
 
     // We fill the 53 bits little-endian.
-    var resultBits = new Uint8List(8);
+    var resultBits = Uint8List(8);
 
     var length = _digitBits * (_used - 1) + _digits[_used - 1].bitLength;
     if (length - 53 > maxDoubleExponent) return double.infinity;
@@ -2739,7 +2734,7 @@
    * The [radix] argument must be an integer in the range 2 to 36.
    */
   String toRadixString(int radix) {
-    if (radix > 36) throw new RangeError.range(radix, 2, 36);
+    if (radix > 36) throw RangeError.range(radix, 2, 36);
 
     if (_used == 0) return "0";
 
@@ -2751,7 +2746,7 @@
 
     if (radix == 16) return _toHexString();
 
-    var base = new _BigIntImpl._fromInt(radix);
+    var base = _BigIntImpl._fromInt(radix);
     var reversedDigitCodeUnits = <int>[];
     var rest = this.abs();
     while (!rest._isZero) {
@@ -2759,7 +2754,7 @@
       rest = rest ~/ base;
       reversedDigitCodeUnits.add(_toRadixCodeUnit(digit));
     }
-    var digitString = new String.fromCharCodes(reversedDigitCodeUnits.reversed);
+    var digitString = String.fromCharCodes(reversedDigitCodeUnits.reversed);
     if (_isNegative) return "-" + digitString;
     return digitString;
   }
@@ -2782,7 +2777,7 @@
       const _dash = 45;
       chars.add(_dash);
     }
-    return new String.fromCharCodes(chars.reversed);
+    return String.fromCharCodes(chars.reversed);
   }
 }
 
@@ -2832,7 +2827,7 @@
   }
 
   _BigIntImpl revert(Uint16List xDigits, int xUsed) {
-    return new _BigIntImpl._(false, xUsed, xDigits);
+    return _BigIntImpl._(false, xUsed, xDigits);
   }
 
   int _reduce(Uint16List xDigits, int xUsed) {
@@ -2845,7 +2840,7 @@
   }
 
   int sqr(Uint16List xDigits, int xUsed, Uint16List resultDigits) {
-    var b = new _BigIntImpl._(false, xUsed, xDigits);
+    var b = _BigIntImpl._(false, xUsed, xDigits);
     var b2 = b * b;
     for (int i = 0; i < b2._used; i++) {
       resultDigits[i] = b2._digits[i];
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
index 99a85fd..a885aae 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
@@ -11,7 +11,7 @@
 
 @patch
 @ForceInline()
-bool debugger({bool when: true, String message}) {
+bool debugger({bool when = true, String message}) {
   if (when) {
     JS('', 'debugger');
   }
@@ -27,15 +27,15 @@
 void log(String message,
     {DateTime time,
     int sequenceNumber,
-    int level: 0,
-    String name: '',
+    int level = 0,
+    String name = '',
     Zone zone,
     Object error,
     StackTrace stackTrace}) {
   // TODO.
 }
 
-final _extensions = new Map<String, ServiceExtensionHandler>();
+final _extensions = Map<String, ServiceExtensionHandler>();
 
 @patch
 ServiceExtensionHandler _lookupExtension(String method) {
@@ -146,11 +146,11 @@
     }
     // Throw an exception if we've reached the maximum number of user tags.
     if (_instances.length == UserTag.MAX_USER_TAGS) {
-      throw new UnsupportedError(
+      throw UnsupportedError(
           'UserTag instance limit (${UserTag.MAX_USER_TAGS}) reached.');
     }
     // Create a new instance and add it to the instance map.
-    var instance = new _FakeUserTag.real(label);
+    var instance = _FakeUserTag.real(label);
     _instances[label] = instance;
     return instance;
   }
@@ -163,7 +163,7 @@
     return old;
   }
 
-  static final UserTag _defaultTag = new _FakeUserTag('Default');
+  static final UserTag _defaultTag = _FakeUserTag('Default');
 }
 
 var _currentTag = _FakeUserTag._defaultTag;
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
index 672eb0a..20cb5ff 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
@@ -12,43 +12,43 @@
 class _Directory {
   @patch
   static _current(_Namespace namespace) {
-    throw new UnsupportedError("Directory._current");
+    throw UnsupportedError("Directory._current");
   }
 
   @patch
   static _setCurrent(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("Directory_SetCurrent");
+    throw UnsupportedError("Directory_SetCurrent");
   }
 
   @patch
   static _createTemp(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("Directory._createTemp");
+    throw UnsupportedError("Directory._createTemp");
   }
 
   @patch
   static String _systemTemp(_Namespace namespace) {
-    throw new UnsupportedError("Directory._systemTemp");
+    throw UnsupportedError("Directory._systemTemp");
   }
 
   @patch
   static _exists(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("Directory._exists");
+    throw UnsupportedError("Directory._exists");
   }
 
   @patch
   static _create(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("Directory._create");
+    throw UnsupportedError("Directory._create");
   }
 
   @patch
   static _deleteNative(
       _Namespace namespace, Uint8List rawPath, bool recursive) {
-    throw new UnsupportedError("Directory._deleteNative");
+    throw UnsupportedError("Directory._deleteNative");
   }
 
   @patch
   static _rename(_Namespace namespace, Uint8List rawPath, String newPath) {
-    throw new UnsupportedError("Directory._rename");
+    throw UnsupportedError("Directory._rename");
   }
 
   @patch
@@ -58,7 +58,7 @@
       Uint8List rawPath,
       bool recursive,
       bool followLinks) {
-    throw new UnsupportedError("Directory._fillWithDirectoryListing");
+    throw UnsupportedError("Directory._fillWithDirectoryListing");
   }
 }
 
@@ -66,7 +66,7 @@
 class _AsyncDirectoryListerOps {
   @patch
   factory _AsyncDirectoryListerOps(int pointer) {
-    throw new UnsupportedError("Directory._list");
+    throw UnsupportedError("Directory._list");
   }
 }
 
@@ -74,7 +74,7 @@
 class _EventHandler {
   @patch
   static void _sendData(Object sender, SendPort sendPort, int data) {
-    throw new UnsupportedError("EventHandler._sendData");
+    throw UnsupportedError("EventHandler._sendData");
   }
 }
 
@@ -82,7 +82,7 @@
 class FileStat {
   @patch
   static _statSync(_Namespace namespace, String path) {
-    throw new UnsupportedError("FileStat.stat");
+    throw UnsupportedError("FileStat.stat");
   }
 }
 
@@ -91,17 +91,17 @@
   @patch
   static _getTypeNative(
       _Namespace namespace, Uint8List rawPath, bool followLinks) {
-    throw new UnsupportedError("FileSystemEntity._getType");
+    throw UnsupportedError("FileSystemEntity._getType");
   }
 
   @patch
   static _identicalNative(_Namespace namespace, String path1, String path2) {
-    throw new UnsupportedError("FileSystemEntity._identical");
+    throw UnsupportedError("FileSystemEntity._identical");
   }
 
   @patch
   static _resolveSymbolicLinks(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("FileSystemEntity._resolveSymbolicLinks");
+    throw UnsupportedError("FileSystemEntity._resolveSymbolicLinks");
   }
 }
 
@@ -109,82 +109,82 @@
 class _File {
   @patch
   static _exists(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._exists");
+    throw UnsupportedError("File._exists");
   }
 
   @patch
   static _create(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._create");
+    throw UnsupportedError("File._create");
   }
 
   @patch
   static _createLink(_Namespace namespace, Uint8List rawPath, String target) {
-    throw new UnsupportedError("File._createLink");
+    throw UnsupportedError("File._createLink");
   }
 
   @patch
   static _linkTarget(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._linkTarget");
+    throw UnsupportedError("File._linkTarget");
   }
 
   @patch
   static _deleteNative(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._deleteNative");
+    throw UnsupportedError("File._deleteNative");
   }
 
   @patch
   static _deleteLinkNative(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._deleteLinkNative");
+    throw UnsupportedError("File._deleteLinkNative");
   }
 
   @patch
   static _rename(_Namespace namespace, Uint8List oldPath, String newPath) {
-    throw new UnsupportedError("File._rename");
+    throw UnsupportedError("File._rename");
   }
 
   @patch
   static _renameLink(_Namespace namespace, Uint8List oldPath, String newPath) {
-    throw new UnsupportedError("File._renameLink");
+    throw UnsupportedError("File._renameLink");
   }
 
   @patch
   static _copy(_Namespace namespace, Uint8List oldPath, String newPath) {
-    throw new UnsupportedError("File._copy");
+    throw UnsupportedError("File._copy");
   }
 
   @patch
   static _lengthFromPath(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._lengthFromPath");
+    throw UnsupportedError("File._lengthFromPath");
   }
 
   @patch
   static _lastModified(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._lastModified");
+    throw UnsupportedError("File._lastModified");
   }
 
   @patch
   static _lastAccessed(_Namespace namespace, Uint8List rawPath) {
-    throw new UnsupportedError("File._lastAccessed");
+    throw UnsupportedError("File._lastAccessed");
   }
 
   @patch
   static _setLastModified(_Namespace namespace, Uint8List rawPath, int millis) {
-    throw new UnsupportedError("File._setLastModified");
+    throw UnsupportedError("File._setLastModified");
   }
 
   @patch
   static _setLastAccessed(_Namespace namespace, Uint8List rawPath, int millis) {
-    throw new UnsupportedError("File._setLastAccessed");
+    throw UnsupportedError("File._setLastAccessed");
   }
 
   @patch
   static _open(_Namespace namespace, Uint8List rawPath, int mode) {
-    throw new UnsupportedError("File._open");
+    throw UnsupportedError("File._open");
   }
 
   @patch
   static int _openStdio(int fd) {
-    throw new UnsupportedError("File._openStdio");
+    throw UnsupportedError("File._openStdio");
   }
 }
 
@@ -192,17 +192,17 @@
 class _Namespace {
   @patch
   static void _setupNamespace(var namespace) {
-    throw new UnsupportedError("_Namespace");
+    throw UnsupportedError("_Namespace");
   }
 
   @patch
   static _Namespace get _namespace {
-    throw new UnsupportedError("_Namespace");
+    throw UnsupportedError("_Namespace");
   }
 
   @patch
   static int get _namespacePointer {
-    throw new UnsupportedError("_Namespace");
+    throw UnsupportedError("_Namespace");
   }
 }
 
@@ -210,7 +210,7 @@
 class _RandomAccessFileOps {
   @patch
   factory _RandomAccessFileOps(int pointer) {
-    throw new UnsupportedError("RandomAccessFile");
+    throw UnsupportedError("RandomAccessFile");
   }
 }
 
@@ -218,7 +218,7 @@
 class _IOCrypto {
   @patch
   static Uint8List getRandomBytes(int count) {
-    throw new UnsupportedError("_IOCrypto.getRandomBytes");
+    throw UnsupportedError("_IOCrypto.getRandomBytes");
   }
 }
 
@@ -226,72 +226,72 @@
 class _Platform {
   @patch
   static int _numberOfProcessors() {
-    throw new UnsupportedError("Platform._numberOfProcessors");
+    throw UnsupportedError("Platform._numberOfProcessors");
   }
 
   @patch
   static String _pathSeparator() {
-    throw new UnsupportedError("Platform._pathSeparator");
+    throw UnsupportedError("Platform._pathSeparator");
   }
 
   @patch
   static String _operatingSystem() {
-    throw new UnsupportedError("Platform._operatingSystem");
+    throw UnsupportedError("Platform._operatingSystem");
   }
 
   @patch
   static _operatingSystemVersion() {
-    throw new UnsupportedError("Platform._operatingSystemVersion");
+    throw UnsupportedError("Platform._operatingSystemVersion");
   }
 
   @patch
   static _localHostname() {
-    throw new UnsupportedError("Platform._localHostname");
+    throw UnsupportedError("Platform._localHostname");
   }
 
   @patch
   static _executable() {
-    throw new UnsupportedError("Platform._executable");
+    throw UnsupportedError("Platform._executable");
   }
 
   @patch
   static _resolvedExecutable() {
-    throw new UnsupportedError("Platform._resolvedExecutable");
+    throw UnsupportedError("Platform._resolvedExecutable");
   }
 
   @patch
   static List<String> _executableArguments() {
-    throw new UnsupportedError("Platform._executableArguments");
+    throw UnsupportedError("Platform._executableArguments");
   }
 
   @patch
   static String _packageRoot() {
-    throw new UnsupportedError("Platform._packageRoot");
+    throw UnsupportedError("Platform._packageRoot");
   }
 
   @patch
   static String _packageConfig() {
-    throw new UnsupportedError("Platform._packageConfig");
+    throw UnsupportedError("Platform._packageConfig");
   }
 
   @patch
   static _environment() {
-    throw new UnsupportedError("Platform._environment");
+    throw UnsupportedError("Platform._environment");
   }
 
   @patch
   static String _version() {
-    throw new UnsupportedError("Platform._version");
+    throw UnsupportedError("Platform._version");
   }
 
   @patch
   static String _localeName() {
-    throw new UnsupportedError("Platform._localeName");
+    throw UnsupportedError("Platform._localeName");
   }
 
   @patch
   static Uri _script() {
-    throw new UnsupportedError("Platform._script");
+    throw UnsupportedError("Platform._script");
   }
 }
 
@@ -299,32 +299,32 @@
 class _ProcessUtils {
   @patch
   static void _exit(int status) {
-    throw new UnsupportedError("ProcessUtils._exit");
+    throw UnsupportedError("ProcessUtils._exit");
   }
 
   @patch
   static void _setExitCode(int status) {
-    throw new UnsupportedError("ProcessUtils._setExitCode");
+    throw UnsupportedError("ProcessUtils._setExitCode");
   }
 
   @patch
   static int _getExitCode() {
-    throw new UnsupportedError("ProcessUtils._getExitCode");
+    throw UnsupportedError("ProcessUtils._getExitCode");
   }
 
   @patch
   static void _sleep(int millis) {
-    throw new UnsupportedError("ProcessUtils._sleep");
+    throw UnsupportedError("ProcessUtils._sleep");
   }
 
   @patch
   static int _pid(Process process) {
-    throw new UnsupportedError("ProcessUtils._pid");
+    throw UnsupportedError("ProcessUtils._pid");
   }
 
   @patch
   static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
-    throw new UnsupportedError("ProcessUtils._watchSignal");
+    throw UnsupportedError("ProcessUtils._watchSignal");
   }
 }
 
@@ -332,12 +332,12 @@
 class ProcessInfo {
   @patch
   static int get currentRss {
-    throw new UnsupportedError("ProcessInfo.currentRss");
+    throw UnsupportedError("ProcessInfo.currentRss");
   }
 
   @patch
   static int get maxRss {
-    throw new UnsupportedError("ProcessInfo.maxRss");
+    throw UnsupportedError("ProcessInfo.maxRss");
   }
 }
 
@@ -347,37 +347,37 @@
   static Future<Process> start(String executable, List<String> arguments,
       {String workingDirectory,
       Map<String, String> environment,
-      bool includeParentEnvironment: true,
-      bool runInShell: false,
-      ProcessStartMode mode: ProcessStartMode.normal}) {
-    throw new UnsupportedError("Process.start");
+      bool includeParentEnvironment = true,
+      bool runInShell = false,
+      ProcessStartMode mode = ProcessStartMode.normal}) {
+    throw UnsupportedError("Process.start");
   }
 
   @patch
   static Future<ProcessResult> run(String executable, List<String> arguments,
       {String workingDirectory,
       Map<String, String> environment,
-      bool includeParentEnvironment: true,
-      bool runInShell: false,
-      Encoding stdoutEncoding: systemEncoding,
-      Encoding stderrEncoding: systemEncoding}) {
-    throw new UnsupportedError("Process.run");
+      bool includeParentEnvironment = true,
+      bool runInShell = false,
+      Encoding stdoutEncoding = systemEncoding,
+      Encoding stderrEncoding = systemEncoding}) {
+    throw UnsupportedError("Process.run");
   }
 
   @patch
   static ProcessResult runSync(String executable, List<String> arguments,
       {String workingDirectory,
       Map<String, String> environment,
-      bool includeParentEnvironment: true,
-      bool runInShell: false,
-      Encoding stdoutEncoding: systemEncoding,
-      Encoding stderrEncoding: systemEncoding}) {
-    throw new UnsupportedError("Process.runSync");
+      bool includeParentEnvironment = true,
+      bool runInShell = false,
+      Encoding stdoutEncoding = systemEncoding,
+      Encoding stderrEncoding = systemEncoding}) {
+    throw UnsupportedError("Process.runSync");
   }
 
   @patch
   static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) {
-    throw new UnsupportedError("Process.killPid");
+    throw UnsupportedError("Process.killPid");
   }
 }
 
@@ -385,38 +385,38 @@
 class InternetAddress {
   @patch
   static InternetAddress get LOOPBACK_IP_V4 {
-    throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V4");
+    throw UnsupportedError("InternetAddress.LOOPBACK_IP_V4");
   }
 
   @patch
   static InternetAddress get LOOPBACK_IP_V6 {
-    throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V6");
+    throw UnsupportedError("InternetAddress.LOOPBACK_IP_V6");
   }
 
   @patch
   static InternetAddress get ANY_IP_V4 {
-    throw new UnsupportedError("InternetAddress.ANY_IP_V4");
+    throw UnsupportedError("InternetAddress.ANY_IP_V4");
   }
 
   @patch
   static InternetAddress get ANY_IP_V6 {
-    throw new UnsupportedError("InternetAddress.ANY_IP_V6");
+    throw UnsupportedError("InternetAddress.ANY_IP_V6");
   }
 
   @patch
   factory InternetAddress(String address) {
-    throw new UnsupportedError("InternetAddress");
+    throw UnsupportedError("InternetAddress");
   }
   @patch
   static Future<List<InternetAddress>> lookup(String host,
-      {InternetAddressType type: InternetAddressType.any}) {
-    throw new UnsupportedError("InternetAddress.lookup");
+      {InternetAddressType type = InternetAddressType.any}) {
+    throw UnsupportedError("InternetAddress.lookup");
   }
 
   @patch
   static InternetAddress _cloneWithNewHost(
       InternetAddress address, String host) {
-    throw new UnsupportedError("InternetAddress._cloneWithNewHost");
+    throw UnsupportedError("InternetAddress._cloneWithNewHost");
   }
 }
 
@@ -424,15 +424,15 @@
 class NetworkInterface {
   @patch
   static bool get listSupported {
-    throw new UnsupportedError("NetworkInterface.listSupported");
+    throw UnsupportedError("NetworkInterface.listSupported");
   }
 
   @patch
   static Future<List<NetworkInterface>> list(
-      {bool includeLoopback: false,
-      bool includeLinkLocal: false,
-      InternetAddressType type: InternetAddressType.any}) {
-    throw new UnsupportedError("NetworkInterface.list");
+      {bool includeLoopback = false,
+      bool includeLinkLocal = false,
+      InternetAddressType type = InternetAddressType.any}) {
+    throw UnsupportedError("NetworkInterface.list");
   }
 }
 
@@ -440,8 +440,8 @@
 class RawServerSocket {
   @patch
   static Future<RawServerSocket> bind(address, int port,
-      {int backlog: 0, bool v6Only: false, bool shared: false}) {
-    throw new UnsupportedError("RawServerSocket.bind");
+      {int backlog = 0, bool v6Only = false, bool shared = false}) {
+    throw UnsupportedError("RawServerSocket.bind");
   }
 }
 
@@ -449,8 +449,8 @@
 class ServerSocket {
   @patch
   static Future<ServerSocket> bind(address, int port,
-      {int backlog: 0, bool v6Only: false, bool shared: false}) {
-    throw new UnsupportedError("ServerSocket.bind");
+      {int backlog = 0, bool v6Only = false, bool shared = false}) {
+    throw UnsupportedError("ServerSocket.bind");
   }
 }
 
@@ -459,7 +459,7 @@
   @patch
   static Future<RawSocket> connect(host, int port,
       {sourceAddress, Duration timeout}) {
-    throw new UnsupportedError("RawSocket constructor");
+    throw UnsupportedError("RawSocket constructor");
   }
 }
 
@@ -468,7 +468,7 @@
   @patch
   static Future<Socket> _connect(host, int port,
       {sourceAddress, Duration timeout}) {
-    throw new UnsupportedError("Socket constructor");
+    throw UnsupportedError("Socket constructor");
   }
 }
 
@@ -476,7 +476,7 @@
 class SecureSocket {
   @patch
   factory SecureSocket._(RawSecureSocket rawSocket) {
-    throw new UnsupportedError("SecureSocket constructor");
+    throw UnsupportedError("SecureSocket constructor");
   }
 }
 
@@ -484,25 +484,25 @@
 class RawSynchronousSocket {
   @patch
   static RawSynchronousSocket connectSync(host, int port) {
-    throw new UnsupportedError("RawSynchronousSocket.connectSync");
+    throw UnsupportedError("RawSynchronousSocket.connectSync");
   }
 }
 
 @patch
 class SecurityContext {
   @patch
-  factory SecurityContext({bool withTrustedRoots: false}) {
-    throw new UnsupportedError("SecurityContext constructor");
+  factory SecurityContext({bool withTrustedRoots = false}) {
+    throw UnsupportedError("SecurityContext constructor");
   }
 
   @patch
   static SecurityContext get defaultContext {
-    throw new UnsupportedError("default SecurityContext getter");
+    throw UnsupportedError("default SecurityContext getter");
   }
 
   @patch
   static bool get alpnSupported {
-    throw new UnsupportedError("SecurityContext alpnSupported getter");
+    throw UnsupportedError("SecurityContext alpnSupported getter");
   }
 }
 
@@ -510,7 +510,7 @@
 class X509Certificate {
   @patch
   factory X509Certificate._() {
-    throw new UnsupportedError("X509Certificate constructor");
+    throw UnsupportedError("X509Certificate constructor");
   }
 }
 
@@ -518,8 +518,8 @@
 class RawDatagramSocket {
   @patch
   static Future<RawDatagramSocket> bind(host, int port,
-      {bool reuseAddress: true}) {
-    throw new UnsupportedError("RawDatagramSocket.bind");
+      {bool reuseAddress = true}) {
+    throw UnsupportedError("RawDatagramSocket.bind");
   }
 }
 
@@ -527,7 +527,7 @@
 class _SecureFilter {
   @patch
   factory _SecureFilter() {
-    throw new UnsupportedError("_SecureFilter._SecureFilter");
+    throw UnsupportedError("_SecureFilter._SecureFilter");
   }
 }
 
@@ -535,22 +535,22 @@
 class _StdIOUtils {
   @patch
   static Stdin _getStdioInputStream(int fd) {
-    throw new UnsupportedError("StdIOUtils._getStdioInputStream");
+    throw UnsupportedError("StdIOUtils._getStdioInputStream");
   }
 
   @patch
   static _getStdioOutputStream(int fd) {
-    throw new UnsupportedError("StdIOUtils._getStdioOutputStream");
+    throw UnsupportedError("StdIOUtils._getStdioOutputStream");
   }
 
   @patch
   static int _socketType(Socket socket) {
-    throw new UnsupportedError("StdIOUtils._socketType");
+    throw UnsupportedError("StdIOUtils._socketType");
   }
 
   @patch
   static _getStdioHandleType(int fd) {
-    throw new UnsupportedError("StdIOUtils._getStdioHandleType");
+    throw UnsupportedError("StdIOUtils._getStdioHandleType");
   }
 }
 
@@ -558,7 +558,7 @@
 class _WindowsCodePageDecoder {
   @patch
   static String _decodeBytes(List<int> bytes) {
-    throw new UnsupportedError("_WindowsCodePageDecoder._decodeBytes");
+    throw UnsupportedError("_WindowsCodePageDecoder._decodeBytes");
   }
 }
 
@@ -566,7 +566,7 @@
 class _WindowsCodePageEncoder {
   @patch
   static List<int> _encodeString(String string) {
-    throw new UnsupportedError("_WindowsCodePageEncoder._encodeString");
+    throw UnsupportedError("_WindowsCodePageEncoder._encodeString");
   }
 }
 
@@ -581,13 +581,13 @@
       int strategy,
       List<int> dictionary,
       bool raw) {
-    throw new UnsupportedError("_newZLibDeflateFilter");
+    throw UnsupportedError("_newZLibDeflateFilter");
   }
 
   @patch
   static RawZLibFilter _makeZLibInflateFilter(
       int windowBits, List<int> dictionary, bool raw) {
-    throw new UnsupportedError("_newZLibInflateFilter");
+    throw UnsupportedError("_newZLibInflateFilter");
   }
 }
 
@@ -595,32 +595,32 @@
 class Stdin {
   @patch
   int readByteSync() {
-    throw new UnsupportedError("Stdin.readByteSync");
+    throw UnsupportedError("Stdin.readByteSync");
   }
 
   @patch
   bool get echoMode {
-    throw new UnsupportedError("Stdin.echoMode");
+    throw UnsupportedError("Stdin.echoMode");
   }
 
   @patch
   void set echoMode(bool enabled) {
-    throw new UnsupportedError("Stdin.echoMode");
+    throw UnsupportedError("Stdin.echoMode");
   }
 
   @patch
   bool get lineMode {
-    throw new UnsupportedError("Stdin.lineMode");
+    throw UnsupportedError("Stdin.lineMode");
   }
 
   @patch
   void set lineMode(bool enabled) {
-    throw new UnsupportedError("Stdin.lineMode");
+    throw UnsupportedError("Stdin.lineMode");
   }
 
   @patch
   bool get supportsAnsiEscapes {
-    throw new UnsupportedError("Stdin.supportsAnsiEscapes");
+    throw UnsupportedError("Stdin.supportsAnsiEscapes");
   }
 }
 
@@ -628,22 +628,22 @@
 class Stdout {
   @patch
   bool _hasTerminal(int fd) {
-    throw new UnsupportedError("Stdout.hasTerminal");
+    throw UnsupportedError("Stdout.hasTerminal");
   }
 
   @patch
   int _terminalColumns(int fd) {
-    throw new UnsupportedError("Stdout.terminalColumns");
+    throw UnsupportedError("Stdout.terminalColumns");
   }
 
   @patch
   int _terminalLines(int fd) {
-    throw new UnsupportedError("Stdout.terminalLines");
+    throw UnsupportedError("Stdout.terminalLines");
   }
 
   @patch
   static bool _supportsAnsiEscapes(int fd) {
-    throw new UnsupportedError("Stdout.supportsAnsiEscapes");
+    throw UnsupportedError("Stdout.supportsAnsiEscapes");
   }
 }
 
@@ -652,12 +652,12 @@
   @patch
   static Stream<FileSystemEvent> _watch(
       String path, int events, bool recursive) {
-    throw new UnsupportedError("_FileSystemWatcher.watch");
+    throw UnsupportedError("_FileSystemWatcher.watch");
   }
 
   @patch
   static bool get isSupported {
-    throw new UnsupportedError("_FileSystemWatcher.isSupported");
+    throw UnsupportedError("_FileSystemWatcher.isSupported");
   }
 }
 
@@ -665,6 +665,6 @@
 class _IOService {
   @patch
   static Future _dispatch(int request, List data) {
-    throw new UnsupportedError("_IOService._dispatch");
+    throw UnsupportedError("_IOService._dispatch");
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
index bd0b258..999f518 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
@@ -30,7 +30,7 @@
 
   @patch
   static Future<Isolate> spawn<T>(void entryPoint(T message), T message,
-          {bool paused: false,
+          {bool paused = false,
           bool errorsAreFatal,
           SendPort onExit,
           SendPort onError}) =>
@@ -38,7 +38,7 @@
 
   @patch
   static Future<Isolate> spawnUri(Uri uri, List<String> args, var message,
-          {bool paused: false,
+          {bool paused = false,
           SendPort onExit,
           SendPort onError,
           bool errorsAreFatal,
@@ -46,7 +46,7 @@
           Map<String, String> environment,
           Uri packageRoot,
           Uri packageConfig,
-          bool automaticPackageResolution: false}) =>
+          bool automaticPackageResolution = false}) =>
       _unsupported();
 
   @patch
@@ -66,10 +66,10 @@
   void setErrorsFatal(bool errorsAreFatal) => _unsupported();
 
   @patch
-  void kill({int priority: beforeNextEvent}) => _unsupported();
+  void kill({int priority = beforeNextEvent}) => _unsupported();
   @patch
   void ping(SendPort responsePort,
-          {Object response, int priority: immediate}) =>
+          {Object response, int priority = immediate}) =>
       _unsupported();
 
   @patch
@@ -115,5 +115,5 @@
 
 @NoReifyGeneric()
 T _unsupported<T>() {
-  throw new UnsupportedError('dart:isolate is not supported on dart4web');
+  throw UnsupportedError('dart:isolate is not supported on dart4web');
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart
index c86c998..1e2c7dd 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart
@@ -67,11 +67,11 @@
 
 @patch
 class Random {
-  static final _secureRandom = new _JSSecureRandom();
+  static final _secureRandom = _JSSecureRandom();
 
   @patch
   factory Random([int seed]) =>
-      (seed == null) ? const _JSRandom() : new _Random(seed);
+      (seed == null) ? const _JSRandom() : _Random(seed);
 
   @patch
   factory Random.secure() => _secureRandom;
@@ -84,7 +84,7 @@
   @notNull
   int nextInt(int max) {
     if (max <= 0 || max > _POW2_32) {
-      throw new RangeError("max must be in range 0 < max ≤ 2^32, was $max");
+      throw RangeError("max must be in range 0 < max ≤ 2^32, was $max");
     }
     return JS("int", "(Math.random() * #) >>> 0", max);
   }
@@ -225,7 +225,7 @@
   @notNull
   int nextInt(@nullCheck int max) {
     if (max <= 0 || max > _POW2_32) {
-      throw new RangeError("max must be in range 0 < max ≤ 2^32, was $max");
+      throw RangeError("max must be in range 0 < max ≤ 2^32, was $max");
     }
     if ((max & (max - 1)) == 0) {
       // Fast case for powers of two.
@@ -261,7 +261,7 @@
 
 class _JSSecureRandom implements Random {
   // Reused buffer with room enough for a double.
-  final _buffer = new ByteData(8);
+  final _buffer = ByteData(8);
 
   _JSSecureRandom() {
     var crypto = JS("", "self.crypto");
@@ -271,7 +271,7 @@
         return;
       }
     }
-    throw new UnsupportedError(
+    throw UnsupportedError(
         "No source of cryptographically secure random numbers available.");
   }
 
@@ -311,7 +311,7 @@
   @notNull
   int nextInt(@nullCheck int max) {
     if (max <= 0 || max > _POW2_32) {
-      throw new RangeError("max must be in range 0 < max ≤ 2^32, was $max");
+      throw RangeError("max must be in range 0 < max ≤ 2^32, was $max");
     }
     int byteCount = 1;
     if (max > 0xFF) {
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
index b2c765f..dec3d20 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
@@ -33,11 +33,11 @@
 @patch
 ClassMirror reflectClass(Type key) {
   if (key is! Type || key == dynamic) {
-    throw new ArgumentError('$key does not denote a class');
+    throw ArgumentError('$key does not denote a class');
   }
   TypeMirror tm = reflectType(key);
   if (tm is! ClassMirror) {
-    throw new ArgumentError("$key does not denote a class");
+    throw ArgumentError("$key does not denote a class");
   }
   return (tm as ClassMirror).originalDeclaration;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart
index 54b2bd2..f1e2dc1 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart
@@ -100,12 +100,12 @@
 class Int64List {
   @patch
   factory Int64List(int length) {
-    throw new UnsupportedError("Int64List not supported by dart2js.");
+    throw UnsupportedError("Int64List not supported by dart2js.");
   }
 
   @patch
   factory Int64List.fromList(List<int> elements) {
-    throw new UnsupportedError("Int64List not supported by dart2js.");
+    throw UnsupportedError("Int64List not supported by dart2js.");
   }
 }
 
@@ -113,12 +113,12 @@
 class Uint64List {
   @patch
   factory Uint64List(int length) {
-    throw new UnsupportedError("Uint64List not supported by dart2js.");
+    throw UnsupportedError("Uint64List not supported by dart2js.");
   }
 
   @patch
   factory Uint64List.fromList(List<int> elements) {
-    throw new UnsupportedError("Uint64List not supported by dart2js.");
+    throw UnsupportedError("Uint64List not supported by dart2js.");
   }
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/annotations.dart b/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
index 87df639..d7409da 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
@@ -20,7 +20,7 @@
 /// or otherwise cause the contract to be violated.
 /// TODO(leafp): Consider adding static checking and exposing
 /// this to user code.
-const notNull = const _NotNull();
+const notNull = _NotNull();
 
 /// Marks a generic function or static method API to be not reified.
 /// ****CAUTION******
@@ -49,7 +49,7 @@
 /// ****CAUTION******
 /// This is currently unchecked, and hence will not catch re-assignments
 /// of a variable with null
-const nullCheck = const _NullCheck();
+const nullCheck = _NullCheck();
 
 /// Tells the optimizing compiler that the annotated method cannot throw.
 /// Requires @NoInline() to function correctly.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart
index 578fbc1..e2cde4c 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/custom_hash_map.dart
@@ -63,8 +63,8 @@
   @notNull
   bool get isNotEmpty => JS('bool', '#.size != 0', _map);
 
-  Iterable<K> get keys => new _JSMapIterable<K>(this, true);
-  Iterable<V> get values => new _JSMapIterable<V>(this, false);
+  Iterable<K> get keys => _JSMapIterable<K>(this, true);
+  Iterable<V> get values => _JSMapIterable<V>(this, false);
 
   @notNull
   bool containsKey(Object key) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
index 0dd4e3e..5c504b4 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
@@ -10,7 +10,7 @@
 ///
 
 // TODO(leafp): Consider splitting some of this out.
-part of dart._runtime;
+part of "runtime.dart";
 
 /// Returns a new type that mixes members from base and the mixin.
 ///
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index 115a550..35ab4ae 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -1,7 +1,7 @@
 // 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.
-part of dart._runtime;
+part of "runtime.dart";
 
 // We need to set these properties while the sdk is only partially initialized
 // so we cannot use regular Dart fields.
@@ -24,22 +24,22 @@
 
 argumentError(value) {
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  throw new ArgumentError.value(value);
+  throw ArgumentError.value(value);
 }
 
 throwUnimplementedError(String message) {
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  throw new UnimplementedError(message);
+  throw UnimplementedError(message);
 }
 
 assertFailed(message) {
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  throw new AssertionErrorImpl(message);
+  throw AssertionErrorImpl(message);
 }
 
 throwCyclicInitializationError([Object field]) {
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  throw new CyclicInitializationError(field);
+  throw CyclicInitializationError(field);
 }
 
 throwNullValueError() {
@@ -47,8 +47,8 @@
   // to thread through method info, but that uglifies the code and can't
   // actually be queried ... it only affects how the error is printed.
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  throw new NoSuchMethodError(
-      null, new Symbol('<Unexpected Null Value>'), null, null, null);
+  throw NoSuchMethodError(
+      null, Symbol('<Unexpected Null Value>'), null, null, null);
 }
 
 castError(obj, expectedType, [@notNull bool isImplicit = false]) {
@@ -59,8 +59,7 @@
     return obj;
   }
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  var error =
-      isImplicit ? new TypeErrorImpl(message) : new CastErrorImpl(message);
+  var error = isImplicit ? TypeErrorImpl(message) : CastErrorImpl(message);
   throw error;
 }
 
@@ -71,7 +70,7 @@
   if (fromClass != null) {
     var fromTypeFormals = getGenericTypeFormals(fromClass);
     var fromType = instantiateClass(fromClass, fromTypeFormals);
-    var inferrer = new _TypeInferrer(fromTypeFormals);
+    var inferrer = _TypeInferrer(fromTypeFormals);
     if (inferrer.trySubtypeMatch(fromType, to)) {
       var inferredTypes = inferrer.getInferredTypes();
       if (inferredTypes != null) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
deleted file mode 100644
index 584a6f1..0000000
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// This library adapts ES6 generators to implement Dart's async/await.
-/// It's designed to interact with Dart's Future/Stream and follow Dart
-/// async/await semantics.
-/// See https://github.com/dart-lang/sdk/issues/27315 for ideas on
-/// reconciling Dart's Future and ES6 Promise.
-/// Inspired by `co`: https://github.com/tj/co/blob/master/index.js, which is a
-/// stepping stone for proposed ES7 async/await, and uses ES6 Promises.
-part of dart._runtime;
-
-// TODO(vsm): Remove once this flag we've removed the ability to
-// whitelist / fallback on the old behavior.
-bool startAsyncSynchronously = true;
-void setStartAsyncSynchronously([bool value = true]) {
-  startAsyncSynchronously = value;
-}
-
-final _jsIterator = JS('', 'Symbol("_jsIterator")');
-final _current = JS('', 'Symbol("_current")');
-
-/// Implementation inspired by _AsyncStarStreamController in
-/// dart-lang/sdk's runtime/lib/core_patch.dart
-///
-/// Given input like:
-///
-///     foo() async* {
-///       yield 1;
-///       yield* bar();
-///       print(await baz());
-///     }
-///
-/// This generates as:
-///
-///     function foo() {
-///       return dart.asyncStar(function*(stream) {
-///         if (stream.add(1)) return;
-///         yield;
-///         if (stream.addStream(bar()) return;
-///         yield;
-///         print(yield baz());
-///      });
-///     }
-///
-// TODO(jmesserly): port back to Dart, based on VM's equivalent class, and move
-// to dart:async async_patch.dart
-final _AsyncStarStreamController = JS('', '''
-  class _AsyncStarStreamController {
-    constructor(T) {
-      this.isAdding = false;
-      this.isWaiting = false;
-      this.isScheduled = false;
-      this.isSuspendedAtYield = false;
-      this.canceler = null;
-      this.controller = ${getGenericClass(StreamController)}(T).new({
-        onListen: () => this.scheduleGenerator(),
-        onResume: () => this.onResume(),
-        onCancel: () => this.onCancel()
-      });
-    }
-
-    onResume() {
-      if (this.isSuspendedAtYield) {
-        this.scheduleGenerator();
-      }
-    }
-
-    onCancel() {
-      if (this.controller.isClosed) {
-        return null;
-      }
-      if (this.canceler == null) {
-        this.canceler = $Completer.new();
-        this.scheduleGenerator();
-      }
-      return this.canceler.future;
-    }
-
-    close() {
-      if (this.canceler != null && !this.canceler.isCompleted) {
-        // If the stream has been cancelled, complete the cancellation future
-        // with the error.
-        this.canceler.complete();
-      }
-      this.controller.close();
-    }
-
-    scheduleGenerator() {
-      // TODO(jmesserly): is this paused check in the right place? Assuming the
-      // async* Stream yields, then is paused (by other code), the body will
-      // already be scheduled. This will cause at least one more iteration to
-      // run (adding another data item to the Stream) before actually pausing.
-      // It could be fixed by moving the `isPaused` check inside `runBody`.
-      if (this.isScheduled || this.controller.isPaused ||
-          this.isAdding || this.isWaiting) {
-        return;
-      }
-      this.isScheduled = true;
-      $scheduleMicrotask(() => this.runBody());
-    }
-
-    runBody(opt_awaitValue) {
-      this.isScheduled = false;
-      this.isSuspendedAtYield = false;
-      this.isWaiting = false;
-      let iter;
-      try {
-        iter = this.iterator.next(opt_awaitValue);
-      } catch (e) {
-        this.addError(e, $stackTrace(e));
-        this.close();
-        return;
-      }
-      if (iter.done) {
-        this.close();
-        return;
-      }
-
-      // If we're suspended at a yield/yield*, we're done for now.
-      if (this.isSuspendedAtYield || this.isAdding) return;
-
-      // Handle `await`: if we get a value passed to `yield` it means we are
-      // waiting on this Future. Make sure to prevent scheduling, and pass the
-      // value back as the result of the `yield`.
-      //
-      // TODO(jmesserly): is the timing here correct? The assumption here is
-      // that we should schedule `await` in `async*` the same as in `async`.
-      this.isWaiting = true;
-      let future = iter.value;
-      // TODO(jmesserly): `async` uses a different check that looks for the
-      // (private) implementation type of `Future`, rather than the public type.
-      if (!$Future.is(future)) {
-        future = $Future.value(future);
-      }
-      return future.then($dynamic, (x) => this.runBody(x),
-          { onError: (e, s) => this.throwError(e, s) });
-    }
-
-    // Adds element to stream, returns true if the caller should terminate
-    // execution of the generator.
-    add(event) {
-      // If stream is cancelled, tell caller to exit the async generator.
-      if (!this.controller.hasListener) return true;
-      this.controller.add(event);
-      this.scheduleGenerator();
-      this.isSuspendedAtYield = true;
-      return false;
-    }
-
-    // Adds the elements of stream into this controller's stream.
-    // The generator will be scheduled again when all of the
-    // elements of the added stream have been consumed.
-    // Returns true if the caller should terminate
-    // execution of the generator.
-    addStream(stream) {
-      // If stream is cancelled, tell caller to exit the async generator.
-      if (!this.controller.hasListener) return true;
-
-      this.isAdding = true;
-      this.controller.addStream(stream, {cancelOnError: false}).then($dynamic,
-          () => {
-        this.isAdding = false;
-        this.scheduleGenerator();
-        if (!this.isScheduled) this.isSuspendedAtYield = true;
-      }, { onError: (e, s) => this.throwError(e, s) });
-    }
-
-    throwError(error, stackTrace) {
-      try {
-        this.iterator.throw(error);
-      } catch (e) {
-        this.addError(e, stackTrace);
-      }
-    }
-
-    addError(error, stackTrace) {
-      if ((this.canceler != null) && !this.canceler.isCompleted) {
-        // If the stream has been cancelled, complete the cancellation future
-        // with the error.
-        this.canceler.completeError(error, stackTrace);
-        return;
-      }
-      if (!this.controller.hasListener) return;
-      this.controller.addError(error, stackTrace);
-    }
-  }
-''');
-
-/// Returns a Stream of T implemented by an async* function.
-asyncStar<T>(Function(Object) initGenerator) {
-  var stream = JS('', 'new #(#)', _AsyncStarStreamController, T);
-  JS('', '#.iterator = #[Symbol.iterator]()', stream, initGenerator(stream));
-  return JS('', '#.controller.stream', stream);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index cbeda90..5e3fef0 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -4,7 +4,7 @@
 
 /// This library defines runtime operations on objects used by the code
 /// generator.
-part of dart._runtime;
+part of "runtime.dart";
 
 // TODO(jmesserly): remove this in favor of _Invocation.
 class InvocationImpl extends Invocation {
@@ -19,23 +19,21 @@
   InvocationImpl(memberName, List<Object> positionalArguments,
       {namedArguments,
       List typeArguments,
-      this.isMethod: false,
-      this.isGetter: false,
-      this.isSetter: false})
+      this.isMethod = false,
+      this.isGetter = false,
+      this.isSetter = false})
       : memberName =
             isSetter ? _setterSymbol(memberName) : _dartSymbol(memberName),
-        positionalArguments = new List.unmodifiable(positionalArguments),
+        positionalArguments = List.unmodifiable(positionalArguments),
         namedArguments = _namedArgsToSymbols(namedArguments),
         typeArguments = typeArguments == null
             ? const []
-            : new List.unmodifiable(typeArguments.map(wrapType));
+            : List.unmodifiable(typeArguments.map(wrapType));
 
   static Map<Symbol, dynamic> _namedArgsToSymbols(namedArgs) {
     if (namedArgs == null) return const {};
-    return new Map.unmodifiable(new Map.fromIterable(
-        getOwnPropertyNames(namedArgs),
-        key: _dartSymbol,
-        value: (k) => JS('', '#[#]', namedArgs, k)));
+    return Map.unmodifiable(Map.fromIterable(getOwnPropertyNames(namedArgs),
+        key: _dartSymbol, value: (k) => JS('', '#[#]', namedArgs, k)));
   }
 }
 
@@ -115,8 +113,7 @@
       return JS('', '#[#]', obj, f);
     }
   }
-  return noSuchMethod(
-      obj, new InvocationImpl(field, JS('', '[]'), isGetter: true));
+  return noSuchMethod(obj, InvocationImpl(field, JS('', '[]'), isGetter: true));
 }
 
 // Version of dload that matches legacy mirrors behavior for JS types.
@@ -153,7 +150,7 @@
     }
   }
   noSuchMethod(
-      obj, new InvocationImpl(field, JS('', '[#]', value), isSetter: true));
+      obj, InvocationImpl(field, JS('', '[#]', value), isSetter: true));
   return value;
 }
 
@@ -365,8 +362,7 @@
   }
   var symbol = _canonicalMember(obj, name);
   if (symbol == null) {
-    return noSuchMethod(
-        obj, new InvocationImpl(displayName, args, isMethod: true));
+    return noSuchMethod(obj, InvocationImpl(displayName, args, isMethod: true));
   }
   var f = obj != null ? JS('', '#[#]', obj, symbol) : null;
   var type = getType(obj);
@@ -412,7 +408,7 @@
   };
 })()''');
 
-final _ignoreTypeFailure = JS('', '''(() => {
+final Object _ignoreTypeFailure = JS('', '''(() => {
   return $_ignoreMemo((actual, type) => {
       // TODO(vsm): Remove this hack ...
       // This is primarily due to the lack of generic methods,
@@ -475,13 +471,11 @@
   return obj;
 }
 
-void _throwBooleanConversionError() =>
-    throw new BooleanConversionAssertionError();
+void _throwBooleanConversionError() => throw BooleanConversionAssertionError();
 
 void booleanConversionFailed(obj) {
   var actual = typeName(getReifiedType(test(obj)));
-  throw new TypeErrorImpl(
-      "type '$actual' is not a 'bool' in boolean expression");
+  throw TypeErrorImpl("type '$actual' is not a 'bool' in boolean expression");
 }
 
 asInt(obj) {
@@ -524,7 +518,7 @@
   map = lookupNonTerminal(map, K);
   var result = JS('', '#.get(#)', map, V);
   if (result != null) return result;
-  result = new ImmutableMap<K, V>.from(elements);
+  result = ImmutableMap<K, V>.from(elements);
   JS('', '#.set(#, #)', map, V, result);
   return result;
 }
@@ -772,7 +766,7 @@
 /// The default implementation of `noSuchMethod` to match `Object.noSuchMethod`.
 defaultNoSuchMethod(obj, Invocation i) {
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  throw new NoSuchMethodError.withInvocation(obj, i);
+  throw NoSuchMethodError.withInvocation(obj, i);
 }
 
 runtimeType(obj) {
@@ -817,7 +811,7 @@
 ///
 /// Libraries are not actually deferred in DDC, so this just returns a future
 /// that completes immediately.
-Future loadLibrary() => new Future.value();
+Future loadLibrary() => Future.value();
 
 /// Defines lazy statics.
 void defineLazy(to, from) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
index 95af629..45a69c1 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
@@ -4,7 +4,7 @@
 
 /// This library defines the association between runtime objects and
 /// runtime types.
-part of dart._runtime;
+part of "runtime.dart";
 
 /// Runtime type information.  This module defines the mapping from
 /// runtime objects to their runtime type information.  See the types
@@ -121,7 +121,7 @@
   if (JS('!', '#.hasOwnProperty(#)', type, _typeObject)) {
     return JS('', '#[#]', type, _typeObject);
   }
-  return JS('Type', '#[#] = #', type, _typeObject, new WrappedType(type));
+  return JS('Type', '#[#] = #', type, _typeObject, WrappedType(type));
 }
 
 /// The symbol used to store the cached `Type` object associated with a class.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index fd5a32b..39e38c1 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -27,15 +27,13 @@
         notNull;
 import 'dart:_debugger' show trackCall;
 
-export 'dart:_debugger'
-    show getDynamicStats, clearDynamicStats, trackCall;
+export 'dart:_debugger' show getDynamicStats, clearDynamicStats, trackCall;
 
 part 'utils.dart';
 part 'classes.dart';
 part 'rtti.dart';
 part 'types.dart';
 part 'errors.dart';
-part 'generators.dart';
 part 'operations.dart';
 
 // TODO(vsm): Move polyfill code to dart:html.
@@ -149,3 +147,10 @@
 }
 
 final JsSymbol = JS('', 'Symbol');
+
+// TODO(vsm): Remove once this flag we've removed the ability to
+// whitelist / fallback on the old behavior.
+bool startAsyncSynchronously = true;
+void setStartAsyncSynchronously([bool value = true]) {
+  startAsyncSynchronously = value;
+}
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index 8ac9b89..7090c94 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// This library defines the representation of runtime types.
-part of dart._runtime;
+part of "runtime.dart";
 
 final metadata = JS('', 'Symbol("metadata")');
 
@@ -149,7 +149,7 @@
 lazyJSType(Function() getJSTypeCallback, String name) {
   var ret = JS('', '#.get(#)', _lazyJSTypes, name);
   if (ret == null) {
-    ret = new LazyJSType(getJSTypeCallback, name);
+    ret = LazyJSType(getJSTypeCallback, name);
     JS('', '#.set(#, #)', _lazyJSTypes, name, ret);
   }
   return ret;
@@ -158,33 +158,33 @@
 anonymousJSType(String name) {
   var ret = JS('', '#.get(#)', _anonymousJSTypes, name);
   if (ret == null) {
-    ret = new AnonymousJSType(name);
+    ret = AnonymousJSType(name);
     JS('', '#.set(#, #)', _anonymousJSTypes, name, ret);
   }
   return ret;
 }
 
 @JSExportName('dynamic')
-final _dynamic = new DynamicType();
+final _dynamic = DynamicType();
 
 class VoidType extends TypeRep {
   toString() => 'void';
 }
 
 @JSExportName('void')
-final void_ = new VoidType();
+final void_ = VoidType();
 
 class BottomType extends TypeRep {
   toString() => 'bottom';
 }
 
-final bottom = new BottomType();
+final bottom = BottomType();
 
 class JSObjectType extends TypeRep {
   toString() => 'NativeJavaScriptObject';
 }
 
-final jsobject = new JSObjectType();
+final jsobject = JSObjectType();
 
 class WrappedType extends Type {
   final _wrappedType;
@@ -310,17 +310,16 @@
     FunctionType Function() create;
     if (extra == null) {
       keys = [returnType, args];
-      create = () => new FunctionType(returnType, args, [], JS('', '{}'));
+      create = () => FunctionType(returnType, args, [], JS('', '{}'));
     } else if (JS('!', '# instanceof Array', extra)) {
       var optionals =
           _canonicalizeArray(JS('', '#', extra), _fnTypeArrayArgMap);
       keys = [returnType, args, optionals];
-      create =
-          () => new FunctionType(returnType, args, optionals, JS('', '{}'));
+      create = () => FunctionType(returnType, args, optionals, JS('', '{}'));
     } else {
       var named = _canonicalizeNamed(extra, _fnTypeNamedArgMap);
       keys = [returnType, args, named];
-      create = () => new FunctionType(returnType, args, [], named);
+      create = () => FunctionType(returnType, args, [], named);
     }
     return _memoizeArray(_fnTypeTypeMap, keys, create);
   }
@@ -534,7 +533,7 @@
       // The Dart 1 spec says omitted type parameters have an upper bound of
       // Object. However strong mode assumes `dynamic` for all purposes
       // (such as instantiate to bounds) so we use that here.
-      return new List.filled(formalCount, _dynamic);
+      return List.filled(formalCount, _dynamic);
     }
     // If bounds are recursive, we need to apply type formals and return them.
     return JS('List', '#.apply(null, #)', boundsFn, typeArgs);
@@ -566,16 +565,16 @@
     var typeFormals = this.typeFormals;
 
     // All type formals
-    var all = new HashMap<Object, int>.identity();
+    var all = HashMap<Object, int>.identity();
     // ground types, by index.
     //
     // For each index, this will be a ground type for the corresponding type
     // formal if known, or it will be the original TypeVariable if we are still
     // solving for it. This array is passed to `instantiateToBounds` as we are
     // progressively solving for type variables.
-    var defaults = new List<Object>(typeFormals.length);
+    var defaults = List<Object>(typeFormals.length);
     // not ground
-    var partials = new Map<TypeVariable, Object>.identity();
+    var partials = Map<TypeVariable, Object>.identity();
 
     var typeBounds = this.instantiateTypeBounds(typeFormals);
     for (var i = 0; i < typeFormals.length; i++) {
@@ -675,15 +674,15 @@
     return str
         .substring(1, end)
         .split(',')
-        .map((n) => new TypeVariable(n.trim()))
+        .map((n) => TypeVariable(n.trim()))
         .toList();
   } else {
-    return [new TypeVariable(str.substring(0, end).trim())];
+    return [TypeVariable(str.substring(0, end).trim())];
   }
 }
 
 Typedef typedef(name, AbstractFunctionType Function() closure) =>
-    new Typedef(name, closure);
+    Typedef(name, closure);
 
 /// Create a function type.
 FunctionType fnType(returnType, List args, [extra = undefined]) =>
@@ -700,14 +699,14 @@
 /// For example given the type <T extends Iterable<T>>(T) -> T, we can declare
 /// this type with `gFnType(T => [T, [T]], T => [Iterable$(T)])`.\
 gFnType(instantiateFn, typeBounds) =>
-    new GenericFunctionType(instantiateFn, typeBounds);
+    GenericFunctionType(instantiateFn, typeBounds);
 
 /// TODO(vsm): Remove when mirrors is deprecated.
 /// This is a temporary workaround to support dart:mirrors, which doesn't
 /// understand generic methods.
 getFunctionTypeMirror(AbstractFunctionType type) {
   if (type is GenericFunctionType) {
-    var typeArgs = new List.filled(type.formalCount, dynamic);
+    var typeArgs = List.filled(type.formalCount, dynamic);
     return type.instantiate(typeArgs);
   }
   return type;
@@ -1066,15 +1065,15 @@
 
 Object extractTypeArguments<T>(T instance, Function f) {
   if (instance == null) {
-    throw new ArgumentError('Cannot extract type of null instance.');
+    throw ArgumentError('Cannot extract type of null instance.');
   }
   var type = unwrapType(T);
   if (type is AbstractFunctionType || _isFutureOr(type)) {
-    throw new ArgumentError('Cannot extract from non-class type ($type).');
+    throw ArgumentError('Cannot extract from non-class type ($type).');
   }
   var typeArguments = getGenericArgs(type);
   if (typeArguments.isEmpty) {
-    throw new ArgumentError('Cannot extract from non-generic type ($type).');
+    throw ArgumentError('Cannot extract from non-generic type ($type).');
   }
   var supertype = _getMatchingSupertype(getReifiedType(instance), type);
   // The signature of this method guarantees that instance is a T, so we
@@ -1093,12 +1092,12 @@
   /// Creates a [TypeConstraintGatherer] which is prepared to gather type
   /// constraints for the given type parameters.
   _TypeInferrer(Iterable<TypeVariable> typeVariables)
-      : _typeVariables = new Map.fromIterables(
-            typeVariables, typeVariables.map((_) => new TypeConstraint()));
+      : _typeVariables = Map.fromIterables(
+            typeVariables, typeVariables.map((_) => TypeConstraint()));
 
   /// Returns the inferred types based on the current constraints.
   List<Object> getInferredTypes() {
-    var result = new List<Object>();
+    var result = List<Object>();
     for (var constraint in _typeVariables.values) {
       // Prefer the known bound, if any.
       if (constraint.lower != null) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
index 8e3b738..24a9463 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
@@ -1,7 +1,7 @@
 // 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.
-part of dart._runtime;
+part of "runtime.dart";
 
 /// This library defines a set of general javascript utilities for us
 /// by the Dart runtime.
@@ -40,7 +40,7 @@
 /// assertion failure (TypeError) or CastError.
 void throwTypeError(String message) {
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  throw new TypeErrorImpl(message);
+  throw TypeErrorImpl(message);
 }
 
 /// This error indicates a bug in the runtime or the compiler.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
index 7b68c31..9fa9679 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
@@ -28,16 +28,16 @@
   const JsonMLConfig(this.name);
 
   final String name;
-  static const none = const JsonMLConfig("none");
-  static const skipDart = const JsonMLConfig("skipDart");
-  static const keyToString = const JsonMLConfig("keyToString");
-  static const asClass = const JsonMLConfig("asClass");
-  static const asObject = const JsonMLConfig("asObject");
+  static const none = JsonMLConfig("none");
+  static const skipDart = JsonMLConfig("skipDart");
+  static const keyToString = JsonMLConfig("keyToString");
+  static const asClass = JsonMLConfig("asClass");
+  static const asObject = JsonMLConfig("asObject");
   toString() => "JsonMLConfig($name)";
 }
 
 int _maxSpanLength = 100;
-var _devtoolsFormatter = new JsonMLFormatter(new DartFormatter());
+var _devtoolsFormatter = JsonMLFormatter(DartFormatter());
 
 /// We truncate a toString() longer than [maxStringLength].
 int maxFormatterStringLength = 100;
@@ -45,7 +45,7 @@
 String _typeof(object) => JS('String', 'typeof #', object);
 
 List<String> getOwnPropertyNames(object) =>
-    new JSArray<String>.of(dart.getOwnPropertyNames(object));
+    JSArray<String>.of(dart.getOwnPropertyNames(object));
 
 List getOwnPropertySymbols(object) =>
     JS('List', 'Object.getOwnPropertySymbols(#)', object);
@@ -60,7 +60,7 @@
 }
 
 void addMetadataChildren(object, Set<NameValuePair> ret) {
-  ret.add(new NameValuePair(
+  ret.add(NameValuePair(
       name: "[[class]]",
       value: dart.getReifiedType(object),
       config: JsonMLConfig.asClass));
@@ -72,11 +72,11 @@
 ///
 void addPropertiesFromSignature(
     sig, Set<NameValuePair> properties, object, bool walkPrototypeChain,
-    {tagTypes: false}) {
+    {tagTypes = false}) {
   // Including these property names doesn't add any value and just clutters
   // the debugger output.
   // TODO(jacobr): consider adding runtimeType to this list.
-  var skippedNames = new Set()..add('hashCode');
+  var skippedNames = Set()..add('hashCode');
   var objectPrototype = JS('', 'Object.prototype');
   while (sig != null && !identical(sig, objectPrototype)) {
     for (var symbol in getOwnPropertySymbols(sig)) {
@@ -91,7 +91,7 @@
       if (tagTypes && _typeof(value) == 'function') {
         dart.fn(value, JS('', '#[#]', sig, symbol));
       }
-      properties.add(new NameValuePair(name: dartName, value: value));
+      properties.add(NameValuePair(name: dartName, value: value));
     }
 
     for (var name in getOwnPropertyNames(sig)) {
@@ -101,7 +101,7 @@
       if (tagTypes && _typeof(value) == 'function') {
         dart.fn(value, JS('', '#[#]', sig, name));
       }
-      properties.add(new NameValuePair(name: name, value: value));
+      properties.add(NameValuePair(name: name, value: value));
     }
 
     if (!walkPrototypeChain) break;
@@ -170,8 +170,8 @@
   NameValuePair(
       {this.name,
       this.value,
-      this.config: JsonMLConfig.none,
-      this.hideName: false});
+      this.config = JsonMLConfig.none,
+      this.hideName = false});
 
   // Define equality and hashCode so that NameValuePair can be used
   // in a Set to dedupe entries with duplicate names.
@@ -222,17 +222,17 @@
     var children = <NameValuePair>[];
     if (length <= _maxSpanLength) {
       asMap().forEach((i, element) {
-        children.add(
-            new NameValuePair(name: (i + start).toString(), value: element));
+        children
+            .add(NameValuePair(name: (i + start).toString(), value: element));
       });
     } else {
       for (var i = start; i < end; i += subsetSize) {
-        var subSpan = new IterableSpan(i, min(end, subsetSize + i), iterable);
+        var subSpan = IterableSpan(i, min(end, subsetSize + i), iterable);
         if (subSpan.length == 1) {
-          children.add(new NameValuePair(
-              name: i.toString(), value: iterable.elementAt(i)));
+          children.add(
+              NameValuePair(name: i.toString(), value: iterable.elementAt(i)));
         } else {
-          children.add(new NameValuePair(
+          children.add(NameValuePair(
               name: '[${i}...${subSpan.end - 1}]',
               value: subSpan,
               hideName: true));
@@ -271,7 +271,7 @@
   }
 }
 
-safeProperties(object) => new Map.fromIterable(
+safeProperties(object) => Map.fromIterable(
     getOwnPropertyNames(object)
         .where((each) => safeGetProperty(object, each) != null),
     key: (name) => name,
@@ -293,7 +293,7 @@
   }
 
   JsonMLElement createChild(String tagName) {
-    var c = new JsonMLElement(tagName);
+    var c = JsonMLElement(tagName);
     _jsonML.add(c.toJsonML());
     return c;
   }
@@ -378,7 +378,7 @@
     // Indicate this is a Dart Object by using a Dart background color.
     // This is stylistically a bit ugly but it eases distinguishing Dart and
     // JS objects.
-    var element = new JsonMLElement('span')
+    var element = JsonMLElement('span')
       ..setStyle('background-color: #d9edf7;')
       ..createTextChild(c);
     return element.toJsonML();
@@ -387,7 +387,7 @@
   bool hasBody(object, config) => _simpleFormatter.hasChildren(object, config);
 
   body(object, config) {
-    var body = new JsonMLElement('ol')
+    var body = JsonMLElement('ol')
       ..setStyle('list-style-type: none;'
           'padding-left: 0px;'
           'margin-top: 0px;'
@@ -408,7 +408,7 @@
       JsonMLElement nameSpan;
       var valueStyle = '';
       if (!child.hideName) {
-        nameSpan = new JsonMLElement('span')
+        nameSpan = JsonMLElement('span')
           ..createTextChild(
               child.displayName.isNotEmpty ? '${child.displayName}: ' : '')
           ..setStyle('color: rgb(136, 19, 145); margin-right: -13px');
@@ -417,7 +417,7 @@
 
       if (_typeof(child.value) == 'object' ||
           _typeof(child.value) == 'function') {
-        var valueSpan = new JsonMLElement('span')..setStyle(valueStyle);
+        var valueSpan = JsonMLElement('span')..setStyle(valueStyle);
         valueSpan.createObjectTag(child.value)
           ..addAttribute('config', child.config);
         if (nameSpan != null) {
@@ -429,7 +429,7 @@
         if (nameSpan != null) {
           line.appendChild(nameSpan);
         }
-        line.appendChild(new JsonMLElement('span')
+        line.appendChild(JsonMLElement('span')
           ..createTextChild(safePreview(child.value, child.config))
           ..setStyle(valueStyle));
       }
@@ -452,20 +452,20 @@
     // The order of formatters matters as formatters earlier in the list take
     // precedence.
     _formatters = [
-      new ObjectInternalsFormatter(),
-      new ClassFormatter(),
-      new TypeFormatter(),
-      new NamedConstructorFormatter(),
-      new MapFormatter(),
-      new IterableFormatter(),
-      new IterableSpanFormatter(),
-      new MapEntryFormatter(),
-      new StackTraceFormatter(),
-      new FunctionFormatter(),
-      new HeritageClauseFormatter(),
-      new LibraryModuleFormatter(),
-      new LibraryFormatter(),
-      new ObjectFormatter(),
+      ObjectInternalsFormatter(),
+      ClassFormatter(),
+      TypeFormatter(),
+      NamedConstructorFormatter(),
+      MapFormatter(),
+      IterableFormatter(),
+      IterableSpanFormatter(),
+      MapEntryFormatter(),
+      StackTraceFormatter(),
+      FunctionFormatter(),
+      HeritageClauseFormatter(),
+      LibraryModuleFormatter(),
+      LibraryFormatter(),
+      ObjectFormatter(),
     ];
   }
 
@@ -552,11 +552,11 @@
 
   List<NameValuePair> children(object) {
     var type = dart.getType(object);
-    var ret = new LinkedHashSet<NameValuePair>();
+    var ret = LinkedHashSet<NameValuePair>();
     // We use a Set rather than a List to avoid duplicates.
-    var fields = new Set<NameValuePair>();
+    var fields = Set<NameValuePair>();
     addPropertiesFromSignature(dart.getFields(type), fields, object, true);
-    var getters = new Set<NameValuePair>();
+    var getters = Set<NameValuePair>();
     addPropertiesFromSignature(dart.getGetters(type), getters, object, true);
     ret.addAll(sortProperties(fields));
     ret.addAll(sortProperties(getters));
@@ -601,18 +601,18 @@
   }
 
   List<NameValuePair> children(object) {
-    var children = new LinkedHashSet<NameValuePair>();
+    var children = LinkedHashSet<NameValuePair>();
     for (var name in getOwnPropertyNames(object)) {
       var value = safeGetProperty(object, name);
-      children.add(new NameValuePair(
-          name: name, value: new Library(name, value), hideName: true));
+      children.add(NameValuePair(
+          name: name, value: Library(name, value), hideName: true));
     }
     return children.toList();
   }
 }
 
 class LibraryFormatter implements Formatter {
-  var genericParameters = new HashMap<String, String>();
+  var genericParameters = HashMap<String, String>();
 
   accept(object, config) => object is Library;
 
@@ -623,7 +623,7 @@
   List<NameValuePair> children(object) {
     // Maintain library member order rather than sorting members as is the
     // case for class members.
-    var children = new LinkedHashSet<NameValuePair>();
+    var children = LinkedHashSet<NameValuePair>();
     var objectProperties = safeProperties(object.object);
     objectProperties.forEach((name, value) {
       // Skip the generic constructors for each class as users are only
@@ -632,14 +632,14 @@
 
       children.add(dart.isType(value)
           ? classChild(name, value)
-          : new NameValuePair(name: name, value: value));
+          : NameValuePair(name: name, value: value));
     });
     return children.toList();
   }
 
   classChild(String name, Object child) {
     var typeName = getTypeName(child);
-    return new NameValuePair(
+    return NameValuePair(
         name: typeName, value: child, config: JsonMLConfig.asClass);
   }
 }
@@ -661,8 +661,8 @@
   }
 
   List<NameValuePair> children(object) => <NameValuePair>[
-        new NameValuePair(name: 'signature', value: preview(object)),
-        new NameValuePair(
+        NameValuePair(name: 'signature', value: preview(object)),
+        NameValuePair(
             name: 'JavaScript Function',
             value: object,
             config: JsonMLConfig.skipDart)
@@ -685,11 +685,11 @@
     // the build in LinkedHashMap class.
     // TODO(jacobr): handle large Maps better.
     Map map = object;
-    var entries = new LinkedHashSet<NameValuePair>();
+    var entries = LinkedHashSet<NameValuePair>();
     map.forEach((key, value) {
-      var entryWrapper = new MapEntry(key: key, value: value);
-      entries.add(new NameValuePair(
-          name: entries.length.toString(), value: entryWrapper));
+      var entryWrapper = MapEntry(key: key, value: value);
+      entries.add(
+          NameValuePair(name: entries.length.toString(), value: entryWrapper));
     });
     addInstanceMembers(object, entries);
     addMetadataChildren(object, entries);
@@ -700,7 +700,7 @@
   // of the Map, particularly for domain objects that implement Map.
   // Add an ObjectFormatter view underneath.
   void addInstanceMembers(object, Set<NameValuePair> ret) {
-    ret.add(new NameValuePair(
+    ret.add(NameValuePair(
         name: "[[instance members]]",
         value: object,
         config: JsonMLConfig.asObject));
@@ -728,8 +728,8 @@
     // are not the built in Set or List types.
     // TODO(jacobr): handle large Iterables better.
     // TODO(jacobr): consider only using numeric indices
-    var children = new LinkedHashSet<NameValuePair>();
-    children.addAll(new IterableSpan(0, object.length, object).children());
+    var children = LinkedHashSet<NameValuePair>();
+    children.addAll(IterableSpan(0, object.length, object).children());
     // TODO(jacobr): provide a link to show regular class properties here.
     // required for subclasses of iterable, etc.
     addMetadataChildren(object, children);
@@ -747,7 +747,7 @@
   bool hasChildren(object) => true;
 
   List<NameValuePair> children(object) => <NameValuePair>[
-        new NameValuePair(
+        NameValuePair(
             name: 'JavaScript Function',
             value: object,
             config: JsonMLConfig.skipDart)
@@ -767,9 +767,9 @@
   bool hasChildren(object) => true;
 
   List<NameValuePair> children(object) => <NameValuePair>[
-        new NameValuePair(
+        NameValuePair(
             name: 'key', value: object.key, config: JsonMLConfig.keyToString),
-        new NameValuePair(name: 'value', value: object.value)
+        NameValuePair(name: 'value', value: object.value)
       ];
 }
 
@@ -789,8 +789,7 @@
     HeritageClause clause = object;
     var children = <NameValuePair>[];
     for (var type in clause.types) {
-      children
-          .add(new NameValuePair(value: type, config: JsonMLConfig.asClass));
+      children.add(NameValuePair(value: type, config: JsonMLConfig.asClass));
     }
     return children;
   }
@@ -823,9 +822,8 @@
   List<NameValuePair> children(object) => object
       .toString()
       .split('\n')
-      .map((line) => new NameValuePair(
-          value: line.replaceFirst(new RegExp(r'^\s+at\s'), ''),
-          hideName: true))
+      .map((line) => NameValuePair(
+          value: line.replaceFirst(RegExp(r'^\s+at\s'), ''), hideName: true))
       .toList();
 }
 
@@ -848,10 +846,10 @@
   List<NameValuePair> children(type) {
     // TODO(jacobr): add other entries describing the class such as
     // implemented interfaces, and methods.
-    var ret = new LinkedHashSet<NameValuePair>();
+    var ret = LinkedHashSet<NameValuePair>();
 
-    var staticProperties = new Set<NameValuePair>();
-    var staticMethods = new Set<NameValuePair>();
+    var staticProperties = Set<NameValuePair>();
+    var staticMethods = Set<NameValuePair>();
     // Static fields and properties.
     addPropertiesFromSignature(
         dart.getStaticFields(type), staticProperties, type, false);
@@ -863,33 +861,33 @@
 
     if (staticProperties.isNotEmpty || staticMethods.isNotEmpty) {
       ret
-        ..add(new NameValuePair(value: '[[Static members]]', hideName: true))
+        ..add(NameValuePair(value: '[[Static members]]', hideName: true))
         ..addAll(sortProperties(staticProperties))
         ..addAll(sortProperties(staticMethods));
     }
 
     // instance methods.
-    var instanceMethods = new Set<NameValuePair>();
+    var instanceMethods = Set<NameValuePair>();
     // Instance methods are defined on the prototype not the constructor object.
     addPropertiesFromSignature(dart.getMethods(type), instanceMethods,
         JS('', '#.prototype', type), false,
         tagTypes: true);
     if (instanceMethods.isNotEmpty) {
       ret
-        ..add(new NameValuePair(value: '[[Instance Methods]]', hideName: true))
+        ..add(NameValuePair(value: '[[Instance Methods]]', hideName: true))
         ..addAll(sortProperties(instanceMethods));
     }
 
     var mixin = dart.getMixin(type);
     if (mixin != null) {
       // TODO(jmesserly): this can only be one value.
-      ret.add(new NameValuePair(
-          name: '[[Mixins]]', value: new HeritageClause('mixins', [mixin])));
+      ret.add(NameValuePair(
+          name: '[[Mixins]]', value: HeritageClause('mixins', [mixin])));
     }
 
     var baseProto = JS('', '#.__proto__', type);
     if (baseProto != null && !dart.isJsInterop(baseProto)) {
-      ret.add(new NameValuePair(
+      ret.add(NameValuePair(
           name: "[[base class]]",
           value: baseProto,
           config: JsonMLConfig.asClass));
diff --git a/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
index bcb2736..9df99fec1 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
@@ -275,9 +275,9 @@
   const _Rest();
 }
 
-const _Rest rest = const _Rest();
+const _Rest rest = _Rest();
 
 dynamic spread(args) {
-  throw new StateError('The spread function cannot be called, '
+  throw StateError('The spread function cannot be called, '
       'it should be compiled away.');
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart
index c2671eb..22d2125 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/identity_hash_map.dart
@@ -30,8 +30,8 @@
   bool get isEmpty => JS('bool', '#.size == 0', _map);
   bool get isNotEmpty => JS('bool', '#.size != 0', _map);
 
-  Iterable<K> get keys => new _JSMapIterable<K>(this, true);
-  Iterable<V> get values => new _JSMapIterable<V>(this, false);
+  Iterable<K> get keys => _JSMapIterable<K>(this, true);
+  Iterable<V> get values => _JSMapIterable<V>(this, false);
 
   bool containsKey(Object key) {
     return JS('bool', '#.has(#)', _map, key);
@@ -118,11 +118,11 @@
     }''',
         modifications,
         map._modifications,
-        new ConcurrentModificationError(map),
+        ConcurrentModificationError(map),
         iterator);
   }
 
-  Iterator<E> get iterator => new DartIterator<E>(_jsIterator());
+  Iterator<E> get iterator => DartIterator<E>(_jsIterator());
 
   bool contains(Object element) =>
       _isKeys ? _map.containsKey(element) : _map.containsValue(element);
diff --git a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
index 5566a25..cbad218 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
@@ -104,10 +104,9 @@
 // it to be picked up as an extension type.
 @JsPeerInterface(name: 'TypeError')
 class NullError extends NativeError implements NoSuchMethodError {
-  static RegExp _nullError =
-      new RegExp(r"^Cannot read property '(.+)' of null$");
-  static RegExp _extensionName = new RegExp(r"^Symbol\(dartx\.(.+)\)$");
-  static RegExp _privateName = new RegExp(r"^Symbol\((_.+)\)$");
+  static RegExp _nullError = RegExp(r"^Cannot read property '(.+)' of null$");
+  static RegExp _extensionName = RegExp(r"^Symbol\(dartx\.(.+)\)$");
+  static RegExp _privateName = RegExp(r"^Symbol\((_.+)\)$");
 
   String _fieldName() {
     var message = JS('String', '#.message', this);
@@ -186,7 +185,7 @@
   noSuchMethod(Invocation i) => dart.defaultNoSuchMethod(null, i);
 }
 
-final Object jsNull = new JSNull();
+final Object jsNull = JSNull();
 
 // Note that this needs to be in interceptors.dart in order for
 // it to be picked up as an extension type.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
index dec36ce..6de83f2 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
@@ -34,7 +34,7 @@
 void startRootIsolate(main, args) {
   if (args == null) args = <String>[];
   if (args is List) {
-    if (args is! List<String>) args = new List<String>.from(args);
+    if (args is! List<String>) args = List<String>.from(args);
     // DDC attaches signatures only when torn off, and the typical way of
     // getting `main` via the JS ABI won't do this. So use JS to invoke main.
     if (JS<bool>('!', 'typeof # == "function"', main)) {
@@ -45,7 +45,7 @@
       (main as dynamic)(args);
     }
   } else {
-    throw new ArgumentError("Arguments to main must be a List: $args");
+    throw ArgumentError("Arguments to main must be a List: $args");
   }
 }
 
@@ -72,7 +72,7 @@
       _handle = JS(
           'int', '#.setTimeout(#, #)', global, internalCallback, milliseconds);
     } else {
-      throw new UnsupportedError("`setTimeout()` not found.");
+      throw UnsupportedError("`setTimeout()` not found.");
     }
   }
 
@@ -93,7 +93,7 @@
         callback(this);
       }, milliseconds);
     } else {
-      throw new UnsupportedError("Periodic timer.");
+      throw UnsupportedError("Periodic timer.");
     }
   }
 
@@ -110,7 +110,7 @@
       }
       _handle = null;
     } else {
-      throw new UnsupportedError("Canceling a timer.");
+      throw UnsupportedError("Canceling a timer.");
     }
   }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_array.dart b/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
index 7dba1a8..5b4a54b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
@@ -58,13 +58,13 @@
 
   checkMutable(reason) {
     if (JS('bool', r'#.immutable$list', this)) {
-      throw new UnsupportedError(reason);
+      throw UnsupportedError(reason);
     }
   }
 
   checkGrowable(reason) {
     if (JS('bool', r'#.fixed$length', this)) {
-      throw new UnsupportedError(reason);
+      throw UnsupportedError(reason);
     }
   }
 
@@ -77,7 +77,7 @@
   E removeAt(@nullCheck int index) {
     checkGrowable('removeAt');
     if (index < 0 || index >= length) {
-      throw new RangeError.value(index);
+      throw RangeError.value(index);
     }
     return JS('-dynamic', r'#.splice(#, 1)[0]', this, index);
   }
@@ -85,7 +85,7 @@
   void insert(@nullCheck int index, E value) {
     checkGrowable('insert');
     if (index < 0 || index > length) {
-      throw new RangeError.value(index);
+      throw RangeError.value(index);
     }
     JS('void', r'#.splice(#, 0, #)', this, index, value);
   }
@@ -161,7 +161,7 @@
       if (!test(element) == removeMatching) {
         retained.add(element);
       }
-      if (this.length != end) throw new ConcurrentModificationError(this);
+      if (this.length != end) throw ConcurrentModificationError(this);
     }
     if (retained.length == end) return;
     this.length = retained.length;
@@ -173,18 +173,18 @@
   }
 
   Iterable<E> where(bool f(E element)) {
-    return new WhereIterable<E>(this, f);
+    return WhereIterable<E>(this, f);
   }
 
   Iterable<T> expand<T>(Iterable<T> f(E element)) {
-    return new ExpandIterable<E, T>(this, f);
+    return ExpandIterable<E, T>(this, f);
   }
 
   void addAll(Iterable<E> collection) {
     int i = this.length;
     checkGrowable('addAll');
     for (E e in collection) {
-      assert(i == this.length || (throw new ConcurrentModificationError(this)));
+      assert(i == this.length || (throw ConcurrentModificationError(this)));
       i++;
       JS('void', r'#.push(#)', this, e);
     }
@@ -201,17 +201,17 @@
       // be replaced by indexing.
       var/*=E*/ element = JS('', '#[#]', this, i);
       f(element);
-      if (this.length != end) throw new ConcurrentModificationError(this);
+      if (this.length != end) throw ConcurrentModificationError(this);
     }
   }
 
   Iterable<T> map<T>(T f(E element)) {
-    return new MappedListIterable<E, T>(this, f);
+    return MappedListIterable<E, T>(this, f);
   }
 
   String join([String separator = ""]) {
     var length = this.length;
-    var list = new List(length);
+    var list = List(length);
     for (int i = 0; i < length; i++) {
       list[i] = "${this[i]}";
     }
@@ -219,19 +219,19 @@
   }
 
   Iterable<E> take(int n) {
-    return new SubListIterable<E>(this, 0, n);
+    return SubListIterable<E>(this, 0, n);
   }
 
   Iterable<E> takeWhile(bool test(E value)) {
-    return new TakeWhileIterable<E>(this, test);
+    return TakeWhileIterable<E>(this, test);
   }
 
   Iterable<E> skip(int n) {
-    return new SubListIterable<E>(this, n, null);
+    return SubListIterable<E>(this, n, null);
   }
 
   Iterable<E> skipWhile(bool test(E value)) {
-    return new SkipWhileIterable<E>(this, test);
+    return SkipWhileIterable<E>(this, test);
   }
 
   E reduce(E combine(E previousValue, E element)) {
@@ -243,7 +243,7 @@
       // be replaced by indexing.
       var/*=E*/ element = JS('', '#[#]', this, i);
       value = combine(value, element);
-      if (length != this.length) throw new ConcurrentModificationError(this);
+      if (length != this.length) throw ConcurrentModificationError(this);
     }
     return value;
   }
@@ -256,7 +256,7 @@
       // be replaced by indexing.
       var/*=E*/ element = JS('', '#[#]', this, i);
       value = combine(value, element);
-      if (this.length != length) throw new ConcurrentModificationError(this);
+      if (this.length != length) throw ConcurrentModificationError(this);
     }
     return value;
   }
@@ -268,7 +268,7 @@
       // be replaced by indexing.
       var/*=E*/ element = JS('', '#[#]', this, i);
       if (test(element)) return element;
-      if (this.length != end) throw new ConcurrentModificationError(this);
+      if (this.length != end) throw ConcurrentModificationError(this);
     }
     if (orElse != null) return orElse();
     throw IterableElementError.noElement();
@@ -282,7 +282,7 @@
       var/*=E*/ element = JS('', '#[#]', this, i);
       if (test(element)) return element;
       if (length != this.length) {
-        throw new ConcurrentModificationError(this);
+        throw ConcurrentModificationError(this);
       }
     }
     if (orElse != null) return orElse();
@@ -305,7 +305,7 @@
         match = element;
       }
       if (length != this.length) {
-        throw new ConcurrentModificationError(this);
+        throw ConcurrentModificationError(this);
       }
     }
     if (matchFound) return match;
@@ -319,7 +319,7 @@
 
   List<E> sublist(@nullCheck int start, [int end]) {
     if (start < 0 || start > length) {
-      throw new RangeError.range(start, 0, length, "start");
+      throw RangeError.range(start, 0, length, "start");
     }
     if (end == null) {
       end = length;
@@ -327,16 +327,16 @@
       @notNull
       var _end = end;
       if (_end < start || _end > length) {
-        throw new RangeError.range(end, start, length, "end");
+        throw RangeError.range(end, start, length, "end");
       }
     }
     if (start == end) return <E>[];
-    return new JSArray<E>.of(JS('', r'#.slice(#, #)', this, start, end));
+    return JSArray<E>.of(JS('', r'#.slice(#, #)', this, start, end));
   }
 
   Iterable<E> getRange(int start, int end) {
     RangeError.checkValidRange(start, end, this.length);
-    return new SubListIterable<E>(this, start, end);
+    return SubListIterable<E>(this, start, end);
   }
 
   E get first {
@@ -448,7 +448,7 @@
       // be replaced by indexing.
       var/*=E*/ element = JS('', '#[#]', this, i);
       if (test(element)) return true;
-      if (this.length != end) throw new ConcurrentModificationError(this);
+      if (this.length != end) throw ConcurrentModificationError(this);
     }
     return false;
   }
@@ -460,12 +460,12 @@
       // be replaced by indexing.
       E element = JS('-dynamic', '#[#]', this, i);
       if (!test(element)) return false;
-      if (this.length != end) throw new ConcurrentModificationError(this);
+      if (this.length != end) throw ConcurrentModificationError(this);
     }
     return true;
   }
 
-  Iterable<E> get reversed => new ReversedListIterable<E>(this);
+  Iterable<E> get reversed => ReversedListIterable<E>(this);
 
   void sort([int compare(E a, E b)]) {
     checkMutable('sort');
@@ -478,7 +478,7 @@
 
   void shuffle([Random random]) {
     checkMutable('shuffle');
-    if (random == null) random = new Random();
+    if (random == null) random = Random();
     int length = this.length;
     while (length > 1) {
       int pos = random.nextInt(length);
@@ -538,15 +538,15 @@
 
   String toString() => ListBase.listToString(this);
 
-  List<E> toList({@nullCheck bool growable: true}) {
+  List<E> toList({@nullCheck bool growable = true}) {
     var list = JS('', '#.slice()', this);
     if (!growable) markFixedList(list);
-    return new JSArray<E>.of(list);
+    return JSArray<E>.of(list);
   }
 
-  Set<E> toSet() => new Set<E>.from(this);
+  Set<E> toSet() => Set<E>.from(this);
 
-  Iterator<E> get iterator => new ArrayIterator<E>(this);
+  Iterator<E> get iterator => ArrayIterator<E>(this);
 
   int get hashCode => identityHashCode(this);
 
@@ -560,7 +560,7 @@
     checkGrowable('set length');
     // TODO(sra): Remove this test and let JavaScript throw an error.
     if (newLength < 0) {
-      throw new RangeError.range(newLength, 0, null, 'newLength');
+      throw RangeError.range(newLength, 0, null, 'newLength');
     }
     // JavaScript with throw a RangeError for numbers that are too big. The
     // message does not contain the value.
@@ -588,20 +588,20 @@
   }
 
   Map<int, E> asMap() {
-    return new ListMapView<E>(this);
+    return ListMapView<E>(this);
   }
 
   Type get runtimeType =>
       dart.wrapType(JS('', '#(#)', dart.getGenericClass(List), E));
 
   Iterable<E> followedBy(Iterable<E> other) =>
-      new FollowedByIterable<E>.firstEfficient(this, other);
+      FollowedByIterable<E>.firstEfficient(this, other);
 
   // TODO(leafp): Restore this functionality once generic methods are enabled
   // in the VM and dart2js.
   // https://github.com/dart-lang/sdk/issues/32463
   Iterable<T> whereType<T>() =>
-      throw new UnimplementedError("whereType is not yet supported");
+      throw UnimplementedError("whereType is not yet supported");
 
   List<E> operator +(List<E> other) {
     int totalLength = this.length + other.length;
@@ -630,12 +630,12 @@
   }
 
   void set first(E element) {
-    if (this.isEmpty) throw new RangeError.index(0, this);
+    if (this.isEmpty) throw RangeError.index(0, this);
     this[0] = element;
   }
 
   void set last(E element) {
-    if (this.isEmpty) throw new RangeError.index(0, this);
+    if (this.isEmpty) throw RangeError.index(0, this);
     this[this.length - 1] = element;
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
index 738db86..c9533c2 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -30,13 +30,13 @@
   const _Patch();
 }
 
-const _Patch patch = const _Patch();
+const _Patch patch = _Patch();
 
 /// Adapts a JS `[Symbol.iterator]` to a Dart `get iterator`.
-/// 
+///
 /// This is the inverse of `JsIterator`, for classes where we can more
 /// efficiently obtain a JS iterator instead of a Dart one.
-/// 
+///
 // TODO(jmesserly): this adapter is to work around
 // https://github.com/dart-lang/sdk/issues/28320
 class DartIterator<E> implements Iterator<E> {
@@ -62,14 +62,13 @@
   @JSExportName('Symbol.iterator')
   _jsIterator() => _initGenerator();
 
-  get iterator => new DartIterator(_initGenerator());
+  get iterator => DartIterator(_initGenerator());
 }
 
 class Primitives {
-
   @NoInline()
   static int _parseIntError(String source, int handleError(String source)) {
-    if (handleError == null) throw new FormatException(source);
+    if (handleError == null) throw FormatException(source);
     return handleError(source);
   }
 
@@ -100,9 +99,10 @@
       }
       return _parseIntError(source, handleError);
     }
-    @notNull var radix = _radix;
+    @notNull
+    var radix = _radix;
     if (radix < 2 || radix > 36) {
-      throw new RangeError.range(radix, 2, 36, 'radix');
+      throw RangeError.range(radix, 2, 36, 'radix');
     }
     if (radix == 10 && decimalMatch != null) {
       // Cannot fail because we know that the digits are all decimal.
@@ -147,12 +147,13 @@
   static double _parseDoubleError(
       String source, double handleError(String source)) {
     if (handleError == null) {
-      throw new FormatException('Invalid double', source);
+      throw FormatException('Invalid double', source);
     }
     return handleError(source);
   }
 
-  static double parseDouble(@nullCheck String source, double handleError(String source)) {
+  static double parseDouble(
+      @nullCheck String source, double handleError(String source)) {
     // Notice that JS parseFloat accepts garbage at the end of the string.
     // Accept only:
     // - [+/-]NaN
@@ -224,9 +225,11 @@
 
   // This is to avoid stack overflows due to very large argument arrays in
   // apply().  It fixes http://dartbug.com/6919
-  @notNull static String _fromCharCodeApply(List<int> array) {
+  @notNull
+  static String _fromCharCodeApply(List<int> array) {
     const kMaxApply = 500;
-    @nullCheck int end = array.length;
+    @nullCheck
+    int end = array.length;
     if (end <= kMaxApply) {
       return JS('String', r'String.fromCharCode.apply(null, #)', array);
     }
@@ -244,7 +247,8 @@
     return result;
   }
 
-  @notNull static String stringFromCodePoints(JSArray<int> codePoints) {
+  @notNull
+  static String stringFromCodePoints(JSArray<int> codePoints) {
     List<int> a = <int>[];
     for (@nullCheck var i in codePoints) {
       if (i <= 0xffff) {
@@ -259,7 +263,8 @@
     return _fromCharCodeApply(a);
   }
 
-  @notNull static String stringFromCharCodes(JSArray<int> charCodes) {
+  @notNull
+  static String stringFromCharCodes(JSArray<int> charCodes) {
     for (@nullCheck var i in charCodes) {
       if (i < 0) throw argumentErrorValue(i);
       if (i > 0xffff) return stringFromCodePoints(charCodes);
@@ -268,7 +273,8 @@
   }
 
   // [start] and [end] are validated.
-  @notNull static String stringFromNativeUint8List(
+  @notNull
+  static String stringFromNativeUint8List(
       NativeUint8List charCodes, @nullCheck int start, @nullCheck int end) {
     const kMaxApply = 500;
     if (end <= kMaxApply && start == 0 && end == charCodes.length) {
@@ -288,7 +294,8 @@
     return result;
   }
 
-  @notNull static String stringFromCharCode(@nullCheck int charCode) {
+  @notNull
+  static String stringFromCharCode(@nullCheck int charCode) {
     if (0 <= charCode) {
       if (charCode <= 0xffff) {
         return JS('String', 'String.fromCharCode(#)', charCode);
@@ -300,7 +307,7 @@
         return JS('String', 'String.fromCharCode(#, #)', high, low);
       }
     }
-    throw new RangeError.range(charCode, 0, 0x10ffff);
+    throw RangeError.range(charCode, 0, 0x10ffff);
   }
 
   static String stringConcatUnchecked(String string1, String string2) {
@@ -351,10 +358,15 @@
     return -JS('int', r'#.getTimezoneOffset()', lazyAsJsDate(receiver));
   }
 
-  static num valueFromDecomposedDate(@nullCheck int years, @nullCheck int month,
-                                     @nullCheck int day, @nullCheck int hours,
-      @nullCheck int minutes, @nullCheck int seconds, @nullCheck int milliseconds,
-                                     @nullCheck bool isUtc) {
+  static num valueFromDecomposedDate(
+      @nullCheck int years,
+      @nullCheck int month,
+      @nullCheck int day,
+      @nullCheck int hours,
+      @nullCheck int minutes,
+      @nullCheck int seconds,
+      @nullCheck int milliseconds,
+      @nullCheck bool isUtc) {
     final int MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
     var jsMonth = month - 1;
     num value;
@@ -479,10 +491,10 @@
   // The following returns the same error that would be thrown by calling
   // [RangeError.checkValidIndex] with no optional parameters provided.
   if (index < 0 || index >= length) {
-    return new RangeError.index(index, indexable, 'index', null, length);
+    return RangeError.index(index, indexable, 'index', null, length);
   }
   // The above should always match, but if it does not, use the following.
-  return new RangeError.value(index, 'index');
+  return RangeError.value(index, 'index');
 }
 
 /**
@@ -492,27 +504,28 @@
 @NoInline()
 Error diagnoseRangeError(int start, int end, int length) {
   if (start == null) {
-    return new ArgumentError.value(start, 'start');
+    return ArgumentError.value(start, 'start');
   }
   if (start < 0 || start > length) {
-    return new RangeError.range(start, 0, length, 'start');
+    return RangeError.range(start, 0, length, 'start');
   }
   if (end != null) {
     if (end < start || end > length) {
-      return new RangeError.range(end, start, length, 'end');
+      return RangeError.range(end, start, length, 'end');
     }
   }
   // The above should always match, but if it does not, use the following.
-  return new ArgumentError.value(end, "end");
+  return ArgumentError.value(end, "end");
 }
 
-@notNull int stringLastIndexOfUnchecked(receiver, element, start) =>
+@notNull
+int stringLastIndexOfUnchecked(receiver, element, start) =>
     JS('int', r'#.lastIndexOf(#, #)', receiver, element, start);
 
 /// 'factory' for constructing ArgumentError.value to keep the call sites small.
 @NoInline()
 ArgumentError argumentErrorValue(object) {
-  return new ArgumentError.value(object);
+  return ArgumentError.value(object);
 }
 
 void throwArgumentErrorValue(value) {
@@ -525,16 +538,16 @@
 }
 
 throwRuntimeError(message) {
-  throw new RuntimeError(message);
+  throw RuntimeError(message);
 }
 
 throwAbstractClassInstantiationError(className) {
-  throw new AbstractClassInstantiationError(className);
+  throw AbstractClassInstantiationError(className);
 }
 
 @NoInline()
 throwConcurrentModificationError(collection) {
-  throw new ConcurrentModificationError(collection);
+  throw ConcurrentModificationError(collection);
 }
 
 class JsNoSuchMethodError extends Error implements NoSuchMethodError {
@@ -641,7 +654,7 @@
  * Called at the end of unaborted switch cases to get the singleton
  * FallThroughError exception that will be thrown.
  */
-getFallThroughError() => new FallThroughErrorImplementation();
+getFallThroughError() => FallThroughErrorImplementation();
 
 /**
  * A metadata annotation describing the types instantiated by a native element.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart b/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
index 270f571..7a61bf2 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
@@ -19,9 +19,9 @@
 }
 
 Symbol getSymbol(name, library) =>
-    throw new UnimplementedError("MirrorSystem.getSymbol unimplemented");
+    throw UnimplementedError("MirrorSystem.getSymbol unimplemented");
 
-final currentJsMirrorSystem = new JsMirrorSystem();
+final currentJsMirrorSystem = JsMirrorSystem();
 
 final _typeMirror = JS('', 'Symbol("_typeMirror")');
 
@@ -29,9 +29,9 @@
   // TODO(vsm): Consider caching the mirror here.  Unlike the type below,
   // reflectee may be a primitive - i.e., we can't just add an expando.
   if (reflectee is Function) {
-    return new JsClosureMirror._(reflectee);
+    return JsClosureMirror._(reflectee);
   } else {
-    return new JsInstanceMirror._(reflectee);
+    return JsInstanceMirror._(reflectee);
   }
 }
 
@@ -43,7 +43,7 @@
     return JS('', '#.value', property);
   }
   // TODO(vsm): Might not be a class.
-  var mirror = new JsClassMirror._(key);
+  var mirror = JsClassMirror._(key);
   JS('', '#[#] = #', unwrapped, _typeMirror, mirror);
   return mirror;
 }
@@ -87,29 +87,29 @@
 
 Symbol _getSymbolForESSymbol(member) {
   var name = _getNameForESSymbol(member);
-  return new PrivateSymbol(name, member);
+  return PrivateSymbol(name, member);
 }
 
 // The [member] must be either a string (public) or an ES6 symbol (private).
 Symbol _getSymbolForMember(member) {
   if (member is String) {
-    return new Symbol(member);
+    return Symbol(member);
   } else {
     var name = _getNameForESSymbol(member);
-    return new PrivateSymbol(name, member);
+    return PrivateSymbol(name, member);
   }
 }
 
 Map<Symbol, dynamic> _toDartMap(data) {
   if (data == null) return {};
-  var map = new Map<Symbol, dynamic>();
+  var map = Map<Symbol, dynamic>();
   // Note: we recorded a map from fields/methods to their type and metadata.
   // The key is a string name for public members but an ES6 symbol for private
   // ones.  That's works nicely for dynamic operations, but dart:mirrors expects
   // Dart symbols, so we convert here.
   var publicMembers = JS('', 'Object.getOwnPropertyNames(#)', data);
   for (var member in publicMembers) {
-    var symbol = new Symbol(member);
+    var symbol = Symbol(member);
     map[symbol] = JS('', '#[#]', data, member);
   }
 
@@ -124,7 +124,7 @@
 dynamic _runtimeType(obj) => dart.wrapType(dart.getReifiedType(obj));
 
 _unimplemented(Type t, Invocation i) {
-  throw new UnimplementedError('$t.${getName(i.memberName)} unimplemented');
+  throw UnimplementedError('$t.${getName(i.memberName)} unimplemented');
 }
 
 dynamic _toJsMap(Map<Symbol, dynamic> map) {
@@ -253,7 +253,7 @@
           unwrapped);
       _metadata = (fn == null)
           ? const <InstanceMirror>[]
-          : new List<InstanceMirror>.unmodifiable(fn().map((i) => reflect(i)));
+          : List<InstanceMirror>.unmodifiable(fn().map((i) => reflect(i)));
     }
     return _metadata;
   }
@@ -262,31 +262,29 @@
     if (_declarations == null) {
       // Load declarations.
       // TODO(vsm): This is only populating the default constructor right now.
-      _declarations = new Map<Symbol, DeclarationMirror>();
+      _declarations = Map<Symbol, DeclarationMirror>();
       var unwrapped = dart.unwrapType(_cls);
       var constructors = _toDartMap(dart.getConstructors(unwrapped));
       constructors.forEach((symbol, ft) {
         var name = getName(symbol);
-        _declarations[symbol] =
-            new JsMethodMirror._constructor(this, symbol, ft);
+        _declarations[symbol] = JsMethodMirror._constructor(this, symbol, ft);
       });
       if (constructors.isEmpty) {
         // Add a default
         var name = 'new';
         var ft = dart.fnType(dart.unwrapType(_cls), []);
-        var symbol = new Symbol(name);
-        _declarations[symbol] =
-            new JsMethodMirror._constructor(this, symbol, ft);
+        var symbol = Symbol(name);
+        _declarations[symbol] = JsMethodMirror._constructor(this, symbol, ft);
       }
       var fields = _toDartMap(dart.getFields(unwrapped));
       fields.forEach((symbol, t) {
-        _declarations[symbol] = new JsVariableMirror._fromField(symbol, t);
+        _declarations[symbol] = JsVariableMirror._fromField(symbol, t);
       });
       var methods = _toDartMap(dart.getMethods(unwrapped));
       methods.forEach((symbol, ft) {
         var name = getName(symbol);
         _declarations[symbol] =
-            new JsMethodMirror._instanceMethod(this, symbol, ft);
+            JsMethodMirror._instanceMethod(this, symbol, ft);
       });
 
       getterType(type) {
@@ -303,7 +301,7 @@
       var getters = _toDartMap(dart.getGetters(unwrapped));
       getters.forEach((symbol, type) {
         _declarations[symbol] =
-            new JsMethodMirror._instanceMethod(this, symbol, getterType(type));
+            JsMethodMirror._instanceMethod(this, symbol, getterType(type));
       });
 
       setterType(type) {
@@ -321,48 +319,47 @@
       setters.forEach((symbol, type) {
         var name = getName(symbol) + '=';
         // Create a separate symbol for the setter.
-        symbol = new PrivateSymbol(name, _getESSymbol(symbol));
+        symbol = PrivateSymbol(name, _getESSymbol(symbol));
         _declarations[symbol] =
-            new JsMethodMirror._instanceMethod(this, symbol, setterType(type));
+            JsMethodMirror._instanceMethod(this, symbol, setterType(type));
       });
 
       var staticFields = _toDartMap(dart.getStaticFields(unwrapped));
       staticFields.forEach((symbol, t) {
-        _declarations[symbol] = new JsVariableMirror._fromField(symbol, t);
+        _declarations[symbol] = JsVariableMirror._fromField(symbol, t);
       });
       var statics = _toDartMap(dart.getStaticMethods(unwrapped));
       statics.forEach((symbol, ft) {
-        _declarations[symbol] =
-            new JsMethodMirror._staticMethod(this, symbol, ft);
+        _declarations[symbol] = JsMethodMirror._staticMethod(this, symbol, ft);
       });
 
       var staticGetters = _toDartMap(dart.getStaticGetters(unwrapped));
       staticGetters.forEach((symbol, type) {
         _declarations[symbol] =
-            new JsMethodMirror._staticMethod(this, symbol, getterType(type));
+            JsMethodMirror._staticMethod(this, symbol, getterType(type));
       });
 
       var staticSetters = _toDartMap(dart.getStaticSetters(unwrapped));
       staticSetters.forEach((symbol, type) {
         _declarations[symbol] =
-            new JsMethodMirror._staticMethod(this, symbol, setterType(type));
+            JsMethodMirror._staticMethod(this, symbol, setterType(type));
       });
       _declarations =
-          new Map<Symbol, DeclarationMirror>.unmodifiable(_declarations);
+          Map<Symbol, DeclarationMirror>.unmodifiable(_declarations);
     }
     return _declarations;
   }
 
-  JsClassMirror._(Type cls, {bool instantiated: true})
+  JsClassMirror._(Type cls, {bool instantiated = true})
       : _cls = cls,
         _raw = instantiated ? dart.getGenericClass(dart.unwrapType(cls)) : null,
-        simpleName = new Symbol(JS('String', '#.name', dart.unwrapType(cls))) {
+        simpleName = Symbol(JS('String', '#.name', dart.unwrapType(cls))) {
     var typeArgs = dart.getGenericArgs(dart.unwrapType(_cls));
     if (typeArgs == null) {
       _typeArguments = const [];
     } else {
-      _typeArguments = new List.unmodifiable(
-          typeArgs.map((t) => reflectType(dart.wrapType(t))));
+      _typeArguments =
+          List.unmodifiable(typeArgs.map((t) => reflectType(dart.wrapType(t))));
     }
   }
 
@@ -403,7 +400,7 @@
       [Map<Symbol, dynamic> namedArgs]) {
     var name = getName(symbol);
     if (namedArgs != null) {
-      args = new List.from(args);
+      args = List.from(args);
       args.add(_toJsMap(namedArgs));
     }
     var result = JS('', '#.#(...#)', dart.unwrapType(_cls), name, args);
@@ -437,8 +434,7 @@
     if (_originalDeclaration != null) {
       return _originalDeclaration;
     }
-    _originalDeclaration = new JsClassMirror._(
-        dart.wrapType(JS('', '#()', _raw)),
+    _originalDeclaration = JsClassMirror._(dart.wrapType(JS('', '#()', _raw)),
         instantiated: false);
     return _originalDeclaration;
   }
@@ -483,12 +479,12 @@
   final bool isStatic = false;
 
   JsVariableMirror._(Symbol symbol, Type t, List annotations,
-      {this.isFinal: false})
+      {this.isFinal = false})
       : _symbol = symbol,
         _name = getName(symbol),
         type = reflectType(t),
-        metadata = new List<InstanceMirror>.unmodifiable(
-            annotations?.map(reflect) ?? []);
+        metadata =
+            List<InstanceMirror>.unmodifiable(annotations?.map(reflect) ?? []);
 
   JsVariableMirror._fromField(Symbol symbol, fieldInfo)
       : this._(symbol, dart.wrapType(JS('', '#.type', fieldInfo)),
@@ -561,7 +557,7 @@
     // TODO(vsm): Why does generic function type trigger true for List?
     if (ftype is! Function && ftype is List) {
       // Record metadata
-      _metadata = new List<InstanceMirror>.unmodifiable(
+      _metadata = List<InstanceMirror>.unmodifiable(
           ftype.skip(1).map((a) => reflect(a)));
       ftype = ftype[0];
     } else {
@@ -575,14 +571,14 @@
     // TODO(vsm): Add named args.
     List args = ftype.args;
     List opts = ftype.optionals;
-    var params = new List<ParameterMirror>(args.length + opts.length);
+    var params = List<ParameterMirror>(args.length + opts.length);
 
     for (var i = 0; i < args.length; ++i) {
       var type = args[i];
       var metadata = ftype.metadata[i];
       // TODO(vsm): Recover the param name.
-      var param = new JsParameterMirror._(
-          new Symbol(''), dart.wrapType(type), metadata);
+      var param =
+          JsParameterMirror._(Symbol(''), dart.wrapType(type), metadata);
       params[i] = param;
     }
 
@@ -590,12 +586,12 @@
       var type = opts[i];
       var metadata = ftype.metadata[args.length + i];
       // TODO(vsm): Recover the param name.
-      var param = new JsParameterMirror._(
-          new Symbol(''), dart.wrapType(type), metadata);
+      var param =
+          JsParameterMirror._(Symbol(''), dart.wrapType(type), metadata);
       params[i + args.length] = param;
     }
 
-    _params = new List.unmodifiable(params);
+    _params = List.unmodifiable(params);
   }
 
   String toString() => "MethodMirror on '$_name'";
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
index 31a5f5d..f539a10 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
@@ -75,7 +75,7 @@
       return JS('int', r'# + 0', truncateToDouble()); // Converts -0.0 to +0.0.
     }
     // This is either NaN, Infinity or -Infinity.
-    throw new UnsupportedError(JS("String", '"" + #', this));
+    throw UnsupportedError(JS("String", '"" + #', this));
   }
 
   @notNull
@@ -104,7 +104,7 @@
       return JS('int', r'0 - Math.round(0 - #)', this);
     }
     // This is either NaN, Infinity or -Infinity.
-    throw new UnsupportedError(JS("String", '"" + #', this));
+    throw UnsupportedError(JS("String", '"" + #', this));
   }
 
   @notNull
@@ -141,7 +141,7 @@
   @notNull
   String toStringAsFixed(@notNull int fractionDigits) {
     if (fractionDigits < 0 || fractionDigits > 20) {
-      throw new RangeError.range(fractionDigits, 0, 20, "fractionDigits");
+      throw RangeError.range(fractionDigits, 0, 20, "fractionDigits");
     }
     String result = JS('String', r'#.toFixed(#)', this, fractionDigits);
     if (this == 0 && isNegative) return "-$result";
@@ -155,7 +155,7 @@
       @notNull
       var _fractionDigits = fractionDigits;
       if (_fractionDigits < 0 || _fractionDigits > 20) {
-        throw new RangeError.range(_fractionDigits, 0, 20, "fractionDigits");
+        throw RangeError.range(_fractionDigits, 0, 20, "fractionDigits");
       }
       result = JS('String', r'#.toExponential(#)', this, _fractionDigits);
     } else {
@@ -168,7 +168,7 @@
   @notNull
   String toStringAsPrecision(@nullCheck int precision) {
     if (precision < 1 || precision > 21) {
-      throw new RangeError.range(precision, 1, 21, "precision");
+      throw RangeError.range(precision, 1, 21, "precision");
     }
     String result = JS('String', r'#.toPrecision(#)', this, precision);
     if (this == 0 && isNegative) return "-$result";
@@ -178,7 +178,7 @@
   @notNull
   String toRadixString(@nullCheck int radix) {
     if (radix < 2 || radix > 36) {
-      throw new RangeError.range(radix, 2, 36, "radix");
+      throw RangeError.range(radix, 2, 36, "radix");
     }
     String result = JS('String', r'#.toString(#)', this, radix);
     const int rightParenCode = 0x29;
@@ -196,7 +196,7 @@
         '', r'/^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(#)', result);
     if (match == null) {
       // Then we don't know how to handle it at all.
-      throw new UnsupportedError("Unexpected toString result: $result");
+      throw UnsupportedError("Unexpected toString result: $result");
     }
     result = JS('!', '#', match[1]);
     int exponent = JS("!", "+#", match[3]);
@@ -401,8 +401,8 @@
   // Returns pow(this, e) % m.
   @notNull
   int modPow(@nullCheck int e, @nullCheck int m) {
-    if (e < 0) throw new RangeError.range(e, 0, null, "exponent");
-    if (m <= 0) throw new RangeError.range(m, 1, null, "modulus");
+    if (e < 0) throw RangeError.range(e, 0, null, "exponent");
+    if (m <= 0) throw RangeError.range(m, 1, null, "modulus");
     if (e == 0) return 1;
     int b = this;
     if (b < 0 || b > m) {
@@ -479,7 +479,7 @@
       }
     } while (u != 0);
     if (!inv) return s * v;
-    if (v != 1) throw new Exception("Not coprime");
+    if (v != 1) throw Exception("Not coprime");
     if (d < 0) {
       d += x;
       if (d < 0) d += x;
@@ -493,13 +493,13 @@
   // Returns 1/this % m, with m > 0.
   @notNull
   int modInverse(@nullCheck int m) {
-    if (m <= 0) throw new RangeError.range(m, 1, null, "modulus");
+    if (m <= 0) throw RangeError.range(m, 1, null, "modulus");
     if (m == 1) return 0;
     int t = this;
     if ((t < 0) || (t >= m)) t %= m;
     if (t == 1) return 1;
     if ((t == 0) || (t.isEven && m.isEven)) {
-      throw new Exception("Not coprime");
+      throw Exception("Not coprime");
     }
     return _binaryGcd(m, t, true);
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_string.dart b/pkg/dev_compiler/tool/input_sdk/private/js_string.dart
index 9b57bf3..6f2c382 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_string.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_string.dart
@@ -20,7 +20,7 @@
     // (JS String.length cannot be null).
     final len = this.length;
     if (index < 0 || index >= len) {
-      throw new RangeError.index(index, this, 'index', null, len);
+      throw RangeError.index(index, this, 'index', null, len);
     }
     return JS('int', r'#.charCodeAt(#)', this, index);
   }
@@ -30,7 +30,7 @@
       [@nullCheck int start = 0]) {
     final len = string.length;
     if (0 > start || start > len) {
-      throw new RangeError.range(start, 0, len);
+      throw RangeError.range(start, 0, len);
     }
     return allMatchesInStringUnchecked(this, string, start);
   }
@@ -38,7 +38,7 @@
   Match matchAsPrefix(@nullCheck String string, [@nullCheck int start = 0]) {
     int stringLength = JS('!', '#.length', string);
     if (start < 0 || start > stringLength) {
-      throw new RangeError.range(start, 0, stringLength);
+      throw RangeError.range(start, 0, stringLength);
     }
     int thisLength = JS('!', '#.length', this);
     if (start + thisLength > stringLength) return null;
@@ -47,7 +47,7 @@
         return null;
       }
     }
-    return new StringMatch(start, string, this);
+    return StringMatch(start, string, this);
   }
 
   @notNull
@@ -97,10 +97,10 @@
   @notNull
   List<String> split(@nullCheck Pattern pattern) {
     if (pattern is String) {
-      return new JSArray.of(JS('', r'#.split(#)', this, pattern));
+      return JSArray.of(JS('', r'#.split(#)', this, pattern));
     } else if (pattern is JSSyntaxRegExp && regExpCaptureCount(pattern) == 0) {
       var re = regExpGetNative(pattern);
-      return new JSArray.of(JS('', r'#.split(#)', this, re));
+      return JSArray.of(JS('', r'#.split(#)', this, re));
     } else {
       return _defaultSplit(pattern);
     }
@@ -150,7 +150,7 @@
     // reference to index.
     int length = JS('int', '#.length', this);
     if (index < 0 || JS('int', '#', index) > length) {
-      throw new RangeError.range(index, 0, this.length);
+      throw RangeError.range(index, 0, this.length);
     }
     if (pattern is String) {
       String other = pattern;
@@ -166,9 +166,9 @@
   String substring(@nullCheck int startIndex, [int _endIndex]) {
     var length = this.length;
     final endIndex = _endIndex ?? length;
-    if (startIndex < 0) throw new RangeError.value(startIndex);
-    if (startIndex > endIndex) throw new RangeError.value(startIndex);
-    if (endIndex > length) throw new RangeError.value(endIndex);
+    if (startIndex < 0) throw RangeError.value(startIndex);
+    if (startIndex > endIndex) throw RangeError.value(startIndex);
+    if (endIndex > length) throw RangeError.value(endIndex);
     return JS('String', r'#.substring(#, #)', this, startIndex, endIndex);
   }
 
@@ -400,15 +400,15 @@
   }
 
   @notNull
-  List<int> get codeUnits => new CodeUnits(this);
+  List<int> get codeUnits => CodeUnits(this);
 
   @notNull
-  Runes get runes => new Runes(this);
+  Runes get runes => Runes(this);
 
   @notNull
   int indexOf(@nullCheck Pattern pattern, [@nullCheck int start = 0]) {
     if (start < 0 || start > this.length) {
-      throw new RangeError.range(start, 0, this.length);
+      throw RangeError.range(start, 0, this.length);
     }
     if (pattern is String) {
       return stringIndexOfStringUnchecked(this, pattern, start);
@@ -430,7 +430,7 @@
     var length = this.length;
     var start = _start ?? length;
     if (start < 0 || start > length) {
-      throw new RangeError.range(start, 0, length);
+      throw RangeError.range(start, 0, length);
     }
     if (pattern is String) {
       String other = pattern;
@@ -448,7 +448,7 @@
   @notNull
   bool contains(@nullCheck Pattern other, [@nullCheck int startIndex = 0]) {
     if (startIndex < 0 || startIndex > this.length) {
-      throw new RangeError.range(startIndex, 0, this.length);
+      throw RangeError.range(startIndex, 0, this.length);
     }
     return stringContainsUnchecked(this, other, startIndex);
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
index ea366ca..f5cde5c 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
@@ -20,7 +20,7 @@
     for (var entry in JS('Iterable', '#.entries()', _map)) {
       action(JS('', '#[0]', entry), JS('', '#[1]', entry));
       if (modifications != _modifications) {
-        throw new ConcurrentModificationError(this);
+        throw ConcurrentModificationError(this);
       }
     }
   }
@@ -90,8 +90,8 @@
   @notNull
   bool get isNotEmpty => JS('bool', '#.size != 0', _map);
 
-  Iterable<K> get keys => new _JSMapIterable<K>(this, true);
-  Iterable<V> get values => new _JSMapIterable<V>(this, false);
+  Iterable<K> get keys => _JSMapIterable<K>(this, true);
+  Iterable<V> get values => _JSMapIterable<V>(this, false);
 
   @notNull
   bool containsKey(Object key) {
@@ -272,5 +272,5 @@
   V putIfAbsent(Object key, Object ifAbsent()) => throw _unsupported();
 
   static Error _unsupported() =>
-      new UnsupportedError("Cannot modify unmodifiable map");
+      UnsupportedError("Cannot modify unmodifiable map");
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart b/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart
index b108a7c..4bc3ff5 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart
@@ -34,69 +34,69 @@
   Type get runtimeType => ByteBuffer;
 
   Uint8List asUint8List([int offsetInBytes = 0, int length]) {
-    return new NativeUint8List.view(this, offsetInBytes, length);
+    return NativeUint8List.view(this, offsetInBytes, length);
   }
 
   Int8List asInt8List([int offsetInBytes = 0, int length]) {
-    return new NativeInt8List.view(this, offsetInBytes, length);
+    return NativeInt8List.view(this, offsetInBytes, length);
   }
 
   Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]) {
-    return new NativeUint8ClampedList.view(this, offsetInBytes, length);
+    return NativeUint8ClampedList.view(this, offsetInBytes, length);
   }
 
   Uint16List asUint16List([int offsetInBytes = 0, int length]) {
-    return new NativeUint16List.view(this, offsetInBytes, length);
+    return NativeUint16List.view(this, offsetInBytes, length);
   }
 
   Int16List asInt16List([int offsetInBytes = 0, int length]) {
-    return new NativeInt16List.view(this, offsetInBytes, length);
+    return NativeInt16List.view(this, offsetInBytes, length);
   }
 
   Uint32List asUint32List([int offsetInBytes = 0, int length]) {
-    return new NativeUint32List.view(this, offsetInBytes, length);
+    return NativeUint32List.view(this, offsetInBytes, length);
   }
 
   Int32List asInt32List([int offsetInBytes = 0, int length]) {
-    return new NativeInt32List.view(this, offsetInBytes, length);
+    return NativeInt32List.view(this, offsetInBytes, length);
   }
 
   Uint64List asUint64List([int offsetInBytes = 0, int length]) {
-    throw new UnsupportedError("Uint64List not supported by dart2js.");
+    throw UnsupportedError("Uint64List not supported by dart2js.");
   }
 
   Int64List asInt64List([int offsetInBytes = 0, int length]) {
-    throw new UnsupportedError("Int64List not supported by dart2js.");
+    throw UnsupportedError("Int64List not supported by dart2js.");
   }
 
   Int32x4List asInt32x4List([int offsetInBytes = 0, int length]) {
     NativeInt32List storage =
         this.asInt32List(offsetInBytes, length != null ? length * 4 : null);
-    return new NativeInt32x4List._externalStorage(storage);
+    return NativeInt32x4List._externalStorage(storage);
   }
 
   Float32List asFloat32List([int offsetInBytes = 0, int length]) {
-    return new NativeFloat32List.view(this, offsetInBytes, length);
+    return NativeFloat32List.view(this, offsetInBytes, length);
   }
 
   Float64List asFloat64List([int offsetInBytes = 0, int length]) {
-    return new NativeFloat64List.view(this, offsetInBytes, length);
+    return NativeFloat64List.view(this, offsetInBytes, length);
   }
 
   Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]) {
     NativeFloat32List storage =
         this.asFloat32List(offsetInBytes, length != null ? length * 4 : null);
-    return new NativeFloat32x4List._externalStorage(storage);
+    return NativeFloat32x4List._externalStorage(storage);
   }
 
   Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]) {
     NativeFloat64List storage =
         this.asFloat64List(offsetInBytes, length != null ? length * 2 : null);
-    return new NativeFloat64x2List._externalStorage(storage);
+    return NativeFloat64x2List._externalStorage(storage);
   }
 
   ByteData asByteData([int offsetInBytes = 0, int length]) {
-    return new NativeByteData.view(this, offsetInBytes, length);
+    return NativeByteData.view(this, offsetInBytes, length);
   }
 }
 
@@ -114,13 +114,12 @@
    * Creates a [Float32x4List] of the specified length (in elements),
    * all of whose elements are initially zero.
    */
-  NativeFloat32x4List(int length)
-      : _storage = new NativeFloat32List(length * 4);
+  NativeFloat32x4List(int length) : _storage = NativeFloat32List(length * 4);
 
   NativeFloat32x4List._externalStorage(this._storage);
 
   NativeFloat32x4List._slowFromList(List<Float32x4> list)
-      : _storage = new NativeFloat32List(list.length * 4) {
+      : _storage = NativeFloat32List(list.length * 4) {
     for (int i = 0; i < list.length; i++) {
       var e = list[i];
       _storage[(i * 4) + 0] = e.x;
@@ -138,10 +137,10 @@
    */
   factory NativeFloat32x4List.fromList(List<Float32x4> list) {
     if (list is NativeFloat32x4List) {
-      return new NativeFloat32x4List._externalStorage(
-          new NativeFloat32List.fromList(list._storage));
+      return NativeFloat32x4List._externalStorage(
+          NativeFloat32List.fromList(list._storage));
     } else {
-      return new NativeFloat32x4List._slowFromList(list);
+      return NativeFloat32x4List._slowFromList(list);
     }
   }
 
@@ -161,7 +160,7 @@
     double _y = _storage[(index * 4) + 1];
     double _z = _storage[(index * 4) + 2];
     double _w = _storage[(index * 4) + 3];
-    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
+    return NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   void operator []=(int index, Float32x4 value) {
@@ -174,7 +173,7 @@
 
   List<Float32x4> sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    return new NativeFloat32x4List._externalStorage(
+    return NativeFloat32x4List._externalStorage(
         _storage.sublist(start * 4, end * 4));
   }
 }
@@ -193,12 +192,12 @@
    * Creates a [Int32x4List] of the specified length (in elements),
    * all of whose elements are initially zero.
    */
-  NativeInt32x4List(int length) : _storage = new NativeInt32List(length * 4);
+  NativeInt32x4List(int length) : _storage = NativeInt32List(length * 4);
 
   NativeInt32x4List._externalStorage(Int32List storage) : _storage = storage;
 
   NativeInt32x4List._slowFromList(List<Int32x4> list)
-      : _storage = new NativeInt32List(list.length * 4) {
+      : _storage = NativeInt32List(list.length * 4) {
     for (int i = 0; i < list.length; i++) {
       var e = list[i];
       _storage[(i * 4) + 0] = e.x;
@@ -216,10 +215,10 @@
    */
   factory NativeInt32x4List.fromList(List<Int32x4> list) {
     if (list is NativeInt32x4List) {
-      return new NativeInt32x4List._externalStorage(
-          new NativeInt32List.fromList(list._storage));
+      return NativeInt32x4List._externalStorage(
+          NativeInt32List.fromList(list._storage));
     } else {
-      return new NativeInt32x4List._slowFromList(list);
+      return NativeInt32x4List._slowFromList(list);
     }
   }
 
@@ -239,7 +238,7 @@
     int _y = _storage[(index * 4) + 1];
     int _z = _storage[(index * 4) + 2];
     int _w = _storage[(index * 4) + 3];
-    return new NativeInt32x4._truncated(_x, _y, _z, _w);
+    return NativeInt32x4._truncated(_x, _y, _z, _w);
   }
 
   void operator []=(int index, Int32x4 value) {
@@ -252,7 +251,7 @@
 
   List<Int32x4> sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    return new NativeInt32x4List._externalStorage(
+    return NativeInt32x4List._externalStorage(
         _storage.sublist(start * 4, end * 4));
   }
 }
@@ -271,13 +270,12 @@
    * Creates a [Float64x2List] of the specified length (in elements),
    * all of whose elements are initially zero.
    */
-  NativeFloat64x2List(int length)
-      : _storage = new NativeFloat64List(length * 2);
+  NativeFloat64x2List(int length) : _storage = NativeFloat64List(length * 2);
 
   NativeFloat64x2List._externalStorage(this._storage);
 
   NativeFloat64x2List._slowFromList(List<Float64x2> list)
-      : _storage = new NativeFloat64List(list.length * 2) {
+      : _storage = NativeFloat64List(list.length * 2) {
     for (int i = 0; i < list.length; i++) {
       var e = list[i];
       _storage[(i * 2) + 0] = e.x;
@@ -291,10 +289,10 @@
    */
   factory NativeFloat64x2List.fromList(List<Float64x2> list) {
     if (list is NativeFloat64x2List) {
-      return new NativeFloat64x2List._externalStorage(
-          new NativeFloat64List.fromList(list._storage));
+      return NativeFloat64x2List._externalStorage(
+          NativeFloat64List.fromList(list._storage));
     } else {
-      return new NativeFloat64x2List._slowFromList(list);
+      return NativeFloat64x2List._slowFromList(list);
     }
   }
 
@@ -314,7 +312,7 @@
     _checkValidIndex(index, this, this.length);
     double _x = _storage[(index * 2) + 0];
     double _y = _storage[(index * 2) + 1];
-    return new Float64x2(_x, _y);
+    return Float64x2(_x, _y);
   }
 
   void operator []=(int index, Float64x2 value) {
@@ -325,7 +323,7 @@
 
   List<Float64x2> sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    return new NativeFloat64x2List._externalStorage(
+    return NativeFloat64x2List._externalStorage(
         _storage.sublist(start * 2, end * 2));
   }
 }
@@ -361,9 +359,9 @@
 
   void _invalidPosition(int position, int length, String name) {
     if (position is! int) {
-      throw new ArgumentError.value(position, name, 'Invalid list position');
+      throw ArgumentError.value(position, name, 'Invalid list position');
     } else {
-      throw new RangeError.range(position, 0, length, name);
+      throw RangeError.range(position, 0, length, name);
     }
   }
 
@@ -380,7 +378,7 @@
 // because passing unvalidated values to the native constructors can cause
 // conversions or create views.
 int _checkLength(length) {
-  if (length is! int) throw new ArgumentError('Invalid length $length');
+  if (length is! int) throw ArgumentError('Invalid length $length');
   return length;
 }
 
@@ -390,13 +388,13 @@
 // views of the input.
 void _checkViewArguments(buffer, offsetInBytes, length) {
   if (buffer is! NativeByteBuffer) {
-    throw new ArgumentError('Invalid view buffer');
+    throw ArgumentError('Invalid view buffer');
   }
   if (offsetInBytes is! int) {
-    throw new ArgumentError('Invalid view offsetInBytes $offsetInBytes');
+    throw ArgumentError('Invalid view offsetInBytes $offsetInBytes');
   }
   if (length != null && length is! int) {
-    throw new ArgumentError('Invalid view length $length');
+    throw ArgumentError('Invalid view length $length');
   }
 }
 
@@ -404,7 +402,7 @@
 // returns a copy of the list.
 List _ensureNativeList(List list) {
   if (list is JSIndexable) return list;
-  List result = new List(list.length);
+  List result = List(list.length);
   for (int i = 0; i < list.length; i++) {
     result[i] = list[i];
   }
@@ -518,7 +516,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   int getInt64(int byteOffset, [Endian endian = Endian.big]) {
-    throw new UnsupportedError('Int64 accessor not supported by dart2js.');
+    throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
   /**
@@ -573,7 +571,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   int getUint64(int byteOffset, [Endian endian = Endian.big]) {
-    throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
+    throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
   /**
@@ -663,7 +661,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]) {
-    throw new UnsupportedError('Int64 accessor not supported by dart2js.');
+    throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
   /**
@@ -717,7 +715,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]) {
-    throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
+    throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
   /**
@@ -750,14 +748,14 @@
     int targetLength = this.length;
     _checkPosition(start, targetLength, "start");
     _checkPosition(end, targetLength, "end");
-    if (start > end) throw new RangeError.range(start, 0, end);
+    if (start > end) throw RangeError.range(start, 0, end);
     int count = end - start;
 
-    if (skipCount < 0) throw new ArgumentError(skipCount);
+    if (skipCount < 0) throw ArgumentError(skipCount);
 
     int sourceLength = source.length;
     if (sourceLength - skipCount < count) {
-      throw new StateError('Not enough elements');
+      throw StateError('Not enough elements');
     }
 
     if (skipCount != 0 || sourceLength != count) {
@@ -1174,7 +1172,7 @@
   final double z;
   final double w;
 
-  static final NativeFloat32List _list = new NativeFloat32List(4);
+  static final NativeFloat32List _list = NativeFloat32List(4);
   static final Uint32List _uint32view = _list.buffer.asUint32List();
 
   static _truncate(x) {
@@ -1189,10 +1187,10 @@
         this.w = _truncate(w) {
     // We would prefer to check for `double` but in dart2js we can't see the
     // difference anyway.
-    if (x is! num) throw new ArgumentError(x);
-    if (y is! num) throw new ArgumentError(y);
-    if (z is! num) throw new ArgumentError(z);
-    if (w is! num) throw new ArgumentError(w);
+    if (x is! num) throw ArgumentError(x);
+    if (y is! num) throw ArgumentError(y);
+    if (z is! num) throw ArgumentError(z);
+    if (w is! num) throw ArgumentError(w);
   }
 
   NativeFloat32x4.splat(double v) : this(v, v, v, v);
@@ -1204,8 +1202,7 @@
     _uint32view[1] = i.y;
     _uint32view[2] = i.z;
     _uint32view[3] = i.w;
-    return new NativeFloat32x4._truncated(
-        _list[0], _list[1], _list[2], _list[3]);
+    return NativeFloat32x4._truncated(_list[0], _list[1], _list[2], _list[3]);
   }
 
   NativeFloat32x4.fromFloat64x2(Float64x2 v)
@@ -1237,12 +1234,12 @@
     double _y = y + other.y;
     double _z = z + other.z;
     double _w = w + other.w;
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Negate operator.
   Float32x4 operator -() {
-    return new NativeFloat32x4._truncated(-x, -y, -z, -w);
+    return NativeFloat32x4._truncated(-x, -y, -z, -w);
   }
 
   /// Subtraction operator.
@@ -1251,7 +1248,7 @@
     double _y = y - other.y;
     double _z = z - other.z;
     double _w = w - other.w;
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Multiplication operator.
@@ -1260,7 +1257,7 @@
     double _y = y * other.y;
     double _z = z * other.z;
     double _w = w * other.w;
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Division operator.
@@ -1269,7 +1266,7 @@
     double _y = y / other.y;
     double _z = z / other.z;
     double _w = w / other.w;
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Relational less than.
@@ -1278,7 +1275,7 @@
     bool _cy = y < other.y;
     bool _cz = z < other.z;
     bool _cw = w < other.w;
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
@@ -1288,7 +1285,7 @@
     bool _cy = y <= other.y;
     bool _cz = z <= other.z;
     bool _cw = w <= other.w;
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
@@ -1298,7 +1295,7 @@
     bool _cy = y > other.y;
     bool _cz = z > other.z;
     bool _cw = w > other.w;
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
@@ -1308,7 +1305,7 @@
     bool _cy = y >= other.y;
     bool _cz = z >= other.z;
     bool _cw = w >= other.w;
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
@@ -1318,7 +1315,7 @@
     bool _cy = y == other.y;
     bool _cz = z == other.z;
     bool _cw = w == other.w;
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
@@ -1328,7 +1325,7 @@
     bool _cy = y != other.y;
     bool _cz = z != other.z;
     bool _cw = w != other.w;
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
@@ -1338,7 +1335,7 @@
     double _y = s * y;
     double _z = s * z;
     double _w = s * w;
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Returns the absolute value of this [Float32x4].
@@ -1347,7 +1344,7 @@
     double _y = y.abs();
     double _z = z.abs();
     double _w = w.abs();
-    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
+    return NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Clamps [this] to be in the range [lowerLimit]-[upperLimit].
@@ -1373,7 +1370,7 @@
     _y = _y < _ly ? _ly : _y;
     _z = _z < _lz ? _lz : _z;
     _w = _w < _lw ? _lw : _w;
-    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
+    return NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Extract the sign bit from each lane return them in the first 4 bits.
@@ -1395,7 +1392,7 @@
   /// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
   Float32x4 shuffle(int mask) {
     if ((mask < 0) || (mask > 255)) {
-      throw new RangeError.range(mask, 0, 255, "mask");
+      throw RangeError.range(mask, 0, 255, "mask");
     }
     _list[0] = x;
     _list[1] = y;
@@ -1406,7 +1403,7 @@
     double _y = _list[(mask >> 2) & 0x3];
     double _z = _list[(mask >> 4) & 0x3];
     double _w = _list[(mask >> 6) & 0x3];
-    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
+    return NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Shuffle the lane values in [this] and [other]. The returned
@@ -1414,7 +1411,7 @@
   /// Uses the same [mask] as [shuffle].
   Float32x4 shuffleMix(Float32x4 other, int mask) {
     if ((mask < 0) || (mask > 255)) {
-      throw new RangeError.range(mask, 0, 255, "mask");
+      throw RangeError.range(mask, 0, 255, "mask");
     }
     _list[0] = x;
     _list[1] = y;
@@ -1429,27 +1426,27 @@
     _list[3] = other.w;
     double _z = _list[(mask >> 4) & 0x3];
     double _w = _list[(mask >> 6) & 0x3];
-    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
+    return NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Copy [this] and replace the [x] lane.
   Float32x4 withX(double newX) {
-    return new NativeFloat32x4._truncated(_truncate(newX), y, z, w);
+    return NativeFloat32x4._truncated(_truncate(newX), y, z, w);
   }
 
   /// Copy [this] and replace the [y] lane.
   Float32x4 withY(double newY) {
-    return new NativeFloat32x4._truncated(x, _truncate(newY), z, w);
+    return NativeFloat32x4._truncated(x, _truncate(newY), z, w);
   }
 
   /// Copy [this] and replace the [z] lane.
   Float32x4 withZ(double newZ) {
-    return new NativeFloat32x4._truncated(x, y, _truncate(newZ), w);
+    return NativeFloat32x4._truncated(x, y, _truncate(newZ), w);
   }
 
   /// Copy [this] and replace the [w] lane.
   Float32x4 withW(double newW) {
-    return new NativeFloat32x4._truncated(x, y, z, _truncate(newW));
+    return NativeFloat32x4._truncated(x, y, z, _truncate(newW));
   }
 
   /// Returns the lane-wise minimum value in [this] or [other].
@@ -1458,7 +1455,7 @@
     double _y = y < other.y ? y : other.y;
     double _z = z < other.z ? z : other.z;
     double _w = w < other.w ? w : other.w;
-    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
+    return NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Returns the lane-wise maximum value in [this] or [other].
@@ -1467,7 +1464,7 @@
     double _y = y > other.y ? y : other.y;
     double _z = z > other.z ? z : other.z;
     double _w = w > other.w ? w : other.w;
-    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
+    return NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Returns the square root of [this].
@@ -1476,7 +1473,7 @@
     double _y = Math.sqrt(y);
     double _z = Math.sqrt(z);
     double _w = Math.sqrt(w);
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Returns the reciprocal of [this].
@@ -1485,7 +1482,7 @@
     double _y = 1.0 / y;
     double _z = 1.0 / z;
     double _w = 1.0 / w;
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Returns the square root of the reciprocal of [this].
@@ -1494,7 +1491,7 @@
     double _y = Math.sqrt(1.0 / y);
     double _z = Math.sqrt(1.0 / z);
     double _w = Math.sqrt(1.0 / w);
-    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
+    return NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 }
 
@@ -1509,7 +1506,7 @@
   final int z;
   final int w;
 
-  static final _list = new NativeInt32List(4);
+  static final _list = NativeInt32List(4);
 
   static _truncate(x) {
     _list[0] = x;
@@ -1521,10 +1518,10 @@
         this.y = _truncate(y),
         this.z = _truncate(z),
         this.w = _truncate(w) {
-    if (x != this.x && x is! int) throw new ArgumentError(x);
-    if (y != this.y && y is! int) throw new ArgumentError(y);
-    if (z != this.z && z is! int) throw new ArgumentError(z);
-    if (w != this.w && w is! int) throw new ArgumentError(w);
+    if (x != this.x && x is! int) throw ArgumentError(x);
+    if (y != this.y && y is! int) throw ArgumentError(y);
+    if (z != this.z && z is! int) throw ArgumentError(z);
+    if (w != this.w && w is! int) throw ArgumentError(w);
   }
 
   NativeInt32x4.bool(bool x, bool y, bool z, bool w)
@@ -1541,7 +1538,7 @@
     floatList[2] = f.z;
     floatList[3] = f.w;
     NativeInt32List view = floatList.buffer.asInt32List();
-    return new NativeInt32x4._truncated(view[0], view[1], view[2], view[3]);
+    return NativeInt32x4._truncated(view[0], view[1], view[2], view[3]);
   }
 
   NativeInt32x4._truncated(this.x, this.y, this.z, this.w);
@@ -1552,7 +1549,7 @@
   Int32x4 operator |(Int32x4 other) {
     // Dart2js uses unsigned results for bit-operations.
     // We use "JS" to fall back to the signed versions.
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         JS("int", "# | #", x, other.x),
         JS("int", "# | #", y, other.y),
         JS("int", "# | #", z, other.z),
@@ -1563,7 +1560,7 @@
   Int32x4 operator &(Int32x4 other) {
     // Dart2js uses unsigned results for bit-operations.
     // We use "JS" to fall back to the signed versions.
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         JS("int", "# & #", x, other.x),
         JS("int", "# & #", y, other.y),
         JS("int", "# & #", z, other.z),
@@ -1574,7 +1571,7 @@
   Int32x4 operator ^(Int32x4 other) {
     // Dart2js uses unsigned results for bit-operations.
     // We use "JS" to fall back to the signed versions.
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         JS("int", "# ^ #", x, other.x),
         JS("int", "# ^ #", y, other.y),
         JS("int", "# ^ #", z, other.z),
@@ -1583,7 +1580,7 @@
 
   Int32x4 operator +(Int32x4 other) {
     // Avoid going through the typed array by "| 0" the result.
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         JS("int", "(# + #) | 0", x, other.x),
         JS("int", "(# + #) | 0", y, other.y),
         JS("int", "(# + #) | 0", z, other.z),
@@ -1592,7 +1589,7 @@
 
   Int32x4 operator -(Int32x4 other) {
     // Avoid going through the typed array by "| 0" the result.
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         JS("int", "(# - #) | 0", x, other.x),
         JS("int", "(# - #) | 0", y, other.y),
         JS("int", "(# - #) | 0", z, other.z),
@@ -1601,7 +1598,7 @@
 
   Int32x4 operator -() {
     // Avoid going through the typed array by "| 0" the result.
-    return new NativeInt32x4._truncated(
+    return NativeInt32x4._truncated(
         JS("int", "(-#) | 0", x),
         JS("int", "(-#) | 0", y),
         JS("int", "(-#) | 0", z),
@@ -1620,7 +1617,7 @@
   /// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
   Int32x4 shuffle(int mask) {
     if ((mask < 0) || (mask > 255)) {
-      throw new RangeError.range(mask, 0, 255, "mask");
+      throw RangeError.range(mask, 0, 255, "mask");
     }
     _list[0] = x;
     _list[1] = y;
@@ -1630,7 +1627,7 @@
     int _y = _list[(mask >> 2) & 0x3];
     int _z = _list[(mask >> 4) & 0x3];
     int _w = _list[(mask >> 6) & 0x3];
-    return new NativeInt32x4._truncated(_x, _y, _z, _w);
+    return NativeInt32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Shuffle the lane values in [this] and [other]. The returned
@@ -1638,7 +1635,7 @@
   /// Uses the same [mask] as [shuffle].
   Int32x4 shuffleMix(Int32x4 other, int mask) {
     if ((mask < 0) || (mask > 255)) {
-      throw new RangeError.range(mask, 0, 255, "mask");
+      throw RangeError.range(mask, 0, 255, "mask");
     }
     _list[0] = x;
     _list[1] = y;
@@ -1653,31 +1650,31 @@
     _list[3] = other.w;
     int _z = _list[(mask >> 4) & 0x3];
     int _w = _list[(mask >> 6) & 0x3];
-    return new NativeInt32x4._truncated(_x, _y, _z, _w);
+    return NativeInt32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new x value.
   Int32x4 withX(int x) {
     int _x = _truncate(x);
-    return new NativeInt32x4._truncated(_x, y, z, w);
+    return NativeInt32x4._truncated(_x, y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new y value.
   Int32x4 withY(int y) {
     int _y = _truncate(y);
-    return new NativeInt32x4._truncated(x, _y, z, w);
+    return NativeInt32x4._truncated(x, _y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new z value.
   Int32x4 withZ(int z) {
     int _z = _truncate(z);
-    return new NativeInt32x4._truncated(x, y, _z, w);
+    return NativeInt32x4._truncated(x, y, _z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new w value.
   Int32x4 withW(int w) {
     int _w = _truncate(w);
-    return new NativeInt32x4._truncated(x, y, z, _w);
+    return NativeInt32x4._truncated(x, y, z, _w);
   }
 
   /// Extracted x value. Returns `false` for 0, `true` for any other value.
@@ -1695,25 +1692,25 @@
   /// Returns a new [Int32x4] copied from [this] with a new x value.
   Int32x4 withFlagX(bool flagX) {
     int _x = flagX ? -1 : 0;
-    return new NativeInt32x4._truncated(_x, y, z, w);
+    return NativeInt32x4._truncated(_x, y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new y value.
   Int32x4 withFlagY(bool flagY) {
     int _y = flagY ? -1 : 0;
-    return new NativeInt32x4._truncated(x, _y, z, w);
+    return NativeInt32x4._truncated(x, _y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new z value.
   Int32x4 withFlagZ(bool flagZ) {
     int _z = flagZ ? -1 : 0;
-    return new NativeInt32x4._truncated(x, y, _z, w);
+    return NativeInt32x4._truncated(x, y, _z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new w value.
   Int32x4 withFlagW(bool flagW) {
     int _w = flagW ? -1 : 0;
-    return new NativeInt32x4._truncated(x, y, z, _w);
+    return NativeInt32x4._truncated(x, y, z, _w);
   }
 
   /// Merge [trueValue] and [falseValue] based on [this]' bit mask:
@@ -1748,7 +1745,7 @@
     intView[1] = _y;
     intView[2] = _z;
     intView[3] = _w;
-    return new NativeFloat32x4._truncated(
+    return NativeFloat32x4._truncated(
         floatList[0], floatList[1], floatList[2], floatList[3]);
   }
 }
@@ -1757,12 +1754,12 @@
   final double x;
   final double y;
 
-  static NativeFloat64List _list = new NativeFloat64List(2);
+  static NativeFloat64List _list = NativeFloat64List(2);
   static NativeUint32List _uint32View = _list.buffer.asUint32List();
 
   NativeFloat64x2(this.x, this.y) {
-    if (x is! num) throw new ArgumentError(x);
-    if (y is! num) throw new ArgumentError(y);
+    if (x is! num) throw ArgumentError(x);
+    if (y is! num) throw ArgumentError(y);
   }
 
   NativeFloat64x2.splat(double v) : this(v, v);
@@ -1778,37 +1775,37 @@
 
   /// Addition operator.
   Float64x2 operator +(Float64x2 other) {
-    return new NativeFloat64x2._doubles(x + other.x, y + other.y);
+    return NativeFloat64x2._doubles(x + other.x, y + other.y);
   }
 
   /// Negate operator.
   Float64x2 operator -() {
-    return new NativeFloat64x2._doubles(-x, -y);
+    return NativeFloat64x2._doubles(-x, -y);
   }
 
   /// Subtraction operator.
   Float64x2 operator -(Float64x2 other) {
-    return new NativeFloat64x2._doubles(x - other.x, y - other.y);
+    return NativeFloat64x2._doubles(x - other.x, y - other.y);
   }
 
   /// Multiplication operator.
   Float64x2 operator *(Float64x2 other) {
-    return new NativeFloat64x2._doubles(x * other.x, y * other.y);
+    return NativeFloat64x2._doubles(x * other.x, y * other.y);
   }
 
   /// Division operator.
   Float64x2 operator /(Float64x2 other) {
-    return new NativeFloat64x2._doubles(x / other.x, y / other.y);
+    return NativeFloat64x2._doubles(x / other.x, y / other.y);
   }
 
   /// Returns a copy of [this] each lane being scaled by [s].
   Float64x2 scale(double s) {
-    return new NativeFloat64x2._doubles(x * s, y * s);
+    return NativeFloat64x2._doubles(x * s, y * s);
   }
 
   /// Returns the absolute value of this [Float64x2].
   Float64x2 abs() {
-    return new NativeFloat64x2._doubles(x.abs(), y.abs());
+    return NativeFloat64x2._doubles(x.abs(), y.abs());
   }
 
   /// Clamps [this] to be in the range [lowerLimit]-[upperLimit].
@@ -1824,7 +1821,7 @@
     _y = _y > _uy ? _uy : _y;
     _x = _x < _lx ? _lx : _x;
     _y = _y < _ly ? _ly : _y;
-    return new NativeFloat64x2._doubles(_x, _y);
+    return NativeFloat64x2._doubles(_x, _y);
   }
 
   /// Extract the sign bits from each lane return them in the first 2 bits.
@@ -1839,31 +1836,31 @@
 
   /// Returns a new [Float64x2] copied from [this] with a new x value.
   Float64x2 withX(double x) {
-    if (x is! num) throw new ArgumentError(x);
-    return new NativeFloat64x2._doubles(x, y);
+    if (x is! num) throw ArgumentError(x);
+    return NativeFloat64x2._doubles(x, y);
   }
 
   /// Returns a new [Float64x2] copied from [this] with a new y value.
   Float64x2 withY(double y) {
-    if (y is! num) throw new ArgumentError(y);
-    return new NativeFloat64x2._doubles(x, y);
+    if (y is! num) throw ArgumentError(y);
+    return NativeFloat64x2._doubles(x, y);
   }
 
   /// Returns the lane-wise minimum value in [this] or [other].
   Float64x2 min(Float64x2 other) {
-    return new NativeFloat64x2._doubles(
+    return NativeFloat64x2._doubles(
         x < other.x ? x : other.x, y < other.y ? y : other.y);
   }
 
   /// Returns the lane-wise maximum value in [this] or [other].
   Float64x2 max(Float64x2 other) {
-    return new NativeFloat64x2._doubles(
+    return NativeFloat64x2._doubles(
         x > other.x ? x : other.x, y > other.y ? y : other.y);
   }
 
   /// Returns the lane-wise square root of [this].
   Float64x2 sqrt() {
-    return new NativeFloat64x2._doubles(Math.sqrt(x), Math.sqrt(y));
+    return NativeFloat64x2._doubles(Math.sqrt(x), Math.sqrt(y));
   }
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/profile.dart b/pkg/dev_compiler/tool/input_sdk/private/profile.dart
index 8e3dd82..2a8edbe 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/profile.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/profile.dart
@@ -27,7 +27,7 @@
 
 /// If the number of dynamic calls exceeds [_callRecordSampleSize] this list
 /// will represent a random sample of the dynamic calls made.
-List<_CallMethodRecord> _callMethodRecords = new List();
+List<_CallMethodRecord> _callMethodRecords = List();
 
 /// If the number of dynamic calls exceeds [_callRecordSampleSize] this value
 /// will be greater than [_callMethodRecords.length].
@@ -43,7 +43,7 @@
 /// speedup lookup of source map frames when running the profiler.
 /// The number of source map entries looked up makes caching more important
 /// in this case than for typical source map use cases.
-Map<String, String> _frameMappingCache = new Map();
+Map<String, String> _frameMappingCache = Map();
 
 List<List<Object>> getDynamicStats() {
   // Process the accumulated method stats. This may be quite slow as processing
@@ -54,7 +54,7 @@
   // raw number of dynamic calls so that the magnitude of the dynamic call
   // performance hit is clear to users.
 
-  Map<String, _MethodStats> callMethodStats = new Map();
+  Map<String, _MethodStats> callMethodStats = Map();
   if (_callMethodRecords.length > 0) {
     // Ratio between total record count and sampled records count.
     var recordRatio = _totalCallRecords / _callMethodRecords.length;
@@ -71,8 +71,8 @@
 
       var actualTypeName = dart.typeName(record.type);
       callMethodStats
-          .putIfAbsent("$actualTypeName <$src>",
-              () => new _MethodStats(actualTypeName, src))
+          .putIfAbsent(
+              "$actualTypeName <$src>", () => _MethodStats(actualTypeName, src))
           .count += recordRatio;
     }
 
@@ -126,7 +126,7 @@
     if (index >= _callMethodRecords.length) return; // don't sample
   }
   var record =
-      new _CallMethodRecord(JS('', 'new Error()'), dart.getReifiedType(obj));
+      _CallMethodRecord(JS('', 'new Error()'), dart.getReifiedType(obj));
   if (index == -1) {
     _callMethodRecords.add(record);
   } else {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart
index 937a7ff..2d6ff70 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart
@@ -50,7 +50,7 @@
   String toString() => "RegExp/$pattern/";
 
   JSSyntaxRegExp(String source,
-      {bool multiLine: false, bool caseSensitive: true})
+      {bool multiLine = false, bool caseSensitive = true})
       : this.pattern = source,
         this._nativeRegExp =
             makeNative(source, multiLine, caseSensitive, false);
@@ -100,13 +100,13 @@
     // The returned value is the JavaScript exception. Turn it into a
     // Dart exception.
     String errorMessage = JS('String', r'String(#)', regexp);
-    throw new FormatException("Illegal RegExp pattern: $source, $errorMessage");
+    throw FormatException("Illegal RegExp pattern: $source, $errorMessage");
   }
 
   Match firstMatch(@nullCheck String string) {
     List m = JS('JSExtendableArray|Null', r'#.exec(#)', _nativeRegExp, string);
     if (m == null) return null;
-    return new _MatchImplementation(this, new JSArray<String>.of(m));
+    return _MatchImplementation(this, JSArray<String>.of(m));
   }
 
   @notNull
@@ -123,9 +123,9 @@
   Iterable<Match> allMatches(@nullCheck String string,
       [@nullCheck int start = 0]) {
     if (start < 0 || start > string.length) {
-      throw new RangeError.range(start, 0, string.length);
+      throw RangeError.range(start, 0, string.length);
     }
-    return new _AllMatchesIterable(this, string, start);
+    return _AllMatchesIterable(this, string, start);
   }
 
   Match _execGlobal(String string, int start) {
@@ -133,7 +133,7 @@
     JS("void", "#.lastIndex = #", regexp, start);
     List match = JS("JSExtendableArray|Null", "#.exec(#)", regexp, string);
     if (match == null) return null;
-    return new _MatchImplementation(this, new JSArray<String>.of(match));
+    return _MatchImplementation(this, JSArray<String>.of(match));
   }
 
   Match _execAnchored(String string, int start) {
@@ -145,12 +145,12 @@
     // match at the start position.
     if (match[match.length - 1] != null) return null;
     match.length -= 1;
-    return new _MatchImplementation(this, new JSArray<String>.of(match));
+    return _MatchImplementation(this, JSArray<String>.of(match));
   }
 
   Match matchAsPrefix(String string, [int start = 0]) {
     if (start < 0 || start > string.length) {
-      throw new RangeError.range(start, 0, string.length);
+      throw RangeError.range(start, 0, string.length);
     }
     return _execAnchored(string, start);
   }
@@ -194,7 +194,7 @@
 
   _AllMatchesIterable(this._re, this._string, this._start);
 
-  Iterator<Match> get iterator => new _AllMatchesIterator(_re, _string, _start);
+  Iterator<Match> get iterator => _AllMatchesIterator(_re, _string, _start);
 }
 
 class _AllMatchesIterator implements Iterator<Match> {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart
index 354716a..41a51d6 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart
@@ -33,13 +33,13 @@
 
   String group(int group_) {
     if (group_ != 0) {
-      throw new RangeError.value(group_);
+      throw RangeError.value(group_);
     }
     return pattern;
   }
 
   List<String> groups(List<int> groups_) {
-    List<String> result = new List<String>();
+    List<String> result = List<String>();
     for (int g in groups_) {
       result.add(group(g));
     }
@@ -53,7 +53,7 @@
 
 Iterable<Match> allMatchesInStringUnchecked(
     String pattern, String string, int startIndex) {
-  return new _StringAllMatchesIterable(string, pattern, startIndex);
+  return _StringAllMatchesIterable(string, pattern, startIndex);
 }
 
 class _StringAllMatchesIterable extends Iterable<Match> {
@@ -64,12 +64,12 @@
   _StringAllMatchesIterable(this._input, this._pattern, this._index);
 
   Iterator<Match> get iterator =>
-      new _StringAllMatchesIterator(_input, _pattern, _index);
+      _StringAllMatchesIterator(_input, _pattern, _index);
 
   Match get first {
     int index = stringIndexOfStringUnchecked(_input, _pattern, _index);
     if (index >= 0) {
-      return new StringMatch(index, _input, _pattern);
+      return StringMatch(index, _input, _pattern);
     }
     throw IterableElementError.noElement();
   }
@@ -95,7 +95,7 @@
       return false;
     }
     int end = index + _pattern.length;
-    _current = new StringMatch(index, _input, _pattern);
+    _current = StringMatch(index, _input, _pattern);
     // Empty match, don't start at same location again.
     if (end == _index) end++;
     _index = end;
@@ -152,7 +152,7 @@
       if (receiver == "") {
         return replacement;
       } else {
-        StringBuffer result = new StringBuffer();
+        StringBuffer result = StringBuffer();
         int length = receiver.length;
         result.write(replacement);
         for (int i = 0; i < length; i++) {
@@ -190,7 +190,7 @@
     return stringReplaceAllStringFuncUnchecked(
         receiver, pattern, onMatch, onNonMatch);
   }
-  StringBuffer buffer = new StringBuffer();
+  StringBuffer buffer = StringBuffer();
   int startIndex = 0;
   for (Match match in pattern.allMatches(receiver)) {
     buffer.write(onNonMatch(receiver.substring(startIndex, match.start)));
@@ -205,12 +205,12 @@
 String stringReplaceAllEmptyFuncUnchecked(String receiver,
     String onMatch(Match match), String onNonMatch(String nonMatch)) {
   // Pattern is the empty string.
-  StringBuffer buffer = new StringBuffer();
+  StringBuffer buffer = StringBuffer();
   int length = receiver.length;
   int i = 0;
   buffer.write(onNonMatch(""));
   while (i < length) {
-    buffer.write(onMatch(new StringMatch(i, receiver, "")));
+    buffer.write(onMatch(StringMatch(i, receiver, "")));
     // Special case to avoid splitting a surrogate pair.
     int code = receiver.codeUnitAt(i);
     if ((code & ~0x3FF) == 0xD800 && length > i + 1) {
@@ -226,7 +226,7 @@
     buffer.write(onNonMatch(receiver[i]));
     i++;
   }
-  buffer.write(onMatch(new StringMatch(i, receiver, "")));
+  buffer.write(onMatch(StringMatch(i, receiver, "")));
   buffer.write(onNonMatch(""));
   return buffer.toString();
 }
@@ -239,7 +239,7 @@
     return stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
   }
   int length = receiver.length;
-  StringBuffer buffer = new StringBuffer();
+  StringBuffer buffer = StringBuffer();
   int startIndex = 0;
   while (startIndex < length) {
     int position = stringIndexOfStringUnchecked(receiver, pattern, startIndex);
@@ -247,7 +247,7 @@
       break;
     }
     buffer.write(onNonMatch(receiver.substring(startIndex, position)));
-    buffer.write(onMatch(new StringMatch(position, receiver, pattern)));
+    buffer.write(onMatch(StringMatch(position, receiver, pattern)));
     startIndex = position + patternLength;
   }
   buffer.write(onNonMatch(receiver.substring(startIndex)));
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index ae5273a..6be14ed 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -18,7 +18,7 @@
 
 Future main(List<String> args) async {
   // Parse flags.
-  var parser = new ArgParser();
+  var parser = ArgParser();
   var parserOptions = parser.parse(args);
   var rest = parserOptions.rest;
 
@@ -36,8 +36,8 @@
   }
 
   var inputPath = path.absolute('tool/input_sdk');
-  var target = new DevCompilerTarget();
-  var options = new CompilerOptions()
+  var target = DevCompilerTarget();
+  var options = CompilerOptions()
     ..compileSdk = true
     ..packagesFileUri = path.toUri(path.absolute('../../.packages'))
     ..sdkRoot = path.toUri(inputPath)
@@ -47,10 +47,10 @@
   var component = await kernelForComponent(inputs, options);
 
   var outputDir = path.dirname(outputPath);
-  await new Directory(outputDir).create(recursive: true);
+  await Directory(outputDir).create(recursive: true);
   await writeComponentToBinary(component, outputPath);
 
-  var jsModule = new ProgramCompiler(component, declaredVariables: {})
+  var jsModule = ProgramCompiler(component, declaredVariables: {})
       .emitModule(component, [], []);
   var moduleFormats = {
     'amd': ModuleFormat.amd,
@@ -63,9 +63,9 @@
     var format = moduleFormats[name];
     var jsDir = path.join(outputDir, name);
     var jsPath = path.join(jsDir, 'dart_sdk.js');
-    await new Directory(jsDir).create();
+    await Directory(jsDir).create();
     var jsCode = jsProgramToCode(jsModule, format);
-    await new File(jsPath).writeAsString(jsCode.code);
-    await new File('$jsPath.map').writeAsString(json.encode(jsCode.sourceMap));
+    await File(jsPath).writeAsString(jsCode.code);
+    await File('$jsPath.map').writeAsString(json.encode(jsCode.sourceMap));
   }
 }
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index 6032c60..85060f0 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -30,7 +30,7 @@
     exit(1);
   }
 
-  var selfModifyTime = new File(self).lastModifiedSync().millisecondsSinceEpoch;
+  var selfModifyTime = File(self).lastModifiedSync().millisecondsSinceEpoch;
 
   var repoDir = argv[0];
   var patchDir = argv[1];
@@ -43,17 +43,17 @@
 
   // Copy libraries.dart, libraries.json and version
   var librariesDart = path.join(patchDir, 'libraries.dart');
-  var libContents = new File(librariesDart).readAsStringSync();
+  var libContents = File(librariesDart).readAsStringSync();
   // TODO(jmesserly): can we remove this?
   _writeSync(path.join(sdkOut, '_internal', 'libraries.dart'), libContents);
   _writeSync(path.join(sdkOut, 'libraries.json'),
-      new File(path.join(patchDir, 'libraries.json')).readAsStringSync());
+      File(path.join(patchDir, 'libraries.json')).readAsStringSync());
   _writeSync(
       path.join(
           sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'),
       libContents);
   _writeSync(path.join(sdkOut, '..', 'version'),
-      new File(path.join(repoDir, 'tools', 'VERSION')).readAsStringSync());
+      File(path.join(repoDir, 'tools', 'VERSION')).readAsStringSync());
 
   // Parse libraries.dart
   var sdkLibraries = _getSdkLibraries(libContents);
@@ -71,13 +71,13 @@
     if (library.path.contains(INTERNAL_PATH)) {
       libraryIn =
           path.join(privateIn, library.path.replaceAll(INTERNAL_PATH, ''));
-    } else if (new File(libraryOverride).existsSync()) {
+    } else if (File(libraryOverride).existsSync()) {
       libraryIn = libraryOverride;
     } else {
       libraryIn = libraryOut;
     }
 
-    var libraryFile = new File(libraryIn);
+    var libraryFile = File(libraryIn);
     if (libraryFile.existsSync()) {
       var outPaths = <String>[libraryOut];
       var libraryContents = libraryFile.readAsStringSync();
@@ -90,7 +90,7 @@
           var partPath = part.uri.stringValue;
           outPaths.add(path.join(path.dirname(libraryOut), partPath));
 
-          var partFile = new File(path.join(path.dirname(libraryIn), partPath));
+          var partFile = File(path.join(path.dirname(libraryIn), partPath));
           partFiles.add(partFile);
           inputModifyTime = math.max(inputModifyTime,
               partFile.lastModifiedSync().millisecondsSinceEpoch);
@@ -101,7 +101,7 @@
       var patchPath = path.join(
           patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart');
 
-      var patchFile = new File(patchPath);
+      var patchFile = File(patchPath);
       bool patchExists = patchFile.existsSync();
       if (patchExists) {
         inputModifyTime = math.max(inputModifyTime,
@@ -116,7 +116,7 @@
       // Compare output modify time with input modify time.
       bool needsUpdate = false;
       for (var outPath in outPaths) {
-        var outFile = new File(outPath);
+        var outFile = File(outPath);
         if (!outFile.existsSync() ||
             outFile.lastModifiedSync().millisecondsSinceEpoch <
                 inputModifyTime) {
@@ -147,10 +147,10 @@
 
 /// Writes a file, creating the directory if needed.
 void _writeSync(String filePath, String contents) {
-  var outDir = new Directory(path.dirname(filePath));
+  var outDir = Directory(path.dirname(filePath));
   if (!outDir.existsSync()) outDir.createSync(recursive: true);
 
-  new File(filePath).writeAsStringSync(contents);
+  File(filePath).writeAsStringSync(contents);
 }
 
 /// Merges dart:* library code with code from *_patch.dart file.
@@ -177,20 +177,20 @@
 
   // Parse the patch first. We'll need to extract bits of this as we go through
   // the other files.
-  var patchFinder = new PatchFinder.parseAndVisit(patchContents);
+  var patchFinder = PatchFinder.parseAndVisit(patchContents);
 
   // Merge `external` declarations with the corresponding `@patch` code.
   bool failed = false;
   for (var partContent in partsContents) {
-    var partEdits = new StringEditBuffer(partContent);
+    var partEdits = StringEditBuffer(partContent);
     var partUnit = parseCompilationUnit(partContent);
-    var patcher = new PatchApplier(partEdits, patchFinder);
+    var patcher = PatchApplier(partEdits, patchFinder);
     partUnit.accept(patcher);
     if (!failed) failed = patcher.patchWasMissing;
     results.add(partEdits);
   }
   if (failed) return null;
-  return new List<String>.from(results.map((e) => e.toString()));
+  return List<String>.from(results.map((e) => e.toString()));
 }
 
 /// Merge `@patch` declarations into `external` declarations.
@@ -395,7 +395,7 @@
   /// Edit the original text, replacing text on the range [begin] and
   /// exclusive [end] with the [replacement] string.
   void replace(int begin, int end, String replacement) {
-    _edits.add(new _StringEdit(begin, end, replacement));
+    _edits.add(_StringEdit(begin, end, replacement));
   }
 
   /// Insert [string] at [offset].
@@ -415,7 +415,7 @@
   /// Throws [UnsupportedError] if the edits were overlapping. If no edits were
   /// made, the original string will be returned.
   String toString() {
-    var sb = new StringBuffer();
+    var sb = StringBuffer();
     if (_edits.length == 0) return original;
 
     // Sort edits by start location.
@@ -424,7 +424,7 @@
     int consumed = 0;
     for (var edit in _edits) {
       if (consumed > edit.begin) {
-        sb = new StringBuffer();
+        sb = StringBuffer();
         sb.write('overlapping edits. Insert at offset ');
         sb.write(edit.begin);
         sb.write(' but have consumed ');
@@ -434,7 +434,7 @@
           sb.write('\n    ');
           sb.write(e);
         }
-        throw new UnsupportedError(sb.toString());
+        throw UnsupportedError(sb.toString());
       }
 
       // Add characters from the original string between this edit and the last
@@ -470,7 +470,10 @@
 }
 
 List<SdkLibrary> _getSdkLibraries(String contents) {
-  var libraryBuilder = new SdkLibrariesReader_LibraryBuilder(true);
+  // TODO(jmesserly): fix SdkLibrariesReader_LibraryBuilder in Analyzer.
+  // It doesn't understand optional new/const in Dart 2. For now, we keep
+  // redundant `const` in tool/input_sdk/libraries.dart as a workaround.
+  var libraryBuilder = SdkLibrariesReader_LibraryBuilder(true);
   parseCompilationUnit(contents).accept(libraryBuilder);
   return libraryBuilder.librariesMap.sdkLibraries;
 }
diff --git a/pkg/dev_compiler/tool/sdk_version_check.dart b/pkg/dev_compiler/tool/sdk_version_check.dart
index 8cab664..4d64c43 100755
--- a/pkg/dev_compiler/tool/sdk_version_check.dart
+++ b/pkg/dev_compiler/tool/sdk_version_check.dart
@@ -13,11 +13,11 @@
     print('for example: sdk_version_check.dart 1.9.0-dev.4.0');
     exit(2);
   }
-  var minVersion = new Version.parse(argv[0]);
+  var minVersion = Version.parse(argv[0]);
 
   var vmStr = Platform.version;
   vmStr = vmStr.substring(0, vmStr.indexOf(' '));
-  var vmVersion = new Version.parse(vmStr);
+  var vmVersion = Version.parse(vmStr);
   if (vmVersion < minVersion) {
     print('Requires VM $minVersion but actual version $vmVersion');
     exit(1);
diff --git a/pkg/dev_compiler/web/main.dart b/pkg/dev_compiler/web/main.dart
index af28187..01fb9ea 100755
--- a/pkg/dev_compiler/web/main.dart
+++ b/pkg/dev_compiler/web/main.dart
@@ -39,8 +39,8 @@
   try {
     // TODO: Remove CommandRunner and args if possible. May run into issues
     // with ArgResults or ArgParsers.
-    var runner = new CommandRunner('dartdevc', 'Dart Development Compiler');
-    runner.addCommand(new WebCompileCommand(messageHandler: messageHandler));
+    var runner = CommandRunner('dartdevc', 'Dart Development Compiler');
+    runner.addCommand(WebCompileCommand(messageHandler: messageHandler));
     _setUpCompilerInBrowser = runner.run(args) as Future<Function>;
   } catch (e, s) {
     _handleError(e, s, args, messageHandler: messageHandler);
diff --git a/pkg/dev_compiler/web/source_map_stack_trace.dart b/pkg/dev_compiler/web/source_map_stack_trace.dart
index 2b3a45c..9dce84a 100644
--- a/pkg/dev_compiler/web/source_map_stack_trace.dart
+++ b/pkg/dev_compiler/web/source_map_stack_trace.dart
@@ -17,13 +17,13 @@
 StackTrace mapStackTrace(Mapping sourceMap, StackTrace stackTrace,
     {List<String> roots}) {
   if (stackTrace is Chain) {
-    return new Chain(stackTrace.traces.map((trace) {
-      return new Trace.from(mapStackTrace(sourceMap, trace, roots: roots));
+    return Chain(stackTrace.traces.map((trace) {
+      return Trace.from(mapStackTrace(sourceMap, trace, roots: roots));
     }));
   }
 
-  var trace = new Trace.from(stackTrace);
-  return new Trace(trace.frames.map((frame) {
+  var trace = Trace.from(stackTrace);
+  return Trace(trace.frames.map((frame) {
     // If there's no line information, there's no way to translate this frame.
     // We could return it as-is, but these lines are usually not useful anyways.
     if (frame.line == null) return null;
@@ -65,7 +65,7 @@
       sourceUrl = 'dart:sdk_internal';
     }
 
-    return new Frame(Uri.parse(sourceUrl), span.start.line + 1,
+    return Frame(Uri.parse(sourceUrl), span.start.line + 1,
         span.start.column + 1, _prettifyMember(frame.member));
   }).where((frame) => frame != null));
 }
diff --git a/pkg/dev_compiler/web/stack_trace_mapper.dart b/pkg/dev_compiler/web/stack_trace_mapper.dart
index a5cdd4d..de9e2b6 100644
--- a/pkg/dev_compiler/web/stack_trace_mapper.dart
+++ b/pkg/dev_compiler/web/stack_trace_mapper.dart
@@ -59,7 +59,7 @@
 /// The unparsed data for the source maps must still be loaded before
 /// LazyMapping is used.
 class LazyMapping extends Mapping {
-  MappingBundle _bundle = new MappingBundle();
+  MappingBundle _bundle = MappingBundle();
   SourceMapProvider _provider;
 
   LazyMapping(this._provider);
@@ -69,7 +69,7 @@
   SourceMapSpan spanFor(int line, int column,
       {Map<String, SourceFile> files, String uri}) {
     if (uri == null) {
-      throw new ArgumentError.notNull('uri');
+      throw ArgumentError.notNull('uri');
     }
 
     if (!_bundle.containsMapping(uri)) {
@@ -101,19 +101,19 @@
   if (_mapping == null) {
     // This should not happen if the user has waited for the ReadyCallback
     // to start the application.
-    throw new StateError('Source maps are not done loading.');
+    throw StateError('Source maps are not done loading.');
   }
-  var trace = new Trace.parse(rawStackTrace);
+  var trace = Trace.parse(rawStackTrace);
   return mapStackTrace(_mapping, trace, roots: roots).toString();
 }
 
 void setSourceMapProvider(SourceMapProvider provider) {
-  _mapping = new LazyMapping(provider);
+  _mapping = LazyMapping(provider);
 }
 
 main() {
   // Register with DDC.
-  dartStackTraceUtility = new DartStackTraceUtility(
+  dartStackTraceUtility = DartStackTraceUtility(
       mapper: allowInterop(mapper),
       setSourceMapProvider: allowInterop(setSourceMapProvider));
 }
diff --git a/pkg/dev_compiler/web/web_command.dart b/pkg/dev_compiler/web/web_command.dart
index eae24da..d57e7a4 100644
--- a/pkg/dev_compiler/web/web_command.dart
+++ b/pkg/dev_compiler/web/web_command.dart
@@ -139,15 +139,15 @@
       List<String> moduleIds) {
     var dartSdkSummaryPath = '/dart-sdk/lib/_internal/web_sdk.sum';
 
-    var resourceProvider = new MemoryResourceProvider()
+    var resourceProvider = MemoryResourceProvider()
       ..newFileWithBytes(dartSdkSummaryPath, sdkBytes);
 
-    var resourceUriResolver = new ResourceUriResolver(resourceProvider);
+    var resourceUriResolver = ResourceUriResolver(resourceProvider);
 
-    var options = new AnalyzerOptions.basic(
+    var options = AnalyzerOptions.basic(
         dartSdkPath: '/dart-sdk', dartSdkSummaryPath: dartSdkSummaryPath);
 
-    var summaryDataStore = new SummaryDataStore(options.summaryPaths,
+    var summaryDataStore = SummaryDataStore(options.summaryPaths,
         resourceProvider: resourceProvider);
     for (var i = 0; i < summaryBytes.length; i++) {
       var bytes = summaryBytes[i];
@@ -156,15 +156,15 @@
       if (bytes.length == 0) continue;
 
       var url = '/${moduleIds[i]}.api.ds';
-      var summaryBundle = new PackageBundle.fromBuffer(bytes);
+      var summaryBundle = PackageBundle.fromBuffer(bytes);
       summaryDataStore.addBundle(url, summaryBundle);
     }
     var summaryResolver =
-        new InSummaryUriResolver(resourceProvider, summaryDataStore);
+        InSummaryUriResolver(resourceProvider, summaryDataStore);
 
     var fileResolvers = [summaryResolver, resourceUriResolver];
 
-    var compiler = new ModuleCompiler(options,
+    var compiler = ModuleCompiler(options,
         analysisRoot: '/web-compile-root',
         fileResolvers: fileResolvers,
         resourceProvider: resourceProvider,
@@ -172,7 +172,7 @@
 
     var context = compiler.context as AnalysisContextImpl;
 
-    var compilerOptions = new CompilerOptions.fromArguments(argResults);
+    var compilerOptions = CompilerOptions.fromArguments(argResults);
 
     var resolveFn = (String url) {
       var packagePrefix = 'package:';
@@ -253,7 +253,7 @@
         if (libraryElement == null) {
           throw "Unable to get library element.";
         }
-        var sb = new StringBuffer(imports);
+        var sb = StringBuffer(imports);
         sb.write('\n');
 
         // TODO(jacobr): we need to add a proper Analyzer flag specifing that
@@ -300,7 +300,7 @@
       }
       resourceProvider.newFile(fileName, sourceCode);
 
-      var unit = new BuildUnit(libraryName, "", [fileName], _moduleForLibrary);
+      var unit = BuildUnit(libraryName, "", [fileName], _moduleForLibrary);
 
       JSModuleFile module = compiler.compile(unit, compilerOptions);
 
@@ -312,7 +312,7 @@
             .code;
       }
 
-      return new CompileResult(
+      return CompileResult(
           code: moduleCode, isValid: module.isValid, errors: module.errors);
     };
 
diff --git a/pkg/front_end/lib/src/api_unstable/summary_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
similarity index 66%
rename from pkg/front_end/lib/src/api_unstable/summary_worker.dart
rename to pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 0d4bf9f..d23cab1 100644
--- a/pkg/front_end/lib/src/api_unstable/summary_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -20,12 +20,14 @@
 export '../api_prototype/standard_file_system.dart' show StandardFileSystem;
 export '../fasta/fasta_codes.dart' show FormattedMessage;
 export '../fasta/severity.dart' show Severity;
+import '../fasta/kernel/utils.dart' show serializeComponent;
 
 Future<InitializedCompilerState> initializeCompiler(
     InitializedCompilerState oldState,
     Uri sdkSummary,
     Uri packagesFile,
-    List<Uri> inputSummaries,
+    List<Uri> summaryInputs,
+    List<Uri> linkedInputs,
     Target target,
     FileSystem fileSystem) async {
   // TODO(sigmund): use incremental compiler when it supports our use case.
@@ -36,7 +38,8 @@
   CompilerOptions options = new CompilerOptions()
     ..sdkSummary = sdkSummary
     ..packagesFileUri = packagesFile
-    ..inputSummaries = inputSummaries
+    ..inputSummaries = summaryInputs
+    ..linkedDependencies = linkedInputs
     ..target = target
     ..fileSystem = fileSystem;
 
@@ -46,7 +49,9 @@
 }
 
 Future<List<int>> compile(InitializedCompilerState compilerState,
-    List<Uri> inputs, ProblemHandler problemHandler) async {
+    List<Uri> inputs, ProblemHandler problemHandler,
+    {bool summaryOnly}) async {
+  summaryOnly ??= true;
   CompilerOptions options = compilerState.options;
   options..onProblem = problemHandler;
 
@@ -55,6 +60,24 @@
   processedOpts.inputs.addAll(inputs);
 
   var result = await generateKernel(processedOpts,
-      buildSummary: true, buildComponent: false, truncateSummary: true);
-  return result?.summary;
+      buildSummary: summaryOnly, buildComponent: !summaryOnly);
+
+  var component = result?.component;
+  if (component != null && !summaryOnly) {
+    for (var lib in component.libraries) {
+      if (!inputs.contains(lib.importUri)) {
+        // Excluding the library also means that their canonical names will not
+        // be computed as part of serialization, so we need to do that
+        // preemtively here to avoid errors when serializing references to
+        // elements of these libraries.
+        component.root.getChildFromUri(lib.importUri).bindTo(lib.reference);
+        lib.computeCanonicalNames();
+      }
+    }
+  }
+
+  return summaryOnly
+      ? result?.summary
+      : serializeComponent(result?.component,
+          filter: (library) => inputs.contains(library.importUri));
 }
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index adb0ca4..550d686 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -16,8 +16,7 @@
 
 import 'package:package_config/packages_file.dart' as package_config;
 
-import 'package:package_config/src/packages_impl.dart'
-    show NonFilePackagesDirectoryPackages, MapPackages;
+import 'package:package_config/src/packages_impl.dart' show MapPackages;
 
 import 'package:source_span/source_span.dart' show SourceSpan, SourceLocation;
 
@@ -492,10 +491,9 @@
   /// the [FileSystem].
   ///
   /// This function first tries to locate a `.packages` file in the `scriptUri`
-  /// directory. If that is not found, it instead checks for the presence of a
-  /// `packages/` directory in the same place.  If that also fails, it starts
-  /// checking parent directories for a `.packages` file, and stops if it finds
-  /// it.  Otherwise it gives up and returns [Packages.noPackages].
+  /// directory. If that is not found, it starts checking parent directories for
+  /// a `.packages` file, and stops if it finds it. Otherwise it gives up and
+  /// returns [Packages.noPackages].
   ///
   /// Note: this is a fork from `package:package_config/discovery.dart` to adapt
   /// it to use [FileSystem]. The logic here is a mix of the logic in the
@@ -504,9 +502,8 @@
   ///    * Like `findPackagesFromFile` resolution searches for parent
   ///    directories
   ///
-  ///    * Like `findPackagesFromNonFile` if we resolve packages as the
-  ///    `packages/` directory, we can't provide a list of packages that are
-  ///    visible.
+  ///    * Unlike package:package_config, it does not look for a `packages/`
+  ///    directory, as that won't be supported in Dart 2.
   Future<Packages> _findPackages(Uri scriptUri) async {
     var dir = scriptUri.resolve('.');
     if (!dir.isAbsolute) {
@@ -527,12 +524,6 @@
     var candidate = await checkInDir(dir);
     if (candidate != null) return createPackagesFromFile(candidate);
 
-    // Check for $cwd/packages/
-    var packagesDir = dir.resolve("packages/");
-    if (await fileSystem.entityForUri(packagesDir).exists()) {
-      return new NonFilePackagesDirectoryPackages(packagesDir);
-    }
-
     // Check for cwd(/..)+/.packages
     var parentDir = dir.resolve('..');
     while (parentDir.path != dir.path) {
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index f430cfc..4cf8c2a 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -4,12 +4,17 @@
 
 library fasta.named_type_builder;
 
-import '../fasta_codes.dart' show Message, templateTypeArgumentMismatch;
+import '../fasta_codes.dart'
+    show
+        Message,
+        templateMissingExplicitTypeArguments,
+        templateTypeArgumentMismatch;
 
 import 'builder.dart'
     show
         Declaration,
         InvalidTypeBuilder,
+        LibraryBuilder,
         PrefixBuilder,
         QualifiedName,
         Scope,
@@ -34,7 +39,8 @@
   }
 
   @override
-  void resolveIn(Scope scope, int charOffset, Uri fileUri) {
+  void resolveIn(
+      Scope scope, int charOffset, Uri fileUri, LibraryBuilder library) {
     if (declaration != null) return;
     final name = this.name;
     Declaration member;
@@ -48,6 +54,14 @@
     }
     if (member is TypeDeclarationBuilder) {
       declaration = member.origin;
+      if (arguments == null && declaration.typeVariablesCount != 0) {
+        library.addProblem(
+            templateMissingExplicitTypeArguments
+                .withArguments(declaration.typeVariablesCount),
+            charOffset,
+            "$name".length,
+            fileUri);
+      }
       return;
     }
     declaration = buildInvalidType(charOffset, fileUri);
diff --git a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
index 75e269a1..bfd642d 100644
--- a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
@@ -18,7 +18,10 @@
   @override
   final int charOffset;
 
-  PrefixBuilder(this.name, this.deferred, this.parent, this.charOffset);
+  final int importIndex;
+
+  PrefixBuilder(
+      this.name, this.deferred, this.parent, this.charOffset, this.importIndex);
 
   Uri get fileUri => parent.fileUri;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/type_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
index 0b2d80a..ee13b6f 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
@@ -10,7 +10,8 @@
 abstract class TypeBuilder {
   const TypeBuilder();
 
-  void resolveIn(Scope scope, int charOffset, Uri fileUri) {}
+  void resolveIn(
+      Scope scope, int charOffset, Uri fileUri, LibraryBuilder library) {}
 
   /// See `UnresolvedType.checkType`.
   void check(int charOffset, Uri fileUri) {}
diff --git a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
index 392e15e..7c5004a 100644
--- a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
+++ b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
@@ -4,7 +4,7 @@
 
 library fasta.unresolved_type;
 
-import 'builder.dart' show Scope, TypeBuilder;
+import 'builder.dart' show LibraryBuilder, Scope, TypeBuilder;
 
 /// A wrapper around a type that is yet to be resolved.
 class UnresolvedType<T extends TypeBuilder> {
@@ -14,7 +14,8 @@
 
   UnresolvedType(this.builder, this.charOffset, this.fileUri);
 
-  void resolveIn(Scope scope) => builder.resolveIn(scope, charOffset, fileUri);
+  void resolveIn(Scope scope, LibraryBuilder library) =>
+      builder.resolveIn(scope, charOffset, fileUri, library);
 
   /// Performs checks on the type after it's resolved.
   void checkType() => builder.check(charOffset, fileUri);
diff --git a/pkg/front_end/lib/src/fasta/command_line_reporting.dart b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
index c7f93ee..e682431 100644
--- a/pkg/front_end/lib/src/fasta/command_line_reporting.dart
+++ b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
@@ -10,6 +10,10 @@
 
 import 'dart:io' show exitCode;
 
+import 'dart:math' show min;
+
+import 'dart:typed_data' show Uint8List;
+
 import 'package:kernel/ast.dart' show Location;
 
 import 'colors.dart' show green, magenta, red;
@@ -27,6 +31,8 @@
 
 import 'severity.dart' show Severity;
 
+import 'scanner/characters.dart' show $CARET, $SPACE, $TAB;
+
 import 'util/relativize.dart' show relativizeUri;
 
 const bool hideWarnings = false;
@@ -75,8 +81,21 @@
       if (sourceLine == null) {
         sourceLine = "";
       } else if (sourceLine.isNotEmpty) {
-        String indentation = " " * (location.column - 1);
-        String pointer = indentation + ("^" * length);
+        // TODO(askesc): Much more could be done to indent properly in the
+        // presence of all sorts of unicode weirdness.
+        // This handling covers the common case of single-width characters
+        // indented with spaces and/or tabs, using no surrogates.
+        int indentLength = location.column - 1;
+        Uint8List indentation = new Uint8List(indentLength + length)
+          ..fillRange(0, indentLength, $SPACE)
+          ..fillRange(indentLength, indentLength + length, $CARET);
+        int lengthInSourceLine = min(indentation.length, sourceLine.length);
+        for (int i = 0; i < lengthInSourceLine; i++) {
+          if (sourceLine.codeUnitAt(i) == $TAB) {
+            indentation[i] = $TAB;
+          }
+        }
+        String pointer = new String.fromCharCodes(indentation);
         if (pointer.length > sourceLine.length) {
           // Truncate the carets to handle messages that span multiple lines.
           int pointerLength = sourceLine.length;
diff --git a/pkg/front_end/lib/src/fasta/diagnostics.md b/pkg/front_end/lib/src/fasta/diagnostics.md
index d3711ec..1305e52 100644
--- a/pkg/front_end/lib/src/fasta/diagnostics.md
+++ b/pkg/front_end/lib/src/fasta/diagnostics.md
@@ -41,7 +41,9 @@
 
 ## Avoid Composing Messages Programmatically
 
-Composing messages programmatically can make it hard to translate them.
+Composing messages programmatically can make it hard to translate them. A tool that compose messages programmatically also makes it hard for its clients to distinguish the diagnostics.
+
+For example, [messages.yaml](../../../messages.yaml) includes an error code named `Unspecified`. This code is useful when prototyping a new diagnostic, but shouldn't otherwise be used.
 
 ## Keep Message Short
 
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 87a1acc..da38ef1 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -949,6 +949,34 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
+        String string,
+        String string2,
+        String
+            string3)> templateConstEvalNegativeShift = const Template<
+        Message Function(String string, String string2, String string3)>(
+    messageTemplate:
+        r"""Binary operator '#string' on '#string2' requires non-negative operand, but was '#string3'.""",
+    withArguments: _withArgumentsConstEvalNegativeShift);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2, String string3)>
+    codeConstEvalNegativeShift =
+    const Code<Message Function(String string, String string2, String string3)>(
+        "ConstEvalNegativeShift", templateConstEvalNegativeShift,
+        dart2jsCode: "INVALID_CONSTANT_SHIFT");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalNegativeShift(
+    String string, String string2, String string3) {
+  return new Message(codeConstEvalNegativeShift,
+      message:
+          """Binary operator '${string}' on '${string2}' requires non-negative operand, but was '${string3}'.""",
+      arguments: {'string': string, 'string2': string2, 'string3': string3});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
         String
             string)> templateConstEvalNonConstantLiteral = const Template<
         Message Function(String string)>(
@@ -971,6 +999,33 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String string,
+        String
+            string2)> templateConstEvalZeroDivisor = const Template<
+        Message Function(String string, String string2)>(
+    messageTemplate:
+        r"""Binary operator '#string' on '#string2' requires non-zero divisor, but divisor was '0'.""",
+    withArguments: _withArgumentsConstEvalZeroDivisor);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2)>
+    codeConstEvalZeroDivisor =
+    const Code<Message Function(String string, String string2)>(
+        "ConstEvalZeroDivisor", templateConstEvalZeroDivisor,
+        analyzerCode: "CONST_EVAL_THROWS_IDBZE",
+        dart2jsCode: "INVALID_CONSTANT_DIV");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalZeroDivisor(String string, String string2) {
+  return new Message(codeConstEvalZeroDivisor,
+      message:
+          """Binary operator '${string}' on '${string2}' requires non-zero divisor, but divisor was '0'.""",
+      arguments: {'string': string, 'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstFactory = messageConstFactory;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2833,6 +2888,60 @@
     message: r"""This is the other inherited member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            string)> templateInitializeFromDillNotSelfContained = const Template<
+        Message Function(String string)>(
+    messageTemplate:
+        r"""Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+    withArguments: _withArgumentsInitializeFromDillNotSelfContained);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)>
+    codeInitializeFromDillNotSelfContained =
+    const Code<Message Function(String string)>(
+        "InitializeFromDillNotSelfContained",
+        templateInitializeFromDillNotSelfContained,
+        severity: Severity.warning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInitializeFromDillNotSelfContained(String string) {
+  return new Message(codeInitializeFromDillNotSelfContained,
+      message:
+          """Tried to initialize from a previous compilation (${string}), but the file was not self-contained. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String string,
+        String
+            string2)> templateInitializeFromDillUnknownProblem = const Template<
+        Message Function(String string, String string2)>(
+    messageTemplate:
+        r"""Tried to initialize from a previous compilation (#string), but couldn't. Error message was '#string2'. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+    withArguments: _withArgumentsInitializeFromDillUnknownProblem);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2)>
+    codeInitializeFromDillUnknownProblem =
+    const Code<Message Function(String string, String string2)>(
+        "InitializeFromDillUnknownProblem",
+        templateInitializeFromDillUnknownProblem,
+        severity: Severity.warning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInitializeFromDillUnknownProblem(
+    String string, String string2) {
+  return new Message(codeInitializeFromDillUnknownProblem,
+      message:
+          """Tried to initialize from a previous compilation (${string}), but couldn't. Error message was '${string2}'. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+      arguments: {'string': string, 'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInitializedVariableInForEach =
     messageInitializedVariableInForEach;
 
@@ -3660,6 +3769,28 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInvalidCodePoint = messageInvalidCodePoint;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInvalidCodePoint = const MessageCode(
+    "InvalidCodePoint",
+    analyzerCode: "INVALID_CODE_POINT",
+    dart2jsCode: "*fatal*",
+    message:
+        r"""The escape sequence starting with '\u' isn't a valid code point.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInvalidHexEscape = messageInvalidHexEscape;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInvalidHexEscape = const MessageCode(
+    "InvalidHexEscape",
+    analyzerCode: "INVALID_HEX_ESCAPE",
+    dart2jsCode: "*fatal*",
+    message:
+        r"""An escape sequence starting with '\x' must be followed by 2 hexidecimal digits.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidInitializer = messageInvalidInitializer;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3735,6 +3866,17 @@
     tip: r"""Try replacing 'sync' with 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInvalidUnicodeEscape = messageInvalidUnicodeEscape;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInvalidUnicodeEscape = const MessageCode(
+    "InvalidUnicodeEscape",
+    analyzerCode: "INVALID_UNICODE_ESCAPE",
+    dart2jsCode: "*fatal*",
+    message:
+        r"""An escape sequence starting with '\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidVoid = messageInvalidVoid;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3958,6 +4100,26 @@
         r"""Try adding the name of the type of the variable or the keyword 'var'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(int count)>
+    templateMissingExplicitTypeArguments =
+    const Template<Message Function(int count)>(
+        messageTemplate: r"""No type arguments provided, #count possible.""",
+        withArguments: _withArgumentsMissingExplicitTypeArguments);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(int count)> codeMissingExplicitTypeArguments =
+    const Code<Message Function(int count)>(
+        "MissingExplicitTypeArguments", templateMissingExplicitTypeArguments,
+        severity: Severity.ignored);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsMissingExplicitTypeArguments(int count) {
+  return new Message(codeMissingExplicitTypeArguments,
+      message: """No type arguments provided, ${count} possible.""",
+      arguments: {'count': count});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingExponent = messageMissingExponent;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/import.dart b/pkg/front_end/lib/src/fasta/import.dart
index e27b1e0..91165d3 100644
--- a/pkg/front_end/lib/src/fasta/import.dart
+++ b/pkg/front_end/lib/src/fasta/import.dart
@@ -50,9 +50,10 @@
       this.configurations,
       this.charOffset,
       this.prefixCharOffset,
+      int importIndex,
       {this.nativeImportUri})
       : prefixBuilder = createPrefixBuilder(prefix, importer, imported,
-            combinators, deferred, charOffset, prefixCharOffset);
+            combinators, deferred, charOffset, prefixCharOffset, importIndex);
 
   Uri get fileUri => importer.fileUri;
 
@@ -94,7 +95,8 @@
     List<Combinator> combinators,
     bool deferred,
     int charOffset,
-    int prefixCharOffset) {
+    int prefixCharOffset,
+    int importIndex) {
   if (prefix == null) return null;
   LibraryDependency dependency = null;
   if (deferred) {
@@ -103,5 +105,5 @@
       ..fileOffset = charOffset;
   }
   return new KernelPrefixBuilder(
-      prefix, deferred, importer, dependency, prefixCharOffset);
+      prefix, deferred, importer, dependency, prefixCharOffset, importIndex);
 }
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2a95602..a1382d0 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -8,53 +8,65 @@
 
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
 
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/binary/ast_from_binary.dart'
+    show BinaryBuilder, CanonicalNameError, InvalidKernelVersionError;
 
-import '../api_prototype/file_system.dart' show FileSystemEntity;
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
 import 'package:kernel/kernel.dart'
     show
-        Library,
-        Name,
-        ReturnStatement,
-        FunctionNode,
         Class,
-        Expression,
-        DartType,
-        LibraryPart,
         Component,
+        DartType,
+        Expression,
+        FunctionNode,
+        Library,
         LibraryDependency,
-        Source,
+        LibraryPart,
+        Name,
         Procedure,
-        TypeParameter,
-        ProcedureKind;
-
-import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
-
-import 'hybrid_file_system.dart' show HybridFileSystem;
+        ProcedureKind,
+        ReturnStatement,
+        Source,
+        TreeNode,
+        TypeParameter;
 
 import 'package:kernel/kernel.dart' as kernel show Combinator;
 
+import '../api_prototype/file_system.dart' show FileSystemEntity;
+
 import '../api_prototype/incremental_kernel_generator.dart'
     show IncrementalKernelGenerator, isLegalIdentifier;
 
+import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
+
 import 'builder/builder.dart' show LibraryBuilder;
 
 import 'builder_graph.dart' show BuilderGraph;
 
+import 'combinator.dart' show Combinator;
+
 import 'compiler_context.dart' show CompilerContext;
 
 import 'dill/dill_library_builder.dart' show DillLibraryBuilder;
 
 import 'dill/dill_target.dart' show DillTarget;
 
+import 'fasta_codes.dart'
+    show
+        templateInitializeFromDillNotSelfContained,
+        templateInitializeFromDillUnknownProblem;
+
+import 'hybrid_file_system.dart' show HybridFileSystem;
+
 import 'kernel/kernel_incremental_target.dart'
     show KernelIncrementalTarget, KernelIncrementalTargetErroneousComponent;
 
-import 'library_graph.dart' show LibraryGraph;
-
 import 'kernel/kernel_library_builder.dart' show KernelLibraryBuilder;
-import 'kernel/kernel_shadow_ast.dart' show ShadowVariableDeclaration;
+
+import 'kernel/kernel_shadow_ast.dart' show VariableDeclarationJudgment;
+
+import 'library_graph.dart' show LibraryGraph;
 
 import 'source/source_library_builder.dart' show SourceLibraryBuilder;
 
@@ -62,8 +74,6 @@
 
 import 'uri_translator.dart' show UriTranslator;
 
-import 'combinator.dart' show Combinator;
-
 class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
 
@@ -112,6 +122,25 @@
             // We might have loaded x out of y libraries into the component.
             // To avoid any unforeseen problems start over.
             bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
+
+            if (e is InvalidKernelVersionError || e is PackageChangedError) {
+              // Don't report any warning.
+            } else if (e is CanonicalNameError) {
+              dillLoadedData.loader.addProblem(
+                  templateInitializeFromDillNotSelfContained
+                      .withArguments(initializeFromDillUri.toString()),
+                  TreeNode.noOffset,
+                  1,
+                  null);
+            } else {
+              // Unknown error: Report problem as such.
+              dillLoadedData.loader.addProblem(
+                  templateInitializeFromDillUnknownProblem.withArguments(
+                      initializeFromDillUri.toString(), "$e"),
+                  TreeNode.noOffset,
+                  1,
+                  null);
+            }
           }
         }
         appendLibraries(data, bytesLength);
@@ -348,7 +377,7 @@
         // We're going to output all we read here so lazy loading it
         // doesn't make sense.
         new BinaryBuilder(initializationBytes, disableLazyReading: true)
-            .readComponent(data.component);
+            .readComponent(data.component, checkCanonicalNames: true);
 
         // Check the any package-urls still point to the same file
         // (e.g. the package still exists and hasn't been updated).
@@ -360,7 +389,7 @@
             // Everything that depends on it should be thrown away.
             // TODO(jensj): Anything that doesn't depend on it can be kept.
             // For now just don't initialize from this dill.
-            throw "Changed package";
+            throw const PackageChangedError();
           }
         }
 
@@ -450,6 +479,7 @@
               dependency.isDeferred,
               -1,
               -1,
+              -1,
               -1);
         }
 
@@ -463,7 +493,7 @@
       FunctionNode parameters = new FunctionNode(null,
           typeParameters: typeDefinitions,
           positionalParameters: definitions.keys
-              .map((name) => new ShadowVariableDeclaration(name, 0))
+              .map((name) => new VariableDeclarationJudgment(name, 0))
               .toList());
 
       debugLibrary.build(userCode.loader.coreLibrary, modifyTarget: false);
@@ -612,6 +642,10 @@
   void recordInvalidatedImportUrisForTesting(List<Uri> uris) {}
 }
 
+class PackageChangedError {
+  const PackageChangedError();
+}
+
 class IncrementalCompilerData {
   bool includeUserLoadedLibraries;
   Procedure userLoadedUriMain;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index e165386..f4a9d05 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -65,7 +65,8 @@
 
 import '../type_inference/type_inferrer.dart' show TypeInferrer;
 
-import '../type_inference/type_promotion.dart' show TypePromoter;
+import '../type_inference/type_promotion.dart'
+    show TypePromoter, TypePromotionFact, TypePromotionScope;
 
 import 'constness.dart' show Constness;
 
@@ -110,13 +111,15 @@
 
 import 'kernel_builder.dart';
 
+import 'kernel_factory.dart' show KernelFactory;
+
 import 'type_algorithms.dart' show calculateBounds;
 
 // TODO(ahe): Remove this and ensure all nodes have a location.
 const noLocation = null;
 
 abstract class BodyBuilder<Expression, Statement, Arguments>
-    extends ScopeListener<JumpTarget>
+    extends ScopeListener<JumpTarget<Statement>>
     implements ExpressionGeneratorHelper<Expression, Statement, Arguments> {
   // TODO(ahe): Rename [library] to 'part'.
   @override
@@ -159,6 +162,14 @@
   @override
   final TypePromoter typePromoter;
 
+  /// The factory used to construct body expressions, statements, and
+  /// initializers.
+  ///
+  /// TODO(paulberry): when the analyzer's diet parser is in use, this should
+  /// point to the analyzer's factory.  Note that type arguments will have to be
+  /// added to BodyBuilder to make this happen.
+  final KernelFactory factory = new KernelFactory();
+
   /// Only used when [member] is a constructor. It tracks if an implicit super
   /// initializer is needed.
   ///
@@ -283,7 +294,7 @@
 
   @override
   Expression toValue(Object node) {
-    if (node is Generator) {
+    if (node is Generator<Expression, Statement, Arguments>) {
       return node.buildSimpleRead();
     } else if (node is Expression) {
       return node;
@@ -301,7 +312,8 @@
   }
 
   Expression toEffect(Object node) {
-    if (node is Generator) return node.buildForEffect();
+    if (node is Generator<Expression, Statement, Arguments>)
+      return node.buildForEffect();
     return toValue(node);
   }
 
@@ -347,11 +359,11 @@
       switchScope.unclaimedForwardDeclarations
           .forEach((String name, Declaration declaration) {
         if (outerSwitchScope == null) {
-          JumpTarget target = declaration;
-          for (kernel.Statement statement in target.users) {
-            statement.parent.replaceChild(
-                statement,
-                wrapInCompileTimeErrorStatement(statement,
+          JumpTarget<Statement> target = declaration;
+          for (Statement statement in target.users) {
+            toKernelStatement(statement).parent.replaceChild(
+                toKernelStatement(statement),
+                wrapInCompileTimeErrorStatement(toKernelStatement(statement),
                     fasta.templateLabelNotFound.withArguments(name)));
           }
         } else {
@@ -414,7 +426,7 @@
   }
 
   @override
-  JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) {
+  JumpTarget<Statement> createJumpTarget(JumpTargetKind kind, int charOffset) {
     return new JumpTarget<Statement>(
         kind, functionNestingLevel, member, charOffset);
   }
@@ -429,17 +441,17 @@
   @override
   void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
     debugEvent("Metadata");
-    var arguments = pop();
+    Object arguments = pop();
     pushQualifiedReference(beginToken.next, periodBeforeName);
     if (arguments != null) {
       push(arguments);
       buildConstructorReferenceInvocation(
-          beginToken, beginToken.offset, Constness.explicitConst);
+          beginToken.next, beginToken.offset, Constness.explicitConst);
       push(popForValue());
     } else {
       String name = pop();
       pop(); // Type arguments (ignored, already reported by parser).
-      var expression = pop();
+      Object expression = pop();
       if (expression is Identifier) {
         Identifier identifier = expression;
         expression = new UnresolvedNameGenerator(
@@ -447,7 +459,7 @@
       }
       if (name?.isNotEmpty ?? false) {
         Token period = periodBeforeName ?? beginToken.next;
-        Generator generator = expression;
+        Generator<Expression, Statement, Arguments> generator = expression;
         expression = generator.buildPropertyAccess(
             new IncompletePropertyAccessGenerator(
                 this, period.next, new Name(name, library.library)),
@@ -456,7 +468,8 @@
       }
 
       ConstantContext savedConstantContext = pop();
-      if (expression is! StaticAccessGenerator) {
+      if (expression
+          is! StaticAccessGenerator<Expression, Statement, Arguments>) {
         push(wrapInCompileTimeError(
             toValue(expression), fasta.messageExpressionNotMetadata));
       } else {
@@ -492,12 +505,12 @@
   void finishFields() {
     debugEvent("finishFields");
     int count = pop();
-    List<FieldBuilder> fields = <FieldBuilder>[];
+    List<FieldBuilder<Object>> fields = <FieldBuilder<Object>>[];
     for (int i = 0; i < count; i++) {
       Expression initializer = pop();
       Identifier identifier = pop();
       String name = identifier.name;
-      FieldBuilder field;
+      FieldBuilder<Object> field;
       if (classBuilder != null) {
         field = classBuilder[name];
       } else {
@@ -514,14 +527,15 @@
         field.initializer = initializer;
         _typeInferrer.inferFieldInitializer(
             this,
+            factory,
             field.hasTypeInferredFromInitializer ? null : field.builtType,
             toKernelExpression(initializer));
       }
     }
     pop(); // Type.
-    List annotations = pop();
+    List<Object> annotations = pop();
     if (annotations != null) {
-      _typeInferrer.inferMetadata(this, annotations);
+      _typeInferrer.inferMetadata(this, factory, annotations);
       Field field = fields.first.target;
       // The first (and often only field) will not get a clone.
       annotations.forEach((annotation) => field.addAnnotation(annotation));
@@ -555,7 +569,7 @@
   }
 
   void prepareInitializers() {
-    ProcedureBuilder member = this.member;
+    ProcedureBuilder<TypeBuilder> member = this.member;
     scope = member.computeFormalParameterInitializerScope(scope);
     if (member is KernelConstructorBuilder) {
       if (member.isConst &&
@@ -624,19 +638,15 @@
     debugEvent("endInitializer");
     assert(!inInitializer);
     final member = this.member;
-    var node = pop();
+    Object node = pop();
     Initializer initializer;
     if (node is Initializer) {
       initializer = node;
-    } else if (node is Generator) {
+    } else if (node is Generator<Expression, Statement, Arguments>) {
       initializer = node.buildFieldInitializer(initializedFields);
     } else if (node is ConstructorInvocation) {
       initializer = buildSuperInitializer(
-          false,
-          node.target,
-          node.arguments as dynamic, // TODO(ahe): Remove this cast when
-          // buildSuperInitializer is moved to [Forest].
-          token.charOffset);
+          false, node.target, unchecked(node.arguments), token.charOffset);
     } else {
       Expression value = toValue(node);
       if (node is! Throw) {
@@ -645,7 +655,7 @@
       }
       initializer = buildInvalidInitializer(node, token.charOffset);
     }
-    _typeInferrer.inferInitializer(this, initializer);
+    _typeInferrer.inferInitializer(this, factory, initializer);
     if (member is KernelConstructorBuilder && !member.isExternal) {
       member.addInitializer(initializer, _typeInferrer);
     } else {
@@ -665,7 +675,7 @@
 
   @override
   void finishFunction(
-      List annotations,
+      List<Object> annotations,
       FormalParameters<Expression, Statement, Arguments> formals,
       AsyncMarker asyncModifier,
       kernel.Statement body) {
@@ -674,7 +684,7 @@
 
     KernelFunctionBuilder builder = member;
     if (formals?.optional != null) {
-      Iterator<FormalParameterBuilder> formalBuilders =
+      Iterator<FormalParameterBuilder<TypeBuilder>> formalBuilders =
           builder.formals.skip(formals.required.length).iterator;
       for (VariableDeclaration parameter in formals.optional.formals) {
         bool hasMore = formalBuilders.moveNext();
@@ -687,12 +697,12 @@
         realParameter.initializer = toKernelExpression(initializer)
           ..parent = realParameter;
         _typeInferrer.inferParameterInitializer(
-            this, toKernelExpression(initializer), realParameter.type);
+            this, factory, toKernelExpression(initializer), realParameter.type);
       }
     }
 
     _typeInferrer.inferFunctionBody(
-        this, _computeReturnTypeContext(member), asyncModifier, body);
+        this, factory, _computeReturnTypeContext(member), asyncModifier, body);
     if (builder.kind == ProcedureKind.Setter) {
       bool oneParameter = formals != null &&
           formals.required.length == 1 &&
@@ -732,7 +742,7 @@
       }
     }
     Member target = builder.target;
-    _typeInferrer.inferMetadata(this, annotations);
+    _typeInferrer.inferMetadata(this, factory, annotations);
     for (Expression annotation in annotations ?? const []) {
       target.addAnnotation(toKernelExpression(annotation));
     }
@@ -749,7 +759,7 @@
   @override
   List<kernel.Expression> finishMetadata() {
     List<kernel.Expression> expressions = pop();
-    _typeInferrer.inferMetadata(this, expressions);
+    _typeInferrer.inferMetadata(this, factory, expressions);
     return expressions;
   }
 
@@ -782,11 +792,11 @@
               .withLocation(uri, eof.charOffset, eof.length));
     }
 
-    ShadowReturnStatement fakeReturn =
-        new ShadowReturnStatement(toKernelExpression(expression));
+    ReturnJudgment fakeReturn =
+        new ReturnJudgment(toKernelExpression(expression));
 
     _typeInferrer.inferFunctionBody(
-        this, const DynamicType(), AsyncMarker.Sync, fakeReturn);
+        this, factory, const DynamicType(), AsyncMarker.Sync, fakeReturn);
 
     return toExpression(fakeReturn.expression);
   }
@@ -857,22 +867,23 @@
   @override
   void endArguments(int count, Token beginToken, Token endToken) {
     debugEvent("Arguments");
-    List<dynamic> arguments =
-        new List<dynamic>.filled(count, null, growable: true);
+    List<Object> arguments =
+        new List<Object>.filled(count, null, growable: true);
     popList(count, arguments);
     int firstNamedArgumentIndex = arguments.length;
     for (int i = 0; i < arguments.length; i++) {
-      var node = arguments[i];
+      Object node = arguments[i];
       if (node is NamedExpression) {
         firstNamedArgumentIndex =
             i < firstNamedArgumentIndex ? i : firstNamedArgumentIndex;
       } else {
-        arguments[i] = toValue(node);
+        Expression argument = toValue(node);
+        arguments[i] = argument;
         if (i > firstNamedArgumentIndex) {
           arguments[i] = new NamedExpression(
               "#$i",
               toKernelExpression(deprecated_buildCompileTimeError(
-                  "Expected named argument.", arguments[i].fileOffset)))
+                  "Expected named argument.", forest.readOffset(argument))))
             ..fileOffset = beginToken.charOffset;
         }
       }
@@ -898,7 +909,7 @@
         for (NamedExpression expression in named) {
           if (seenNames.containsKey(expression.name)) {
             hasProblem = true;
-            var prevNamedExpression = seenNames[expression.name];
+            NamedExpression prevNamedExpression = seenNames[expression.name];
             prevNamedExpression.value = toKernelExpression(
                 deprecated_buildCompileTimeError(
                     "Duplicated named argument '${expression.name}'.",
@@ -962,7 +973,7 @@
 
   @override
   finishSend(Object receiver, Arguments arguments, int charOffset) {
-    if (receiver is Generator) {
+    if (receiver is Generator<Expression, Statement, Arguments>) {
       return receiver.doInvocation(charOffset, arguments);
     } else {
       return buildMethodInvocation(
@@ -981,7 +992,7 @@
           this, token, expression.variable));
       expression.extend();
     } else {
-      VariableDeclaration variable = new ShadowVariableDeclaration.forValue(
+      VariableDeclaration variable = new VariableDeclarationJudgment.forValue(
           toKernelExpression(expression), functionNestingLevel);
       push(new ShadowCascadeExpression(variable));
       push(new VariableUseGenerator<Expression, Statement, Arguments>(
@@ -1035,7 +1046,7 @@
     if (optional("??", token)) return doIfNull(token);
     if (optional("?.", token)) return doIfNotNull(token);
     Expression argument = popForValue();
-    var receiver = pop();
+    Object receiver = pop();
     bool isSuper = false;
     if (receiver is ThisAccessGenerator && receiver.isSuper) {
       ThisAccessGenerator thisAccessorReceiver = receiver;
@@ -1097,7 +1108,7 @@
 
   /// Handle `a?.b(...)`.
   void doIfNotNull(Token token) {
-    var send = pop();
+    Object send = pop();
     if (send is IncompleteSendGenerator) {
       push(send.withReceiver(pop(), token.charOffset, isNullAware: true));
     } else {
@@ -1110,9 +1121,12 @@
   }
 
   void doDotOrCascadeExpression(Token token) {
-    var send = pop();
+    Object send = pop();
     if (send is IncompleteSendGenerator) {
       Object receiver = optional(".", token) ? pop() : popForValue();
+      if (receiver is TypeUseGenerator<dynamic, dynamic, dynamic>) {
+        _typeInferrer.storeTypeUse(receiver);
+      }
       push(send.withReceiver(receiver, token.charOffset));
     } else {
       pop();
@@ -1317,15 +1331,16 @@
     /// Performs a similar lookup to [lookupConstructor], but using a slower
     /// implementation.
     Constructor lookupConstructorWithPatches(Name name, bool isSuper) {
-      ClassBuilder builder = classBuilder.origin;
+      ClassBuilder<TypeBuilder, Object> builder = classBuilder.origin;
 
-      ClassBuilder getSuperclass(ClassBuilder builder) {
+      ClassBuilder<TypeBuilder, Object> getSuperclass(
+          ClassBuilder<TypeBuilder, Object> builder) {
         // This way of computing the superclass is slower than using the kernel
         // objects directly.
-        var supertype = builder.supertype;
-        if (supertype is NamedTypeBuilder) {
-          var builder = supertype.declaration;
-          if (builder is ClassBuilder) return builder;
+        Object supertype = builder.supertype;
+        if (supertype is NamedTypeBuilder<TypeBuilder, Object>) {
+          Object builder = supertype.declaration;
+          if (builder is ClassBuilder<TypeBuilder, Object>) return builder;
         }
         return null;
       }
@@ -1446,14 +1461,15 @@
       // [ProcedureBuilder.computeFormalParameterInitializerScope]. If that
       // wasn't the case, we could always use [VariableUseGenerator].
       if (declaration.isFinal) {
-        var fact = typePromoter.getFactForAccess(
+        Object fact = typePromoter.getFactForAccess(
             declaration.target, functionNestingLevel);
-        var scope = typePromoter.currentScope;
+        Object scope = typePromoter.currentScope;
         return new ReadOnlyAccessGenerator<Expression, Statement, Arguments>(
             this,
             token,
-            toExpression(new ShadowVariableGet(declaration.target, fact, scope)
-              ..fileOffset = charOffset),
+            toExpression(
+                new VariableGetJudgment(declaration.target, fact, scope)
+                  ..fileOffset = charOffset),
             name);
       } else {
         return new VariableUseGenerator<Expression, Statement, Arguments>(
@@ -1501,6 +1517,7 @@
             "You might try moving the constant to the deferred library, "
             "or removing 'deferred' from the import.");
       }
+      _typeInferrer.storePrefix(token, declaration);
       return declaration;
     } else if (declaration is LoadLibraryBuilder) {
       return new LoadLibraryGenerator<Expression, Statement, Arguments>(
@@ -1539,7 +1556,7 @@
   void handleQualified(Token period) {
     debugEvent("Qualified");
     Identifier name = pop();
-    var receiver = pop();
+    Object receiver = pop();
     push([receiver, name]);
   }
 
@@ -1560,10 +1577,10 @@
     debugEvent("endLiteralString");
     if (interpolationCount == 0) {
       Token token = pop();
-      String value = unescapeString(token.lexeme);
+      String value = unescapeString(token.lexeme, token, this);
       push(forest.literalString(value, token));
     } else {
-      var count = 1 + interpolationCount * 2;
+      Object count = 1 + interpolationCount * 2;
       List<Object> parts =
           popList(count, new List<Object>.filled(count, null, growable: true));
       Token first = parts.first;
@@ -1572,16 +1589,17 @@
       List<Expression> expressions = <Expression>[];
       // Contains more than just \' or \".
       if (first.lexeme.length > 1) {
-        String value = unescapeFirstStringPart(first.lexeme, quote);
+        String value =
+            unescapeFirstStringPart(first.lexeme, quote, first, this);
         if (value.isNotEmpty) {
           expressions.add(forest.literalString(value, first));
         }
       }
       for (int i = 1; i < parts.length - 1; i++) {
-        var part = parts[i];
+        Object part = parts[i];
         if (part is Token) {
           if (part.lexeme.length != 0) {
-            String value = unescape(part.lexeme, quote);
+            String value = unescape(part.lexeme, quote, part, this);
             expressions.add(forest.literalString(value, part));
           }
         } else {
@@ -1590,7 +1608,7 @@
       }
       // Contains more than just \' or \".
       if (last.lexeme.length > 1) {
-        String value = unescapeLastStringPart(last.lexeme, quote);
+        String value = unescapeLastStringPart(last.lexeme, quote, last, this);
         if (value.isNotEmpty) {
           expressions.add(forest.literalString(value, last));
         }
@@ -1730,7 +1748,7 @@
     bool isConst = (currentLocalVariableModifiers & constMask) != 0;
     bool isFinal = (currentLocalVariableModifiers & finalMask) != 0;
     assert(isConst == (constantContext == ConstantContext.inferred));
-    push(new ShadowVariableDeclaration(identifier.name, functionNestingLevel,
+    push(new VariableDeclarationJudgment(identifier.name, functionNestingLevel,
         initializer: toKernelExpression(initializer),
         type: currentLocalVariableType,
         isFinal: isFinal,
@@ -1833,8 +1851,8 @@
   void handleAssignmentExpression(Token token) {
     debugEvent("AssignmentExpression");
     Expression value = popForValue();
-    var generator = pop();
-    if (generator is! Generator) {
+    Object generator = pop();
+    if (generator is! Generator<Expression, Statement, Arguments>) {
       push(buildCompileTimeError(fasta.messageNotAnLvalue,
           offsetForToken(token), lengthForToken(token)));
     } else {
@@ -1845,8 +1863,8 @@
 
   @override
   void enterLoop(int charOffset) {
-    if (peek() is LabelTarget) {
-      LabelTarget target = peek();
+    if (peek() is LabelTarget<Statement>) {
+      LabelTarget<Statement> target = peek();
       enterBreakTarget(charOffset, target.breakTarget);
       enterContinueTarget(charOffset, target.continueTarget);
     } else {
@@ -1865,25 +1883,25 @@
   }
 
   List<VariableDeclaration> buildVariableDeclarations(variableOrExpression) {
-    if (variableOrExpression is Generator) {
+    if (variableOrExpression is Generator<Expression, Statement, Arguments>) {
       variableOrExpression = variableOrExpression.buildForEffect();
     }
     if (variableOrExpression is VariableDeclaration) {
       return <VariableDeclaration>[variableOrExpression];
     } else if (variableOrExpression is Expression) {
-      VariableDeclaration variable = new ShadowVariableDeclaration.forEffect(
+      VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
           toKernelExpression(variableOrExpression), functionNestingLevel);
       return <VariableDeclaration>[variable];
     } else if (variableOrExpression is ExpressionStatement) {
-      VariableDeclaration variable = new ShadowVariableDeclaration.forEffect(
+      VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
           variableOrExpression.expression, functionNestingLevel);
       return <VariableDeclaration>[variable];
     } else if (forest.isVariablesDeclaration(variableOrExpression)) {
       return forest
           .variablesDeclarationExtractDeclarations(variableOrExpression);
-    } else if (variableOrExpression is List) {
+    } else if (variableOrExpression is List<Object>) {
       List<VariableDeclaration> variables = <VariableDeclaration>[];
-      for (var v in variableOrExpression) {
+      for (Object v in variableOrExpression) {
         variables.addAll(buildVariableDeclarations(v));
       }
       return variables;
@@ -1900,7 +1918,7 @@
     Statement body = popStatement();
     List<Expression> updates = popListForEffect(updateExpressionCount);
     Statement conditionStatement = popStatement();
-    dynamic variableOrExpression = pop();
+    Object variableOrExpression = pop();
     List<VariableDeclaration> variables =
         buildVariableDeclarations(variableOrExpression);
     if (variables == null) {
@@ -1908,8 +1926,8 @@
           forKeyword.charOffset, uri);
     }
     exitLocalScope();
-    JumpTarget continueTarget = exitContinueTarget();
-    JumpTarget breakTarget = exitBreakTarget();
+    JumpTarget<Statement> continueTarget = exitContinueTarget();
+    JumpTarget<Statement> breakTarget = exitBreakTarget();
     if (continueTarget.hasUsers) {
       body = forest.syntheticLabeledStatement(body);
       continueTarget.resolveContinues(forest, body);
@@ -2006,7 +2024,7 @@
   void handleLiteralMap(
       int count, Token leftBrace, Token constKeyword, Token rightBrace) {
     debugEvent("LiteralMap");
-    List entries = forest.mapEntryList(count);
+    List<Object> entries = forest.mapEntryList(count);
     popList(count, entries);
     Object typeArguments = pop();
     DartType keyType;
@@ -2080,13 +2098,14 @@
     // TODO(ahe): The scope is wrong for return types of generic functions.
     debugEvent("Type");
     List<DartType> arguments = pop();
-    dynamic name = pop();
-    if (name is List) {
-      if (name.length != 2) {
-        unexpected("${name.length}", "2", beginToken.charOffset, uri);
+    Object name = pop();
+    if (name is List<Object>) {
+      List<Object> list = name;
+      if (list.length != 2) {
+        unexpected("${list.length}", "2", beginToken.charOffset, uri);
       }
-      var prefix = name[0];
-      Identifier suffix = name[1];
+      Object prefix = list[0];
+      Identifier suffix = list[1];
       if (prefix is PrefixBuilder) {
         name = scopeLookup(prefix.exportScope, suffix.name, beginToken,
             isQualified: true, prefix: prefix);
@@ -2102,7 +2121,7 @@
         return;
       }
     }
-    if (name is Generator) {
+    if (name is Generator<Expression, Statement, Arguments>) {
       push(name.buildTypeWithBuiltArguments(arguments));
     } else if (name is TypeBuilder) {
       push(name.build(library));
@@ -2122,7 +2141,7 @@
     debugEvent("beginFunctionType");
   }
 
-  void enterFunctionTypeScope(List typeVariables) {
+  void enterFunctionTypeScope(List<Object> typeVariables) {
     debugEvent("enterFunctionTypeScope");
     enterLocalScope(null,
         scope.createNestedScope("function-type scope", isModifiable: true));
@@ -2264,7 +2283,7 @@
     if (!inCatchClause &&
         functionNestingLevel == 0 &&
         memberKind != MemberKind.GeneralizedFunctionType) {
-      ProcedureBuilder member = this.member;
+      ProcedureBuilder<TypeBuilder> member = this.member;
       KernelFormalParameterBuilder formal = member.getFormal(name.name);
       if (formal == null) {
         internalProblem(
@@ -2277,7 +2296,8 @@
         variable.initializer = name.initializer;
       }
     } else {
-      variable = new ShadowVariableDeclaration(name?.name, functionNestingLevel,
+      variable = new VariableDeclarationJudgment(
+          name?.name, functionNestingLevel,
           type: type,
           initializer: name?.initializer,
           isFinal: isFinal,
@@ -2289,7 +2309,8 @@
     }
     if (annotations != null) {
       if (functionNestingLevel == 0) {
-        _typeInferrer.inferMetadata(this, toKernelExpressionList(annotations));
+        _typeInferrer.inferMetadata(
+            this, factory, toKernelExpressionList(annotations));
       }
       for (Expression annotation in annotations) {
         variable.addAnnotation(toKernelExpression(annotation));
@@ -2305,7 +2326,7 @@
     FormalParameterKind kind = optional("{", beginToken)
         ? FormalParameterKind.optionalNamed
         : FormalParameterKind.optionalPositional;
-    var variables =
+    Object variables =
         new List<VariableDeclaration>.filled(count, null, growable: true);
     popList(count, variables);
     push(new OptionalFormals(kind, variables));
@@ -2341,7 +2362,7 @@
   @override
   void endFormalParameterDefaultValueExpression() {
     debugEvent("FormalParameterDefaultValueExpression");
-    var defaultValueExpression = pop();
+    Object defaultValueExpression = pop();
     constantContext = pop();
     push(defaultValueExpression);
   }
@@ -2378,8 +2399,9 @@
     List<VariableDeclaration> variables =
         new List<VariableDeclaration>.filled(count, null, growable: true);
     popList(count, variables);
-    var formals = new FormalParameters<Expression, Statement, Arguments>(
-        variables, optional, beginToken.charOffset);
+    FormalParameters<Expression, Statement, Arguments> formals =
+        new FormalParameters<Expression, Statement, Arguments>(
+            variables, optional, beginToken.charOffset);
     constantContext = pop();
     push(formals);
     if ((inCatchClause || functionNestingLevel != 0) &&
@@ -2470,7 +2492,7 @@
       Token openSquareBracket, Token closeSquareBracket) {
     debugEvent("IndexedExpression");
     Expression index = popForValue();
-    var receiver = pop();
+    Object receiver = pop();
     if (receiver is ThisAccessGenerator && receiver.isSuper) {
       push(new SuperIndexedAccessGenerator<Expression, Statement, Arguments>(
           this,
@@ -2487,31 +2509,31 @@
   @override
   void handleUnaryPrefixExpression(Token token) {
     debugEvent("UnaryPrefixExpression");
-    var receiver = pop();
+    Object receiver = pop();
     if (optional("!", token)) {
       push(forest.notExpression(toValue(receiver), token));
     } else {
       String operator = token.stringValue;
+      Expression receiverValue;
       if (optional("-", token)) {
         operator = "unary-";
 
         if (receiver
             is LargeIntAccessGenerator<Expression, Statement, Arguments>) {
-          int value =
-              int.parse("-" + receiver.token.lexeme, onError: (_) => null);
+          int value = int.tryParse("-" + receiver.token.lexeme);
           if (value != null) {
-            push(forest.literalInt(value, token));
-            return;
+            receiverValue = forest.literalInt(value, token);
           }
         }
       }
       bool isSuper = false;
-      Expression receiverValue;
-      if (receiver is ThisAccessGenerator && receiver.isSuper) {
-        isSuper = true;
-        receiverValue = forest.thisExpression(receiver.token);
-      } else {
-        receiverValue = toValue(receiver);
+      if (receiverValue == null) {
+        if (receiver is ThisAccessGenerator && receiver.isSuper) {
+          isSuper = true;
+          receiverValue = forest.thisExpression(receiver.token);
+        } else {
+          receiverValue = toValue(receiver);
+        }
       }
       push(buildMethodInvocation(receiverValue, new Name(operator),
           forest.argumentsEmpty(noLocation), token.charOffset,
@@ -2531,8 +2553,8 @@
   @override
   void handleUnaryPrefixAssignmentExpression(Token token) {
     debugEvent("UnaryPrefixAssignmentExpression");
-    var generator = pop();
-    if (generator is Generator) {
+    Object generator = pop();
+    if (generator is Generator<Expression, Statement, Arguments>) {
       push(generator.buildPrefixIncrement(incrementOperator(token),
           offset: token.charOffset));
     } else {
@@ -2544,8 +2566,8 @@
   @override
   void handleUnaryPostfixAssignmentExpression(Token token) {
     debugEvent("UnaryPostfixAssignmentExpression");
-    var generator = pop();
-    if (generator is Generator) {
+    Object generator = pop();
+    if (generator is Generator<Expression, Statement, Arguments>) {
       push(new DelayedPostfixIncrement(
           this, token, generator, incrementOperator(token), null));
     } else {
@@ -2598,10 +2620,11 @@
     Identifier suffix = popIfNotNull(periodBeforeName);
     Identifier identifier;
     List<DartType> typeArguments = pop();
-    dynamic type = pop();
-    if (type is List) {
-      var prefix = type[0];
-      identifier = type[1];
+    Object type = pop();
+    if (type is List<Object>) {
+      List<Object> list = type;
+      Object prefix = list[0];
+      identifier = list[1];
       if (prefix is PrefixBuilder) {
         type = scopeLookup(
             prefix.exportScope, identifier.name, identifier.token,
@@ -2609,7 +2632,7 @@
         identifier = null;
       } else if (prefix is TypeUseGenerator<Expression, Statement, Arguments>) {
         type = prefix;
-      } else if (prefix is Generator) {
+      } else if (prefix is Generator<Expression, Statement, Arguments>) {
         String name = suffix == null
             ? "${prefix.plainNameForRead}.${identifier.name}"
             : "${prefix.plainNameForRead}.${identifier.name}.$suffix";
@@ -2711,7 +2734,7 @@
               forest.argumentsPositional(arguments).length)
           .withLocation(uri, offset, noLength);
     }
-    List named = forest.argumentsNamed(arguments);
+    List<Object> named = forest.argumentsNamed(arguments);
     if (named.isNotEmpty) {
       Set<String> names =
           new Set.from(function.namedParameters.map((a) => a.name));
@@ -2724,7 +2747,7 @@
       }
     }
 
-    List types = forest.argumentsTypeArguments(arguments);
+    List<Object> types = forest.argumentsTypeArguments(arguments);
     if (typeParameters.length != types.length) {
       // TODO(paulberry): Report error in this case as well,
       // after https://github.com/dart-lang/sdk/issues/32130 is fixed.
@@ -2754,7 +2777,7 @@
               forest.argumentsPositional(arguments).length)
           .withLocation(uri, offset, noLength);
     }
-    List named = forest.argumentsNamed(arguments);
+    List<Object> named = forest.argumentsNamed(arguments);
     if (named.isNotEmpty) {
       Set<String> names =
           new Set.from(function.namedParameters.map((a) => a.name));
@@ -2804,7 +2827,7 @@
   @override
   void endConstLiteral(Token token) {
     debugEvent("endConstLiteral");
-    var literal = pop();
+    Object literal = pop();
     constantContext = pop();
     push(literal);
   }
@@ -2822,7 +2845,7 @@
     String name = pop();
     List<DartType> typeArguments = pop();
 
-    var type = pop();
+    Object type = pop();
     PrefixBuilder deferredPrefix;
     int checkOffset;
     if (type is DeferredAccessGenerator<Expression, Statement, Arguments>) {
@@ -2835,6 +2858,7 @@
 
     if (type is TypeUseGenerator<Expression, Statement, Arguments>) {
       TypeUseGenerator<Expression, Statement, Arguments> generator = type;
+      _typeInferrer.storeTypeUse(generator);
       if (generator.prefix != null) {
         nameToken = nameToken.next.next;
       }
@@ -2842,7 +2866,7 @@
     }
 
     ConstantContext savedConstantContext = pop();
-    if (type is TypeDeclarationBuilder) {
+    if (type is TypeDeclarationBuilder<TypeBuilder, Object>) {
       Expression expression = buildConstructorInvocation(
           type, nameToken, arguments, name, typeArguments, offset, constness);
       push(deferredPrefix != null
@@ -2867,7 +2891,7 @@
 
   @override
   Expression buildConstructorInvocation(
-      TypeDeclarationBuilder type,
+      TypeDeclarationBuilder<TypeBuilder, Object> type,
       Token nameToken,
       Arguments arguments,
       String name,
@@ -2885,8 +2909,8 @@
     }
 
     String errorName;
-    if (type is ClassBuilder) {
-      if (type is EnumBuilder) {
+    if (type is ClassBuilder<TypeBuilder, Object>) {
+      if (type is EnumBuilder<TypeBuilder, Object>) {
         return deprecated_buildCompileTimeError(
             "An enum class can't be instantiated.", nameToken.charOffset);
       }
@@ -3006,7 +3030,7 @@
     debugEvent("NamedArgument");
     Expression value = popForValue();
     Identifier identifier = pop();
-    push(new NamedExpression(identifier.name, toKernelExpression(value))
+    push(new NamedExpressionJudgment(identifier.name, toKernelExpression(value))
       ..fileOffset = offsetForToken(identifier.token));
   }
 
@@ -3014,7 +3038,7 @@
   void endFunctionName(Token beginToken, Token token) {
     debugEvent("FunctionName");
     Identifier name = pop();
-    VariableDeclaration variable = new ShadowVariableDeclaration(
+    VariableDeclaration variable = new VariableDeclarationJudgment(
         name.name, functionNestingLevel,
         isFinal: true, isLocalFunction: true)
       ..fileOffset = offsetForToken(name.token);
@@ -3044,7 +3068,7 @@
     functionNestingLevel--;
     inCatchBlock = pop();
     switchScope = pop();
-    List typeVariables = pop();
+    List<Object> typeVariables = pop();
     exitLocalScope();
     push(typeVariables ?? NullValue.TypeVariables);
   }
@@ -3058,7 +3082,7 @@
   @override
   void beginNamedFunctionExpression(Token token) {
     debugEvent("beginNamedFunctionExpression");
-    List typeVariables = pop();
+    List<Object> typeVariables = pop();
     // Create an additional scope in which the named function expression is
     // declared.
     enterLocalScope("named function");
@@ -3077,9 +3101,9 @@
     AsyncMarker asyncModifier = pop();
     exitLocalScope();
     FormalParameters<Expression, Statement, Arguments> formals = pop();
-    var declaration = pop();
-    var returnType = pop();
-    var hasImplicitReturnType = returnType == null;
+    Object declaration = pop();
+    Object returnType = pop();
+    Object hasImplicitReturnType = returnType == null;
     returnType ??= const DynamicType();
     exitFunction();
     List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop());
@@ -3118,12 +3142,12 @@
           // This must have been a compile-time error.
           assert(isErroneousNode(toKernelExpression(oldInitializer)));
 
-          push(new Let(
+          push(new ShadowSyntheticExpression(new Let(
               new VariableDeclaration.forValue(
                   toKernelExpression(oldInitializer))
                 ..fileOffset = forest.readOffset(expression),
               toKernelExpression(expression))
-            ..fileOffset = forest.readOffset(expression));
+            ..fileOffset = forest.readOffset(expression)));
         } else {
           push(expression);
         }
@@ -3197,8 +3221,8 @@
     debugEvent("DoWhileStatement");
     Expression condition = popForValue();
     Statement body = popStatement();
-    JumpTarget continueTarget = exitContinueTarget();
-    JumpTarget breakTarget = exitBreakTarget();
+    JumpTarget<Statement> continueTarget = exitContinueTarget();
+    JumpTarget<Statement> breakTarget = exitBreakTarget();
     if (continueTarget.hasUsers) {
       body = forest.syntheticLabeledStatement(body);
       continueTarget.resolveContinues(forest, body);
@@ -3231,14 +3255,14 @@
     debugEvent("ForIn");
     Statement body = popStatement();
     Expression expression = popForValue();
-    var lvalue = pop();
+    Object lvalue = pop();
     exitLocalScope();
-    JumpTarget continueTarget = exitContinueTarget();
-    JumpTarget breakTarget = exitBreakTarget();
+    JumpTarget<Statement> continueTarget = exitContinueTarget();
+    JumpTarget<Statement> breakTarget = exitBreakTarget();
     kernel.Statement kernelBody = toKernelStatement(body);
     if (continueTarget.hasUsers) {
-      kernelBody = new ShadowLabeledStatement(kernelBody);
-      continueTarget.resolveContinues(forest, kernelBody);
+      kernelBody = new LabeledStatementJudgment(kernelBody);
+      continueTarget.resolveContinues(forest, toStatement(kernelBody));
     }
     VariableDeclaration variable;
     bool declaresVariable = false;
@@ -3250,7 +3274,7 @@
         deprecated_addCompileTimeError(
             variable.fileOffset, "A for-in loop-variable can't be 'const'.");
       }
-    } else if (lvalue is Generator) {
+    } else if (lvalue is Generator<Expression, Statement, Arguments>) {
       /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
       ///
       ///     for (lvalue in expression) body
@@ -3262,13 +3286,14 @@
       ///       body;
       ///     }
       variable =
-          new ShadowVariableDeclaration.forValue(null, functionNestingLevel);
-      var fact = typePromoter.getFactForAccess(variable, functionNestingLevel);
-      var scope = typePromoter.currentScope;
-      syntheticAssignment = lvalue.buildAssignment(
-          new ShadowVariableGet(variable, fact, scope)
-            ..fileOffset = inKeyword.offset,
-          voidContext: true);
+          new VariableDeclarationJudgment.forValue(null, functionNestingLevel);
+      TypePromotionFact fact =
+          typePromoter.getFactForAccess(variable, functionNestingLevel);
+      TypePromotionScope scope = typePromoter.currentScope;
+      syntheticAssignment = toKernelExpression(lvalue.buildAssignment(
+          toExpression(new VariableGetJudgment(variable, fact, scope)
+            ..fileOffset = inKeyword.offset),
+          voidContext: true));
       kernelBody = combineStatements(
           new ShadowLoopAssignmentStatement(syntheticAssignment), kernelBody);
     } else {
@@ -3290,8 +3315,8 @@
       ..fileOffset = awaitToken?.charOffset ?? forToken.charOffset
       ..bodyOffset = kernelBody.fileOffset;
     if (breakTarget.hasUsers) {
-      result = new ShadowLabeledStatement(result);
-      breakTarget.resolveBreaks(forest, result);
+      result = new LabeledStatementJudgment(result);
+      breakTarget.resolveBreaks(forest, toStatement(result));
     }
     exitLoopOrSwitch(toStatement(result));
   }
@@ -3310,7 +3335,7 @@
         new List<Object>.filled(labelCount, null, growable: true);
     popList(labelCount, labels);
     enterLocalScope(null, scope.createNestedLabelScope());
-    LabelTarget target = new LabelTarget<Statement>(
+    LabelTarget<Statement> target = new LabelTarget<Statement>(
         labels, member, functionNestingLevel, token.charOffset);
     for (Object label in labels) {
       scope.declareLabel(forest.getLabelName(label), target);
@@ -3322,7 +3347,7 @@
   void endLabeledStatement(int labelCount) {
     debugEvent("LabeledStatement");
     Statement statement = popStatement();
-    LabelTarget target = pop();
+    LabelTarget<Statement> target = pop();
     exitLocalScope();
     if (target.breakTarget.hasUsers) {
       if (statement is! LabeledStatement) {
@@ -3363,8 +3388,8 @@
     debugEvent("WhileStatement");
     Statement body = popStatement();
     Expression condition = popForValue();
-    JumpTarget continueTarget = exitContinueTarget();
-    JumpTarget breakTarget = exitBreakTarget();
+    JumpTarget<Statement> continueTarget = exitContinueTarget();
+    JumpTarget<Statement> breakTarget = exitBreakTarget();
     if (continueTarget.hasUsers) {
       body = forest.syntheticLabeledStatement(body);
       continueTarget.resolveContinues(forest, body);
@@ -3436,13 +3461,13 @@
   @override
   void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
     debugEvent("beginSwitchCase");
-    var count = labelCount + expressionCount;
+    Object count = labelCount + expressionCount;
     List<Object> labelsAndExpressions =
         popList(count, new List<Object>.filled(count, null, growable: true));
     List<Object> labels = <Object>[];
     List<Expression> expressions = <Expression>[];
     if (labelsAndExpressions != null) {
-      for (var labelOrExpression in labelsAndExpressions) {
+      for (Object labelOrExpression in labelsAndExpressions) {
         if (forest.isLabel(labelOrExpression)) {
           labels.add(labelOrExpression);
         } else {
@@ -3504,7 +3529,7 @@
     debugEvent("SwitchStatement");
 
     List<SwitchCase> cases = pop();
-    JumpTarget target = exitBreakTarget();
+    JumpTarget<Statement> target = exitBreakTarget();
     exitSwitchScope();
     exitLocalScope();
     Expression expression = popForValue();
@@ -3512,8 +3537,8 @@
         new ShadowSwitchStatement(toKernelExpression(expression), cases)
           ..fileOffset = switchKeyword.charOffset;
     if (target.hasUsers) {
-      result = new ShadowLabeledStatement(result);
-      target.resolveBreaks(forest, result);
+      result = new LabeledStatementJudgment(result);
+      target.resolveBreaks(forest, toStatement(result));
     }
     exitLoopOrSwitch(toStatement(result));
   }
@@ -3527,7 +3552,8 @@
       List<Object> labels = pop();
       SwitchCase current = cases[i] = pop();
       for (Object label in labels) {
-        JumpTarget target = switchScope.lookupLabel(forest.getLabelName(label));
+        JumpTarget<Statement> target =
+            switchScope.lookupLabel(forest.getLabelName(label));
         if (target != null) {
           target.resolveGotos(forest, current);
         }
@@ -3572,7 +3598,7 @@
   void handleBreakStatement(
       bool hasTarget, Token breakKeyword, Token endToken) {
     debugEvent("BreakStatement");
-    var target = breakTarget;
+    JumpTarget<Statement> target = breakTarget;
     Identifier identifier;
     String name;
     if (hasTarget) {
@@ -3585,7 +3611,7 @@
           deprecated_buildCompileTimeErrorStatement(
               "No target of break.", breakKeyword.charOffset));
     } else if (target == null ||
-        target is! JumpTarget ||
+        target is! JumpTarget<Statement> ||
         !target.isBreakTarget) {
       push(compileTimeErrorInLoopOrSwitch =
           deprecated_buildCompileTimeErrorStatement(
@@ -3607,20 +3633,21 @@
   void handleContinueStatement(
       bool hasTarget, Token continueKeyword, Token endToken) {
     debugEvent("ContinueStatement");
-    var target = continueTarget;
+    JumpTarget<Statement> target = continueTarget;
     Identifier identifier;
     String name;
     if (hasTarget) {
       identifier = pop();
       name = identifier.name;
-      target = scope.lookupLabel(identifier.name);
-      if (target != null && target is! JumpTarget) {
+      Declaration namedTarget = scope.lookupLabel(identifier.name);
+      if (namedTarget != null && namedTarget is! JumpTarget<Statement>) {
         push(compileTimeErrorInLoopOrSwitch =
             deprecated_buildCompileTimeErrorStatement(
                 "Target of continue must be a label.",
                 continueKeyword.charOffset));
         return;
       }
+      target = namedTarget;
       if (target == null) {
         if (switchScope == null) {
           push(deprecated_buildCompileTimeErrorStatement(
@@ -3632,10 +3659,9 @@
       }
       if (target.isGotoTarget &&
           target.functionNestingLevel == functionNestingLevel) {
-        ContinueSwitchStatement statement =
-            new ShadowContinueSwitchStatement(null)
-              ..fileOffset = continueKeyword.charOffset;
-        target.addGoto(statement);
+        ContinueSwitchStatement statement = new ContinueSwitchJudgment(null)
+          ..fileOffset = continueKeyword.charOffset;
+        target.addGoto(toStatement(statement));
         push(statement);
         return;
       }
@@ -3680,8 +3706,8 @@
     // TODO(dmitryas):  Move the resolution to the appropriate place once
     // [ClassMemberParser] is not used to build the type variables for the local
     // function.  See the comment above.
-    for (UnresolvedType t in library.types) {
-      t.resolveIn(scope);
+    for (UnresolvedType<TypeBuilder> t in library.types) {
+      t.resolveIn(scope, library);
     }
     library.types.clear();
   }
@@ -3708,6 +3734,7 @@
     KernelTypeVariableBuilder variable;
     Object inScope = scopeLookup(scope, name.name, token);
     if (inScope is TypeUseGenerator<Expression, Statement, Arguments>) {
+      _typeInferrer.storeTypeUse(inScope);
       variable = inScope.declaration;
     } else {
       // Something went wrong when pre-parsing the type variables.
@@ -3717,7 +3744,8 @@
     }
     variable.parameter.bound = bound;
     if (annotations != null) {
-      _typeInferrer.inferMetadata(this, toKernelExpressionList(annotations));
+      _typeInferrer.inferMetadata(
+          this, factory, toKernelExpressionList(annotations));
       for (Expression annotation in annotations) {
         variable.parameter.addAnnotation(toKernelExpression(annotation));
       }
@@ -3741,8 +3769,8 @@
             library.loader.target.objectClassBuilder);
         for (int i = 0; i < typeVariables.length; ++i) {
           typeVariables[i].defaultType = calculatedBounds[i];
-          typeVariables[i].defaultType.resolveIn(
-              scope, typeVariables[i].charOffset, typeVariables[i].fileUri);
+          typeVariables[i].defaultType.resolveIn(scope,
+              typeVariables[i].charOffset, typeVariables[i].fileUri, library);
           typeVariables[i].finish(
               library,
               library.loader.target.objectClassBuilder,
@@ -3761,7 +3789,8 @@
     push(typeVariables ?? NullValue.TypeVariables);
   }
 
-  List<TypeParameter> typeVariableBuildersToKernel(List typeVariableBuilders) {
+  List<TypeParameter> typeVariableBuildersToKernel(
+      List<Object> typeVariableBuilders) {
     if (typeVariableBuilders == null) return null;
     List<TypeParameter> typeParameters = new List<TypeParameter>.filled(
         typeVariableBuilders.length, null,
@@ -3832,7 +3861,7 @@
       {List<LocatedMessage> context}) {
     // TODO(askesc): Produce explicit error expression wrapping the original.
     // See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
-    return toExpression(new Let(
+    return toExpression(new ShadowSyntheticExpression(new Let(
         new VariableDeclaration.forValue(toKernelExpression(
             buildCompileTimeError(
                 message.messageObject, message.charOffset, message.length,
@@ -3844,7 +3873,7 @@
             toKernelExpression(storeOffset(
                 forest.literalNull(null), forest.readOffset(expression))))
           ..fileOffset = forest.readOffset(expression))
-      ..fileOffset = forest.readOffset(expression));
+      ..fileOffset = forest.readOffset(expression)));
   }
 
   Expression buildFallThroughError(int charOffset) {
@@ -4143,7 +4172,7 @@
       }
 
       receiver = toExpression(
-          new ShadowSuperPropertyGet(name, target)..fileOffset = offset);
+          new SuperPropertyGetJudgment(name, target)..fileOffset = offset);
       return toExpression(new ShadowMethodInvocation(
           toKernelExpression(receiver),
           callName,
@@ -4210,13 +4239,14 @@
 
   @override
   StaticGet makeStaticGet(Member readTarget, Token token) {
-    return new ShadowStaticGet(readTarget)..fileOffset = offsetForToken(token);
+    return new StaticGetJudgment(readTarget)
+      ..fileOffset = offsetForToken(token);
   }
 
   @override
   Expression wrapInDeferredCheck(
       Expression expression, KernelPrefixBuilder prefix, int charOffset) {
-    var check = new VariableDeclaration.forValue(
+    Object check = new VariableDeclaration.forValue(
         toKernelExpression(forest.checkLibraryIsLoaded(prefix.dependency)))
       ..fileOffset = charOffset;
     return toExpression(
@@ -4226,33 +4256,33 @@
   // TODO(ahe): Remove this method once Forest API is complete.
   @override
   T storeOffset<T>(T object, int offset) {
-    TreeNode node = object as dynamic;
+    TreeNode node = unchecked(object);
     node.fileOffset = offset;
     return object;
   }
 
   // TODO(ahe): Remove this method once Forest API is complete.
   kernel.Expression toKernelExpression(Expression expression) {
-    return expression as dynamic;
+    return unchecked(expression);
   }
 
   // TODO(ahe): Remove this method once Forest API is complete.
   Expression toExpression(kernel.Expression expression) {
-    return expression as dynamic;
+    return unchecked(expression);
   }
 
   List<kernel.Expression> toKernelExpressionList(List<Expression> expressions) {
-    return expressions as dynamic;
+    return unchecked(expressions);
   }
 
   // TODO(ahe): Remove this method once Forest API is complete.
   kernel.Statement toKernelStatement(Statement statement) {
-    return statement as dynamic;
+    return unchecked(statement);
   }
 
   // TODO(ahe): Remove this method once Forest API is complete.
   Statement toStatement(kernel.Statement statement) {
-    return statement as dynamic;
+    return unchecked(statement);
   }
 
   /// TODO(ahe): This method is temporarily implemented by subclasses. Once type
@@ -4338,7 +4368,7 @@
   }
 
   void resolveBreaks(
-      Forest<dynamic, Statement, dynamic, dynamic> forest, Statement target) {
+      Forest<Object, Statement, Object, Object> forest, Statement target) {
     assert(isBreakTarget);
     for (Statement user in users) {
       forest.resolveBreak(target, user);
@@ -4347,7 +4377,7 @@
   }
 
   void resolveContinues(
-      Forest<dynamic, Statement, dynamic, dynamic> forest, Statement target) {
+      Forest<Object, Statement, Object, Object> forest, Statement target) {
     assert(isContinueTarget);
     for (Statement user in users) {
       forest.resolveContinue(target, user);
@@ -4356,7 +4386,7 @@
   }
 
   void resolveGotos(
-      Forest<dynamic, Statement, dynamic, dynamic> forest, Object target) {
+      Forest<Object, Statement, Object, Object> forest, Object target) {
     assert(isGotoTarget);
     for (Statement user in users) {
       forest.resolveContinueInSwitch(target, user);
@@ -4375,9 +4405,9 @@
   @override
   final MemberBuilder parent;
 
-  final JumpTarget breakTarget;
+  final JumpTarget<Statement> breakTarget;
 
-  final JumpTarget continueTarget;
+  final JumpTarget<Statement> continueTarget;
 
   final int functionNestingLevel;
 
@@ -4419,17 +4449,17 @@
   }
 
   void resolveBreaks(
-      Forest<dynamic, Statement, dynamic, dynamic> forest, Statement target) {
+      Forest<Object, Statement, Object, Object> forest, Statement target) {
     breakTarget.resolveBreaks(forest, target);
   }
 
   void resolveContinues(
-      Forest<dynamic, Statement, dynamic, dynamic> forest, Statement target) {
+      Forest<Object, Statement, Object, Object> forest, Statement target) {
     continueTarget.resolveContinues(forest, target);
   }
 
   void resolveGotos(
-      Forest<dynamic, Statement, dynamic, dynamic> forest, Object target) {
+      Forest<Object, Statement, Object, Object> forest, Object target) {
     unsupported("resolveGotos", charOffset, fileUri);
   }
 
@@ -4497,7 +4527,7 @@
   }
 
   Scope computeFormalParameterScope(Scope parent, Declaration declaration,
-      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper) {
+      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper) {
     if (required.length == 0 && optional == null) return parent;
     Map<String, Declaration> local = <String, Declaration>{};
 
@@ -4553,7 +4583,7 @@
     return node.fullNameForErrors;
   } else if (node is ThisAccessGenerator) {
     return node.isSuper ? "super" : "this";
-  } else if (node is Generator) {
+  } else if (node is Generator<Object, Object, Object>) {
     return node.plainNameForRead;
   } else {
     return unhandled("${node.runtimeType}", "getNodeName", -1, null);
@@ -4580,3 +4610,6 @@
         asyncToken.charOffset, null);
   }
 }
+
+// TODO(ahe): Remove this method when all AST nodes have moved to [Forest].
+dynamic unchecked(Object o) => o;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index a7228a9..24aedf5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -15,6 +15,7 @@
         messageInvalidInitializer,
         templateDeferredTypeAnnotation,
         templateIntegerLiteralIsOutOfRange,
+        templateMissingExplicitTypeArguments,
         templateNotAType,
         templateUnresolvedPrefixInTypeAnnotation;
 
@@ -602,6 +603,10 @@
 
   TypeDeclarationBuilder get declaration;
 
+  /// The offset at which the [declaration] is referenced by this generator,
+  /// or `-1` if the reference is implicit.
+  int get declarationReferenceOffset;
+
   @override
   String get debugName => "TypeUseGenerator";
 
@@ -632,6 +637,12 @@
         // as a recovery node once the IR can represent it (Issue #29840).
         arguments = null;
       }
+    } else if (declaration.typeVariablesCount != 0) {
+      helper.addProblem(
+          templateMissingExplicitTypeArguments
+              .withArguments(declaration.typeVariablesCount),
+          offsetForToken(token),
+          lengthForToken(token));
     }
 
     DartType type;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 5351b10..3589b1c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -22,7 +22,7 @@
 
 import 'forest.dart' show Forest;
 
-import 'kernel_builder.dart' show PrefixBuilder;
+import 'kernel_builder.dart' show KernelTypeBuilder, PrefixBuilder;
 
 import 'kernel_ast_api.dart'
     show
@@ -130,7 +130,7 @@
       Member interfaceTarget});
 
   Expression buildConstructorInvocation(
-      TypeDeclarationBuilder type,
+      TypeDeclarationBuilder<KernelTypeBuilder, DartType> type,
       Token nameToken,
       Arguments arguments,
       String name,
diff --git a/pkg/front_end/lib/src/fasta/kernel/factory.dart b/pkg/front_end/lib/src/fasta/kernel/factory.dart
new file mode 100644
index 0000000..0300a2a
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/factory.dart
@@ -0,0 +1,345 @@
+// 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:front_end/src/scanner/token.dart' show Token;
+
+import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
+
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+import 'kernel_shadow_ast.dart'
+    show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+
+/// Abstract base class for factories that can construct trees of expressions,
+/// statements, initializers, and literal types based on tokens, inferred types,
+/// and invocation targets.
+abstract class Factory<Expression, Statement, Initializer, Type> {
+  Expression asExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression expression,
+      Token asOperator,
+      Type literalType,
+      DartType inferredType);
+
+  Initializer assertInitializer(
+      InitializerJudgment judgment,
+      int fileOffset,
+      Token assertKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token comma,
+      Expression message,
+      Token rightParenthesis);
+
+  Statement assertStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token assertKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token comma,
+      Expression message,
+      Token rightParenthesis,
+      Token semicolon);
+
+  Expression awaitExpression(ExpressionJudgment judgment, int fileOffset,
+      Token awaitKeyword, Expression expression, DartType inferredType);
+
+  Statement block(StatementJudgment judgment, int fileOffset, Token leftBracket,
+      List<Statement> statements, Token rightBracket);
+
+  Expression boolLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, bool value, DartType inferredType);
+
+  Statement breakStatement(StatementJudgment judgment, int fileOffset,
+      Token breakKeyword, Expression label, Token semicolon);
+
+  Expression cascadeExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Object catchStatement(
+      Catch judgment,
+      int fileOffset,
+      Token onKeyword,
+      Type type,
+      Token catchKeyword,
+      Token leftParenthesis,
+      Token exceptionParameter,
+      Token comma,
+      Token stackTraceParameter,
+      Token rightParenthesis,
+      Statement body,
+      DartType guardType,
+      int exceptionOffset,
+      DartType exceptionType,
+      int stackTraceOffset,
+      DartType stackTraceType);
+
+  Expression conditionalExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression condition,
+      Token question,
+      Expression thenExpression,
+      Token colon,
+      Expression elseExpression,
+      DartType inferredType);
+
+  Expression constructorInvocation(ExpressionJudgment judgment, int fileOffset,
+      Node expressionTarget, DartType inferredType);
+
+  Statement continueStatement(StatementJudgment judgment, int fileOffset,
+      Token continueKeyword, Expression label, Token semicolon);
+
+  Statement continueSwitchStatement(StatementJudgment judgment, int fileOffset,
+      Token continueKeyword, Expression label, Token semicolon);
+
+  Expression deferredCheck(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Statement doStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token doKeyword,
+      Statement body,
+      Token whileKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token rightParenthesis,
+      Token semicolon);
+
+  Expression doubleLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, double value, DartType inferredType);
+
+  Statement expressionStatement(StatementJudgment judgment, int fileOffset,
+      Expression expression, Token semicolon);
+
+  Initializer fieldInitializer(
+      InitializerJudgment judgment, int fileOffset, Node initializerField);
+
+  Statement forInStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      int variableOffset,
+      DartType variableType,
+      int writeOffset,
+      DartType writeVariableType,
+      int writeVariableDeclarationOffset,
+      Node writeTarget);
+
+  Statement forStatement(StatementJudgment judgment, int fileOffset);
+
+  Statement functionDeclaration(
+      StatementJudgment judgment, int fileOffset, FunctionType inferredType);
+
+  Expression functionExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Expression ifNull(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression leftOperand,
+      Token operator,
+      Expression rightOperand,
+      DartType inferredType);
+
+  Statement ifStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token ifKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token rightParenthesis,
+      Statement thenStatement,
+      Token elseKeyword,
+      Statement elseStatement);
+
+  Expression indexAssign(ExpressionJudgment judgment, int fileOffset,
+      Node writeMember, Node combiner, DartType inferredType);
+
+  Expression intLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, num value, DartType inferredType);
+
+  Initializer invalidInitializer(InitializerJudgment judgment, int fileOffset);
+
+  Expression isExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression expression,
+      Token isOperator,
+      Type literalType,
+      DartType testedType,
+      DartType inferredType);
+
+  Expression isNotExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression expression,
+      Token isOperator,
+      Token notOperator,
+      Type literalType,
+      DartType testedType,
+      DartType inferredType);
+
+  Statement labeledStatement(StatementJudgment judgment, int fileOffset);
+
+  Expression listLiteral(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Expression logicalExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression leftOperand,
+      Token operator,
+      Expression rightOperand,
+      DartType inferredType);
+
+  Expression mapLiteral(
+      ExpressionJudgment judgment, int fileOffset, DartType typeContext);
+
+  Expression methodInvocation(
+      ExpressionJudgment judgment,
+      int resultOffset,
+      List<DartType> argumentsTypes,
+      bool isImplicitCall,
+      Node interfaceMember,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType);
+
+  Expression methodInvocationCall(
+      ExpressionJudgment judgment,
+      int resultOffset,
+      List<DartType> argumentsTypes,
+      bool isImplicitCall,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType);
+
+  Expression namedFunctionExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Expression not(ExpressionJudgment judgment, int fileOffset, Token operator,
+      Expression operand, DartType inferredType);
+
+  Expression nullLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, bool isSynthetic, DartType inferredType);
+
+  Expression propertyAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node writeMember,
+      DartType writeContext,
+      Node combiner,
+      DartType inferredType);
+
+  Expression propertyGet(ExpressionJudgment judgment, int fileOffset,
+      Node member, DartType inferredType);
+
+  Expression propertyGetCall(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Expression propertySet(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Initializer redirectingInitializer(
+      InitializerJudgment judgment, int fileOffset, Node initializerTarget);
+
+  Expression rethrow_(ExpressionJudgment judgment, int fileOffset,
+      Token rethrowKeyword, DartType inferredType);
+
+  Statement returnStatement(StatementJudgment judgment, int fileOffset,
+      Token returnKeyword, Expression expression, Token semicolon);
+
+  Expression staticAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node writeMember,
+      DartType writeContext,
+      Node combiner,
+      DartType inferredType);
+
+  Expression staticGet(ExpressionJudgment judgment, int fileOffset,
+      Node expressionTarget, DartType inferredType);
+
+  Expression staticInvocation(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node expressionTarget,
+      List<DartType> expressionArgumentsTypes,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType);
+
+  Expression stringConcatenation(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Expression stringLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, String value, DartType inferredType);
+
+  Initializer superInitializer(InitializerJudgment judgment, int fileOffset);
+
+  Statement switchStatement(StatementJudgment judgment, int fileOffset);
+
+  Expression symbolLiteral(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token poundSign,
+      List<Token> components,
+      String value,
+      DartType inferredType);
+
+  Expression thisExpression(ExpressionJudgment judgment, int fileOffset,
+      Token thisKeyword, DartType inferredType);
+
+  Expression throw_(ExpressionJudgment judgment, int fileOffset,
+      Token throwKeyword, Expression expression, DartType inferredType);
+
+  Statement tryCatch(StatementJudgment judgment, int fileOffset);
+
+  Statement tryFinally(StatementJudgment judgment, int fileOffset);
+
+  Expression typeLiteral(ExpressionJudgment judgment, int fileOffset,
+      Node expressionType, DartType inferredType);
+
+  Expression variableAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      DartType writeContext,
+      int writeVariableDeclarationOffset,
+      Node combiner,
+      DartType inferredType);
+
+  Statement variableDeclaration(StatementJudgment judgment, int fileOffset,
+      DartType statementType, DartType inferredType);
+
+  Expression variableGet(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      bool isInCascade,
+      int expressionVariableDeclarationOffset,
+      DartType inferredType);
+
+  Expression variableSet(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+
+  Statement whileStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token whileKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token rightParenthesis,
+      Statement body);
+
+  Statement yieldStatement(StatementJudgment judgment, int fileOffset,
+      Token yieldKeyword, Token star, Expression expression, Token semicolon);
+
+  /// TODO(paulberry): this isn't really shaped properly for a factory class.
+  void storePrefixInfo(int fileOffset, int prefixImportIndex);
+
+  /// TODO(paulberry): this isn't really shaped properly for a factory class.
+  void storeClassReference(int fileOffset, Node reference, DartType rawType);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 1700191..ee066cd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -66,44 +66,46 @@
 
 import 'kernel_shadow_ast.dart'
     show
-        ShadowArguments,
-        ShadowAsExpression,
-        ShadowAssertInitializer,
-        ShadowAssertStatement,
-        ShadowAwaitExpression,
-        ShadowBlock,
-        ShadowBoolLiteral,
-        ShadowBreakStatement,
-        ShadowCheckLibraryIsLoaded,
-        ShadowConditionalExpression,
-        ShadowDoStatement,
-        ShadowDoubleLiteral,
+        ArgumentsJudgment,
+        AsJudgment,
+        AssertInitializerJudgment,
+        AssertStatementJudgment,
+        AwaitJudgment,
+        BlockJudgment,
+        BoolJudgment,
+        BreakJudgment,
+        CheckLibraryIsLoadedJudgment,
+        ConditionalJudgment,
+        ContinueJudgment,
+        DoJudgment,
+        DoubleJudgment,
+        EmptyStatementJudgment,
+        IntJudgment,
+        IsJudgment,
+        IsNotJudgment,
+        LabeledStatementJudgment,
+        LoadLibraryJudgment,
+        NullJudgment,
         ShadowExpressionStatement,
         ShadowForStatement,
-        ShadowIfStatement,
-        ShadowIntLiteral,
-        ShadowIsExpression,
-        ShadowIsNotExpression,
-        ShadowLabeledStatement,
+        IfJudgment,
         ShadowListLiteral,
-        ShadowLoadLibrary,
         ShadowLogicalExpression,
         ShadowMapLiteral,
         ShadowNot,
-        ShadowNullLiteral,
         ShadowRethrow,
-        ShadowReturnStatement,
+        ReturnJudgment,
         ShadowStringConcatenation,
         ShadowStringLiteral,
         ShadowSymbolLiteral,
         ShadowSyntheticExpression,
-        ShadowThisExpression,
-        ShadowThrow,
         ShadowTryCatch,
         ShadowTryFinally,
-        ShadowTypeLiteral,
         ShadowWhileStatement,
-        ShadowYieldStatement;
+        YieldJudgment,
+        ThisJudgment,
+        ThrowJudgment,
+        TypeLiteralJudgment;
 
 import 'forest.dart'
     show
@@ -120,14 +122,14 @@
   const Fangorn();
 
   @override
-  ShadowArguments arguments(List<Expression> positional, Token token,
+  ArgumentsJudgment arguments(List<Expression> positional, Token token,
       {List<DartType> types, List<NamedExpression> named}) {
-    return new ShadowArguments(positional, types: types, named: named)
+    return new ArgumentsJudgment(positional, types: types, named: named)
       ..fileOffset = offsetForToken(token);
   }
 
   @override
-  ShadowArguments argumentsEmpty(Token token) {
+  ArgumentsJudgment argumentsEmpty(Token token) {
     return arguments(<Expression>[], token);
   }
 
@@ -148,25 +150,25 @@
 
   @override
   void argumentsSetTypeArguments(Arguments arguments, List<DartType> types) {
-    ShadowArguments.setNonInferrableArgumentTypes(arguments, types);
+    ArgumentsJudgment.setNonInferrableArgumentTypes(arguments, types);
   }
 
   @override
   ShadowStringLiteral asLiteralString(Expression value) => value;
 
   @override
-  ShadowBoolLiteral literalBool(bool value, Token token) {
-    return new ShadowBoolLiteral(value)..fileOffset = offsetForToken(token);
+  BoolJudgment literalBool(bool value, Token token) {
+    return new BoolJudgment(value)..fileOffset = offsetForToken(token);
   }
 
   @override
-  ShadowDoubleLiteral literalDouble(double value, Token token) {
-    return new ShadowDoubleLiteral(value)..fileOffset = offsetForToken(token);
+  DoubleJudgment literalDouble(double value, Token token) {
+    return new DoubleJudgment(value)..fileOffset = offsetForToken(token);
   }
 
   @override
-  ShadowIntLiteral literalInt(int value, Token token) {
-    return new ShadowIntLiteral(value)..fileOffset = offsetForToken(token);
+  IntJudgment literalInt(int value, Token token) {
+    return new IntJudgment(value)..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -203,8 +205,8 @@
   }
 
   @override
-  ShadowNullLiteral literalNull(Token token) {
-    return new ShadowNullLiteral()..fileOffset = offsetForToken(token);
+  NullJudgment literalNull(Token token) {
+    return new NullJudgment()..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -223,8 +225,8 @@
   }
 
   @override
-  ShadowTypeLiteral literalType(DartType type, Token token) {
-    return new ShadowTypeLiteral(type)..fileOffset = offsetForToken(token);
+  TypeLiteralJudgment literalType(DartType type, Token token) {
+    return new TypeLiteralJudgment(type)..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -248,18 +250,17 @@
 
   @override
   Expression loadLibrary(LibraryDependency dependency) {
-    return new ShadowLoadLibrary(dependency);
+    return new LoadLibraryJudgment(dependency);
   }
 
   @override
   Expression checkLibraryIsLoaded(LibraryDependency dependency) {
-    return new ShadowCheckLibraryIsLoaded(dependency);
+    return new CheckLibraryIsLoadedJudgment(dependency);
   }
 
   @override
   Expression asExpression(Expression expression, covariant type, Token token) {
-    return new ShadowAsExpression(expression, type)
-      ..fileOffset = offsetForToken(token);
+    return new AsJudgment(expression, type)..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -269,7 +270,7 @@
       Expression condition,
       Token comma,
       Expression message) {
-    return new ShadowAssertInitializer(assertStatement(
+    return new AssertInitializerJudgment(assertStatement(
         assertKeyword, leftParenthesis, condition, comma, message, null));
   }
 
@@ -309,7 +310,7 @@
         endOffset = conditionLastToken.offset + conditionLastToken.length;
       }
     }
-    return new ShadowAssertStatement(condition,
+    return new AssertStatementJudgment(condition,
         conditionStartOffset: startOffset,
         conditionEndOffset: endOffset,
         message: message);
@@ -317,8 +318,7 @@
 
   @override
   Expression awaitExpression(Expression operand, Token token) {
-    return new ShadowAwaitExpression(operand)
-      ..fileOffset = offsetForToken(token);
+    return new AwaitJudgment(operand)..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -334,13 +334,13 @@
         copy.add(statement);
       }
     }
-    return new ShadowBlock(copy ?? statements)
+    return new BlockJudgment(copy ?? statements)
       ..fileOffset = offsetForToken(openBrace);
   }
 
   @override
   Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
-    return new ShadowBreakStatement(null)..fileOffset = breakKeyword.charOffset;
+    return new BreakJudgment(null)..fileOffset = breakKeyword.charOffset;
   }
 
   @override
@@ -361,23 +361,20 @@
   @override
   Expression conditionalExpression(Expression condition, Token question,
       Expression thenExpression, Token colon, Expression elseExpression) {
-    return new ShadowConditionalExpression(
-        condition, thenExpression, elseExpression)
+    return new ConditionalJudgment(condition, thenExpression, elseExpression)
       ..fileOffset = offsetForToken(question);
   }
 
   @override
   Statement continueStatement(
       Token continueKeyword, Object label, Token semicolon) {
-    return new ShadowBreakStatement(null)
-      ..fileOffset = continueKeyword.charOffset;
+    return new ContinueJudgment(null)..fileOffset = continueKeyword.charOffset;
   }
 
   @override
   Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
       Expression condition, Token semicolon) {
-    return new ShadowDoStatement(body, condition)
-      ..fileOffset = doKeyword.charOffset;
+    return new DoJudgment(body, condition)..fileOffset = doKeyword.charOffset;
   }
 
   Statement expressionStatement(Expression expression, Token semicolon) {
@@ -386,7 +383,7 @@
 
   @override
   Statement emptyStatement(Token semicolon) {
-    return new EmptyStatement();
+    return new EmptyStatementJudgment();
   }
 
   @override
@@ -408,7 +405,7 @@
   @override
   Statement ifStatement(Token ifKeyword, Expression condition,
       Statement thenStatement, Token elseKeyword, Statement elseStatement) {
-    return new ShadowIfStatement(condition, thenStatement, elseStatement)
+    return new IfJudgment(condition, thenStatement, elseStatement)
       ..fileOffset = ifKeyword.charOffset;
   }
 
@@ -417,9 +414,9 @@
       Expression operand, isOperator, Token notOperator, covariant type) {
     int offset = offsetForToken(isOperator);
     if (notOperator != null) {
-      return new ShadowIsNotExpression(operand, type, offset);
+      return new IsNotJudgment(operand, type, offset);
     }
-    return new ShadowIsExpression(operand, type)..fileOffset = offset;
+    return new IsJudgment(operand, type)..fileOffset = offset;
   }
 
   @override
@@ -460,7 +457,7 @@
   @override
   Statement returnStatement(
       Token returnKeyword, Expression expression, Token semicolon) {
-    return new ShadowReturnStatement(expression)
+    return new ReturnJudgment(expression)
       ..fileOffset = returnKeyword.charOffset;
   }
 
@@ -473,17 +470,17 @@
 
   @override
   Statement syntheticLabeledStatement(Statement statement) {
-    return new ShadowLabeledStatement(statement);
+    return new LabeledStatementJudgment(statement);
   }
 
   @override
   Expression thisExpression(Token token) {
-    return new ShadowThisExpression()..fileOffset = offsetForToken(token);
+    return new ThisJudgment()..fileOffset = offsetForToken(token);
   }
 
   @override
   Expression throwExpression(Token throwKeyword, Expression expression) {
-    return new ShadowThrow(expression)
+    return new ThrowJudgment(expression)
       ..fileOffset = offsetForToken(throwKeyword);
   }
 
@@ -515,10 +512,10 @@
   @override
   Statement wrapVariables(Statement statement) {
     if (statement is _VariablesDeclaration) {
-      return new ShadowBlock(statement.declarations)
+      return new BlockJudgment(statement.declarations)
         ..fileOffset = statement.fileOffset;
     } else if (statement is VariableDeclaration) {
-      return new ShadowBlock(<Statement>[statement])
+      return new BlockJudgment(<Statement>[statement])
         ..fileOffset = statement.fileOffset;
     } else {
       return statement;
@@ -535,7 +532,7 @@
   @override
   Statement yieldStatement(
       Token yieldKeyword, Token star, Expression expression, Token semicolon) {
-    return new ShadowYieldStatement(expression, isYieldStar: star != null)
+    return new YieldJudgment(expression, isYieldStar: star != null)
       ..fileOffset = yieldKeyword.charOffset;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index 33906b3..c331eb7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -64,13 +64,13 @@
 
 export 'kernel_shadow_ast.dart'
     show
-        ShadowAssertInitializer,
-        ShadowAssertStatement,
-        ShadowBreakStatement,
+        AssertInitializerJudgment,
+        AssertStatementJudgment,
+        BreakJudgment,
         ShadowCascadeExpression,
         ShadowComplexAssignment,
         ShadowConstructorInvocation,
-        ShadowContinueSwitchStatement,
+        ContinueSwitchJudgment,
         ShadowDeferredCheck,
         ShadowExpressionStatement,
         ShadowFactoryConstructorInvocation,
@@ -79,30 +79,31 @@
         ShadowFunctionDeclaration,
         ShadowFunctionExpression,
         ShadowIfNullExpression,
-        ShadowIfStatement,
+        IfJudgment,
         ShadowIllegalAssignment,
         ShadowIndexAssign,
         ShadowInvalidInitializer,
-        ShadowLabeledStatement,
+        LabeledStatementJudgment,
         ShadowLogicalExpression,
         ShadowLoopAssignmentStatement,
         ShadowMethodInvocation,
         ShadowNamedFunctionExpression,
         ShadowNullAwareMethodInvocation,
-        ShadowNullAwarePropertyGet,
+        NullAwarePropertyGetJudgment,
         ShadowPropertyAssign,
-        ShadowPropertyGet,
+        PropertyGetJudgment,
         ShadowRedirectingInitializer,
-        ShadowReturnStatement,
+        ReturnJudgment,
         ShadowStaticAssignment,
-        ShadowStaticGet,
+        StaticGetJudgment,
         ShadowStaticInvocation,
         ShadowSuperInitializer,
         ShadowSuperMethodInvocation,
-        ShadowSuperPropertyGet,
+        SuperPropertyGetJudgment,
         ShadowSwitchStatement,
         ShadowSyntheticExpression,
-        ShadowVariableAssignment,
-        ShadowVariableDeclaration,
-        ShadowVariableGet,
-        ShadowYieldStatement;
+        VariableAssignmentJudgment,
+        VariableDeclarationJudgment,
+        VariableGetJudgment,
+        YieldJudgment,
+        NamedExpressionJudgment;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 1cb2acc..930a322 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -385,13 +385,10 @@
     }
   }
 
-  // TODO(dmitryas): Find a better place for this routine.
-  static bool hasUserDefinedNoSuchMethod(
-      Class klass, ClassHierarchy hierarchy) {
+  bool hasUserDefinedNoSuchMethod(
+      Class klass, ClassHierarchy hierarchy, Class objectClass) {
     Member noSuchMethod = hierarchy.getDispatchTarget(klass, noSuchMethodName);
-    // `Object` doesn't have a superclass reference.
-    return noSuchMethod != null &&
-        noSuchMethod.enclosingClass.superclass != null;
+    return noSuchMethod != null && noSuchMethod.enclosingClass != objectClass;
   }
 
   void transformProcedureToNoSuchMethodForwarder(
@@ -435,59 +432,52 @@
     cloned.parent = cls;
   }
 
-  void addNoSuchMethodForwarders(
+  /// Adds noSuchMethod forwarding stubs to this class. Returns `true` if the
+  /// class was modified.
+  bool addNoSuchMethodForwarders(
       KernelTarget target, ClassHierarchy hierarchy) {
-    if (!hasUserDefinedNoSuchMethod(cls, hierarchy)) {
-      return;
+    if (cls.isAbstract ||
+        !hasUserDefinedNoSuchMethod(cls, hierarchy, target.objectClass)) {
+      return false;
     }
 
     Set<Name> existingForwardersNames = new Set<Name>();
     Set<Name> existingSetterForwardersNames = new Set<Name>();
-    if (cls.superclass != null &&
-        hasUserDefinedNoSuchMethod(cls.superclass, hierarchy)) {
-      List<Member> concrete = hierarchy.getDispatchTargets(cls.superclass);
-      for (Member member in hierarchy.getInterfaceMembers(cls.superclass)) {
+    Class leastConcreteSuperclass = cls.superclass;
+    while (
+        leastConcreteSuperclass != null && leastConcreteSuperclass.isAbstract) {
+      leastConcreteSuperclass = leastConcreteSuperclass.superclass;
+    }
+    if (leastConcreteSuperclass != null &&
+        hasUserDefinedNoSuchMethod(
+            leastConcreteSuperclass, hierarchy, target.objectClass)) {
+      List<Member> concrete =
+          hierarchy.getDispatchTargets(leastConcreteSuperclass);
+      for (Member member
+          in hierarchy.getInterfaceMembers(leastConcreteSuperclass)) {
         if (ClassHierarchy.findMemberByName(concrete, member.name) == null) {
           existingForwardersNames.add(member.name);
         }
       }
 
       List<Member> concreteSetters =
-          hierarchy.getDispatchTargets(cls.superclass, setters: true);
-      for (Member member
-          in hierarchy.getInterfaceMembers(cls.superclass, setters: true)) {
+          hierarchy.getDispatchTargets(leastConcreteSuperclass, setters: true);
+      for (Member member in hierarchy
+          .getInterfaceMembers(leastConcreteSuperclass, setters: true)) {
         if (ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
             null) {
           existingSetterForwardersNames.add(member.name);
         }
       }
     }
-    if (cls.mixedInClass != null &&
-        hasUserDefinedNoSuchMethod(cls.mixedInClass, hierarchy)) {
-      List<Member> concrete = hierarchy.getDispatchTargets(cls.mixedInClass);
-      for (Member member in hierarchy.getInterfaceMembers(cls.mixedInClass)) {
-        if (ClassHierarchy.findMemberByName(concrete, member.name) == null) {
-          existingForwardersNames.add(member.name);
-        }
-      }
-
-      List<Member> concreteSetters =
-          hierarchy.getDispatchTargets(cls.superclass, setters: true);
-      for (Member member
-          in hierarchy.getInterfaceMembers(cls.superclass, setters: true)) {
-        if (ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
-            null) {
-          existingSetterForwardersNames.add(member.name);
-        }
-      }
-    }
-
-    List<Member> concrete = hierarchy.getDispatchTargets(cls);
-    List<Member> declared = hierarchy.getDeclaredMembers(cls);
 
     Member noSuchMethod = ClassHierarchy.findMemberByName(
         hierarchy.getInterfaceMembers(cls), noSuchMethodName);
 
+    List<Member> concrete = hierarchy.getDispatchTargets(cls);
+    List<Member> declared = hierarchy.getDeclaredMembers(cls);
+
+    bool changed = false;
     for (Member member in hierarchy.getInterfaceMembers(cls)) {
       if (member is Procedure &&
           ClassHierarchy.findMemberByName(concrete, member.name) == null &&
@@ -500,6 +490,7 @@
               noSuchMethod, target, member, hierarchy);
         }
         existingForwardersNames.add(member.name);
+        changed = true;
       }
     }
 
@@ -521,8 +512,11 @@
               noSuchMethod, target, member, hierarchy);
         }
         existingSetterForwardersNames.add(member.name);
+        changed = true;
       }
     }
+
+    return changed;
   }
 
   Uri _getMemberUri(Member member) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index 5c4c3d9..0964665 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -230,10 +230,12 @@
   @override
   Class build(KernelLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary) {
     cls.isEnum = true;
-    intType.resolveIn(coreLibrary.scope, charOffset, fileUri);
-    stringType.resolveIn(coreLibrary.scope, charOffset, fileUri);
-    objectType.resolveIn(coreLibrary.scope, charOffset, fileUri);
-    listType.resolveIn(coreLibrary.scope, charOffset, fileUri);
+    intType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
+    stringType.resolveIn(
+        coreLibrary.scope, charOffset, fileUri, libraryBuilder);
+    objectType.resolveIn(
+        coreLibrary.scope, charOffset, fileUri, libraryBuilder);
+    listType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
 
     KernelFieldBuilder indexFieldBuilder = this["index"];
     Field indexField = indexFieldBuilder.build(libraryBuilder);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index de2683d..51f22e3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -78,15 +78,16 @@
         ShadowIllegalAssignment,
         ShadowIndexAssign,
         ShadowMethodInvocation,
-        ShadowNullAwarePropertyGet,
+        NullAwarePropertyGetJudgment,
         ShadowPropertyAssign,
-        ShadowPropertyGet,
+        PropertyGetJudgment,
         ShadowStaticAssignment,
         ShadowSuperMethodInvocation,
-        ShadowSuperPropertyGet,
-        ShadowVariableAssignment,
-        ShadowVariableDeclaration,
-        ShadowVariableGet,
+        SuperPropertyGetJudgment,
+        VariableAssignmentJudgment,
+        ShadowSyntheticExpression,
+        VariableDeclarationJudgment,
+        VariableGetJudgment,
         StaticSet,
         SuperMethodInvocation,
         SuperPropertySet,
@@ -205,7 +206,7 @@
         offset: offset);
     complexAssignment?.combiner = combiner;
     complexAssignment?.isPostIncDec = true;
-    var dummy = new ShadowVariableDeclaration.forValue(
+    var dummy = new VariableDeclarationJudgment.forValue(
         _makeWrite(combiner, true, complexAssignment),
         helper.functionNestingLevel);
     return _finish(
@@ -278,7 +279,7 @@
     var fact = helper.typePromoter
         .getFactForAccess(variable, helper.functionNestingLevel);
     var scope = helper.typePromoter.currentScope;
-    var read = new ShadowVariableGet(variable, fact, scope)
+    var read = new VariableGetJudgment(variable, fact, scope)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -305,7 +306,7 @@
 
   @override
   ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowVariableAssignment(rhs);
+      new VariableAssignmentJudgment(rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -372,8 +373,9 @@
   }
 
   @override
-  Expression _makeSimpleRead() => new ShadowPropertyGet(receiver, name, getter)
-    ..fileOffset = offsetForToken(token);
+  Expression _makeSimpleRead() =>
+      new PropertyGetJudgment(receiver, name, getter)
+        ..fileOffset = offsetForToken(token);
 
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
@@ -386,7 +388,7 @@
 
   @override
   Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    var read = new ShadowPropertyGet(receiverAccess(), name, getter)
+    var read = new PropertyGetJudgment(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -432,8 +434,9 @@
     if (getter == null) {
       helper.warnUnresolvedGet(name, offsetForToken(token));
     }
-    var read = new ShadowPropertyGet(forest.thisExpression(token), name, getter)
-      ..fileOffset = offsetForToken(token);
+    var read =
+        new PropertyGetJudgment(forest.thisExpression(token), name, getter)
+          ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
   }
@@ -515,7 +518,7 @@
 
   @override
   Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    var read = new ShadowPropertyGet(receiverAccess(), name, getter)
+    var read = new PropertyGetJudgment(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -549,7 +552,7 @@
       kernelPropertyAssign.desugared = body;
       return kernelPropertyAssign;
     } else {
-      return new ShadowNullAwarePropertyGet(receiver, nullAwareGuard)
+      return new NullAwarePropertyGetJudgment(receiver, nullAwareGuard)
         ..fileOffset = offset;
     }
   }
@@ -606,7 +609,7 @@
       helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
     }
     // TODO(ahe): Use [DirectPropertyGet] when possible.
-    var read = new ShadowSuperPropertyGet(name, getter)
+    var read = new SuperPropertyGetJudgment(name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -765,7 +768,7 @@
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
-    var dummy = new ShadowVariableDeclaration.forValue(
+    var dummy = new VariableDeclarationJudgment.forValue(
         write, helper.functionNestingLevel);
     return makeLet(
         valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
@@ -1238,6 +1241,7 @@
 
   /// The offset at which the [declaration] is referenced by this generator,
   /// or `-1` if the reference is implicit.
+  @override
   final int declarationReferenceOffset;
 
   @override
@@ -1260,9 +1264,9 @@
         KernelInvalidTypeBuilder declaration = this.declaration;
         helper.addProblemErrorIfConst(
             declaration.message.messageObject, offset, token.length);
-        super.expression =
+        super.expression = new ShadowSyntheticExpression(
             new Throw(forest.literalString(declaration.message.message, token))
-              ..fileOffset = offset;
+              ..fileOffset = offset);
       } else {
         super.expression = forest.literalType(
             buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
@@ -1488,7 +1492,7 @@
 
   @override
   Expression buildSimpleRead() {
-    return new ShadowPropertyGet(receiver, name)
+    return new PropertyGetJudgment(receiver, name)
       ..fileOffset = offsetForToken(token);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
new file mode 100644
index 0000000..46e49f1
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
@@ -0,0 +1,547 @@
+// 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:front_end/src/scanner/token.dart' show Token;
+
+import 'package:kernel/ast.dart'
+    show
+        Catch,
+        DartType,
+        Expression,
+        FunctionType,
+        Initializer,
+        Node,
+        Statement;
+
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+import 'factory.dart' show Factory;
+
+import 'kernel_shadow_ast.dart'
+    show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+
+/// Implementation of [Factory] that builds source code into a kernel
+/// representation.
+class KernelFactory
+    implements Factory<Expression, Statement, Initializer, void> {
+  @override
+  Expression asExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression expression,
+      Token asOperator,
+      void literalType,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Initializer assertInitializer(
+      InitializerJudgment judgment,
+      int fileOffset,
+      Token assertKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token comma,
+      Expression message,
+      Token rightParenthesis) {
+    return judgment;
+  }
+
+  @override
+  Statement assertStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token assertKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token comma,
+      Expression message,
+      Token rightParenthesis,
+      Token semicolon) {
+    return judgment;
+  }
+
+  @override
+  Expression awaitExpression(ExpressionJudgment judgment, int fileOffset,
+      Token awaitKeyword, Expression expression, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement block(StatementJudgment judgment, int fileOffset, Token leftBracket,
+      List<Statement> statements, Token rightBracket) {
+    return judgment;
+  }
+
+  @override
+  Expression boolLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, bool value, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement breakStatement(StatementJudgment judgment, int fileOffset,
+      Token breakKeyword, Expression label, Token semicolon) {
+    return judgment;
+  }
+
+  @override
+  Expression cascadeExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Object catchStatement(
+      Catch judgment,
+      int fileOffset,
+      Token onKeyword,
+      void type,
+      Token catchKeyword,
+      Token leftParenthesis,
+      Token exceptionParameter,
+      Token comma,
+      Token stackTraceParameter,
+      Token rightParenthesis,
+      Statement body,
+      DartType guardType,
+      int exceptionOffset,
+      DartType exceptionType,
+      int stackTraceOffset,
+      DartType stackTraceType) {
+    return judgment;
+  }
+
+  @override
+  Expression conditionalExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression condition,
+      Token question,
+      Expression thenExpression,
+      Token colon,
+      Expression elseExpression,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression constructorInvocation(ExpressionJudgment judgment, int fileOffset,
+      Node expressionTarget, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement continueStatement(StatementJudgment judgment, int fileOffset,
+      Token continueKeyword, Expression label, Token semicolon) {
+    return judgment;
+  }
+
+  @override
+  Statement continueSwitchStatement(StatementJudgment judgment, int fileOffset,
+      Token continueKeyword, Expression label, Token semicolon) {
+    return judgment;
+  }
+
+  @override
+  Expression deferredCheck(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement doStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token doKeyword,
+      Statement body,
+      Token whileKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token rightParenthesis,
+      Token semicolon) {
+    return judgment;
+  }
+
+  @override
+  Expression doubleLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, double value, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement expressionStatement(StatementJudgment judgment, int fileOffset,
+      Expression expression, Token semicolon) {
+    return judgment;
+  }
+
+  @override
+  Initializer fieldInitializer(
+      InitializerJudgment judgment, int fileOffset, Node initializerField) {
+    return judgment;
+  }
+
+  @override
+  Statement forInStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      int variableOffset,
+      DartType variableType,
+      int writeOffset,
+      DartType writeVariableType,
+      int writeVariableDeclarationOffset,
+      Node writeTarget) {
+    return judgment;
+  }
+
+  @override
+  Statement forStatement(StatementJudgment judgment, int fileOffset) {
+    return judgment;
+  }
+
+  @override
+  Statement functionDeclaration(
+      StatementJudgment judgment, int fileOffset, FunctionType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression functionExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression ifNull(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression leftOperand,
+      Token operator,
+      Expression rightOperand,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement ifStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token ifKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token rightParenthesis,
+      Statement thenStatement,
+      Token elseKeyword,
+      Statement elseStatement) {
+    return judgment;
+  }
+
+  @override
+  Expression indexAssign(ExpressionJudgment judgment, int fileOffset,
+      Node writeMember, Node combiner, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression intLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, num value, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Initializer invalidInitializer(InitializerJudgment judgment, int fileOffset) {
+    return judgment;
+  }
+
+  @override
+  Expression isExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression expression,
+      Token isOperator,
+      void literalType,
+      DartType testedType,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression isNotExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression expression,
+      Token isOperator,
+      Token notOperator,
+      void literalType,
+      DartType testedType,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement labeledStatement(StatementJudgment judgment, int fileOffset) {
+    return judgment;
+  }
+
+  @override
+  Expression listLiteral(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression logicalExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Expression leftOperand,
+      Token operator,
+      Expression rightOperand,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression mapLiteral(
+      ExpressionJudgment judgment, int fileOffset, DartType typeContext) {
+    return judgment;
+  }
+
+  @override
+  Expression methodInvocation(
+      ExpressionJudgment judgment,
+      int resultOffset,
+      List<DartType> argumentsTypes,
+      bool isImplicitCall,
+      Node interfaceMember,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression methodInvocationCall(
+      ExpressionJudgment judgment,
+      int resultOffset,
+      List<DartType> argumentsTypes,
+      bool isImplicitCall,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression namedFunctionExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression not(ExpressionJudgment judgment, int fileOffset, Token operator,
+      Expression operand, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression nullLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, bool isSynthetic, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression propertyAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node writeMember,
+      DartType writeContext,
+      Node combiner,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression propertyGet(ExpressionJudgment judgment, int fileOffset,
+      Node member, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression propertyGetCall(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression propertySet(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Initializer redirectingInitializer(
+      InitializerJudgment judgment, int fileOffset, Node initializerTarget) {
+    return judgment;
+  }
+
+  @override
+  Expression rethrow_(ExpressionJudgment judgment, int fileOffset,
+      Token rethrowKeyword, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement returnStatement(StatementJudgment judgment, int fileOffset,
+      Token returnKeyword, Expression expression, Token semicolon) {
+    return judgment;
+  }
+
+  @override
+  Expression staticAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node writeMember,
+      DartType writeContext,
+      Node combiner,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression staticGet(ExpressionJudgment judgment, int fileOffset,
+      Node expressionTarget, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression staticInvocation(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node expressionTarget,
+      List<DartType> expressionArgumentsTypes,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  void storeClassReference(int fileOffset, Node reference, DartType rawType) {}
+
+  @override
+  void storePrefixInfo(int fileOffset, int prefixImportIndex) {}
+
+  @override
+  Expression stringConcatenation(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression stringLiteral(ExpressionJudgment judgment, int fileOffset,
+      Token literal, String value, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Initializer superInitializer(InitializerJudgment judgment, int fileOffset) {
+    return judgment;
+  }
+
+  @override
+  Statement switchStatement(StatementJudgment judgment, int fileOffset) {
+    return judgment;
+  }
+
+  @override
+  Expression symbolLiteral(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token poundSign,
+      List<Token> components,
+      String value,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression thisExpression(ExpressionJudgment judgment, int fileOffset,
+      Token thisKeyword, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression throw_(ExpressionJudgment judgment, int fileOffset,
+      Token throwKeyword, Expression expression, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement tryCatch(StatementJudgment judgment, int fileOffset) {
+    return judgment;
+  }
+
+  @override
+  Statement tryFinally(StatementJudgment judgment, int fileOffset) {
+    return judgment;
+  }
+
+  @override
+  Expression typeLiteral(ExpressionJudgment judgment, int fileOffset,
+      Node expressionType, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression variableAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      DartType writeContext,
+      int writeVariableDeclarationOffset,
+      Node combiner,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement variableDeclaration(StatementJudgment judgment, int fileOffset,
+      DartType statementType, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression variableGet(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      bool isInCascade,
+      int expressionVariableDeclarationOffset,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Expression variableSet(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Statement whileStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token whileKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token rightParenthesis,
+      Statement body) {
+    return judgment;
+  }
+
+  @override
+  Statement yieldStatement(StatementJudgment judgment, int fileOffset,
+      Token yieldKeyword, Token star, Expression expression, Token semicolon) {
+    return judgment;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index c74aa4b..519886d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -5,7 +5,7 @@
 library fasta.kernel_field_builder;
 
 import 'package:kernel/ast.dart'
-    show DartType, Expression, Field, Name, NullLiteral;
+    show DartType, Expression, Field, Name, Node, NullLiteral;
 
 import '../../base/instrumentation.dart'
     show Instrumentation, InstrumentationValueForType;
@@ -16,6 +16,9 @@
 
 import '../problems.dart' show internalProblem;
 
+import '../type_inference/type_inference_listener.dart'
+    show TypeInferenceListener;
+
 import 'kernel_body_builder.dart' show KernelBodyBuilder;
 
 import 'kernel_builder.dart'
@@ -87,8 +90,10 @@
   @override
   void prepareTopLevelInference() {
     if (!isEligibleForInference) return;
+    var listener = new TypeInferenceListener<int, int, Node, int>();
     var typeInferrer = library.loader.typeInferenceEngine
-        .createTopLevelTypeInferrer(field.enclosingClass?.thisType, field);
+        .createTopLevelTypeInferrer(
+            listener, field.enclosingClass?.thisType, field);
     if (hasInitializer) {
       initializer = new KernelBodyBuilder.forField(this, typeInferrer)
           .parseFieldInitializer(initializerTokenForInference);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
index 752a461..c6ca4d9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
@@ -5,7 +5,7 @@
 library fasta.kernel_formal_parameter_builder;
 
 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'
-    show ShadowVariableDeclaration;
+    show VariableDeclarationJudgment;
 
 import '../modifier.dart' show finalMask;
 
@@ -21,7 +21,7 @@
 
 class KernelFormalParameterBuilder
     extends FormalParameterBuilder<KernelTypeBuilder> {
-  ShadowVariableDeclaration declaration;
+  VariableDeclarationJudgment declaration;
   final int charOffset;
 
   KernelFormalParameterBuilder(
@@ -35,11 +35,11 @@
       : super(metadata, modifiers, type, name, hasThis, compilationUnit,
             charOffset);
 
-  ShadowVariableDeclaration get target => declaration;
+  VariableDeclarationJudgment get target => declaration;
 
-  ShadowVariableDeclaration build(SourceLibraryBuilder library) {
+  VariableDeclarationJudgment build(SourceLibraryBuilder library) {
     if (declaration == null) {
-      declaration = new ShadowVariableDeclaration(name, 0,
+      declaration = new VariableDeclarationJudgment(name, 0,
           type: type?.build(library),
           isFinal: isFinal,
           isConst: isConst,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_prefix_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_prefix_builder.dart
index 5c8aa36..72b33f2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_prefix_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_prefix_builder.dart
@@ -16,8 +16,8 @@
   LoadLibraryBuilder loadLibraryBuilder;
 
   KernelPrefixBuilder(String name, bool deferred, LibraryBuilder parent,
-      this.dependency, int charOffset)
-      : super(name, deferred, parent, charOffset) {
+      this.dependency, int charOffset, int importIndex)
+      : super(name, deferred, parent, charOffset, importIndex) {
     if (deferred) {
       loadLibraryBuilder =
           new LoadLibraryBuilder(parent, dependency, charOffset);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index c78baa0..b09e032 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -74,7 +74,8 @@
         TypeVariableBuilder,
         isRedirectingGenerativeConstructorImplementation;
 
-import 'kernel_shadow_ast.dart' show ShadowProcedure, ShadowVariableDeclaration;
+import 'kernel_shadow_ast.dart'
+    show ShadowProcedure, VariableDeclarationJudgment;
 
 import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
 
@@ -169,7 +170,7 @@
       // Do this after building the parameters, since the diet listener
       // assumes that parameters are built, even if illegal in number.
       VariableDeclaration parameter =
-          new ShadowVariableDeclaration("#synthetic", 0);
+          new VariableDeclarationJudgment("#synthetic", 0);
       result.positionalParameters.clear();
       result.positionalParameters.add(parameter);
       parameter.parent = result;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 36ec248..73dee2a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -20,6 +20,8 @@
 
 import 'dart:core' hide MapEntry;
 
+import 'package:kernel/ast.dart' as kernel show Expression, Initializer;
+
 import 'package:kernel/ast.dart' hide InvalidExpression, InvalidInitializer;
 
 import 'package:kernel/clone.dart' show CloneVisitor;
@@ -59,6 +61,9 @@
 import '../type_inference/type_inferrer.dart'
     show TypeInferrer, TypeInferrerDisabled, TypeInferrerImpl;
 
+import '../type_inference/type_inference_listener.dart'
+    show TypeInferenceListener;
+
 import '../type_inference/type_promotion.dart'
     show TypePromoter, TypePromoterImpl, TypePromotionFact, TypePromotionScope;
 
@@ -71,6 +76,8 @@
 
 import 'body_builder.dart' show combineStatements;
 
+import 'factory.dart' show Factory;
+
 import 'kernel_expression_generator.dart' show makeLet;
 
 /// Indicates whether type inference involving conditional expressions should
@@ -94,7 +101,7 @@
 }
 
 List<DartType> getExplicitTypeArguments(Arguments arguments) {
-  if (arguments is ShadowArguments) {
+  if (arguments is ArgumentsJudgment) {
     return arguments._hasExplicitTypeArguments ? arguments.types : null;
   } else {
     // This code path should only be taken in situations where there are no
@@ -123,119 +130,191 @@
 }
 
 /// Concrete shadow object representing a set of invocation arguments.
-class ShadowArguments extends Arguments {
+class ArgumentsJudgment extends Arguments {
   bool _hasExplicitTypeArguments;
 
-  ShadowArguments(List<Expression> positional,
+  List<ExpressionJudgment> get positionalJudgments => positional.cast();
+
+  List<NamedExpressionJudgment> get namedJudgments => named.cast();
+
+  ArgumentsJudgment(List<Expression> positional,
       {List<DartType> types, List<NamedExpression> named})
       : _hasExplicitTypeArguments = types != null && types.isNotEmpty,
         super(positional, types: types, named: named);
 
   static void setNonInferrableArgumentTypes(
-      ShadowArguments arguments, List<DartType> types) {
+      ArgumentsJudgment arguments, List<DartType> types) {
     arguments.types.clear();
     arguments.types.addAll(types);
     arguments._hasExplicitTypeArguments = true;
   }
 
-  static void removeNonInferrableArgumentTypes(ShadowArguments arguments) {
+  static void removeNonInferrableArgumentTypes(ArgumentsJudgment arguments) {
     arguments.types.clear();
     arguments._hasExplicitTypeArguments = false;
   }
 }
 
 /// Shadow object for [AsExpression].
-class ShadowAsExpression extends AsExpression implements ShadowExpression {
-  ShadowAsExpression(Expression operand, DartType type) : super(operand, type);
+class AsJudgment extends AsExpression implements ExpressionJudgment {
+  DartType inferredType;
+
+  AsJudgment(Expression operand, DartType type) : super(operand, type);
+
+  ExpressionJudgment get judgment => operand;
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    inferrer.inferExpression(operand, const UnknownType(), false);
-    return type;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.asExpressionEnter(fileOffset, typeContext);
+    inferrer.inferExpression(factory, judgment, const UnknownType(), false);
+    inferredType = type;
+    inferrer.listener.asExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing an assert initializer in kernel form.
-class ShadowAssertInitializer extends AssertInitializer
-    implements ShadowInitializer {
-  ShadowAssertInitializer(AssertStatement statement) : super(statement);
+class AssertInitializerJudgment extends AssertInitializer
+    implements InitializerJudgment {
+  AssertInitializerJudgment(AssertStatement statement) : super(statement);
+
+  AssertStatementJudgment get judgment => statement;
 
   @override
-  void _inferInitializer(ShadowTypeInferrer inferrer) {
-    inferrer.inferStatement(statement);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.assertInitializerEnter(fileOffset);
+    inferrer.inferStatement(factory, judgment);
+    inferrer.listener.assertInitializerExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing an assertion statement in kernel form.
-class ShadowAssertStatement extends AssertStatement implements ShadowStatement {
-  ShadowAssertStatement(Expression condition,
+class AssertStatementJudgment extends AssertStatement
+    implements StatementJudgment {
+  AssertStatementJudgment(Expression condition,
       {Expression message, int conditionStartOffset, int conditionEndOffset})
       : super(condition,
             message: message,
             conditionStartOffset: conditionStartOffset,
             conditionEndOffset: conditionEndOffset);
 
+  ExpressionJudgment get conditionJudgment => condition;
+
+  ExpressionJudgment get messageJudgment => message;
+
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.assertStatementEnter(fileOffset);
+    var conditionJudgment = this.conditionJudgment;
+    var messageJudgment = this.messageJudgment;
     var expectedType = inferrer.coreTypes.boolClass.rawType;
-    var actualType =
-        inferrer.inferExpression(condition, expectedType, !inferrer.isTopLevel);
-    inferrer.ensureAssignable(
-        expectedType, actualType, condition, condition.fileOffset);
-    if (message != null) {
-      inferrer.inferExpression(message, const UnknownType(), false);
+    inferrer.inferExpression(
+        factory, conditionJudgment, expectedType, !inferrer.isTopLevel);
+    inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
+        conditionJudgment, conditionJudgment.fileOffset);
+    if (messageJudgment != null) {
+      inferrer.inferExpression(
+          factory, messageJudgment, const UnknownType(), false);
     }
+    inferrer.listener.assertStatementExit(fileOffset);
   }
 }
 
 /// Shadow object for [AwaitExpression].
-class ShadowAwaitExpression extends AwaitExpression
-    implements ShadowExpression {
-  ShadowAwaitExpression(Expression operand) : super(operand);
+class AwaitJudgment extends AwaitExpression implements ExpressionJudgment {
+  DartType inferredType;
+
+  AwaitJudgment(Expression operand) : super(operand);
+
+  ExpressionJudgment get judgment => operand;
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.awaitExpressionEnter(fileOffset, typeContext);
     if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) {
       typeContext = inferrer.wrapFutureOrType(typeContext);
     }
-    var inferredType = inferrer.inferExpression(operand, typeContext, true);
-    return inferrer.typeSchemaEnvironment.unfutureType(inferredType);
+    var judgment = this.judgment;
+    inferrer.inferExpression(factory, judgment, typeContext, true);
+    inferredType =
+        inferrer.typeSchemaEnvironment.unfutureType(judgment.inferredType);
+    inferrer.listener.awaitExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a statement block in kernel form.
-class ShadowBlock extends Block implements ShadowStatement {
-  ShadowBlock(List<Statement> statements) : super(statements);
+class BlockJudgment extends Block implements StatementJudgment {
+  BlockJudgment(List<Statement> statements) : super(statements);
+
+  List<Statement> get judgments => statements;
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    for (var statement in statements) {
-      inferrer.inferStatement(statement);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.blockEnter(fileOffset);
+    for (var judgment in judgments) {
+      inferrer.inferStatement(factory, judgment);
     }
+    inferrer.listener.blockExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a boolean literal in kernel form.
-class ShadowBoolLiteral extends BoolLiteral implements ShadowExpression {
-  ShadowBoolLiteral(bool value) : super(value);
+class BoolJudgment extends BoolLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
+  BoolJudgment(bool value) : super(value);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.coreTypes.boolClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.boolLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferrer.listener.boolLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
-/// Concrete shadow object representing a break or continue statement in kernel
-/// form.
-class ShadowBreakStatement extends BreakStatement implements ShadowStatement {
-  ShadowBreakStatement(LabeledStatement target) : super(target);
+/// Concrete shadow object representing a break statement in kernel form.
+class BreakJudgment extends BreakStatement implements StatementJudgment {
+  BreakJudgment(LabeledStatement target) : super(target);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
     // No inference needs to be done.
   }
 }
 
+/// Concrete shadow object representing a continue statement in kernel form.
+class ContinueJudgment extends BreakStatement implements StatementJudgment {
+  ContinueJudgment(LabeledStatement target) : super(target);
+
+  @override
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.breakStatementEnter(fileOffset);
+    // No inference needs to be done.
+    inferrer.listener.breakStatementExit(fileOffset);
+  }
+}
+
 /// Concrete shadow object representing a cascade expression.
 ///
 /// A cascade expression of the form `a..b()..c()` is represented as the kernel
@@ -254,7 +333,9 @@
 /// call [finalize] with an expression representing the expression after the
 /// `..`.  If a further `..` follows that expression, the caller should call
 /// [extend] followed by [finalize] for each subsequent cascade.
-class ShadowCascadeExpression extends Let implements ShadowExpression {
+class ShadowCascadeExpression extends Let implements ExpressionJudgment {
+  DartType inferredType;
+
   /// Pointer to the last "let" expression in the cascade.
   Let nextCascade;
 
@@ -262,7 +343,7 @@
   /// variable.  Caller is responsible for ensuring that [variable]'s
   /// initializer is the expression preceding the first `..` of the cascade
   /// expression.
-  ShadowCascadeExpression(ShadowVariableDeclaration variable)
+  ShadowCascadeExpression(VariableDeclarationJudgment variable)
       : super(
             variable,
             makeLet(new VariableDeclaration.forValue(new _UnfinishedCascade()),
@@ -290,19 +371,24 @@
   }
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    var lhsType =
-        inferrer.inferExpression(variable.initializer, typeContext, true);
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.cascadeExpressionEnter(fileOffset, typeContext);
+    var lhsType = inferrer.inferExpression(
+        factory, variable.initializer, typeContext, true);
     if (inferrer.strongMode) {
       variable.type = lhsType;
     }
     Let section = body;
     while (true) {
       inferrer.inferExpression(
-          section.variable.initializer, const UnknownType(), false);
+          factory, section.variable.initializer, const UnknownType(), false);
       if (section.body is! Let) break;
       section = section.body;
     }
+    inferrer.listener.cascadeExpressionExit(fileOffset, lhsType);
     return lhsType;
   }
 }
@@ -427,8 +513,12 @@
   DartType _getWriteType(ShadowTypeInferrer inferrer) => unhandled(
       '$runtimeType', 'ShadowComplexAssignment._getWriteType', -1, null);
 
-  _ComplexAssignmentInferenceResult _inferRhs(
-      ShadowTypeInferrer inferrer, DartType readType, DartType writeContext) {
+  _ComplexAssignmentInferenceResult
+      _inferRhs<Expression, Statement, Initializer, Type>(
+          ShadowTypeInferrer inferrer,
+          Factory<Expression, Statement, Initializer, Type> factory,
+          DartType readType,
+          DartType writeContext) {
     assert(writeContext != null);
     var writeOffset = write == null ? -1 : write.fileOffset;
     Procedure combinerMember;
@@ -453,7 +543,8 @@
         assert(identical(combiner.arguments.positional.first, rhs));
         // Analyzer uses a null context for the RHS here.
         // TODO(paulberry): improve on this.
-        rhsType = inferrer.inferExpression(rhs, const UnknownType(), true);
+        rhsType =
+            inferrer.inferExpression(factory, rhs, const UnknownType(), true);
         // Do not use rhs after this point because it may be a Shadow node
         // that has been replaced in the tree with its desugaring.
         var expectedType = getPositionalParameterType(combinerType, 0);
@@ -484,7 +575,7 @@
       _storeLetType(inferrer, replacedCombiner, combinedType);
     } else {
       var rhsType = inferrer.inferExpression(
-          rhs, writeContext ?? const UnknownType(), true);
+          factory, rhs, writeContext ?? const UnknownType(), true);
       var replacedRhs =
           inferrer.ensureAssignable(writeContext, rhsType, rhs, writeOffset);
       _storeLetType(inferrer, replacedRhs ?? rhs, rhsType);
@@ -537,10 +628,12 @@
     return parts;
   }
 
-  DartType _inferReceiver(ShadowTypeInferrer inferrer) {
+  DartType _inferReceiver<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
     if (receiver != null) {
-      var receiverType =
-          inferrer.inferExpression(receiver, const UnknownType(), true);
+      var receiverType = inferrer.inferExpression(
+          factory, receiver, const UnknownType(), true);
       _storeLetType(inferrer, receiver, receiverType);
       return receiverType;
     } else if (isSuper) {
@@ -554,37 +647,54 @@
 
 /// Concrete shadow object representing a conditional expression in kernel form.
 /// Shadow object for [ConditionalExpression].
-class ShadowConditionalExpression extends ConditionalExpression
-    implements ShadowExpression {
-  ShadowConditionalExpression(
+class ConditionalJudgment extends ConditionalExpression
+    implements ExpressionJudgment {
+  DartType inferredType;
+
+  ExpressionJudgment get conditionJudgment => condition;
+
+  ExpressionJudgment get thenJudgment => then;
+
+  ExpressionJudgment get otherwiseJudgment => otherwise;
+
+  ConditionalJudgment(
       Expression condition, Expression then, Expression otherwise)
       : super(condition, then, otherwise, null);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.conditionalExpressionEnter(fileOffset, typeContext);
+    var conditionJudgment = this.conditionJudgment;
+    var thenJudgment = this.thenJudgment;
+    var otherwiseJudgment = this.otherwiseJudgment;
     var expectedType = inferrer.coreTypes.boolClass.rawType;
-    var conditionType =
-        inferrer.inferExpression(condition, expectedType, !inferrer.isTopLevel);
-    inferrer.ensureAssignable(
-        expectedType, conditionType, condition, condition.fileOffset);
-    DartType thenType = inferrer.inferExpression(then, typeContext, true);
+    inferrer.inferExpression(
+        factory, conditionJudgment, expectedType, !inferrer.isTopLevel);
+    inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
+        condition, condition.fileOffset);
+    inferrer.inferExpression(factory, thenJudgment, typeContext, true);
     bool useLub = _forceLub || typeContext == null;
-    DartType otherwiseType =
-        inferrer.inferExpression(otherwise, typeContext, useLub);
-    DartType type = useLub
-        ? inferrer.typeSchemaEnvironment
-            .getLeastUpperBound(thenType, otherwiseType)
+    inferrer.inferExpression(factory, otherwiseJudgment, typeContext, useLub);
+    inferredType = useLub
+        ? inferrer.typeSchemaEnvironment.getLeastUpperBound(
+            thenJudgment.inferredType, otherwiseJudgment.inferredType)
         : greatestClosure(inferrer.coreTypes, typeContext);
     if (inferrer.strongMode) {
-      staticType = type;
+      staticType = inferredType;
     }
-    return type;
+    inferrer.listener.conditionalExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Shadow object for [ConstructorInvocation].
 class ShadowConstructorInvocation extends ConstructorInvocation
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   final Member _initialTarget;
 
   /// If the constructor invocation points to a redirected constructor, the type
@@ -609,7 +719,11 @@
       : super(target, arguments, isConst: isConst);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.constructorInvocationEnter(fileOffset, typeContext);
     var library = inferrer.engine.beingInferred[target];
     if (library != null) {
       // There is a cyclic dependency where inferring the types of the
@@ -641,6 +755,7 @@
       inferrer.engine.beingInferred.remove(target);
     }
     var inferredType = inferrer.inferInvocation(
+        factory,
         typeContext,
         fileOffset,
         _initialTarget.function.functionType,
@@ -656,6 +771,8 @@
           fileOffset,
           noLength);
     }
+    inferrer.listener
+        .constructorInvocationExit(fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
@@ -696,78 +813,129 @@
 
 /// Concrete shadow object representing a continue statement from a switch
 /// statement, in kernel form.
-class ShadowContinueSwitchStatement extends ContinueSwitchStatement
-    implements ShadowStatement {
-  ShadowContinueSwitchStatement(SwitchCase target) : super(target);
+class ContinueSwitchJudgment extends ContinueSwitchStatement
+    implements StatementJudgment {
+  ContinueSwitchJudgment(SwitchCase target) : super(target);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.continueSwitchStatementEnter(fileOffset);
     // No inference needs to be done.
+    inferrer.listener.continueSwitchStatementExit(fileOffset);
   }
 }
 
 /// Shadow object representing a deferred check in kernel form.
-class ShadowDeferredCheck extends Let implements ShadowExpression {
+class ShadowDeferredCheck extends Let implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowDeferredCheck(VariableDeclaration variable, Expression body)
       : super(variable, body);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.deferredCheckEnter(fileOffset, typeContext);
     // Since the variable is not used in the body we don't need to type infer
     // it.  We can just type infer the body.
-    return inferrer.inferExpression(body, typeContext, true);
+    var inferredType =
+        inferrer.inferExpression(factory, body, typeContext, true);
+    inferrer.listener.deferredCheckExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a do loop in kernel form.
-class ShadowDoStatement extends DoStatement implements ShadowStatement {
-  ShadowDoStatement(Statement body, Expression condition)
-      : super(body, condition);
+class DoJudgment extends DoStatement implements StatementJudgment {
+  DoJudgment(Statement body, Expression condition) : super(body, condition);
+
+  StatementJudgment get bodyJudgment => body;
+
+  ExpressionJudgment get conditionJudgment => condition;
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    inferrer.inferStatement(body);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.doStatementEnter(fileOffset);
+    var conditionJudgment = this.conditionJudgment;
+    inferrer.inferStatement(factory, bodyJudgment);
     var boolType = inferrer.coreTypes.boolClass.rawType;
-    var actualType =
-        inferrer.inferExpression(condition, boolType, !inferrer.isTopLevel);
-    inferrer.ensureAssignable(
-        boolType, actualType, condition, condition.fileOffset);
+    inferrer.inferExpression(
+        factory, conditionJudgment, boolType, !inferrer.isTopLevel);
+    inferrer.ensureAssignable(boolType, conditionJudgment.inferredType,
+        condition, condition.fileOffset);
+    inferrer.listener.doStatementExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a double literal in kernel form.
-class ShadowDoubleLiteral extends DoubleLiteral implements ShadowExpression {
-  ShadowDoubleLiteral(double value) : super(value);
+class DoubleJudgment extends DoubleLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
+  DoubleJudgment(double value) : super(value);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.coreTypes.doubleClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.doubleLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.doubleClass.rawType;
+    inferrer.listener.doubleLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Common base class for shadow objects representing expressions in kernel
 /// form.
-abstract class ShadowExpression implements Expression {
+abstract class ExpressionJudgment implements Expression {
+  DartType inferredType;
+
   /// Calls back to [inferrer] to perform type inference for whatever concrete
-  /// type of [ShadowExpression] this is.
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext);
+  /// type of [ExpressionJudgment] this is.
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext);
+}
+
+/// Concrete shadow object representing an empty statement in kernel form.
+class EmptyStatementJudgment extends EmptyStatement
+    implements StatementJudgment {
+  @override
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    // No inference needs to be done.
+  }
 }
 
 /// Concrete shadow object representing an expression statement in kernel form.
 class ShadowExpressionStatement extends ExpressionStatement
-    implements ShadowStatement {
+    implements StatementJudgment {
   ShadowExpressionStatement(Expression expression) : super(expression);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    inferrer.inferExpression(expression, const UnknownType(), false);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.expressionStatementEnter(fileOffset);
+    inferrer.inferExpression(factory, expression, const UnknownType(), false);
+    inferrer.listener.expressionStatementExit(fileOffset);
   }
 }
 
 /// Shadow object for [StaticInvocation] when the procedure being invoked is a
 /// factory constructor.
 class ShadowFactoryConstructorInvocation extends StaticInvocation
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   final Member _initialTarget;
 
   /// If the factory invocation points to a redirected factory, the type
@@ -792,13 +960,20 @@
       : super(target, arguments, isConst: isConst);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.constructorInvocationEnter(fileOffset, typeContext);
     var inferredType = inferrer.inferInvocation(
+        factory,
         typeContext,
         fileOffset,
         _initialTarget.function.functionType,
         computeConstructorReturnType(_initialTarget),
         arguments);
+    inferrer.listener
+        .constructorInvocationExit(fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
@@ -868,18 +1043,23 @@
 
 /// Concrete shadow object representing a field initializer in kernel form.
 class ShadowFieldInitializer extends FieldInitializer
-    implements ShadowInitializer {
+    implements InitializerJudgment {
   ShadowFieldInitializer(Field field, Expression value) : super(field, value);
 
   @override
-  void _inferInitializer(ShadowTypeInferrer inferrer) {
-    var initializerType = inferrer.inferExpression(value, field.type, true);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.fieldInitializerEnter(fileOffset, field);
+    var initializerType =
+        inferrer.inferExpression(factory, value, field.type, true);
     inferrer.ensureAssignable(field.type, initializerType, value, fileOffset);
+    inferrer.listener.fieldInitializerExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a for-in loop in kernel form.
-class ShadowForInStatement extends ForInStatement implements ShadowStatement {
+class ShadowForInStatement extends ForInStatement implements StatementJudgment {
   final bool _declaresVariable;
 
   final ShadowSyntheticExpression _syntheticAssignment;
@@ -890,15 +1070,18 @@
       : super(variable, iterable, body, isAsync: isAsync);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
     var iterableClass = isAsync
         ? inferrer.coreTypes.streamClass
         : inferrer.coreTypes.iterableClass;
     DartType context;
     bool typeNeeded = false;
     bool typeChecksNeeded = !inferrer.isTopLevel;
-    ShadowVariableDeclaration variable;
+    VariableDeclarationJudgment variable;
     var syntheticAssignment = _syntheticAssignment;
+    kernel.Expression syntheticWrite;
     DartType syntheticWriteType;
     if (_declaresVariable) {
       variable = this.variable;
@@ -909,14 +1092,48 @@
         context = variable.type;
       }
     } else if (syntheticAssignment is ShadowComplexAssignment) {
+      syntheticWrite = syntheticAssignment.write;
       syntheticWriteType =
           context = syntheticAssignment._getWriteType(inferrer);
     } else {
       context = const UnknownType();
     }
     context = inferrer.wrapType(context, iterableClass);
-    var inferredExpressionType = inferrer.resolveTypeParameter(inferrer
-        .inferExpression(iterable, context, typeNeeded || typeChecksNeeded));
+    if (syntheticWrite is VariableSet) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset,
+          variable?.fileOffset,
+          syntheticWrite.fileOffset,
+          syntheticWrite.variable.type,
+          syntheticWrite.variable.fileOffset,
+          null);
+    } else if (syntheticWrite is PropertySet) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset,
+          variable?.fileOffset,
+          syntheticWrite.fileOffset,
+          syntheticWrite.interfaceTarget?.setterType,
+          null,
+          syntheticWrite.interfaceTarget);
+    } else if (syntheticWrite is StaticSet) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset,
+          variable?.fileOffset,
+          syntheticWrite.fileOffset,
+          syntheticWrite.target.setterType,
+          null,
+          syntheticWrite.target);
+    } else if (syntheticWrite == null ||
+        syntheticWrite is ShadowSyntheticExpression) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset, variable?.fileOffset, null, null, null, null);
+    } else {
+      throw new UnimplementedError(
+          '(${syntheticWrite.runtimeType}) $syntheticWrite');
+    }
+    var inferredExpressionType = inferrer.resolveTypeParameter(
+        inferrer.inferExpression(
+            factory, iterable, context, typeNeeded || typeChecksNeeded));
     inferrer.ensureAssignable(
         inferrer.wrapType(const DynamicType(), iterableClass),
         inferredExpressionType,
@@ -941,9 +1158,9 @@
         this.variable.type = inferredType;
       }
     }
-    inferrer.inferStatement(body);
+    inferrer.inferStatement(factory, body);
     if (_declaresVariable) {
-      inferrer.inferMetadataKeepingHelper(variable.annotations);
+      inferrer.inferMetadataKeepingHelper(factory, variable.annotations);
       var tempVar =
           new VariableDeclaration(null, type: inferredType, isFinal: true);
       var variableGet = new VariableGet(tempVar)
@@ -969,52 +1186,65 @@
       }
       syntheticAssignment._replaceWithDesugared();
     }
+    inferrer.listener
+        .forInStatementExit(fileOffset, variable != null, variable?.type);
   }
 }
 
 /// Concrete shadow object representing a classic for loop in kernel form.
-class ShadowForStatement extends ForStatement implements ShadowStatement {
+class ShadowForStatement extends ForStatement implements StatementJudgment {
   ShadowForStatement(List<VariableDeclaration> variables, Expression condition,
       List<Expression> updates, Statement body)
       : super(variables, condition, updates, body);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    variables.forEach(inferrer.inferStatement);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.forStatementEnter(fileOffset);
+    for (var variable in variables) {
+      inferrer.inferStatement(factory, variable);
+    }
     if (condition != null) {
       var expectedType = inferrer.coreTypes.boolClass.rawType;
       var conditionType = inferrer.inferExpression(
-          condition, expectedType, !inferrer.isTopLevel);
+          factory, condition, expectedType, !inferrer.isTopLevel);
       inferrer.ensureAssignable(
           expectedType, conditionType, condition, condition.fileOffset);
     }
     for (var update in updates) {
-      inferrer.inferExpression(update, const UnknownType(), false);
+      inferrer.inferExpression(factory, update, const UnknownType(), false);
     }
-    inferrer.inferStatement(body);
+    inferrer.inferStatement(factory, body);
+    inferrer.listener.forStatementExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a local function declaration in kernel
 /// form.
 class ShadowFunctionDeclaration extends FunctionDeclaration
-    implements ShadowStatement {
+    implements StatementJudgment {
   bool _hasImplicitReturnType = false;
 
   ShadowFunctionDeclaration(VariableDeclaration variable, FunctionNode function)
       : super(variable, function);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    inferrer.inferMetadataKeepingHelper(variable.annotations);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.functionDeclarationEnter(fileOffset);
+    inferrer.inferMetadataKeepingHelper(factory, variable.annotations);
     inferrer.inferLocalFunction(
+        factory,
         function,
         null,
         fileOffset,
         _hasImplicitReturnType
             ? (inferrer.strongMode ? null : const DynamicType())
             : function.returnType);
-    variable.type = function.functionType;
+    var inferredType = variable.type = function.functionType;
+    inferrer.listener.functionDeclarationExit(fileOffset, inferredType);
   }
 
   static void setHasImplicitReturnType(
@@ -1025,12 +1255,21 @@
 
 /// Concrete shadow object representing a function expression in kernel form.
 class ShadowFunctionExpression extends FunctionExpression
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowFunctionExpression(FunctionNode function) : super(function);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.inferLocalFunction(function, typeContext, fileOffset, null);
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.functionExpressionEnter(fileOffset, typeContext);
+    var inferredType = inferrer.inferLocalFunction(
+        factory, function, typeContext, fileOffset, null);
+    inferrer.listener.functionExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1040,7 +1279,9 @@
 /// expression:
 ///
 ///     let v = a in v == null ? b : v
-class ShadowIfNullExpression extends Let implements ShadowExpression {
+class ShadowIfNullExpression extends Let implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowIfNullExpression(VariableDeclaration variable, Expression body)
       : super(variable, body);
 
@@ -1054,19 +1295,24 @@
   Expression get _rhs => body.then;
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.ifNullEnter(fileOffset, typeContext);
     // To infer `e0 ?? e1` in context K:
     // - Infer e0 in context K to get T0
-    var lhsType = inferrer.inferExpression(_lhs, typeContext, true);
+    var lhsType = inferrer.inferExpression(factory, _lhs, typeContext, true);
     if (inferrer.strongMode) {
       variable.type = lhsType;
     }
+    inferrer.listener.ifNullBeforeRhs(fileOffset);
     // - Let J = T0 if K is `?` else K.
     // - Infer e1 in context J to get T1
     bool useLub = _forceLub || typeContext is UnknownType;
     var rhsType = typeContext is UnknownType
-        ? inferrer.inferExpression(_rhs, lhsType, true)
-        : inferrer.inferExpression(_rhs, typeContext, _forceLub);
+        ? inferrer.inferExpression(factory, _rhs, lhsType, true)
+        : inferrer.inferExpression(factory, _rhs, typeContext, _forceLub);
     // - Let T = greatest closure of K with respect to `?` if K is not `_`, else
     //   UP(t0, t1)
     // - Then the inferred type is T.
@@ -1076,24 +1322,38 @@
     if (inferrer.strongMode) {
       body.staticType = inferredType;
     }
+    inferrer.listener.ifNullExit(fileOffset, inferredType);
     return inferredType;
   }
 }
 
 /// Concrete shadow object representing an if statement in kernel form.
-class ShadowIfStatement extends IfStatement implements ShadowStatement {
-  ShadowIfStatement(Expression condition, Statement then, Statement otherwise)
+class IfJudgment extends IfStatement implements StatementJudgment {
+  IfJudgment(Expression condition, Statement then, Statement otherwise)
       : super(condition, then, otherwise);
 
+  ExpressionJudgment get conditionJudgment => condition;
+
+  StatementJudgment get thenJudgment => then;
+
+  StatementJudgment get otherwiseJudgment => otherwise;
+
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.ifStatementEnter(fileOffset);
+    var conditionJudgment = this.conditionJudgment;
     var expectedType = inferrer.coreTypes.boolClass.rawType;
-    var conditionType =
-        inferrer.inferExpression(condition, expectedType, !inferrer.isTopLevel);
-    inferrer.ensureAssignable(
-        expectedType, conditionType, condition, condition.fileOffset);
-    inferrer.inferStatement(then);
-    if (otherwise != null) inferrer.inferStatement(otherwise);
+    inferrer.inferExpression(
+        factory, conditionJudgment, expectedType, !inferrer.isTopLevel);
+    inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
+        condition, condition.fileOffset);
+    inferrer.inferStatement(factory, thenJudgment);
+    if (otherwiseJudgment != null) {
+      inferrer.inferStatement(factory, otherwiseJudgment);
+    }
+    inferrer.listener.ifStatementExit(fileOffset);
   }
 }
 
@@ -1108,9 +1368,12 @@
   }
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
     if (write != null) {
-      inferrer.inferExpression(write, const UnknownType(), false);
+      inferrer.inferExpression(factory, write, const UnknownType(), false);
     }
     _replaceWithDesugared();
     return const DynamicType();
@@ -1147,8 +1410,13 @@
   }
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    var receiverType = _inferReceiver(inferrer);
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.indexAssignEnter(desugared.fileOffset, typeContext);
+    var receiverType = _inferReceiver(inferrer, factory);
+    inferrer.listener.indexAssignAfterReceiver(write.fileOffset, typeContext);
     var writeMember = inferrer.findMethodInvocationMember(receiverType, write);
     // To replicate analyzer behavior, we base type inference on the write
     // member.  TODO(paulberry): would it be better to use the read member
@@ -1165,7 +1433,8 @@
       expectedIndexTypeForWrite = calleeType.positionalParameters[0];
       writeContext = calleeType.positionalParameters[1];
     }
-    var indexType = inferrer.inferExpression(index, indexContext, true);
+    var indexType =
+        inferrer.inferExpression(factory, index, indexContext, true);
     _storeLetType(inferrer, index, indexType);
     if (writeContext is! UnknownType) {
       inferrer.ensureAssignable(
@@ -1200,7 +1469,9 @@
           read.fileOffset);
       _storeLetType(inferrer, replacedRead, readType);
     }
-    var inferredResult = _inferRhs(inferrer, readType, writeContext);
+    var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
+    inferrer.listener.indexAssignExit(write.fileOffset, writeMember,
+        inferredResult.combiner, inferredResult.type);
     _replaceWithDesugared();
     return inferredResult.type;
   }
@@ -1208,70 +1479,118 @@
 
 /// Common base class for shadow objects representing initializers in kernel
 /// form.
-abstract class ShadowInitializer implements Initializer {
-  /// Performs type inference for whatever concrete type of [ShadowInitializer]
+abstract class InitializerJudgment implements Initializer {
+  /// Performs type inference for whatever concrete type of [InitializerJudgment]
   /// this is.
-  void _inferInitializer(ShadowTypeInferrer inferrer);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory);
 }
 
 /// Concrete shadow object representing an integer literal in kernel form.
-class ShadowIntLiteral extends IntLiteral implements ShadowExpression {
-  ShadowIntLiteral(int value) : super(value);
+class IntJudgment extends IntLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
+  IntJudgment(int value) : super(value);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.coreTypes.intClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.intLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.intClass.rawType;
+    inferrer.listener.intLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing an invalid initializer in kernel form.
 class ShadowInvalidInitializer extends LocalInitializer
-    implements ShadowInitializer {
+    implements InitializerJudgment {
   ShadowInvalidInitializer(VariableDeclaration variable) : super(variable);
 
   @override
-  void _inferInitializer(ShadowTypeInferrer inferrer) {
-    inferrer.inferExpression(variable.initializer, const UnknownType(), false);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.invalidInitializerEnter(fileOffset);
+    inferrer.inferExpression(
+        factory, variable.initializer, const UnknownType(), false);
+    inferrer.listener.invalidInitializerExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a non-inverted "is" test in kernel form.
-class ShadowIsExpression extends IsExpression implements ShadowExpression {
-  ShadowIsExpression(Expression operand, DartType type) : super(operand, type);
+class IsJudgment extends IsExpression implements ExpressionJudgment {
+  DartType inferredType;
+
+  ExpressionJudgment get judgment => operand;
+
+  IsJudgment(Expression operand, DartType type) : super(operand, type);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    inferrer.inferExpression(operand, const UnknownType(), false);
-    return inferrer.coreTypes.boolClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.isExpressionEnter(fileOffset, typeContext);
+    inferrer.inferExpression(factory, judgment, const UnknownType(), false);
+    inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferrer.listener.isExpressionExit(fileOffset, type, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing an inverted "is" test in kernel form.
-class ShadowIsNotExpression extends Not implements ShadowExpression {
-  ShadowIsNotExpression(Expression operand, DartType type, int charOffset)
+class IsNotJudgment extends Not implements ExpressionJudgment {
+  DartType inferredType;
+
+  @override
+  IsExpression get operand => super.operand;
+
+  ExpressionJudgment get judgment => operand.operand;
+
+  IsNotJudgment(Expression operand, DartType type, int charOffset)
       : super(new IsExpression(operand, type)..fileOffset = charOffset);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
     IsExpression isExpression = this.operand;
-    inferrer.inferExpression(isExpression.operand, const UnknownType(), false);
-    return inferrer.coreTypes.boolClass.rawType;
+
+    inferrer.listener.isNotExpressionEnter(fileOffset, typeContext);
+    inferrer.inferExpression(factory, judgment, const UnknownType(), false);
+    inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferrer.listener
+        .isNotExpressionExit(fileOffset, isExpression.type, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a labeled statement in kernel form.
-class ShadowLabeledStatement extends LabeledStatement
-    implements ShadowStatement {
-  ShadowLabeledStatement(Statement body) : super(body);
+class LabeledStatementJudgment extends LabeledStatement
+    implements StatementJudgment {
+  LabeledStatementJudgment(Statement body) : super(body);
+
+  StatementJudgment get judgment => body;
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    inferrer.inferStatement(body);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.labeledStatementEnter(fileOffset);
+    inferrer.inferStatement(factory, judgment);
+    inferrer.listener.labeledStatementExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a list literal in kernel form.
-class ShadowListLiteral extends ListLiteral implements ShadowExpression {
+class ShadowListLiteral extends ListLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
   final DartType _declaredTypeArgument;
 
   ShadowListLiteral(List<Expression> expressions,
@@ -1282,7 +1601,11 @@
             isConst: isConst);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.listLiteralEnter(fileOffset, typeContext);
     var listClass = inferrer.coreTypes.listClass;
     var listType = listClass.thisType;
     List<DartType> inferredTypes;
@@ -1306,7 +1629,7 @@
     }
     if (inferenceNeeded || typeChecksNeeded) {
       for (var expression in expressions) {
-        var expressionType = inferrer.inferExpression(expression,
+        var expressionType = inferrer.inferExpression(factory, expression,
             inferredTypeArgument, inferenceNeeded || typeChecksNeeded);
         if (inferenceNeeded) {
           formalTypes.add(listType.typeArguments[0]);
@@ -1333,26 +1656,37 @@
             expressions[i].fileOffset);
       }
     }
-    return new InterfaceType(listClass, [inferredTypeArgument]);
+    var inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
+    inferrer.listener.listLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Shadow object for [LogicalExpression].
 class ShadowLogicalExpression extends LogicalExpression
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowLogicalExpression(Expression left, String operator, Expression right)
       : super(left, operator, right);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.logicalExpressionEnter(fileOffset, typeContext);
     var boolType = inferrer.coreTypes.boolClass.rawType;
     var leftType =
-        inferrer.inferExpression(left, boolType, !inferrer.isTopLevel);
-    var rightType =
-        inferrer.inferExpression(right, boolType, !inferrer.isTopLevel);
+        inferrer.inferExpression(factory, left, boolType, !inferrer.isTopLevel);
+    inferrer.listener.logicalExpressionBeforeRhs(fileOffset);
+    var rightType = inferrer.inferExpression(
+        factory, right, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, leftType, left, left.fileOffset);
     inferrer.ensureAssignable(boolType, rightType, right, right.fileOffset);
-    return boolType;
+    var inferredType = boolType;
+    inferrer.listener.logicalExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1362,15 +1696,19 @@
 /// elsewhere, so it is desugared into a for-in loop that assigns to the
 /// variable at the top of the loop body.
 class ShadowLoopAssignmentStatement extends ExpressionStatement
-    implements ShadowStatement {
+    implements StatementJudgment {
   ShadowLoopAssignmentStatement(Expression expression) : super(expression);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {}
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {}
 }
 
 /// Shadow object for [MapLiteral].
-class ShadowMapLiteral extends MapLiteral implements ShadowExpression {
+class ShadowMapLiteral extends MapLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
   final DartType _declaredKeyType;
   final DartType _declaredValueType;
 
@@ -1384,7 +1722,11 @@
             isConst: isConst);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.mapLiteralEnter(fileOffset, typeContext);
     var mapClass = inferrer.coreTypes.mapClass;
     var mapType = mapClass.thisType;
     List<DartType> inferredTypes;
@@ -1412,10 +1754,10 @@
     }
     if (inferenceNeeded || typeChecksNeeded) {
       for (var entry in entries) {
-        var keyType = inferrer.inferExpression(
-            entry.key, inferredKeyType, inferenceNeeded || typeChecksNeeded);
-        var valueType = inferrer.inferExpression(entry.value, inferredValueType,
-            inferenceNeeded || typeChecksNeeded);
+        var keyType = inferrer.inferExpression(factory, entry.key,
+            inferredKeyType, inferenceNeeded || typeChecksNeeded);
+        var valueType = inferrer.inferExpression(factory, entry.value,
+            inferredValueType, inferenceNeeded || typeChecksNeeded);
         if (inferenceNeeded) {
           formalTypes.addAll(mapType.typeArguments);
         }
@@ -1453,7 +1795,10 @@
             valueType, actualTypes[2 * i + 1], value, value.fileOffset);
       }
     }
-    return new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
+    var inferredType =
+        new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
+    inferrer.listener.mapLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1480,7 +1825,9 @@
 
 /// Shadow object for [MethodInvocation].
 class ShadowMethodInvocation extends MethodInvocation
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   /// Indicates whether this method invocation is a call to a `call` method
   /// resulting from the invocation of a function expression.
   final bool _isImplicitCall;
@@ -1491,9 +1838,12 @@
         super(receiver, name, arguments, interfaceTarget);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
     return inferrer.inferMethodInvocation(
-        this, receiver, fileOffset, _isImplicitCall, typeContext,
+        factory, this, receiver, fileOffset, _isImplicitCall, typeContext,
         desugaredInvocation: this);
   }
 }
@@ -1507,31 +1857,46 @@
 /// kernel expression:
 ///
 ///     let f = () { ... } in f
-class ShadowNamedFunctionExpression extends Let implements ShadowExpression {
+class ShadowNamedFunctionExpression extends Let implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowNamedFunctionExpression(VariableDeclaration variable)
       : super(variable, new VariableGet(variable));
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    var inferredType =
-        inferrer.inferExpression(variable.initializer, typeContext, true);
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.namedFunctionExpressionEnter(fileOffset, typeContext);
+    var inferredType = inferrer.inferExpression(
+        factory, variable.initializer, typeContext, true);
     if (inferrer.strongMode) variable.type = inferredType;
+    inferrer.listener.namedFunctionExpressionExit(fileOffset, inferredType);
     return inferredType;
   }
 }
 
 /// Shadow object for [Not].
-class ShadowNot extends Not implements ShadowExpression {
+class ShadowNot extends Not implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowNot(Expression operand) : super(operand);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.notEnter(fileOffset, typeContext);
     // First infer the receiver so we can look up the method that was invoked.
     var boolType = inferrer.coreTypes.boolClass.rawType;
-    var actualType =
-        inferrer.inferExpression(operand, boolType, !inferrer.isTopLevel);
+    var actualType = inferrer.inferExpression(
+        factory, operand, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, actualType, operand, fileOffset);
-    return boolType;
+    DartType inferredType = boolType;
+    inferrer.listener.notExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1541,7 +1906,10 @@
 /// expression:
 ///
 ///     let v = a in v == null ? null : v.b(...)
-class ShadowNullAwareMethodInvocation extends Let implements ShadowExpression {
+class ShadowNullAwareMethodInvocation extends Let
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowNullAwareMethodInvocation(VariableDeclaration variable, Expression body)
       : super(variable, body);
 
@@ -1551,9 +1919,12 @@
   MethodInvocation get _desugaredInvocation => body.otherwise;
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
     var inferredType = inferrer.inferMethodInvocation(
-        this, variable.initializer, fileOffset, false, typeContext,
+        factory, this, variable.initializer, fileOffset, false, typeContext,
         receiverVariable: variable, desugaredInvocation: _desugaredInvocation);
     if (inferrer.strongMode) {
       body.staticType = inferredType;
@@ -1568,8 +1939,10 @@
 /// expression:
 ///
 ///     let v = a in v == null ? null : v.b
-class ShadowNullAwarePropertyGet extends Let implements ShadowExpression {
-  ShadowNullAwarePropertyGet(
+class NullAwarePropertyGetJudgment extends Let implements ExpressionJudgment {
+  DartType inferredType;
+
+  NullAwarePropertyGetJudgment(
       VariableDeclaration variable, ConditionalExpression body)
       : super(variable, body);
 
@@ -1578,10 +1951,15 @@
 
   PropertyGet get _desugaredGet => body.otherwise;
 
+  ExpressionJudgment get receiverJudgment => variable.initializer;
+
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    var inferredType = inferrer.inferPropertyGet(
-        this, variable.initializer, fileOffset, typeContext,
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.inferPropertyGet(
+        factory, this, receiverJudgment, fileOffset, typeContext,
         receiverVariable: variable, desugaredGet: _desugaredGet);
     if (inferrer.strongMode) {
       body.staticType = inferredType;
@@ -1591,10 +1969,19 @@
 }
 
 /// Concrete shadow object representing a null literal in kernel form.
-class ShadowNullLiteral extends NullLiteral implements ShadowExpression {
+class NullJudgment extends NullLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.coreTypes.nullClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.nullLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.nullClass.rawType;
+    inferrer.listener
+        .nullLiteralExit(fileOffset, fileOffset == -1, inferredType);
+    return inferredType;
   }
 }
 
@@ -1660,9 +2047,13 @@
   }
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    var receiverType = _inferReceiver(inferrer);
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    var receiverType = _inferReceiver(inferrer, factory);
 
+    inferrer.listener.propertyAssignEnter(write.fileOffset, typeContext);
     DartType readType;
     if (read != null) {
       var readMember =
@@ -1680,38 +2071,55 @@
     // member.  TODO(paulberry): would it be better to use the read member when
     // doing compound assignment?
     var writeContext = inferrer.getSetterType(writeMember, receiverType);
-    var inferredResult = _inferRhs(inferrer, readType, writeContext);
+    var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
     if (inferrer.strongMode) nullAwareGuard?.staticType = inferredResult.type;
+    inferrer.listener.propertyAssignExit(
+        write.fileOffset,
+        inferrer.getRealTarget(writeMember),
+        writeContext,
+        inferredResult.combiner,
+        inferredResult.type);
     _replaceWithDesugared();
     return inferredResult.type;
   }
 }
 
 /// Shadow object for [PropertyGet].
-class ShadowPropertyGet extends PropertyGet implements ShadowExpression {
-  ShadowPropertyGet(Expression receiver, Name name, [Member interfaceTarget])
+class PropertyGetJudgment extends PropertyGet implements ExpressionJudgment {
+  DartType inferredType;
+
+  PropertyGetJudgment(Expression receiver, Name name, [Member interfaceTarget])
       : super(receiver, name, interfaceTarget);
 
-  ShadowPropertyGet.byReference(
+  PropertyGetJudgment.byReference(
       Expression receiver, Name name, Reference interfaceTargetReference)
       : super.byReference(receiver, name, interfaceTargetReference);
 
+  ExpressionJudgment get receiverJudgment => receiver;
+
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.inferPropertyGet(this, receiver, fileOffset, typeContext,
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.inferPropertyGet(
+        factory, this, receiverJudgment, fileOffset, typeContext,
         desugaredGet: this);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a redirecting initializer in kernel
 /// form.
 class ShadowRedirectingInitializer extends RedirectingInitializer
-    implements ShadowInitializer {
+    implements InitializerJudgment {
   ShadowRedirectingInitializer(Constructor target, Arguments arguments)
       : super(target, arguments);
 
   @override
-  _inferInitializer(ShadowTypeInferrer inferrer) {
+  infer<Expression, Statement, Initializer, Type>(ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.redirectingInitializerEnter(fileOffset, target);
     List<TypeParameter> classTypeParameters =
         target.enclosingClass.typeParameters;
     List<DartType> typeArguments =
@@ -1719,51 +2127,73 @@
     for (int i = 0; i < typeArguments.length; i++) {
       typeArguments[i] = new TypeParameterType(classTypeParameters[i]);
     }
-    ShadowArguments.setNonInferrableArgumentTypes(arguments, typeArguments);
-    inferrer.inferInvocation(null, fileOffset, target.function.functionType,
-        target.enclosingClass.thisType, arguments,
+    ArgumentsJudgment.setNonInferrableArgumentTypes(arguments, typeArguments);
+    inferrer.inferInvocation(factory, null, fileOffset,
+        target.function.functionType, target.enclosingClass.thisType, arguments,
         skipTypeArgumentInference: true);
-    ShadowArguments.removeNonInferrableArgumentTypes(arguments);
+    ArgumentsJudgment.removeNonInferrableArgumentTypes(arguments);
+    inferrer.listener.redirectingInitializerExit(fileOffset);
   }
 }
 
 /// Shadow object for [Rethrow].
-class ShadowRethrow extends Rethrow implements ShadowExpression {
+class ShadowRethrow extends Rethrow implements ExpressionJudgment {
+  DartType inferredType;
+
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return const BottomType();
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.rethrowEnter(fileOffset, typeContext);
+    var inferredType = const BottomType();
+    inferrer.listener.rethrowExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a return statement in kernel form.
-class ShadowReturnStatement extends ReturnStatement implements ShadowStatement {
-  ShadowReturnStatement([Expression expression]) : super(expression);
+class ReturnJudgment extends ReturnStatement implements StatementJudgment {
+  ReturnJudgment([Expression expression]) : super(expression);
+
+  ExpressionJudgment get judgment => expression;
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.returnStatementEnter(fileOffset);
+    var judgment = this.judgment;
     var closureContext = inferrer.closureContext;
     var typeContext = !closureContext.isGenerator
         ? closureContext.returnOrYieldContext
         : const UnknownType();
-    var inferredType = expression != null
-        ? inferrer.inferExpression(expression, typeContext, true)
-        : const VoidType();
+    DartType inferredType;
+    if (expression != null) {
+      inferrer.inferExpression(factory, judgment, typeContext, true);
+      inferredType = judgment.inferredType;
+    } else {
+      inferredType = const VoidType();
+    }
     // Analyzer treats bare `return` statements as having no effect on the
     // inferred type of the closure.  TODO(paulberry): is this what we want
     // for Fasta?
-    if (expression != null) {
+    if (judgment != null) {
       closureContext.handleReturn(
           inferrer, inferredType, expression, fileOffset);
     }
+    inferrer.listener.returnStatementExit(fileOffset);
   }
 }
 
 /// Common base class for shadow objects representing statements in kernel
 /// form.
-abstract class ShadowStatement extends Statement {
+abstract class StatementJudgment extends Statement {
   /// Calls back to [inferrer] to perform type inference for whatever concrete
-  /// type of [ShadowStatement] this is.
-  void _inferStatement(ShadowTypeInferrer inferrer);
+  /// type of [StatementJudgment] this is.
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> statement);
 }
 
 /// Concrete shadow object representing an assignment to a static variable.
@@ -1777,7 +2207,11 @@
   }
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.staticAssignEnter(this.write?.fileOffset, typeContext);
     DartType readType = const DynamicType(); // Only used in error recovery
     var read = this.read;
     if (read is StaticGet) {
@@ -1795,7 +2229,9 @@
         writeMember.inferenceNode = null;
       }
     }
-    var inferredResult = _inferRhs(inferrer, readType, writeContext);
+    var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
+    inferrer.listener.staticAssignExit(write?.fileOffset, writeMember,
+        writeContext, inferredResult.combiner, inferredResult.type);
     _replaceWithDesugared();
     return inferredResult.type;
   }
@@ -1803,11 +2239,17 @@
 
 /// Concrete shadow object representing a read of a static variable in kernel
 /// form.
-class ShadowStaticGet extends StaticGet implements ShadowExpression {
-  ShadowStaticGet(Member target) : super(target);
+class StaticGetJudgment extends StaticGet implements ExpressionJudgment {
+  DartType inferredType;
+
+  StaticGetJudgment(Member target) : super(target);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.staticGetEnter(fileOffset, typeContext);
     var target = this.target;
     if (target is ShadowField && target.inferenceNode != null) {
       target.inferenceNode.resolve();
@@ -1817,63 +2259,101 @@
     if (target is Procedure && target.kind == ProcedureKind.Method) {
       type = inferrer.instantiateTearOff(type, typeContext, this);
     }
-    return type;
+    inferredType = type;
+    inferrer.listener.staticGetExit(fileOffset, target, inferredType);
+    return inferredType;
   }
 }
 
 /// Shadow object for [StaticInvocation].
 class ShadowStaticInvocation extends StaticInvocation
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowStaticInvocation(Procedure target, Arguments arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.staticInvocationEnter(
+        this.fileOffset, arguments.fileOffset, typeContext);
     var calleeType = target.function.functionType;
-    return inferrer.inferInvocation(
-        typeContext, fileOffset, calleeType, calleeType.returnType, arguments);
+    var inferredType = inferrer.inferInvocation(factory, typeContext,
+        fileOffset, calleeType, calleeType.returnType, arguments);
+    inferrer.listener.staticInvocationExit(
+        fileOffset,
+        target,
+        arguments.types,
+        inferrer.lastCalleeType,
+        inferrer.lastInferredSubstitution,
+        inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a string concatenation in kernel form.
 class ShadowStringConcatenation extends StringConcatenation
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowStringConcatenation(List<Expression> expressions) : super(expressions);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.stringConcatenationEnter(fileOffset, typeContext);
     if (!inferrer.isTopLevel) {
-      for (Expression expression in expressions) {
-        inferrer.inferExpression(expression, const UnknownType(), false);
+      for (kernel.Expression expression in expressions) {
+        inferrer.inferExpression(
+            factory, expression, const UnknownType(), false);
       }
     }
-    return inferrer.coreTypes.stringClass.rawType;
+    var inferredType = inferrer.coreTypes.stringClass.rawType;
+    inferrer.listener.stringConcatenationExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a string literal in kernel form.
-class ShadowStringLiteral extends StringLiteral implements ShadowExpression {
+class ShadowStringLiteral extends StringLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowStringLiteral(String value) : super(value);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.coreTypes.stringClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.stringLiteralEnter(fileOffset, typeContext);
+    var inferredType = inferrer.coreTypes.stringClass.rawType;
+    inferrer.listener.stringLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a super initializer in kernel form.
 class ShadowSuperInitializer extends SuperInitializer
-    implements ShadowInitializer {
+    implements InitializerJudgment {
   ShadowSuperInitializer(Constructor target, Arguments arguments)
       : super(target, arguments);
 
   @override
-  void _inferInitializer(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.superInitializerEnter(fileOffset);
     var substitution = Substitution.fromSupertype(inferrer.classHierarchy
         .getClassAsInstanceOf(
             inferrer.thisType.classNode, target.enclosingClass));
     inferrer.inferInvocation(
+        factory,
         null,
         fileOffset,
         substitution
@@ -1881,24 +2361,30 @@
         inferrer.thisType,
         arguments,
         skipTypeArgumentInference: true);
+    inferrer.listener.superInitializerExit(fileOffset);
   }
 }
 
 /// Shadow object for [SuperMethodInvocation].
 class ShadowSuperMethodInvocation extends SuperMethodInvocation
-    implements ShadowExpression {
+    implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowSuperMethodInvocation(Name name, Arguments arguments,
       [Procedure interfaceTarget])
       : super(name, arguments, interfaceTarget);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
     if (interfaceTarget != null) {
       inferrer.instrumentation?.record(inferrer.uri, fileOffset, 'target',
           new InstrumentationValueForMember(interfaceTarget));
     }
     return inferrer.inferMethodInvocation(
-        this, null, fileOffset, false, typeContext,
+        factory, this, null, fileOffset, false, typeContext,
         interfaceMember: interfaceTarget,
         methodName: name,
         arguments: arguments);
@@ -1906,47 +2392,67 @@
 }
 
 /// Shadow object for [SuperPropertyGet].
-class ShadowSuperPropertyGet extends SuperPropertyGet
-    implements ShadowExpression {
-  ShadowSuperPropertyGet(Name name, [Member interfaceTarget])
+class SuperPropertyGetJudgment extends SuperPropertyGet
+    implements ExpressionJudgment {
+  DartType inferredType;
+
+  SuperPropertyGetJudgment(Name name, [Member interfaceTarget])
       : super(name, interfaceTarget);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
     if (interfaceTarget != null) {
       inferrer.instrumentation?.record(inferrer.uri, fileOffset, 'target',
           new InstrumentationValueForMember(interfaceTarget));
     }
-    return inferrer.inferPropertyGet(this, null, fileOffset, typeContext,
+    inferrer.inferPropertyGet(factory, this, null, fileOffset, typeContext,
         interfaceMember: interfaceTarget, propertyName: name);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a switch statement in kernel form.
-class ShadowSwitchStatement extends SwitchStatement implements ShadowStatement {
+class ShadowSwitchStatement extends SwitchStatement
+    implements StatementJudgment {
   ShadowSwitchStatement(Expression expression, List<SwitchCase> cases)
       : super(expression, cases);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    var expressionType =
-        inferrer.inferExpression(expression, const UnknownType(), true);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.switchStatementEnter(fileOffset);
+    var expressionType = inferrer.inferExpression(
+        factory, expression, const UnknownType(), true);
     for (var switchCase in cases) {
       for (var caseExpression in switchCase.expressions) {
-        inferrer.inferExpression(caseExpression, expressionType, false);
+        inferrer.inferExpression(
+            factory, caseExpression, expressionType, false);
       }
-      inferrer.inferStatement(switchCase.body);
+      inferrer.inferStatement(factory, switchCase.body);
     }
+    inferrer.listener.switchStatementExit(fileOffset);
   }
 }
 
 /// Shadow object for [SymbolLiteral].
-class ShadowSymbolLiteral extends SymbolLiteral implements ShadowExpression {
+class ShadowSymbolLiteral extends SymbolLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowSymbolLiteral(String value) : super(value);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.coreTypes.symbolClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.symbolLiteralEnter(fileOffset, typeContext);
+    var inferredType = inferrer.coreTypes.symbolClass.rawType;
+    inferrer.listener.symbolLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1955,7 +2461,9 @@
 ///
 /// These expressions are removed by type inference and replaced with their
 /// desugared equivalents.
-class ShadowSyntheticExpression extends Let implements ShadowExpression {
+class ShadowSyntheticExpression extends Let implements ExpressionJudgment {
+  DartType inferredType;
+
   ShadowSyntheticExpression(Expression desugared)
       : super(new VariableDeclaration('_', initializer: new NullLiteral()),
             desugared);
@@ -1969,7 +2477,10 @@
   }
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
     _replaceWithDesugared();
     return const DynamicType();
   }
@@ -2013,47 +2524,79 @@
   }
 }
 
-/// Shadow object for [ThisExpression].
-class ShadowThisExpression extends ThisExpression implements ShadowExpression {
+class ThisJudgment extends ThisExpression implements ExpressionJudgment {
+  DartType inferredType;
+
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return (inferrer.thisType ?? const DynamicType());
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.thisExpressionEnter(fileOffset, typeContext);
+    inferredType = inferrer.thisType ?? const DynamicType();
+    inferrer.listener.thisExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
-/// Shadow object for [Throw].
-class ShadowThrow extends Throw implements ShadowExpression {
-  ShadowThrow(Expression expression) : super(expression);
+class ThrowJudgment extends Throw implements ExpressionJudgment {
+  DartType inferredType;
+
+  ExpressionJudgment get judgment => expression;
+
+  ThrowJudgment(Expression expression) : super(expression);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    inferrer.inferExpression(expression, const UnknownType(), false);
-    return const BottomType();
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.throwEnter(fileOffset, typeContext);
+    inferrer.inferExpression(factory, judgment, const UnknownType(), false);
+    inferredType = const BottomType();
+    inferrer.listener.throwExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a try-catch block in kernel form.
-class ShadowTryCatch extends TryCatch implements ShadowStatement {
+class ShadowTryCatch extends TryCatch implements StatementJudgment {
   ShadowTryCatch(Statement body, List<Catch> catches) : super(body, catches);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    inferrer.inferStatement(body);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.tryCatchEnter(fileOffset);
+    inferrer.inferStatement(factory, body);
     for (var catch_ in catches) {
-      inferrer.inferStatement(catch_.body);
+      inferrer.listener.catchStatementEnter(
+          catch_.fileOffset,
+          catch_.guard,
+          catch_.exception?.fileOffset,
+          catch_.exception?.type,
+          catch_.stackTrace?.fileOffset,
+          catch_.stackTrace?.type);
+      inferrer.inferStatement(factory, catch_.body);
+      inferrer.listener.catchStatementExit(catch_.fileOffset);
     }
+    inferrer.listener.tryCatchExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a try-finally block in kernel form.
-class ShadowTryFinally extends TryFinally implements ShadowStatement {
+class ShadowTryFinally extends TryFinally implements StatementJudgment {
   ShadowTryFinally(Statement body, Statement finalizer)
       : super(body, finalizer);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    inferrer.inferStatement(body);
-    inferrer.inferStatement(finalizer);
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.tryFinallyEnter(fileOffset);
+    inferrer.inferStatement(factory, body);
+    inferrer.inferStatement(factory, finalizer);
+    inferrer.listener.tryFinallyExit(fileOffset);
   }
 }
 
@@ -2069,15 +2612,21 @@
 
   @override
   ShadowTypeInferrer createLocalTypeInferrer(
-      Uri uri, InterfaceType thisType, SourceLibraryBuilder library) {
-    return new ShadowTypeInferrer._(this, uri, false, thisType, library);
+      Uri uri,
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      SourceLibraryBuilder library) {
+    return new ShadowTypeInferrer._(
+        this, uri, listener, false, thisType, library);
   }
 
   @override
   ShadowTypeInferrer createTopLevelTypeInferrer(
-      InterfaceType thisType, ShadowField field) {
-    return field._typeInferrer =
-        new ShadowTypeInferrer._(this, field.fileUri, true, thisType, null);
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      ShadowField field) {
+    return field._typeInferrer = new ShadowTypeInferrer._(
+        this, field.fileUri, listener, true, thisType, null);
   }
 
   @override
@@ -2092,10 +2641,15 @@
   @override
   final typePromoter;
 
-  ShadowTypeInferrer._(ShadowTypeInferenceEngine engine, Uri uri, bool topLevel,
-      InterfaceType thisType, SourceLibraryBuilder library)
+  ShadowTypeInferrer._(
+      ShadowTypeInferenceEngine engine,
+      Uri uri,
+      TypeInferenceListener<int, int, Node, int> listener,
+      bool topLevel,
+      InterfaceType thisType,
+      SourceLibraryBuilder library)
       : typePromoter = new ShadowTypePromoter(engine.typeSchemaEnvironment),
-        super(engine, uri, topLevel, thisType, library);
+        super(engine, uri, listener, topLevel, thisType, library);
 
   @override
   Expression getFieldInitializer(ShadowField field) {
@@ -2103,8 +2657,11 @@
   }
 
   @override
-  DartType inferExpression(
-      Expression expression, DartType typeContext, bool typeNeeded) {
+  DartType inferExpression<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Expression expression,
+      DartType typeContext,
+      bool typeNeeded) {
     // `null` should never be used as the type context.  An instance of
     // `UnknownType` should be used instead.
     assert(typeContext != null);
@@ -2123,13 +2680,14 @@
     // those subexpressions.
     if (!typeNeeded && isTopLevel) return null;
 
-    if (expression is ShadowExpression) {
+    if (expression is ExpressionJudgment) {
       // Use polymorphic dispatch on [KernelExpression] to perform whatever kind
       // of type inference is correct for this kind of statement.
       // TODO(paulberry): experiment to see if dynamic dispatch would be better,
       // so that the type hierarchy will be simpler (which may speed up "is"
       // checks).
-      return expression._inferExpression(this, typeContext);
+      return expression.inferredType =
+          expression.infer(this, factory, typeContext);
     } else {
       // Encountered an expression type for which type inference is not yet
       // implemented, so just infer dynamic for now.
@@ -2140,38 +2698,47 @@
   }
 
   @override
-  DartType inferFieldTopLevel(ShadowField field, bool typeNeeded) {
+  DartType inferFieldTopLevel<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      ShadowField field,
+      bool typeNeeded) {
     if (field.initializer == null) return const DynamicType();
-    return inferExpression(field.initializer, const UnknownType(), typeNeeded);
+    return inferExpression(
+        factory, field.initializer, const UnknownType(), typeNeeded);
   }
 
   @override
-  void inferInitializer(InferenceHelper helper, Initializer initializer) {
-    assert(initializer is ShadowInitializer);
+  void inferInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Initializer initializer) {
+    assert(initializer is InitializerJudgment);
     this.helper = helper;
     // Use polymorphic dispatch on [KernelInitializer] to perform whatever
     // kind of type inference is correct for this kind of initializer.
     // TODO(paulberry): experiment to see if dynamic dispatch would be better,
     // so that the type hierarchy will be simpler (which may speed up "is"
     // checks).
-    ShadowInitializer kernelInitializer = initializer;
-    kernelInitializer._inferInitializer(this);
+    InitializerJudgment kernelInitializer = initializer;
+    kernelInitializer.infer(this, factory);
     this.helper = null;
   }
 
   @override
-  void inferStatement(Statement statement) {
+  void inferStatement<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      Statement statement) {
     // For full (non-top level) inference, we need access to the
     // ExpressionGeneratorHelper so that we can perform error recovery.
     if (!isTopLevel) assert(helper != null);
 
-    if (statement is ShadowStatement) {
+    if (statement is StatementJudgment) {
       // Use polymorphic dispatch on [KernelStatement] to perform whatever kind
       // of type inference is correct for this kind of statement.
       // TODO(paulberry): experiment to see if dynamic dispatch would be better,
       // so that the type hierarchy will be simpler (which may speed up "is"
       // checks).
-      return statement._inferStatement(this);
+      return statement.infer(this, factory);
     } else {
       // Encountered a statement type for which type inference is not yet
       // implemented, so just skip it for now.
@@ -2181,13 +2748,20 @@
   }
 }
 
-/// Shadow object for [TypeLiteral].
-class ShadowTypeLiteral extends TypeLiteral implements ShadowExpression {
-  ShadowTypeLiteral(DartType type) : super(type);
+class TypeLiteralJudgment extends TypeLiteral implements ExpressionJudgment {
+  DartType inferredType;
+
+  TypeLiteralJudgment(DartType type) : super(type);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return inferrer.coreTypes.typeClass.rawType;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.typeLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.typeClass.rawType;
+    inferrer.listener.typeLiteralExit(fileOffset, type, inferredType);
+    return inferredType;
   }
 }
 
@@ -2199,7 +2773,7 @@
 
   @override
   int getVariableFunctionNestingLevel(VariableDeclaration variable) {
-    if (variable is ShadowVariableDeclaration) {
+    if (variable is VariableDeclarationJudgment) {
       return variable._functionNestingLevel;
     } else {
       // Hack to deal with the fact that BodyBuilder still creates raw
@@ -2212,8 +2786,8 @@
 
   @override
   bool isPromotionCandidate(VariableDeclaration variable) {
-    assert(variable is ShadowVariableDeclaration);
-    ShadowVariableDeclaration kernelVariableDeclaration = variable;
+    assert(variable is VariableDeclarationJudgment);
+    VariableDeclarationJudgment kernelVariableDeclaration = variable;
     return !kernelVariableDeclaration._isLocalFunction;
   }
 
@@ -2224,7 +2798,7 @@
 
   @override
   void setVariableMutatedAnywhere(VariableDeclaration variable) {
-    if (variable is ShadowVariableDeclaration) {
+    if (variable is VariableDeclarationJudgment) {
       variable._mutatedAnywhere = true;
     } else {
       // Hack to deal with the fact that BodyBuilder still creates raw
@@ -2236,7 +2810,7 @@
 
   @override
   void setVariableMutatedInClosure(VariableDeclaration variable) {
-    if (variable is ShadowVariableDeclaration) {
+    if (variable is VariableDeclarationJudgment) {
       variable._mutatedInClosure = true;
     } else {
       // Hack to deal with the fact that BodyBuilder still creates raw
@@ -2248,7 +2822,7 @@
 
   @override
   bool wasVariableMutatedAnywhere(VariableDeclaration variable) {
-    if (variable is ShadowVariableDeclaration) {
+    if (variable is VariableDeclarationJudgment) {
       return variable._mutatedAnywhere;
     } else {
       // Hack to deal with the fact that BodyBuilder still creates raw
@@ -2260,9 +2834,8 @@
   }
 }
 
-/// Concrete shadow object representing an assignment to a local variable.
-class ShadowVariableAssignment extends ShadowComplexAssignment {
-  ShadowVariableAssignment(Expression rhs) : super(rhs);
+class VariableAssignmentJudgment extends ShadowComplexAssignment {
+  VariableAssignmentJudgment(Expression rhs) : super(rhs);
 
   @override
   DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -2271,7 +2844,11 @@
   }
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    inferrer.listener.variableAssignEnter(this.write.fileOffset, typeContext);
     DartType readType;
     var read = this.read;
     if (read is VariableGet) {
@@ -2285,15 +2862,21 @@
         _storeLetType(inferrer, read, writeContext);
       }
     }
-    var inferredResult = _inferRhs(inferrer, readType, writeContext);
+    var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
+    inferrer.listener.variableAssignExit(
+        write.fileOffset,
+        writeContext,
+        write is VariableSet ? write.variable.fileOffset : null,
+        inferredResult.combiner,
+        inferredResult.type);
     _replaceWithDesugared();
-    return inferredResult.type;
+    return inferredType = inferredResult.type;
   }
 }
 
 /// Concrete shadow object representing a variable declaration in kernel form.
-class ShadowVariableDeclaration extends VariableDeclaration
-    implements ShadowStatement {
+class VariableDeclarationJudgment extends VariableDeclaration
+    implements StatementJudgment {
   final bool _implicitlyTyped;
 
   final int _functionNestingLevel;
@@ -2304,7 +2887,7 @@
 
   final bool _isLocalFunction;
 
-  ShadowVariableDeclaration(String name, this._functionNestingLevel,
+  VariableDeclarationJudgment(String name, this._functionNestingLevel,
       {Expression initializer,
       DartType type,
       bool isFinal: false,
@@ -2322,46 +2905,57 @@
             isFieldFormal: isFieldFormal,
             isCovariant: isCovariant);
 
-  ShadowVariableDeclaration.forEffect(
+  VariableDeclarationJudgment.forEffect(
       Expression initializer, this._functionNestingLevel)
       : _implicitlyTyped = false,
         _isLocalFunction = false,
         super.forValue(initializer);
 
-  ShadowVariableDeclaration.forValue(
+  VariableDeclarationJudgment.forValue(
       Expression initializer, this._functionNestingLevel)
       : _implicitlyTyped = true,
         _isLocalFunction = false,
         super.forValue(initializer);
 
-  @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
-    inferrer.inferMetadataKeepingHelper(annotations);
+  List<Expression> get annotationJudgments => annotations;
 
-    // After the inference was done on the annotations, we may clone them for
-    // this instance of VariableDeclaration in order to avoid having the same
-    // annotation node for two VariableDeclaration nodes in a situation like
-    // the following:
-    //
-    //     class Foo { const Foo(List<String> list); }
-    //
-    //     @Foo(const [])
-    //     var x, y;
-    CloneVisitor cloner = new CloneVisitor();
-    for (int i = 0; i < annotations.length; ++i) {
-      Expression annotation = annotations[i];
-      if (annotation.parent != this) {
-        annotations[i] = cloner.clone(annotation);
-        annotations[i].parent = this;
+  ExpressionJudgment get initializerJudgment => initializer;
+
+  @override
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.variableDeclarationEnter(fileOffset);
+    if (annotationJudgments.isNotEmpty) {
+      inferrer.inferMetadataKeepingHelper(factory, annotationJudgments);
+
+      // After the inference was done on the annotations, we may clone them for
+      // this instance of VariableDeclaration in order to avoid having the same
+      // annotation node for two VariableDeclaration nodes in a situation like
+      // the following:
+      //
+      //     class Foo { const Foo(List<String> list); }
+      //
+      //     @Foo(const [])
+      //     var x, y;
+      CloneVisitor cloner = new CloneVisitor();
+      for (int i = 0; i < annotations.length; ++i) {
+        kernel.Expression annotation = annotations[i];
+        if (annotation.parent != this) {
+          annotations[i] = cloner.clone(annotation);
+          annotations[i].parent = this;
+        }
       }
     }
 
+    var initializerJudgment = this.initializerJudgment;
     var declaredType = _implicitlyTyped ? const UnknownType() : type;
     DartType inferredType;
     DartType initializerType;
-    if (initializer != null) {
-      initializerType = inferrer.inferExpression(
-          initializer, declaredType, !inferrer.isTopLevel || _implicitlyTyped);
+    if (initializerJudgment != null) {
+      inferrer.inferExpression(factory, initializerJudgment, declaredType,
+          !inferrer.isTopLevel || _implicitlyTyped);
+      initializerType = initializerJudgment.inferredType;
       inferredType = inferrer.inferDeclarationType(initializerType);
     } else {
       inferredType = const DynamicType();
@@ -2378,40 +2972,61 @@
         initializer = replacedInitializer;
       }
     }
+    inferrer.listener.variableDeclarationExit(
+        fileOffset, type, _implicitlyTyped ? inferredType : type);
   }
 
-  /// Determine whether the given [ShadowVariableDeclaration] had an implicit
+  /// Determine whether the given [VariableDeclarationJudgment] had an implicit
   /// type.
   ///
   /// This is static to avoid introducing a method that would be visible to
   /// the kernel.
-  static bool isImplicitlyTyped(ShadowVariableDeclaration variable) =>
+  static bool isImplicitlyTyped(VariableDeclarationJudgment variable) =>
       variable._implicitlyTyped;
 
-  /// Determines whether the given [ShadowVariableDeclaration] represents a
+  /// Determines whether the given [VariableDeclarationJudgment] represents a
   /// local function.
   ///
   /// This is static to avoid introducing a method that would be visible to the
   /// kernel.
-  static bool isLocalFunction(ShadowVariableDeclaration variable) =>
+  static bool isLocalFunction(VariableDeclarationJudgment variable) =>
       variable._isLocalFunction;
 }
 
 /// Concrete shadow object representing a read from a variable in kernel form.
-class ShadowVariableGet extends VariableGet implements ShadowExpression {
+class VariableGetJudgment extends VariableGet implements ExpressionJudgment {
+  DartType inferredType;
+
   final TypePromotionFact _fact;
 
   final TypePromotionScope _scope;
 
-  ShadowVariableGet(VariableDeclaration variable, this._fact, this._scope)
+  VariableGetJudgment(VariableDeclaration variable, this._fact, this._scope)
       : super(variable);
 
+  /// Return `true` if the given [variable] declaration occurs in a let
+  /// expression that is, or is part of, a cascade expression.
+  bool _isInCascade() {
+    TreeNode ancestor = variable.parent;
+    while (ancestor is Let) {
+      if (ancestor is ShadowCascadeExpression) {
+        return true;
+      }
+      ancestor = ancestor.parent;
+    }
+    return false;
+  }
+
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    var variable = this.variable as ShadowVariableDeclaration;
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    VariableDeclarationJudgment variable = this.variable;
     bool mutatedInClosure = variable._mutatedInClosure;
     DartType declaredOrInferredType = variable.type;
 
+    inferrer.listener.variableGetEnter(fileOffset, typeContext);
     DartType promotedType = inferrer.typePromoter
         .computePromotedType(_fact, _scope, mutatedInClosure);
     if (promotedType != null) {
@@ -2423,35 +3038,47 @@
     if (variable._isLocalFunction) {
       type = inferrer.instantiateTearOff(type, typeContext, this);
     }
-    return type;
+    inferredType = type;
+    inferrer.listener.variableGetExit(
+        fileOffset, _isInCascade(), variable.fileOffset, inferredType);
+    return inferredType;
   }
 }
 
 /// Concrete shadow object representing a while loop in kernel form.
-class ShadowWhileStatement extends WhileStatement implements ShadowStatement {
+class ShadowWhileStatement extends WhileStatement implements StatementJudgment {
   ShadowWhileStatement(Expression condition, Statement body)
       : super(condition, body);
 
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.whileStatementEnter(fileOffset);
     var expectedType = inferrer.coreTypes.boolClass.rawType;
-    var actualType =
-        inferrer.inferExpression(condition, expectedType, !inferrer.isTopLevel);
+    var actualType = inferrer.inferExpression(
+        factory, condition, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
         expectedType, actualType, condition, condition.fileOffset);
-    inferrer.inferStatement(body);
+    inferrer.inferStatement(factory, body);
+    inferrer.listener.whileStatementExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a yield statement in kernel form.
-class ShadowYieldStatement extends YieldStatement implements ShadowStatement {
-  ShadowYieldStatement(Expression expression, {bool isYieldStar: false})
+class YieldJudgment extends YieldStatement implements StatementJudgment {
+  YieldJudgment(Expression expression, {bool isYieldStar: false})
       : super(expression, isYieldStar: isYieldStar);
 
+  ExpressionJudgment get judgment => expression;
+
   @override
-  void _inferStatement(ShadowTypeInferrer inferrer) {
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.yieldStatementEnter(fileOffset);
+    var judgment = this.judgment;
     var closureContext = inferrer.closureContext;
-    DartType inferredType;
     if (closureContext.isGenerator) {
       var typeContext = closureContext.returnOrYieldContext;
       if (isYieldStar && typeContext != null) {
@@ -2461,37 +3088,55 @@
                 ? inferrer.coreTypes.streamClass
                 : inferrer.coreTypes.iterableClass);
       }
-      inferredType = inferrer.inferExpression(expression, typeContext, true);
+      inferrer.inferExpression(factory, judgment, typeContext, true);
     } else {
-      inferredType =
-          inferrer.inferExpression(expression, const UnknownType(), true);
+      inferrer.inferExpression(factory, judgment, const UnknownType(), true);
     }
     closureContext.handleYield(
-        inferrer, isYieldStar, inferredType, expression, fileOffset);
+        inferrer, isYieldStar, judgment.inferredType, expression, fileOffset);
+    inferrer.listener.yieldStatementExit(fileOffset);
   }
 }
 
 /// Concrete shadow object representing a deferred load library call.
-class ShadowLoadLibrary extends LoadLibrary implements ShadowExpression {
-  ShadowLoadLibrary(LibraryDependency import) : super(import);
+class LoadLibraryJudgment extends LoadLibrary implements ExpressionJudgment {
+  DartType inferredType;
+
+  LoadLibraryJudgment(LibraryDependency import) : super(import);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return super.getStaticType(inferrer.typeSchemaEnvironment);
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    return inferredType =
+        inferrer.typeSchemaEnvironment.futureType(const DynamicType());
   }
 }
 
 /// Concrete shadow object representing a deferred library-is-loaded check.
-class ShadowCheckLibraryIsLoaded extends CheckLibraryIsLoaded
-    implements ShadowExpression {
-  ShadowCheckLibraryIsLoaded(LibraryDependency import) : super(import);
+class CheckLibraryIsLoadedJudgment extends CheckLibraryIsLoaded
+    implements ExpressionJudgment {
+  DartType inferredType;
+
+  CheckLibraryIsLoadedJudgment(LibraryDependency import) : super(import);
 
   @override
-  DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) {
-    return super.getStaticType(inferrer.typeSchemaEnvironment);
+  DartType infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    return inferredType = inferrer.typeSchemaEnvironment.objectType;
   }
 }
 
+/// Concrete shadow object representing a named expression.
+class NamedExpressionJudgment extends NamedExpression {
+  NamedExpressionJudgment(String name, Expression value) : super(name, value);
+
+  ExpressionJudgment get judgment => value;
+}
+
 /// The result of inference for a RHS of an assignment.
 class _ComplexAssignmentInferenceResult {
   /// The resolved combiner [Procedure], e.g. `operator+` for `a += 2`, or
diff --git a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
new file mode 100644
index 0000000..54bc2a2
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
@@ -0,0 +1,412 @@
+// 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:front_end/src/scanner/token.dart' show Token;
+
+import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
+
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+import 'factory.dart' show Factory;
+
+import 'kernel_shadow_ast.dart'
+    show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+
+/// Implementation of [Factory] for use during top level type inference, when
+/// no representation of the code semantics needs to be created (only the type
+/// needs to be inferred).
+class ToplevelInferenceFactory implements Factory<void, void, void, void> {
+  const ToplevelInferenceFactory();
+
+  @override
+  void asExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      void expression,
+      Token asOperator,
+      void literalType,
+      DartType inferredType) {}
+
+  @override
+  void assertInitializer(
+      InitializerJudgment judgment,
+      int fileOffset,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis) {}
+
+  @override
+  void assertStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis,
+      Token semicolon) {}
+
+  @override
+  void awaitExpression(ExpressionJudgment judgment, int fileOffset,
+      Token awaitKeyword, void expression, DartType inferredType) {}
+
+  @override
+  void block(StatementJudgment judgment, int fileOffset, Token leftBracket,
+      void statements, Token rightBracket) {}
+
+  @override
+  void boolLiteral(ExpressionJudgment judgment, int fileOffset, Token literal,
+      bool value, DartType inferredType) {}
+
+  @override
+  void breakStatement(StatementJudgment judgment, int fileOffset,
+      Token breakKeyword, void label, Token semicolon) {}
+
+  @override
+  void cascadeExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  Object catchStatement(
+      Catch judgment,
+      int fileOffset,
+      Token onKeyword,
+      void type,
+      Token catchKeyword,
+      Token leftParenthesis,
+      Token exceptionParameter,
+      Token comma,
+      Token stackTraceParameter,
+      Token rightParenthesis,
+      void body,
+      DartType guardType,
+      int exceptionOffset,
+      DartType exceptionType,
+      int stackTraceOffset,
+      DartType stackTraceType) {
+    return judgment;
+  }
+
+  @override
+  void conditionalExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      void condition,
+      Token question,
+      void thenExpression,
+      Token colon,
+      void elseExpression,
+      DartType inferredType) {}
+
+  @override
+  void constructorInvocation(ExpressionJudgment judgment, int fileOffset,
+      Node expressionTarget, DartType inferredType) {}
+
+  @override
+  void continueStatement(StatementJudgment judgment, int fileOffset,
+      Token continueKeyword, void label, Token semicolon) {}
+
+  @override
+  void continueSwitchStatement(StatementJudgment judgment, int fileOffset,
+      Token continueKeyword, void label, Token semicolon) {}
+
+  @override
+  void deferredCheck(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void doStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token doKeyword,
+      void body,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      Token semicolon) {}
+
+  @override
+  void doubleLiteral(ExpressionJudgment judgment, int fileOffset, Token literal,
+      double value, DartType inferredType) {}
+
+  @override
+  void expressionStatement(StatementJudgment judgment, int fileOffset,
+      void expression, Token semicolon) {}
+
+  @override
+  void fieldInitializer(
+      InitializerJudgment judgment, int fileOffset, Node initializerField) {}
+
+  @override
+  void forInStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      int variableOffset,
+      DartType variableType,
+      int writeOffset,
+      DartType writeVariableType,
+      int writeVariableDeclarationOffset,
+      Node writeTarget) {}
+
+  @override
+  void forStatement(StatementJudgment judgment, int fileOffset) {}
+
+  @override
+  void functionDeclaration(
+      StatementJudgment judgment, int fileOffset, FunctionType inferredType) {}
+
+  @override
+  void functionExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void ifNull(ExpressionJudgment judgment, int fileOffset, void leftOperand,
+      Token operator, void rightOperand, DartType inferredType) {}
+
+  @override
+  void ifStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token ifKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void thenStatement,
+      Token elseKeyword,
+      void elseStatement) {}
+
+  @override
+  void indexAssign(ExpressionJudgment judgment, int fileOffset,
+      Node writeMember, Node combiner, DartType inferredType) {}
+
+  @override
+  void intLiteral(ExpressionJudgment judgment, int fileOffset, Token literal,
+      num value, DartType inferredType) {}
+
+  @override
+  void invalidInitializer(InitializerJudgment judgment, int fileOffset) {}
+
+  @override
+  void isExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      void expression,
+      Token isOperator,
+      void literalType,
+      DartType testedType,
+      DartType inferredType) {}
+
+  @override
+  void isNotExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      void expression,
+      Token isOperator,
+      Token notOperator,
+      void literalType,
+      DartType testedType,
+      DartType inferredType) {}
+
+  @override
+  void labeledStatement(StatementJudgment judgment, int fileOffset) {}
+
+  @override
+  void listLiteral(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void logicalExpression(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      void leftOperand,
+      Token operator,
+      void rightOperand,
+      DartType inferredType) {}
+
+  @override
+  void mapLiteral(
+      ExpressionJudgment judgment, int fileOffset, DartType typeContext) {}
+
+  @override
+  void methodInvocation(
+      ExpressionJudgment judgment,
+      int resultOffset,
+      List<DartType> argumentsTypes,
+      bool isImplicitCall,
+      Node interfaceMember,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType) {}
+
+  @override
+  void methodInvocationCall(
+      ExpressionJudgment judgment,
+      int resultOffset,
+      List<DartType> argumentsTypes,
+      bool isImplicitCall,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType) {}
+
+  @override
+  void namedFunctionExpression(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void not(ExpressionJudgment judgment, int fileOffset, Token operator,
+      void operand, DartType inferredType) {}
+
+  @override
+  void nullLiteral(ExpressionJudgment judgment, int fileOffset, Token literal,
+      bool isSynthetic, DartType inferredType) {}
+
+  @override
+  void propertyAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node writeMember,
+      DartType writeContext,
+      Node combiner,
+      DartType inferredType) {}
+
+  @override
+  void propertyGet(ExpressionJudgment judgment, int fileOffset, Node member,
+      DartType inferredType) {}
+
+  @override
+  void propertyGetCall(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void propertySet(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void redirectingInitializer(
+      InitializerJudgment judgment, int fileOffset, Node initializerTarget) {}
+
+  @override
+  void rethrow_(ExpressionJudgment judgment, int fileOffset,
+      Token rethrowKeyword, DartType inferredType) {}
+
+  @override
+  void returnStatement(StatementJudgment judgment, int fileOffset,
+      Token returnKeyword, void expression, Token semicolon) {}
+
+  @override
+  void staticAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node writeMember,
+      DartType writeContext,
+      Node combiner,
+      DartType inferredType) {}
+
+  @override
+  void staticGet(ExpressionJudgment judgment, int fileOffset,
+      Node expressionTarget, DartType inferredType) {}
+
+  @override
+  void staticInvocation(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Node expressionTarget,
+      List<DartType> expressionArgumentsTypes,
+      FunctionType calleeType,
+      Substitution substitution,
+      DartType inferredType) {}
+
+  @override
+  void storeClassReference(int fileOffset, Node reference, DartType rawType) {}
+
+  @override
+  void storePrefixInfo(int fileOffset, int prefixImportIndex) {}
+
+  @override
+  void stringConcatenation(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void stringLiteral(ExpressionJudgment judgment, int fileOffset, Token literal,
+      String value, DartType inferredType) {}
+
+  @override
+  void superInitializer(InitializerJudgment judgment, int fileOffset) {}
+
+  @override
+  void switchStatement(StatementJudgment judgment, int fileOffset) {}
+
+  @override
+  void symbolLiteral(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token poundSign,
+      List<Token> components,
+      String value,
+      DartType inferredType) {}
+
+  @override
+  void thisExpression(ExpressionJudgment judgment, int fileOffset,
+      Token thisKeyword, DartType inferredType) {}
+
+  @override
+  void throw_(ExpressionJudgment judgment, int fileOffset, Token throwKeyword,
+      void expression, DartType inferredType) {}
+
+  @override
+  void tryCatch(StatementJudgment judgment, int fileOffset) {}
+
+  @override
+  void tryFinally(StatementJudgment judgment, int fileOffset) {}
+
+  @override
+  void typeLiteral(ExpressionJudgment judgment, int fileOffset,
+      Node expressionType, DartType inferredType) {}
+
+  @override
+  void variableAssign(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      DartType writeContext,
+      int writeVariableDeclarationOffset,
+      Node combiner,
+      DartType inferredType) {}
+
+  @override
+  void variableDeclaration(StatementJudgment judgment, int fileOffset,
+      DartType statementType, DartType inferredType) {}
+
+  @override
+  void variableGet(
+      ExpressionJudgment judgment,
+      int fileOffset,
+      bool isInCascade,
+      int expressionVariableDeclarationOffset,
+      DartType inferredType) {}
+
+  @override
+  void variableSet(
+      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+
+  @override
+  void whileStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void body) {}
+
+  @override
+  void yieldStatement(StatementJudgment judgment, int fileOffset,
+      Token yieldKeyword, Token star, void expression, Token semicolon) {}
+}
+
+const toplevelInferenceFactory = const ToplevelInferenceFactory();
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 9e8809f..0abc7d3 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -1249,6 +1249,12 @@
   }
 
   @override
+  void handleUnescapeError(
+      Message message, Token location, int offset, int length) {
+    listener?.handleUnescapeError(message, location, offset, length);
+  }
+
+  @override
   void handleStringPart(Token token) {
     listener?.handleStringPart(token);
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index 8e26b03..dba1f6c 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -9,6 +9,8 @@
 import '../fasta_codes.dart'
     show Message, messageNativeClauseShouldBeAnnotation;
 
+import '../quote.dart' show UnescapeErrorListener;
+
 import 'assert.dart' show Assert;
 
 import 'formal_parameter_kind.dart' show FormalParameterKind;
@@ -30,7 +32,7 @@
 ///
 /// Events starting with `handle` are used when isn't possible to have a begin
 /// event.
-class Listener {
+class Listener implements UnescapeErrorListener {
   final List<ParserError> recoverableErrors = <ParserError>[];
 
   Uri get uri => null;
@@ -1232,6 +1234,12 @@
         .add(new ParserError.fromTokens(startToken, endToken, message));
   }
 
+  @override
+  void handleUnescapeError(
+      Message message, Token location, int stringOffset, int length) {
+    handleRecoverableError(message, location, location);
+  }
+
   /// Signals to the listener that the previous statement contained a semantic
   /// error (described by the given [message]). This method can also be called
   /// after [handleExpressionFunctionBody], in which case it signals that the
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 8937d33..f70d408 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -1189,6 +1189,12 @@
             // Scanner has already reported a missing `)` error,
             // but placed the `)` in the wrong location, so move it.
             token = rewriter.moveSynthetic(token, begin.endGroup);
+          } else if (next.kind == IDENTIFIER_TOKEN &&
+              next.next.kind == IDENTIFIER_TOKEN) {
+            // Looks like a missing comma
+            Token comma = new SyntheticToken(TokenType.COMMA, next.charOffset);
+            token = rewriter.insertTokenAfter(token, comma).next;
+            continue;
           } else {
             reportRecoverableError(
                 next, fasta.templateExpectedButGot.withArguments(')'));
@@ -2961,7 +2967,8 @@
         }
         // Fall through to continue parsing `get` or `set` as an identifier.
       } else if (identical(value, 'factory')) {
-        if (next.next.isIdentifier) {
+        Token next2 = next.next;
+        if (next2.isIdentifier || next2.isModifier) {
           token = parseFactoryMethod(token, beforeStart, externalToken,
               staticToken ?? covariantToken, varFinalOrConst);
           listener.endMember();
@@ -3819,10 +3826,9 @@
   }
 
   Token parseExpressionWithoutCascade(Token token) {
-    Token result = optional('throw', token.next)
+    return optional('throw', token.next)
         ? parseThrowExpression(token, false)
         : parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false);
-    return result;
   }
 
   Token parseConditionalExpressionRest(Token token) {
@@ -3868,7 +3874,10 @@
         } else if (identical(tokenLevel, ASSIGNMENT_PRECEDENCE)) {
           // Right associative, so we recurse at the same precedence
           // level.
-          token = parsePrecedenceExpression(token.next, level, allowCascades);
+          Token next = token.next;
+          token = optional('throw', next.next)
+              ? parseThrowExpression(next, false)
+              : parsePrecedenceExpression(next, level, allowCascades);
           listener.handleAssignmentExpression(operator);
         } else if (identical(tokenLevel, POSTFIX_PRECEDENCE)) {
           if ((identical(type, TokenType.PLUS_PLUS)) ||
@@ -3949,7 +3958,7 @@
     Token mark;
     do {
       mark = token;
-      if (optional('.', next)) {
+      if (optional('.', next) || optional('?.', next)) {
         Token period = next;
         token = parseSend(next, IdentifierContext.expressionContinuation);
         next = token.next;
diff --git a/pkg/front_end/lib/src/fasta/quote.dart b/pkg/front_end/lib/src/fasta/quote.dart
index ac3eaa7..682419f 100644
--- a/pkg/front_end/lib/src/fasta/quote.dart
+++ b/pkg/front_end/lib/src/fasta/quote.dart
@@ -4,10 +4,10 @@
 
 library fasta.quote;
 
-import 'deprecated_problems.dart' show deprecated_inputError;
-
 import 'problems.dart' show unhandled;
 
+import 'fasta_codes.dart' as fasta;
+
 import 'scanner/characters.dart'
     show
         $BACKSLASH,
@@ -121,36 +121,43 @@
   return unhandled("$quote", "lastQuoteLength", -1, null);
 }
 
-String unescapeFirstStringPart(String first, Quote quote) {
-  return unescape(first.substring(firstQuoteLength(first, quote)), quote);
+String unescapeFirstStringPart(String first, Quote quote, Object location,
+    UnescapeErrorListener listener) {
+  return unescape(first.substring(firstQuoteLength(first, quote)), quote,
+      location, listener);
 }
 
-String unescapeLastStringPart(String last, Quote quote) {
-  return unescape(
-      last.substring(0, last.length - lastQuoteLength(quote)), quote);
+String unescapeLastStringPart(
+    String last, Quote quote, Object location, UnescapeErrorListener listener) {
+  return unescape(last.substring(0, last.length - lastQuoteLength(quote)),
+      quote, location, listener);
 }
 
-String unescapeString(String string) {
+String unescapeString(
+    String string, Object location, UnescapeErrorListener listener) {
   Quote quote = analyzeQuote(string);
   return unescape(
       string.substring(firstQuoteLength(string, quote),
           string.length - lastQuoteLength(quote)),
-      quote);
+      quote,
+      location,
+      listener);
 }
 
-String unescape(String string, Quote quote) {
+String unescape(String string, Quote quote, Object location,
+    UnescapeErrorListener listener) {
   switch (quote) {
     case Quote.Single:
     case Quote.Double:
       return !string.contains("\\")
           ? string
-          : unescapeCodeUnits(string.codeUnits, false);
+          : unescapeCodeUnits(string.codeUnits, false, location, listener);
 
     case Quote.MultiLineSingle:
     case Quote.MultiLineDouble:
       return !string.contains("\\") && !string.contains("\r")
           ? string
-          : unescapeCodeUnits(string.codeUnits, false);
+          : unescapeCodeUnits(string.codeUnits, false, location, listener);
 
     case Quote.RawSingle:
     case Quote.RawDouble:
@@ -160,26 +167,18 @@
     case Quote.RawMultiLineDouble:
       return !string.contains("\r")
           ? string
-          : unescapeCodeUnits(string.codeUnits, true);
+          : unescapeCodeUnits(string.codeUnits, true, location, listener);
   }
   return unhandled("$quote", "unescape", -1, null);
 }
 
-const String incompleteSequence = "Incomplete escape sequence.";
-
-const String invalidCharacter = "Invalid character in escape sequence.";
-
-const String invalidCodePoint = "Invalid code point.";
-
 // Note: based on
 // [StringValidator.validateString](pkg/compiler/lib/src/string_validator.dart).
-String unescapeCodeUnits(List<int> codeUnits, bool isRaw) {
+String unescapeCodeUnits(List<int> codeUnits, bool isRaw, Object location,
+    UnescapeErrorListener listener) {
   // Can't use Uint8List or Uint16List here, the code units may be larger.
   List<int> result = new List<int>(codeUnits.length);
   int resultOffset = 0;
-  error(int offset, String message) {
-    deprecated_inputError(null, null, message);
-  }
 
   for (int i = 0; i < codeUnits.length; i++) {
     int code = codeUnits[i];
@@ -189,7 +188,11 @@
       }
       code = $LF;
     } else if (!isRaw && code == $BACKSLASH) {
-      if (codeUnits.length == ++i) return error(i, incompleteSequence);
+      if (codeUnits.length == ++i) {
+        listener.handleUnescapeError(
+            fasta.messageInvalidUnicodeEscape, location, i, 1);
+        return new String.fromCharCodes(codeUnits);
+      }
       code = codeUnits[i];
 
       /// `\n` for newline, equivalent to `\x0A`.
@@ -214,43 +217,86 @@
         code = $VTAB;
       } else if (code == $x) {
         // Expect exactly 2 hex digits.
-        if (codeUnits.length <= i + 2) return error(i, incompleteSequence);
+        int begin = i;
+        if (codeUnits.length <= i + 2) {
+          listener.handleUnescapeError(fasta.messageInvalidHexEscape, location,
+              begin, codeUnits.length + 1 - begin);
+          return new String.fromCharCodes(codeUnits);
+        }
         code = 0;
         for (int j = 0; j < 2; j++) {
           int digit = codeUnits[++i];
-          if (!isHexDigit(digit)) return error(i, invalidCharacter);
+          if (!isHexDigit(digit)) {
+            listener.handleUnescapeError(
+                fasta.messageInvalidHexEscape, location, begin, i + 1 - begin);
+            return new String.fromCharCodes(codeUnits);
+          }
           code = (code << 4) + hexDigitValue(digit);
         }
       } else if (code == $u) {
-        if (codeUnits.length == i + 1) return error(i, incompleteSequence);
+        int begin = i;
+        if (codeUnits.length == i + 1) {
+          listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+              location, begin, codeUnits.length + 1 - begin);
+          return new String.fromCharCodes(codeUnits);
+        }
         code = codeUnits[i + 1];
         if (code == $OPEN_CURLY_BRACKET) {
           // Expect 1-6 hex digits followed by '}'.
-          if (codeUnits.length == ++i) return error(i, incompleteSequence);
+          if (codeUnits.length == ++i) {
+            listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+                location, begin, i + 1 - begin);
+            return new String.fromCharCodes(codeUnits);
+          }
           code = 0;
           for (int j = 0; j < 7; j++) {
-            if (codeUnits.length == ++i) return error(i, incompleteSequence);
+            if (codeUnits.length == ++i) {
+              listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+                  location, begin, i + 1 - begin);
+              return new String.fromCharCodes(codeUnits);
+            }
             int digit = codeUnits[i];
             if (j != 0 && digit == $CLOSE_CURLY_BRACKET) break;
-            if (!isHexDigit(digit)) return error(i, invalidCharacter);
+            if (!isHexDigit(digit)) {
+              listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+                  location, begin, i + 2 - begin);
+              return new String.fromCharCodes(codeUnits);
+            }
             code = (code << 4) + hexDigitValue(digit);
           }
         } else {
           // Expect exactly 4 hex digits.
-          if (codeUnits.length <= i + 4) return error(i, incompleteSequence);
+          if (codeUnits.length <= i + 4) {
+            listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+                location, begin, codeUnits.length + 1 - begin);
+            return new String.fromCharCodes(codeUnits);
+          }
           code = 0;
           for (int j = 0; j < 4; j++) {
             int digit = codeUnits[++i];
-            if (!isHexDigit(digit)) return error(i, invalidCharacter);
+            if (!isHexDigit(digit)) {
+              listener.handleUnescapeError(fasta.messageInvalidUnicodeEscape,
+                  location, begin, i + 1 - begin);
+              return new String.fromCharCodes(codeUnits);
+            }
             code = (code << 4) + hexDigitValue(digit);
           }
         }
+        if (code > 0x10FFFF) {
+          listener.handleUnescapeError(
+              fasta.messageInvalidCodePoint, location, begin, i + 1 - begin);
+          return new String.fromCharCodes(codeUnits);
+        }
       } else {
         // Nothing, escaped character is passed through;
       }
-      if (code > 0x10FFFF) return error(i, invalidCodePoint);
     }
     result[resultOffset++] = code;
   }
   return new String.fromCharCodes(result, 0, resultOffset);
 }
+
+abstract class UnescapeErrorListener {
+  void handleUnescapeError(
+      fasta.Message message, covariant location, int offset, int length);
+}
diff --git a/pkg/front_end/lib/src/fasta/rewrite_severity.dart b/pkg/front_end/lib/src/fasta/rewrite_severity.dart
index 5238c7d..0455195 100644
--- a/pkg/front_end/lib/src/fasta/rewrite_severity.dart
+++ b/pkg/front_end/lib/src/fasta/rewrite_severity.dart
@@ -8,36 +8,119 @@
 
 Severity rewriteSeverity(
     Severity severity, msg.Code<Object> code, Uri fileUri) {
-  if (severity == Severity.ignored &&
-      fileUri.path.contains("/pkg/front_end/lib/src/fasta/")) {
-    String path = fileUri.path;
-    if (code == msg.codeUseOfDeprecatedIdentifier) {
-      // TODO(ahe): Remove the exceptions below.
-      // We plan to remove all uses of deprecated identifiers from Fasta. The
-      // strategy is to remove files from the list below one by one. To get
-      // started on cleaning up a given file, simply remove it from the list
-      // below and compile Fasta with itself to get a list of remaining call
-      // sites.
-      if (path.endsWith("/command_line_reporting.dart")) return severity;
-      if (path.endsWith("/deprecated_problems.dart")) return severity;
-      if (path.endsWith("/kernel/body_builder.dart")) return severity;
-      if (path.endsWith("/kernel/expression_generator.dart")) return severity;
-      if (path.endsWith("/kernel/kernel_expression_generator.dart"))
+  if (severity != Severity.ignored) return severity;
+  String path = fileUri.path;
+  const String fastaPath = "/pkg/front_end/lib/src/fasta/";
+  int index = path.indexOf(fastaPath);
+  if (index == -1) return severity;
+  if (code == msg.codeUseOfDeprecatedIdentifier) {
+    // TODO(ahe): Remove the exceptions below.
+    // We plan to remove all uses of deprecated identifiers from Fasta. The
+    // strategy is to remove files from the list below one by one. To get
+    // started on cleaning up a given file, simply remove it from the list
+    // below and compile Fasta with itself to get a list of remaining call
+    // sites.
+    switch (path.substring(fastaPath.length + index)) {
+      case "command_line_reporting.dart":
+      case "deprecated_problems.dart":
+      case "kernel/body_builder.dart":
+      case "kernel/expression_generator.dart":
+      case "kernel/kernel_expression_generator.dart":
+      case "kernel/kernel_expression_generator_impl.dart":
+      case "kernel/kernel_procedure_builder.dart":
+      case "kernel/kernel_target.dart":
+      case "kernel/kernel_type_variable_builder.dart":
+      case "quote.dart":
+      case "source/diet_listener.dart":
+      case "source/source_library_builder.dart":
+      case "source/source_loader.dart":
+      case "source/stack_listener.dart":
         return severity;
-      if (path.endsWith("/kernel/kernel_expression_generator_impl.dart"))
-        return severity;
-      if (path.endsWith("/kernel/kernel_procedure_builder.dart"))
-        return severity;
-      if (path.endsWith("/kernel/kernel_target.dart")) return severity;
-      if (path.endsWith("/kernel/kernel_type_variable_builder.dart"))
-        return severity;
-      if (path.endsWith("/quote.dart")) return severity;
-      if (path.endsWith("/source/diet_listener.dart")) return severity;
-      if (path.endsWith("/source/source_library_builder.dart")) return severity;
-      if (path.endsWith("/source/source_loader.dart")) return severity;
-      if (path.endsWith("/source/stack_listener.dart")) return severity;
     }
-    return Severity.error;
+  } else if (code == msg.codeMissingExplicitTypeArguments) {
+    // TODO(ahe): Remove the exceptions below.
+    // We're not sure if we want to require that all types have explicit type
+    // arguments in Fasta. Regardles, the strategy is to remove files from the
+    // list below one by one. To get started on cleaning up a given file,
+    // simply remove it from the list below and compile Fasta with itself to
+    // get a list of remaining call sites.
+    switch (path.substring(fastaPath.length + index)) {
+      case "builder/builtin_type_builder.dart":
+      case "builder/class_builder.dart":
+      case "builder/constructor_reference_builder.dart":
+      case "builder/dynamic_type_builder.dart":
+      case "builder/field_builder.dart":
+      case "builder/formal_parameter_builder.dart":
+      case "builder/function_type_alias_builder.dart":
+      case "builder/function_type_builder.dart":
+      case "builder/library_builder.dart":
+      case "builder/member_builder.dart":
+      case "builder/metadata_builder.dart":
+      case "builder/mixin_application_builder.dart":
+      case "builder/named_type_builder.dart":
+      case "builder/prefix_builder.dart":
+      case "builder/procedure_builder.dart":
+      case "builder/type_builder.dart":
+      case "builder/type_declaration_builder.dart":
+      case "builder/type_variable_builder.dart":
+      case "builder/unresolved_type.dart":
+      case "builder/void_type_builder.dart":
+      case "builder_graph.dart":
+      case "compiler_context.dart":
+      case "dill/dill_class_builder.dart":
+      case "dill/dill_library_builder.dart":
+      case "dill/dill_loader.dart":
+      case "dill/dill_target.dart":
+      case "dill/dill_typedef_builder.dart":
+      case "export.dart":
+      case "fasta_codes.dart":
+      case "import.dart":
+      case "incremental_compiler.dart":
+      case "kernel/expression_generator.dart":
+      case "kernel/expression_generator_helper.dart":
+      case "kernel/fangorn.dart":
+      case "kernel/forest.dart":
+      case "kernel/kernel_class_builder.dart":
+      case "kernel/kernel_enum_builder.dart":
+      case "kernel/kernel_expression_generator.dart":
+      case "kernel/kernel_expression_generator_impl.dart":
+      case "kernel/kernel_field_builder.dart":
+      case "kernel/kernel_formal_parameter_builder.dart":
+      case "kernel/kernel_function_type_alias_builder.dart":
+      case "kernel/kernel_function_type_builder.dart":
+      case "kernel/kernel_invalid_type_builder.dart":
+      case "kernel/kernel_library_builder.dart":
+      case "kernel/kernel_mixin_application_builder.dart":
+      case "kernel/kernel_named_type_builder.dart":
+      case "kernel/kernel_prefix_builder.dart":
+      case "kernel/kernel_procedure_builder.dart":
+      case "kernel/kernel_shadow_ast.dart":
+      case "kernel/kernel_target.dart":
+      case "kernel/kernel_type_builder.dart":
+      case "kernel/kernel_type_variable_builder.dart":
+      case "kernel/load_library_builder.dart":
+      case "kernel/metadata_collector.dart":
+      case "kernel/type_algorithms.dart":
+      case "kernel/verifier.dart":
+      case "loader.dart":
+      case "scanner/error_token.dart":
+      case "scanner/recover.dart":
+      case "scope.dart":
+      case "source/diet_listener.dart":
+      case "source/outline_builder.dart":
+      case "source/source_class_builder.dart":
+      case "source/source_library_builder.dart":
+      case "source/source_loader.dart":
+      case "source/stack_listener.dart":
+      case "target_implementation.dart":
+      case "type_inference/interface_resolver.dart":
+      case "type_inference/type_inference_engine.dart":
+      case "type_inference/type_inferrer.dart":
+      case "type_inference/type_schema.dart":
+      case "util/link.dart":
+      case "util/link_implementation.dart":
+        return severity;
+    }
   }
-  return severity;
+  return Severity.error;
 }
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index eeef8b1..516a6b6 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -14,6 +14,7 @@
         Library,
         LibraryDependency,
         LibraryPart,
+        Node,
         Typedef;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
@@ -40,6 +41,9 @@
 
 import '../type_inference/type_inference_engine.dart' show TypeInferenceEngine;
 
+import '../type_inference/type_inference_listener.dart'
+    show TypeInferenceListener;
+
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'stack_listener.dart' show NullValue, StackListener;
@@ -391,7 +395,8 @@
     // Native imports must be skipped because they aren't assigned corresponding
     // LibraryDependency nodes.
     Token importUriToken = importKeyword.next;
-    String importUri = unescapeString(importUriToken.lexeme);
+    String importUri =
+        unescapeString(importUriToken.lexeme, importUriToken, this);
     if (importUri.startsWith("dart-ext:")) return;
 
     Library libraryNode = library.target;
@@ -527,13 +532,16 @@
 
   StackListener createListener(
       ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
-      [Scope formalParameterScope]) {
+      [Scope formalParameterScope,
+      TypeInferenceListener<int, int, Node, int> listener]) {
+    listener ??= new TypeInferenceListener<int, int, Node, int>();
     // Note: we set thisType regardless of whether we are building a static
     // member, since that provides better error recovery.
     InterfaceType thisType = currentClass?.target?.thisType;
     var typeInferrer = library.disableTypeInference
         ? typeInferenceEngine.createDisabledTypeInferrer()
-        : typeInferenceEngine.createLocalTypeInferrer(uri, thisType, library);
+        : typeInferenceEngine.createLocalTypeInferrer(
+            uri, listener, thisType, library);
     ConstantContext constantContext = builder.isConstructor && builder.isConst
         ? ConstantContext.inferred
         : ConstantContext.none;
diff --git a/pkg/front_end/lib/src/fasta/source/directive_listener.dart b/pkg/front_end/lib/src/fasta/source/directive_listener.dart
index 71babc5..dca1e4b 100644
--- a/pkg/front_end/lib/src/fasta/source/directive_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/directive_listener.dart
@@ -54,7 +54,7 @@
   @override
   void beginLiteralString(Token token) {
     if (_combinators != null || _inPart) {
-      _uri = unescapeString(token.lexeme);
+      _uri = unescapeString(token.lexeme, token, this);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index e65dcf6..f0e69b9 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -96,6 +96,7 @@
   final bool stringExpectedAfterNative;
   bool inConstructor = false;
   bool inConstructorName = false;
+  int importIndex = 0;
 
   String nativeMethodName;
 
@@ -219,8 +220,17 @@
     int uriOffset = popCharOffset();
     String uri = pop(); // For a conditional import, this is the default URI.
     List<MetadataBuilder> metadata = pop();
-    library.addImport(metadata, uri, configurations, prefix, combinators,
-        isDeferred, importKeyword.charOffset, prefixOffset, uriOffset);
+    library.addImport(
+        metadata,
+        uri,
+        configurations,
+        prefix,
+        combinators,
+        isDeferred,
+        importKeyword.charOffset,
+        prefixOffset,
+        uriOffset,
+        importIndex++);
     checkEmpty(importKeyword.charOffset);
   }
 
@@ -316,7 +326,7 @@
     debugEvent("endLiteralString");
     if (interpolationCount == 0) {
       Token token = pop();
-      push(unescapeString(token.lexeme));
+      push(unescapeString(token.lexeme, token, this));
       push(token.charOffset);
     } else {
       Token beginToken = pop();
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 9b5db36..d6e591c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -279,7 +279,8 @@
       bool deferred,
       int charOffset,
       int prefixCharOffset,
-      int uriOffset) {
+      int uriOffset,
+      int importIndex) {
     if (configurations != null) {
       for (Configuration config in configurations) {
         if (lookupImportCondition(config.dottedName) == config.condition) {
@@ -308,7 +309,7 @@
     }
 
     imports.add(new Import(this, builder, deferred, prefix, combinators,
-        configurations, charOffset, prefixCharOffset,
+        configurations, charOffset, prefixCharOffset, importIndex,
         nativeImportUri: builder == null ? resolvedUri : null));
   }
 
@@ -712,7 +713,7 @@
   int resolveTypes() {
     int typeCount = types.length;
     for (UnresolvedType<T> t in types) {
-      t.resolveIn(scope);
+      t.resolveIn(scope, this);
       if (loader.target.strongMode) {
         t.checkType();
       } else {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 1a037f4..5221c08 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -715,11 +715,15 @@
   void addNoSuchMethodForwarders(List<SourceClassBuilder> sourceClasses) {
     if (!target.backendTarget.enableNoSuchMethodForwarders) return;
 
+    List<Class> changedClasses = new List<Class>();
     for (SourceClassBuilder builder in sourceClasses) {
       if (builder.library.loader == this) {
-        builder.addNoSuchMethodForwarders(target, hierarchy);
+        if (builder.addNoSuchMethodForwarders(target, hierarchy)) {
+          changedClasses.add(builder.target);
+        }
       }
     }
+    hierarchy.applyMemberChanges(changedClasses, findDescendants: true);
     ticker.logMs("Added noSuchMethod forwarders");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index dd5fc5d..262dfe2 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -297,7 +297,7 @@
     debugEvent("endLiteralString");
     if (interpolationCount == 0) {
       Token token = pop();
-      push(unescapeString(token.lexeme));
+      push(unescapeString(token.lexeme, token, this));
     } else {
       unimplemented("string interpolation", endToken.charOffset, uri);
     }
@@ -356,6 +356,12 @@
     throw deprecated_inputError(uri, token.charOffset, message.message);
   }
 
+  @override
+  void handleUnescapeError(
+      Message message, Token token, int stringOffset, int length) {
+    addCompileTimeError(message, token.charOffset + stringOffset, length);
+  }
+
   void addCompileTimeError(Message message, int charOffset, int length);
 }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index 9b4bf82..0fc6eb5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -49,7 +49,7 @@
         ShadowField,
         ShadowMember,
         ShadowProcedure,
-        ShadowVariableDeclaration;
+        VariableDeclarationJudgment;
 
 import '../messages.dart'
     show
@@ -773,7 +773,7 @@
     }
     var positionalParameters = method.function.positionalParameters;
     for (int i = 0; i < positionalParameters.length; ++i) {
-      if (ShadowVariableDeclaration
+      if (VariableDeclarationJudgment
           .isImplicitlyTyped(positionalParameters[i])) {
         // Note that if the parameter is not present in the overridden method,
         // getPositionalParameterType treats it as dynamic.  This is consistent
@@ -800,7 +800,7 @@
     }
     var namedParameters = method.function.namedParameters;
     for (int i = 0; i < namedParameters.length; i++) {
-      if (ShadowVariableDeclaration.isImplicitlyTyped(namedParameters[i])) {
+      if (VariableDeclarationJudgment.isImplicitlyTyped(namedParameters[i])) {
         var name = namedParameters[i].name;
         namedParameters[i].type = matchTypes(
             overriddenTypes.map((type) => getNamedParameterType(type, name)),
@@ -1264,10 +1264,10 @@
     }
     var function = procedure.function;
     for (var parameter in function.positionalParameters) {
-      if (ShadowVariableDeclaration.isImplicitlyTyped(parameter)) return true;
+      if (VariableDeclarationJudgment.isImplicitlyTyped(parameter)) return true;
     }
     for (var parameter in function.namedParameters) {
-      if (ShadowVariableDeclaration.isImplicitlyTyped(parameter)) return true;
+      if (VariableDeclarationJudgment.isImplicitlyTyped(parameter)) return true;
     }
     return false;
   }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index 300dd31..23402c5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -9,17 +9,24 @@
         FunctionType,
         InterfaceType,
         NamedType,
+        Procedure,
         TypeParameter,
         TypeParameterType,
         VoidType;
 
-import 'package:kernel/type_algebra.dart' show substitute;
+import 'package:kernel/type_algebra.dart' show substitute, Substitution;
 
 import 'type_schema.dart' show UnknownType;
 
 import 'type_schema_environment.dart'
     show TypeConstraint, TypeSchemaEnvironment, substituteTypeParams;
 
+import '../names.dart' show callName;
+
+import 'type_schema.dart';
+
+import 'type_schema_environment.dart';
+
 /// Creates a collection of [TypeConstraint]s corresponding to type parameters,
 /// based on an attempt to make one type schema a subtype of another.
 class TypeConstraintGatherer {
@@ -101,8 +108,10 @@
         supertype.positionalParameters.length) {
       return false;
     }
-    if (subtype.typeParameters.isNotEmpty ||
-        supertype.typeParameters.isNotEmpty) {
+    if (subtype.typeParameters.length != supertype.typeParameters.length) {
+      return false;
+    }
+    if (subtype.typeParameters.isNotEmpty) {
       var subtypeSubstitution = <TypeParameter, DartType>{};
       var supertypeSubstitution = <TypeParameter, DartType>{};
       var freshTypeVariables = <TypeParameter>[];
@@ -299,30 +308,37 @@
     if (subtype is InterfaceType && supertype is InterfaceType) {
       return _isInterfaceSubtypeMatch(subtype, supertype);
     }
-    // A type `P` is a subtype match for `Function` with respect to `L` under no
-    // constraints:
-    // - If `P` implements a call method.
-    // - Or if `P` is a function type.
-    // TODO(paulberry): implement this case.
+    if (subtype is FunctionType) {
+      if (supertype is InterfaceType) {
+        return identical(
+                supertype.classNode, environment.coreTypes.functionClass) ||
+            identical(supertype.classNode, environment.coreTypes.objectClass);
+      } else if (supertype is FunctionType) {
+        return _isFunctionSubtypeMatch(subtype, supertype);
+      }
+    }
     // A type `P` is a subtype match for a type `Q` with respect to `L` under
     // constraints `C`:
     // - If `P` is an interface type which implements a call method of type `F`,
     //   and `F` is a subtype match for a type `Q` with respect to `L` under
     //   constraints `C`.
-    // TODO(paulberry): implement this case.
-    if (subtype is FunctionType) {
-      if (supertype is InterfaceType) {
-        if (identical(
-                supertype.classNode, environment.coreTypes.functionClass) ||
-            identical(supertype.classNode, environment.coreTypes.objectClass)) {
-          return true;
-        } else {
-          return false;
+    if (subtype is InterfaceType) {
+      var callMember =
+          environment.hierarchy.getInterfaceMember(subtype.classNode, callName);
+      if (callMember is Procedure && !callMember.isGetter) {
+        var callType = callMember.getterType;
+        if (callType != null) {
+          callType =
+              Substitution.fromInterfaceType(subtype).substituteType(callType);
+          // TODO(kmillikin): The subtype check will fail if the type of a
+          // generic call method is a subtype of a non-generic function type.
+          // For example, if `T call<T>(T arg)` is a subtype of `S->S` for some
+          // S.  However, explicitly tearing off that call method will work and
+          // insert an explicit instantiation, so the implicit tear off should
+          // work as well.  Figure out how to support this case.
+          return _isSubtypeMatch(callType, supertype);
         }
       }
-      if (supertype is FunctionType) {
-        return _isFunctionSubtypeMatch(subtype, supertype);
-      }
     }
     return false;
   }
@@ -346,13 +362,12 @@
       Map<TypeParameter, DartType> substitution1,
       Map<TypeParameter, DartType> substitution2,
       List<TypeParameter> freshTypeVariables) {
-    int count = params1.length;
-    if (count != params2.length) return false;
+    assert(params1.length == params2.length);
     // TODO(paulberry): in imitation of analyzer, we're checking the bounds as
     // we build up the substitutions.  But I don't think that's correct--I think
     // we should build up both substitutions completely before checking any
     // bounds.  See dartbug.com/29629.
-    for (int i = 0; i < count; i++) {
+    for (int i = 0; i < params1.length; ++i) {
       TypeParameter pFresh = new TypeParameter(params2[i].name);
       freshTypeVariables.add(pFresh);
       DartType variableFresh = new TypeParameterType(pFresh);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 9fe590f..8338668 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -10,6 +10,7 @@
         DynamicType,
         FunctionType,
         InterfaceType,
+        Node,
         TypeParameter,
         TypeParameterType,
         TypedefType,
@@ -23,10 +24,14 @@
 
 import '../kernel/kernel_shadow_ast.dart';
 
+import '../kernel/toplevel_inference_factory.dart';
+
 import '../messages.dart' show noLength, templateCantInferTypeDueToCircularity;
 
 import '../source/source_library_builder.dart';
 
+import 'type_inference_listener.dart' show TypeInferenceListener;
+
 import 'type_inferrer.dart';
 
 import 'type_schema_environment.dart';
@@ -52,8 +57,8 @@
       // typeInferrer to be null.  If this happens, just skip type inference for
       // this field.
       if (typeInferrer != null) {
-        var inferredType = typeInferrer
-            .inferDeclarationType(typeInferrer.inferFieldTopLevel(field, true));
+        var inferredType = typeInferrer.inferDeclarationType(typeInferrer
+            .inferFieldTopLevel(toplevelInferenceFactory, field, true));
         if (isCircular) {
           // Report the appropriate error.
           _library.addCompileTimeError(
@@ -236,12 +241,17 @@
   /// Creates a type inferrer for use inside of a method body declared in a file
   /// with the given [uri].
   TypeInferrer createLocalTypeInferrer(
-      Uri uri, InterfaceType thisType, SourceLibraryBuilder library);
+      Uri uri,
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      SourceLibraryBuilder library);
 
   /// Creates a [TypeInferrer] object which is ready to perform type inference
   /// on the given [field].
   TypeInferrer createTopLevelTypeInferrer(
-      InterfaceType thisType, ShadowField field);
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      ShadowField field);
 
   /// Retrieve the [TypeInferrer] for the given [field], which was created by
   /// a previous call to [createTopLevelTypeInferrer].
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
new file mode 100644
index 0000000..28ea849
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -0,0 +1,481 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'package:kernel/ast.dart' show DartType, FunctionType;
+
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+/// Base class for [TypeInferenceListener] that defines the API for debugging.
+///
+/// By default no debug info is printed.  To enable debug printing, mix in
+/// [TypeInferenceDebugging].
+class TypeInferenceBase<Location> {
+  void genericExpressionEnter(
+      String expressionType, Location location, DartType typeContext) {}
+
+  void genericExpressionExit(
+      String expressionType, Location location, DartType inferredType) {}
+
+  void genericInitializerEnter(String initializerType, Location location) {}
+
+  void genericInitializerExit(String initializerType, Location location) {}
+
+  void genericStatementEnter(String statementType, Location location) {}
+
+  void genericStatementExit(String statementType, Location location) {}
+}
+
+/// Callback interface used by [TypeInferrer] to report the results of type
+/// inference to a client.
+///
+/// The interface is structured as a set of enter/exit methods.  The enter
+/// methods are called as the inferrer recurses down through the AST, and the
+/// exit methods are called on the way back up.  The enter methods take a
+/// [DartType] argument representing the downwards inference context; the exit
+/// methods take [DartType] argument representing the final inferred type.
+///
+/// The default implementation (in this base class) does nothing, however it can
+/// be used to debug type inference by uncommenting the
+/// "with TypeInferenceDebugging" clause below.
+class TypeInferenceListener<Location, Declaration, Reference, PrefixInfo>
+    extends TypeInferenceBase<Location> {
+  void asExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("asExpression", location, typeContext);
+
+  void asExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("asExpression", location, inferredType);
+
+  void assertInitializerEnter(Location location) =>
+      genericInitializerEnter("assertInitializer", location);
+
+  void assertInitializerExit(Location location) =>
+      genericInitializerExit("assertInitializer", location);
+
+  void assertStatementEnter(Location location) =>
+      genericStatementEnter('assertStatement', location);
+
+  void assertStatementExit(Location location) =>
+      genericStatementExit('assertStatement', location);
+
+  void awaitExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("awaitExpression", location, typeContext);
+
+  void awaitExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("awaitExpression", location, inferredType);
+
+  void blockEnter(Location location) =>
+      genericStatementEnter('block', location);
+
+  void blockExit(Location location) => genericStatementExit('block', location);
+
+  void boolLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("boolLiteral", location, typeContext);
+
+  void boolLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("boolLiteral", location, inferredType);
+
+  void breakStatementEnter(Location location) =>
+      genericStatementEnter('breakStatement', location);
+
+  void breakStatementExit(Location location) =>
+      genericStatementExit('breakStatement', location);
+
+  void cascadeExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("cascade", location, typeContext);
+
+  void cascadeExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("cascade", location, inferredType);
+
+  void catchStatementEnter(
+      Location location,
+      DartType guardType,
+      Location exceptionLocation,
+      DartType exceptionType,
+      Location stackTraceLocation,
+      DartType stackTraceType) {}
+
+  void catchStatementExit(Location location) {}
+
+  void conditionalExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("conditionalExpression", location, typeContext);
+
+  void conditionalExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("conditionalExpression", location, inferredType);
+
+  void constructorInvocationEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("constructorInvocation", location, typeContext);
+
+  void constructorInvocationExit(Location location, Reference expressionTarget,
+          DartType inferredType) =>
+      genericExpressionExit("constructorInvocation", location, inferredType);
+
+  void continueSwitchStatementEnter(Location location) =>
+      genericStatementEnter('continueSwitchStatement', location);
+
+  void continueSwitchStatementExit(Location location) =>
+      genericStatementExit('continueSwitchStatement', location);
+
+  void deferredCheckEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("deferredCheck", location, typeContext);
+
+  void deferredCheckExit(Location location, DartType inferredType) =>
+      genericExpressionExit("deferredCheck", location, inferredType);
+
+  void doStatementEnter(Location location) =>
+      genericStatementEnter("doStatement", location);
+
+  void doStatementExit(Location location) =>
+      genericStatementExit("doStatement", location);
+
+  void doubleLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("doubleLiteral", location, typeContext);
+
+  void doubleLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("doubleLiteral", location, inferredType);
+
+  void dryRunEnter(Location location) =>
+      genericExpressionEnter("dryRun", location, null);
+
+  void dryRunExit(Location location) =>
+      genericExpressionExit("dryRun", location, null);
+
+  void expressionStatementEnter(Location location) =>
+      genericStatementEnter('expressionStatement', location);
+
+  void expressionStatementExit(Location location) =>
+      genericStatementExit('expressionStatement', location);
+
+  void fieldInitializerEnter(Location location, Reference initializerField) =>
+      genericInitializerEnter("fieldInitializer", location);
+
+  void fieldInitializerExit(Location location) =>
+      genericInitializerExit("fieldInitializer", location);
+
+  void forInStatementEnter(
+          Location location,
+          Location variableLocation,
+          Location writeLocation,
+          DartType writeVariableType,
+          Declaration writeVariable,
+          Reference writeTarget) =>
+      genericStatementEnter('forInStatement', location);
+
+  void forInStatementExit(
+          Location location, bool variablePresent, DartType variableType) =>
+      genericStatementExit('forInStatement', location);
+
+  void forStatementEnter(Location location) =>
+      genericStatementEnter('forStatement', location);
+
+  void forStatementExit(Location location) =>
+      genericStatementExit('forStatement', location);
+
+  void functionDeclarationEnter(Location location) =>
+      genericStatementEnter('functionDeclaration', location);
+
+  void functionDeclarationExit(Location location, FunctionType inferredType) =>
+      genericStatementExit('functionDeclaration', location);
+
+  void functionExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("functionExpression", location, typeContext);
+
+  void functionExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("functionExpression", location, inferredType);
+
+  void ifNullBeforeRhs(Location location) {}
+
+  void ifNullEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter('ifNull', location, typeContext);
+
+  void ifNullExit(Location location, DartType inferredType) =>
+      genericExpressionExit('ifNull', location, inferredType);
+
+  void ifStatementEnter(Location location) =>
+      genericStatementEnter('ifStatement', location);
+
+  void ifStatementExit(Location location) =>
+      genericStatementExit('ifStatement', location);
+
+  void indexAssignAfterReceiver(Location location, DartType typeContext) {}
+
+  void indexAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("indexAssign", location, typeContext);
+
+  void indexAssignExit(Location location, Reference writeMember,
+          Reference combiner, DartType inferredType) =>
+      genericExpressionExit("indexAssign", location, inferredType);
+
+  void intLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("intLiteral", location, typeContext);
+
+  void intLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("intLiteral", location, inferredType);
+
+  void invalidInitializerEnter(Location location) =>
+      genericInitializerEnter("invalidInitializer", location);
+
+  void invalidInitializerExit(Location location) =>
+      genericInitializerExit("invalidInitializer", location);
+
+  void isExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("isExpression", location, typeContext);
+
+  void isExpressionExit(
+          Location location, DartType testedType, DartType inferredType) =>
+      genericExpressionExit("isExpression", location, inferredType);
+
+  void isNotExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("isNotExpression", location, typeContext);
+
+  void isNotExpressionExit(
+          Location location, DartType type, DartType inferredType) =>
+      genericExpressionExit("isNotExpression", location, inferredType);
+
+  void labeledStatementEnter(Location location) =>
+      genericStatementEnter('labeledStatement', location);
+
+  void labeledStatementExit(Location location) =>
+      genericStatementExit('labeledStatement', location);
+
+  void listLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("listLiteral", location, typeContext);
+
+  void listLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("listLiteral", location, inferredType);
+
+  void logicalExpressionBeforeRhs(Location location) {}
+
+  void logicalExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("logicalExpression", location, typeContext);
+
+  void logicalExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("logicalExpression", location, inferredType);
+
+  void mapLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("mapLiteral", location, typeContext);
+
+  void mapLiteralExit(Location location, DartType typeContext) =>
+      genericExpressionExit("mapLiteral", location, typeContext);
+
+  void methodInvocationBeforeArgs(Location location, bool isImplicitCall) {}
+
+  void methodInvocationEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("methodInvocation", location, typeContext);
+
+  void methodInvocationExit(
+          Location resultOffset,
+          List<DartType> argumentsTypes,
+          bool isImplicitCall,
+          Reference interfaceMember,
+          FunctionType calleeType,
+          Substitution substitution,
+          DartType inferredType) =>
+      genericExpressionExit("methodInvocation", resultOffset, inferredType);
+
+  void methodInvocationExitCall(
+          Location resultOffset,
+          List<DartType> argumentsTypes,
+          bool isImplicitCall,
+          FunctionType calleeType,
+          Substitution substitution,
+          DartType inferredType) =>
+      genericExpressionExit("methodInvocation", resultOffset, inferredType);
+
+  void namedFunctionExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("namedFunctionExpression", location, typeContext);
+
+  void namedFunctionExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("namedFunctionExpression", location, inferredType);
+
+  void notEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("not", location, typeContext);
+
+  void notExit(Location location, DartType inferredType) =>
+      genericExpressionExit("not", location, inferredType);
+
+  void nullLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("nullLiteral", location, typeContext);
+
+  void nullLiteralExit(
+          Location location, bool isSynthetic, DartType inferredType) =>
+      genericExpressionExit("nullLiteral", location, inferredType);
+
+  void propertyAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("propertyAssign", location, typeContext);
+
+  void propertyAssignExit(Location location, Reference writeMember,
+          DartType writeContext, Reference combiner, DartType inferredType) =>
+      genericExpressionExit("propertyAssign", location, inferredType);
+
+  void propertyGetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("propertyGet", location, typeContext);
+
+  void propertyGetExit(
+          Location location, Reference member, DartType inferredType) =>
+      genericExpressionExit("propertyGet", location, inferredType);
+
+  void propertyGetExitCall(Location location, DartType inferredType) =>
+      genericExpressionExit("propertyGet", location, inferredType);
+
+  void propertySetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("propertySet", location, typeContext);
+
+  void propertySetExit(Location location, DartType inferredType) =>
+      genericExpressionExit("propertySet", location, inferredType);
+
+  void redirectingInitializerEnter(
+          Location location, Reference initializerTarget) =>
+      genericInitializerEnter("redirectingInitializer", location);
+
+  void redirectingInitializerExit(Location location) =>
+      genericInitializerExit("redirectingInitializer", location);
+
+  void rethrowEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter('rethrow', location, typeContext);
+
+  void rethrowExit(Location location, DartType inferredType) =>
+      genericExpressionExit('rethrow', location, inferredType);
+
+  void returnStatementEnter(Location location) =>
+      genericStatementEnter('returnStatement', location);
+
+  void returnStatementExit(Location location) =>
+      genericStatementExit('returnStatement', location);
+
+  void staticAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("staticAssign", location, typeContext);
+
+  void staticAssignExit(Location location, Reference writeMember,
+          DartType writeContext, Reference combiner, DartType inferredType) =>
+      genericExpressionExit("staticAssign", location, inferredType);
+
+  void staticGetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("staticGet", location, typeContext);
+
+  void staticGetExit(Location location, Reference expressionTarget,
+          DartType inferredType) =>
+      genericExpressionExit("staticGet", location, inferredType);
+
+  void staticInvocationEnter(Location location,
+          Location expressionArgumentsLocation, DartType typeContext) =>
+      genericExpressionEnter("staticInvocation", location, typeContext);
+
+  void staticInvocationExit(
+          Location location,
+          Reference expressionTarget,
+          List<DartType> expressionArgumentsTypes,
+          FunctionType calleeType,
+          Substitution substitution,
+          DartType inferredType) =>
+      genericExpressionExit("staticInvocation", location, inferredType);
+
+  void stringConcatenationEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("stringConcatenation", location, typeContext);
+
+  void stringConcatenationExit(Location location, DartType inferredType) =>
+      genericExpressionExit("stringConcatenation", location, inferredType);
+
+  void stringLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("StringLiteral", location, typeContext);
+
+  void stringLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("StringLiteral", location, inferredType);
+
+  void superInitializerEnter(Location location) =>
+      genericInitializerEnter("superInitializer", location);
+
+  void superInitializerExit(Location location) =>
+      genericInitializerExit("superInitializer", location);
+
+  void switchStatementEnter(Location location) =>
+      genericStatementEnter('switchStatement', location);
+
+  void switchStatementExit(Location location) =>
+      genericStatementExit('switchStatement', location);
+
+  void symbolLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("symbolLiteral", location, typeContext);
+
+  void symbolLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("symbolLiteral", location, inferredType);
+
+  void thisExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("thisExpression", location, typeContext);
+
+  void thisExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("thisExpression", location, inferredType);
+
+  void throwEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter('throw', location, typeContext);
+
+  void throwExit(Location location, DartType inferredType) =>
+      genericExpressionExit('throw', location, inferredType);
+
+  void tryCatchEnter(Location location) =>
+      genericStatementEnter('tryCatch', location);
+
+  void tryCatchExit(Location location) =>
+      genericStatementExit('tryCatch', location);
+
+  void tryFinallyEnter(Location location) =>
+      genericStatementEnter('tryFinally', location);
+
+  void tryFinallyExit(Location location) =>
+      genericStatementExit('tryFinally', location);
+
+  void typeLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("typeLiteral", location, typeContext);
+
+  void typeLiteralExit(
+          Location location, Reference expressionType, DartType inferredType) =>
+      genericExpressionExit("typeLiteral", location, inferredType);
+
+  void variableAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("variableAssign", location, typeContext);
+
+  void variableAssignExit(
+          Location location,
+          DartType writeContext,
+          Declaration writeVariable,
+          Reference combiner,
+          DartType inferredType) =>
+      genericExpressionExit("variableAssign", location, inferredType);
+
+  void variableDeclarationEnter(Location location) =>
+      genericStatementEnter('variableDeclaration', location);
+
+  void variableDeclarationExit(
+          Location location, DartType statementType, DartType inferredType) =>
+      genericStatementExit('variableDeclaration', location);
+
+  void variableGetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("variableGet", location, typeContext);
+
+  void variableGetExit(Location location, bool isInCascade,
+          Declaration expressionVariable, DartType inferredType) =>
+      genericExpressionExit("variableGet", location, inferredType);
+
+  void variableSetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("variableSet", location, typeContext);
+
+  void variableSetExit(Location location, DartType inferredType) =>
+      genericExpressionExit("variableSet", location, inferredType);
+
+  void whileStatementEnter(Location location) =>
+      genericStatementEnter("whileStatement", location);
+
+  void whileStatementExit(Location location) =>
+      genericStatementExit("whileStatement", location);
+
+  void yieldStatementEnter(Location location) =>
+      genericStatementEnter('yieldStatement', location);
+
+  void yieldStatementExit(Location location) =>
+      genericStatementExit('yieldStatement', location);
+
+  void storePrefixInfo(Location location, PrefixInfo prefixInfo) {}
+
+  void storeClassReference(
+      Location location, Reference reference, DartType rawType) {}
+}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index e9b987e..95e550b 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
+import 'package:kernel/ast.dart' as kernel;
+
 import 'package:kernel/ast.dart'
     show
         Arguments,
@@ -18,7 +20,6 @@
         FunctionExpression,
         FunctionNode,
         FunctionType,
-        Initializer,
         Instantiation,
         InterfaceType,
         InvocationExpression,
@@ -28,12 +29,12 @@
         Member,
         MethodInvocation,
         Name,
+        Node,
         NullLiteral,
         Procedure,
         ProcedureKind,
         PropertyGet,
         PropertySet,
-        Statement,
         StaticGet,
         SuperMethodInvocation,
         SuperPropertyGet,
@@ -60,19 +61,39 @@
         InstrumentationValueForType,
         InstrumentationValueForTypeArgs;
 
+import '../../scanner/token.dart' show Token;
+
+import '../builder/class_builder.dart' show ClassBuilder;
+
+import '../builder/function_type_alias_builder.dart'
+    show FunctionTypeAliasBuilder;
+
+import '../builder/invalid_type_builder.dart' show InvalidTypeBuilder;
+
+import '../builder/prefix_builder.dart' show PrefixBuilder;
+
+import '../builder/type_builder.dart' show TypeBuilder;
+
+import '../builder/type_variable_builder.dart' show TypeVariableBuilder;
+
 import '../fasta_codes.dart';
 
+import '../kernel/expression_generator.dart' show TypeUseGenerator;
+
+import '../kernel/factory.dart' show Factory;
+
 import '../kernel/kernel_expression_generator.dart' show buildIsNull;
 
 import '../kernel/kernel_shadow_ast.dart'
     show
-        getExplicitTypeArguments,
+        ExpressionJudgment,
         ShadowClass,
         ShadowConstructorInvocation,
         ShadowField,
         ShadowMember,
-        ShadowNullLiteral,
-        ShadowVariableDeclaration;
+        NullJudgment,
+        VariableDeclarationJudgment,
+        getExplicitTypeArguments;
 
 import '../names.dart' show callName;
 
@@ -91,6 +112,8 @@
 import 'type_inference_engine.dart'
     show IncludesTypeParametersCovariantly, TypeInferenceEngine;
 
+import 'type_inference_listener.dart' show TypeInferenceListener;
+
 import 'type_promotion.dart' show TypePromoter, TypePromoterDisabled;
 
 import 'type_schema.dart' show isKnown, UnknownType;
@@ -323,27 +346,49 @@
   Uri get uri;
 
   /// Performs full type inference on the given field initializer.
-  void inferFieldInitializer(
-      InferenceHelper helper, DartType declaredType, Expression initializer);
+  void inferFieldInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType declaredType,
+      kernel.Expression initializer);
 
   /// Performs type inference on the given function body.
-  void inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body);
+  void inferFunctionBody<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType returnType,
+      AsyncMarker asyncMarker,
+      Statement body);
 
   /// Performs type inference on the given constructor initializer.
-  void inferInitializer(InferenceHelper helper, Initializer initializer);
+  void inferInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Initializer initializer);
 
   /// Performs type inference on the given metadata annotations.
-  void inferMetadata(InferenceHelper helper, List<Expression> annotations);
+  void inferMetadata<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      List<kernel.Expression> annotations);
 
   /// Performs type inference on the given metadata annotations keeping the
   /// existing helper if possible.
-  void inferMetadataKeepingHelper(List<Expression> annotations);
+  void inferMetadataKeepingHelper<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      List<kernel.Expression> annotations);
 
   /// Performs type inference on the given function parameter initializer
   /// expression.
-  void inferParameterInitializer(
-      InferenceHelper helper, Expression initializer, DartType declaredType);
+  void inferParameterInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Expression initializer,
+      DartType declaredType);
+
+  void storePrefix(Token token, PrefixBuilder prefix);
+
+  void storeTypeUse(TypeUseGenerator generator);
 }
 
 /// Implementation of [TypeInferrer] which doesn't do any type inference.
@@ -363,25 +408,49 @@
   Uri get uri => null;
 
   @override
-  void inferFieldInitializer(
-      InferenceHelper helper, DartType declaredType, Expression initializer) {}
+  void inferFieldInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType declaredType,
+      kernel.Expression initializer) {}
 
   @override
-  void inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body) {}
+  void inferFunctionBody<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> statementFactory,
+      DartType returnType,
+      AsyncMarker asyncMarker,
+      Statement body) {}
 
   @override
-  void inferInitializer(InferenceHelper helper, Initializer initializer) {}
+  void inferInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Initializer initializer) {}
 
   @override
-  void inferMetadata(InferenceHelper helper, List<Expression> annotations) {}
+  void inferMetadata<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      List<kernel.Expression> annotations) {}
 
   @override
-  void inferMetadataKeepingHelper(List<Expression> annotations) {}
+  void inferMetadataKeepingHelper<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      List<kernel.Expression> annotations) {}
 
   @override
-  void inferParameterInitializer(
-      InferenceHelper helper, Expression initializer, DartType declaredType) {}
+  void inferParameterInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Expression initializer,
+      DartType declaredType) {}
+
+  @override
+  void storePrefix(Token token, PrefixBuilder prefix) {}
+
+  @override
+  void storeTypeUse(TypeUseGenerator generator) {}
 }
 
 /// Derived class containing generic implementations of [TypeInferrer].
@@ -415,6 +484,8 @@
 
   final TypeSchemaEnvironment typeSchemaEnvironment;
 
+  final TypeInferenceListener<int, int, Node, int> listener;
+
   final InterfaceType thisType;
 
   final SourceLibraryBuilder library;
@@ -433,8 +504,8 @@
   /// if the last invocation didn't require any inference.
   FunctionType lastCalleeType;
 
-  TypeInferrerImpl(
-      this.engine, this.uri, bool topLevel, this.thisType, this.library)
+  TypeInferrerImpl(this.engine, this.uri, this.listener, bool topLevel,
+      this.thisType, this.library)
       : coreTypes = engine.coreTypes,
         strongMode = engine.strongMode,
         classHierarchy = engine.classHierarchy,
@@ -799,6 +870,15 @@
   /// initializer.
   Expression getFieldInitializer(ShadowField field);
 
+  /// If the [member] is a forwarding stub, return the target it forwards to.
+  /// Otherwise return the given [member].
+  Member getRealTarget(Member member) {
+    if (member is Procedure && member.isForwardingStub) {
+      return member.forwardingStubInterfaceTarget;
+    }
+    return member;
+  }
+
   DartType getSetterType(Object interfaceMember, DartType receiverType) {
     if (interfaceMember is FunctionType) {
       return interfaceMember;
@@ -960,16 +1040,22 @@
   ///
   /// Derived classes should override this method with logic that dispatches on
   /// the expression type and calls the appropriate specialized "infer" method.
-  DartType inferExpression(
-      Expression expression, DartType typeContext, bool typeNeeded);
+  DartType inferExpression<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Expression expression,
+      DartType typeContext,
+      bool typeNeeded);
 
   @override
-  void inferFieldInitializer(
-      InferenceHelper helper, DartType declaredType, Expression initializer) {
+  void inferFieldInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType declaredType,
+      kernel.Expression initializer) {
     assert(closureContext == null);
     this.helper = helper;
-    var actualType = inferExpression(
-        initializer, declaredType ?? const UnknownType(), declaredType != null);
+    var actualType = inferExpression(factory, initializer,
+        declaredType ?? const UnknownType(), declaredType != null);
     if (declaredType != null) {
       ensureAssignable(
           declaredType, actualType, initializer, initializer.fileOffset);
@@ -981,24 +1067,36 @@
   ///
   /// Derived classes should provide an implementation that calls
   /// [inferExpression] for the given [field]'s initializer expression.
-  DartType inferFieldTopLevel(ShadowField field, bool typeNeeded);
+  DartType inferFieldTopLevel<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      ShadowField field,
+      bool typeNeeded);
 
   @override
-  void inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body) {
+  void inferFunctionBody<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType returnType,
+      AsyncMarker asyncMarker,
+      Statement body) {
     assert(closureContext == null);
     this.helper = helper;
     closureContext =
         new ClosureContext(this, asyncMarker, returnType, false, true);
-    inferStatement(body);
+    inferStatement(factory, body);
     closureContext = null;
     this.helper = null;
   }
 
   /// Performs the type inference steps that are shared by all kinds of
   /// invocations (constructors, instance methods, and static methods).
-  DartType inferInvocation(DartType typeContext, int offset,
-      FunctionType calleeType, DartType returnType, Arguments arguments,
+  DartType inferInvocation<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext,
+      int offset,
+      FunctionType calleeType,
+      DartType returnType,
+      Arguments arguments,
       {bool isOverloadedArithmeticOperator: false,
       DartType receiverType,
       bool skipTypeArgumentInference: false,
@@ -1067,6 +1165,7 @@
           ? substitution.substituteType(formalType)
           : formalType;
       var expressionType = inferExpression(
+          factory,
           expression,
           inferredFormalType,
           inferenceNeeded ||
@@ -1128,8 +1227,12 @@
     return inferredType;
   }
 
-  DartType inferLocalFunction(FunctionNode function, DartType typeContext,
-      int fileOffset, DartType returnContext) {
+  DartType inferLocalFunction<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      FunctionNode function,
+      DartType typeContext,
+      int fileOffset,
+      DartType returnContext) {
     bool hasImplicitReturnType = false;
     if (returnContext == null) {
       hasImplicitReturnType = true;
@@ -1139,21 +1242,22 @@
       var positionalParameters = function.positionalParameters;
       for (var i = 0; i < positionalParameters.length; i++) {
         var parameter = positionalParameters[i];
-        inferMetadataKeepingHelper(parameter.annotations);
+        inferMetadataKeepingHelper(factory, parameter.annotations);
         if (i >= function.requiredParameterCount &&
             parameter.initializer == null) {
-          parameter.initializer = new ShadowNullLiteral()..parent = parameter;
+          parameter.initializer = new NullJudgment()..parent = parameter;
         }
         if (parameter.initializer != null) {
-          inferExpression(parameter.initializer, parameter.type, false);
+          inferExpression(
+              factory, parameter.initializer, parameter.type, false);
         }
       }
       for (var parameter in function.namedParameters) {
-        inferMetadataKeepingHelper(parameter.annotations);
+        inferMetadataKeepingHelper(factory, parameter.annotations);
         if (parameter.initializer == null) {
-          parameter.initializer = new ShadowNullLiteral()..parent = parameter;
+          parameter.initializer = new NullJudgment()..parent = parameter;
         }
-        inferExpression(parameter.initializer, parameter.type, false);
+        inferExpression(factory, parameter.initializer, parameter.type, false);
       }
     }
 
@@ -1215,8 +1319,8 @@
     // Otherwise, if `Qi` is not `_`, let `Ri` be the greatest closure of
     // `Qi[T/S]` with respect to `?`.  Otherwise, let `Ri` be `dynamic`.
     for (int i = 0; i < formals.length; i++) {
-      ShadowVariableDeclaration formal = formals[i];
-      if (ShadowVariableDeclaration.isImplicitlyTyped(formal)) {
+      VariableDeclarationJudgment formal = formals[i];
+      if (VariableDeclarationJudgment.isImplicitlyTyped(formal)) {
         DartType inferredType;
         if (formalTypesFromContext[i] == coreTypes.nullClass.rawType) {
           inferredType = coreTypes.objectClass.rawType;
@@ -1249,7 +1353,7 @@
         needToSetReturnType,
         needImplicitDowncasts);
     this.closureContext = closureContext;
-    inferStatement(function.body);
+    inferStatement(factory, function.body);
 
     // If the closure is declared with `async*` or `sync*`, let `M` be the
     // least upper bound of the types of the `yield` expressions in `B’`, or
@@ -1277,16 +1381,21 @@
   }
 
   @override
-  void inferMetadata(InferenceHelper helper, List<Expression> annotations) {
+  void inferMetadata<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      List<kernel.Expression> annotations) {
     if (annotations != null) {
       this.helper = helper;
-      inferMetadataKeepingHelper(annotations);
+      inferMetadataKeepingHelper(factory, annotations);
       this.helper = null;
     }
   }
 
   @override
-  void inferMetadataKeepingHelper(List<Expression> annotations) {
+  void inferMetadataKeepingHelper<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      List<kernel.Expression> annotations) {
     if (annotations != null) {
       // Place annotations in a temporary list literal so that they will have a
       // parent.  This is necessary in case any of the annotations need to get
@@ -1294,7 +1403,7 @@
       var parents = annotations.map((e) => e.parent).toList();
       new ListLiteral(annotations);
       for (var annotation in annotations) {
-        inferExpression(annotation, const UnknownType(), false);
+        inferExpression(factory, annotation, const UnknownType(), false);
       }
       for (int i = 0; i < annotations.length; ++i) {
         annotations[i].parent = parents[i];
@@ -1304,17 +1413,24 @@
 
   /// Performs the core type inference algorithm for method invocations (this
   /// handles both null-aware and non-null-aware method invocations).
-  DartType inferMethodInvocation(Expression expression, Expression receiver,
-      int fileOffset, bool isImplicitCall, DartType typeContext,
+  DartType inferMethodInvocation<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Expression expression,
+      kernel.Expression receiver,
+      int fileOffset,
+      bool isImplicitCall,
+      DartType typeContext,
       {VariableDeclaration receiverVariable,
       MethodInvocation desugaredInvocation,
       Object interfaceMember,
       Name methodName,
       Arguments arguments}) {
+    listener.methodInvocationEnter(expression.fileOffset, typeContext);
     // First infer the receiver so we can look up the method that was invoked.
     var receiverType = receiver == null
         ? thisType
-        : inferExpression(receiver, const UnknownType(), true);
+        : inferExpression(factory, receiver, const UnknownType(), true);
+    listener.methodInvocationBeforeArgs(expression.fileOffset, isImplicitCall);
     if (strongMode) {
       receiverVariable?.type = receiverType;
     }
@@ -1333,8 +1449,8 @@
         getCalleeFunctionType(interfaceMember, receiverType, !isImplicitCall);
     var checkKind = preCheckInvocationContravariance(receiver, receiverType,
         interfaceMember, desugaredInvocation, arguments, expression);
-    var inferredType = inferInvocation(
-        typeContext, fileOffset, calleeType, calleeType.returnType, arguments,
+    var inferredType = inferInvocation(factory, typeContext, fileOffset,
+        calleeType, calleeType.returnType, arguments,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         receiverType: receiverType);
     if (methodName.name == '==') {
@@ -1342,29 +1458,52 @@
     }
     handleInvocationContravariance(checkKind, desugaredInvocation, arguments,
         expression, inferredType, calleeType, fileOffset);
-    if (!identical(interfaceMember, 'call') &&
-        strongMode &&
-        isImplicitCall &&
-        interfaceMember != null &&
-        !(interfaceMember is Procedure &&
-            interfaceMember.kind == ProcedureKind.Method) &&
-        receiverType is! DynamicType &&
-        receiverType != typeSchemaEnvironment.rawFunctionType) {
-      var parent = expression.parent;
-      var errorNode = helper.wrapInCompileTimeError(expression,
-          templateImplicitCallOfNonMethod.withArguments(receiverType));
-      parent?.replaceChild(expression, errorNode);
+    int resultOffset = arguments.fileOffset != -1
+        ? arguments.fileOffset
+        : expression.fileOffset;
+    if (identical(interfaceMember, 'call')) {
+      listener.methodInvocationExitCall(
+          resultOffset,
+          arguments.types,
+          isImplicitCall,
+          lastCalleeType,
+          lastInferredSubstitution,
+          inferredType);
+    } else {
+      if (strongMode &&
+          isImplicitCall &&
+          interfaceMember != null &&
+          !(interfaceMember is Procedure &&
+              interfaceMember.kind == ProcedureKind.Method) &&
+          receiverType is! DynamicType &&
+          receiverType != typeSchemaEnvironment.rawFunctionType) {
+        var parent = expression.parent;
+        var errorNode = helper.wrapInCompileTimeError(expression,
+            templateImplicitCallOfNonMethod.withArguments(receiverType));
+        parent?.replaceChild(expression, errorNode);
+      }
+      listener.methodInvocationExit(
+          resultOffset,
+          arguments.types,
+          isImplicitCall,
+          getRealTarget(interfaceMember),
+          lastCalleeType,
+          lastInferredSubstitution,
+          inferredType);
     }
     return inferredType;
   }
 
   @override
-  void inferParameterInitializer(
-      InferenceHelper helper, Expression initializer, DartType declaredType) {
+  void inferParameterInitializer<Expression, Statement, Initializer, Type>(
+      InferenceHelper helper,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      kernel.Expression initializer,
+      DartType declaredType) {
     assert(closureContext == null);
     this.helper = helper;
     assert(declaredType != null);
-    var actualType = inferExpression(initializer, declaredType, true);
+    var actualType = inferExpression(factory, initializer, declaredType, true);
     ensureAssignable(
         declaredType, actualType, initializer, initializer.fileOffset);
     this.helper = null;
@@ -1372,16 +1511,25 @@
 
   /// Performs the core type inference algorithm for property gets (this handles
   /// both null-aware and non-null-aware property gets).
-  DartType inferPropertyGet(Expression expression, Expression receiver,
-      int fileOffset, DartType typeContext,
+  void inferPropertyGet<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      ExpressionJudgment expression,
+      ExpressionJudgment receiver,
+      int fileOffset,
+      DartType typeContext,
       {VariableDeclaration receiverVariable,
       PropertyGet desugaredGet,
       Object interfaceMember,
       Name propertyName}) {
+    listener.propertyGetEnter(expression.fileOffset, typeContext);
     // First infer the receiver so we can look up the getter that was invoked.
-    var receiverType = receiver == null
-        ? thisType
-        : inferExpression(receiver, const UnknownType(), true);
+    DartType receiverType;
+    if (receiver == null) {
+      receiverType = thisType;
+    } else {
+      inferExpression(factory, receiver, const UnknownType(), true);
+      receiverType = receiver.inferredType;
+    }
     if (strongMode) {
       receiverVariable?.type = receiverType;
     }
@@ -1408,7 +1556,13 @@
       inferredType =
           instantiateTearOff(inferredType, typeContext, replacedExpression);
     }
-    return inferredType;
+    if (identical(interfaceMember, 'call')) {
+      listener.propertyGetExitCall(expression.fileOffset, inferredType);
+    } else {
+      listener.propertyGetExit(
+          expression.fileOffset, interfaceMember, inferredType);
+    }
+    expression.inferredType = inferredType;
   }
 
   /// Modifies a type as appropriate when inferring a closure return type.
@@ -1425,7 +1579,9 @@
   ///
   /// Derived classes should override this method with logic that dispatches on
   /// the statement type and calls the appropriate specialized "infer" method.
-  void inferStatement(Statement statement);
+  void inferStatement<Expression, Statement, Initializer, Type>(
+      Factory<Expression, Statement, Initializer, Type> factory,
+      Statement statement);
 
   /// Performs the type inference steps necessary to instantiate a tear-off
   /// (if necessary).
@@ -1542,6 +1698,30 @@
     }
   }
 
+  @override
+  void storePrefix(Token token, PrefixBuilder prefix) {
+    listener.storePrefixInfo(token.offset, prefix.importIndex);
+  }
+
+  @override
+  void storeTypeUse(TypeUseGenerator generator) {
+    var declaration = generator.declaration;
+    if (declaration is ClassBuilder<TypeBuilder, InterfaceType>) {
+      Class class_ = declaration.target;
+      listener.storeClassReference(
+          generator.declarationReferenceOffset, class_, class_.rawType);
+    } else if (declaration is TypeVariableBuilder<TypeBuilder, DartType>) {
+      // TODO(paulberry): handle this case.
+    } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, DartType>) {
+      // TODO(paulberry): handle this case.
+    } else if (declaration is InvalidTypeBuilder<TypeBuilder, DartType>) {
+      // TODO(paulberry): handle this case.
+    } else {
+      throw new UnimplementedError(
+          'TODO(paulberry): ${declaration.runtimeType}');
+    }
+  }
+
   DartType wrapFutureOrType(DartType type) {
     if (type is InterfaceType &&
         identical(type.classNode, coreTypes.futureOrClass)) {
@@ -1630,8 +1810,8 @@
     }
     if (expression is VariableGet) {
       var variable = expression.variable;
-      if (variable is ShadowVariableDeclaration &&
-          ShadowVariableDeclaration.isLocalFunction(variable)) {
+      if (variable is VariableDeclarationJudgment &&
+          VariableDeclarationJudgment.isLocalFunction(variable)) {
         return templateInvalidCastLocalFunction;
       }
     }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 8c56c40..7820263 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -80,8 +80,11 @@
 ConstEvalInvalidStringInterpolationOperand/example: Fail
 ConstEvalInvalidType/analyzerCode: Fail # CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH / CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH / CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH / ...
 ConstEvalInvalidType/example: Fail
+ConstEvalNegativeShift/analyzerCode: Fail # http://dartbug.com/33481
+ConstEvalNegativeShift/example: Fail
 ConstEvalNonConstantLiteral/dart2jsCode: Fail
 ConstEvalNonConstantLiteral/example: Fail
+ConstEvalZeroDivisor/example: Fail
 ConstFieldWithoutInitializer/example: Fail
 ConstructorNotFound/analyzerCode: Fail
 ConstructorNotFound/example: Fail
@@ -221,7 +224,6 @@
 InvalidInitializer/analyzerCode: Fail
 InvalidInitializer/example: Fail
 InvalidInlineFunctionType/analyzerCode: Fail
-InvalidInlineFunctionType/declaration: Fail
 InvalidPackageUri/analyzerCode: Fail
 InvalidPackageUri/example: Fail
 InvalidVoid/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 534bfdf..7292c04 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -64,6 +64,9 @@
 # `#lexeme` a token. The token's `lexeme` property is used.
 #
 # `#string`, `#string2`, `#string3`: strings (that aren't names).
+#    Note: as a rule of thumb, avoid using the `#string` keys. In particular,
+#    do not use them for composing error messages, see [diagnostics.md](
+#    lib/src/fasta/diagnostics.md#avoid-composing-messages-programmatically).
 #
 # `#type`, #type2`: Kernel types.
 #
@@ -99,6 +102,15 @@
 ConstEvalInvalidBinaryOperandType:
   template: "Binary operator '#string' on '#constant' requires operand of type '#type', but was of type '#type2'."
 
+ConstEvalZeroDivisor:
+  template: "Binary operator '#string' on '#string2' requires non-zero divisor, but divisor was '0'."
+  dart2jsCode: INVALID_CONSTANT_DIV
+  analyzerCode: CONST_EVAL_THROWS_IDBZE
+
+ConstEvalNegativeShift:
+  template: "Binary operator '#string' on '#string2' requires non-negative operand, but was '#string3'."
+  dart2jsCode: INVALID_CONSTANT_SHIFT
+
 ConstEvalInvalidMethodInvocation:
   template: "The method '#string' can't be invoked on '#constant' within a const context."
   analyzerCode: UNDEFINED_OPERATOR
@@ -766,6 +778,32 @@
   analyzerCode: STACK_OVERFLOW
   dart2jsCode: GENERIC
 
+InvalidCodePoint:
+  template: "The escape sequence starting with '\\u' isn't a valid code point."
+  analyzerCode: INVALID_CODE_POINT
+  dart2jsCode: "*fatal*"
+  expression:
+    - "'\\u{110000}'"
+
+InvalidHexEscape:
+  template: "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits."
+  analyzerCode: INVALID_HEX_ESCAPE
+  dart2jsCode: "*fatal*"
+  expression:
+    - "'\\x0'"
+    - "'\\x0y'"
+
+InvalidUnicodeEscape:
+  template: "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'."
+  analyzerCode: INVALID_UNICODE_ESCAPE
+  dart2jsCode: "*fatal*"
+  expression:
+    - "'\\u'"
+    - "'\\u0F'"
+    - "'\\u{'"
+    - "'\\u{03'"
+    - "'\\u{0Z}'"
+
 UnexpectedDollarInString:
   template: "A '$' has special meaning inside a string, and must be followed by an identifier or an expression in curly braces ({})."
   tip: "Try adding a backslash (\\) to escape the '$'."
@@ -858,6 +896,9 @@
   template: "Incomplete token."
   dart2jsCode: UNTERMINATED_TOKEN
 
+# Note: avoid using this template, it should only be used for debugging and
+# prototyping, see [diagnostics.md](
+# lib/src/fasta/diagnostics.md#avoid-composing-messages-programmatically).
 Unspecified:
   template: "#string"
   dart2jsCode: GENERIC
@@ -914,7 +955,7 @@
   template: "Invalid inline function type."
   tip: "Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f')."
   dart2jsCode: INVALID_INLINE_FUNCTION_TYPE
-  declaration: "typedef F = Function(int f(String x)); main() { F f; }"
+  declaration: "typedef F = Function(int f(String x));"
 
 SetterNotSync:
   template: "Setters can't use 'async', 'async*', or 'sync*'."
@@ -2275,3 +2316,19 @@
 UseOfDeprecatedIdentifier:
   template: "'#name' is deprecated."
   severity: IGNORED
+
+InitializeFromDillNotSelfContained:
+  template: "Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new."
+  severity: WARNING
+  frontendInternal: true
+  external: test/incremental_load_from_invalid_dill_test.dart
+
+InitializeFromDillUnknownProblem:
+  template: "Tried to initialize from a previous compilation (#string), but couldn't. Error message was '#string2'. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new."
+  severity: WARNING
+  frontendInternal: true
+  external: test/incremental_load_from_invalid_dill_test.dart
+
+MissingExplicitTypeArguments:
+  template: "No type arguments provided, #count possible."
+  severity: IGNORED
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
index 2ca89b4..752038c 100644
--- a/pkg/front_end/test/fasta/bootstrap_test.dart
+++ b/pkg/front_end/test/fasta/bootstrap_test.dart
@@ -48,6 +48,7 @@
   Uri dartVm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
   StdioProcess result = await StdioProcess.run(dartVm.toFilePath(), <String>[
     "-c",
+    "--no_preview_dart_2",
     compiler.toFilePath(),
     "--compile-sdk=sdk/",
     "--output=${output.toFilePath()}",
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 4901f63..08dfb3a 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -118,7 +118,7 @@
     Name binaryOperator = new Name("+");
     Name name = new Name("bar");
     PrefixBuilder prefixBuilder =
-        new PrefixBuilder("myPrefix", false, libraryBuilder, -1);
+        new PrefixBuilder("myPrefix", false, libraryBuilder, -1, -1);
     String assignmentOperator = "+=";
     TypeDeclarationBuilder declaration =
         new KernelTypeVariableBuilder.fromKernel(
diff --git a/pkg/front_end/test/fasta/messages_test.dart b/pkg/front_end/test/fasta/messages_test.dart
index d5d759d..9ba85b8 100644
--- a/pkg/front_end/test/fasta/messages_test.dart
+++ b/pkg/front_end/test/fasta/messages_test.dart
@@ -229,8 +229,10 @@
           null,
           exampleAndAnalyzerCodeRequired &&
                   externalTest != null &&
-                  !(new File(externalTest).existsSync())
-              ? "Given external example for $name points to a nonexisting file."
+                  !(new File.fromUri(suite.uri.resolve(externalTest))
+                      .existsSync())
+              ? "Given external example for $name points to a nonexisting file "
+                  "(${suite.uri.resolve(externalTest)})."
               : null);
 
       yield createDescription(
diff --git a/pkg/front_end/test/fasta/tool_test.dart b/pkg/front_end/test/fasta/tool_test.dart
index 494cde9..9c763dd 100644
--- a/pkg/front_end/test/fasta/tool_test.dart
+++ b/pkg/front_end/test/fasta/tool_test.dart
@@ -85,12 +85,12 @@
     "compile-platform": {
       "exitCode": 1,
       "stdout": """
-Usage: compile_platform [options] dart-library-uri libraries.json platform.dill outline.dill
+Usage: compile_platform [options] dart-library-uri libraries.json vm_outline_strong.dill platform.dill outline.dill
 
 Compiles Dart SDK platform to the Dill/Kernel IR format.
 
 $usage
-Error: Expected four arguments.
+Error: Expected five arguments.
 """,
       "stderr": "",
     },
diff --git a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
index 679349d..97a1d64 100644
--- a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
@@ -201,7 +201,7 @@
       {String name: 'foo',
       DartType setterType: const DynamicType(),
       bool isCovariant: false}) {
-    var parameter = new ShadowVariableDeclaration('value', 0,
+    var parameter = new VariableDeclarationJudgment('value', 0,
         type: setterType, isCovariant: isCovariant);
     var body = new Block([]);
     var function = new FunctionNode(body,
@@ -256,7 +256,7 @@
   }
 
   void test_candidate_for_setter() {
-    var parameter = new ShadowVariableDeclaration('value', 0);
+    var parameter = new VariableDeclarationJudgment('value', 0);
     var function = new FunctionNode(null,
         positionalParameters: [parameter], returnType: const VoidType());
     var setter = new ShadowProcedure(
@@ -367,8 +367,8 @@
         kind: ProcedureKind.Operator,
         name: '[]=',
         positionalParameters: [
-          new ShadowVariableDeclaration('index', 0, type: intType),
-          new ShadowVariableDeclaration('value', 0, type: numType)
+          new VariableDeclarationJudgment('index', 0, type: intType),
+          new VariableDeclarationJudgment('value', 0, type: numType)
         ]);
     var stub = makeForwardingStub(operator, false);
     expect(stub.name, operator.name);
@@ -397,7 +397,7 @@
   }
 
   void test_createForwardingStub_optionalNamedParameter() {
-    var parameter = new ShadowVariableDeclaration('x', 0, type: intType);
+    var parameter = new VariableDeclarationJudgment('x', 0, type: intType);
     var method = makeEmptyMethod(namedParameters: [parameter]);
     var stub = makeForwardingStub(method, false);
     expect(stub.function.namedParameters, hasLength(1));
@@ -414,7 +414,7 @@
   }
 
   void test_createForwardingStub_optionalPositionalParameter() {
-    var parameter = new ShadowVariableDeclaration('x', 0, type: intType);
+    var parameter = new VariableDeclarationJudgment('x', 0, type: intType);
     var method = makeEmptyMethod(
         positionalParameters: [parameter], requiredParameterCount: 0);
     var stub = makeForwardingStub(method, false);
@@ -431,7 +431,7 @@
   }
 
   void test_createForwardingStub_requiredParameter() {
-    var parameter = new ShadowVariableDeclaration('x', 0, type: intType);
+    var parameter = new VariableDeclarationJudgment('x', 0, type: intType);
     var method = makeEmptyMethod(positionalParameters: [parameter]);
     var stub = makeForwardingStub(method, false);
     expect(stub.function.positionalParameters, hasLength(1));
@@ -512,9 +512,9 @@
     // class C<T> { T foo(T x, {T y}); }
     var T = new TypeParameter('T', objectType);
     var x =
-        new ShadowVariableDeclaration('x', 0, type: new TypeParameterType(T));
+        new VariableDeclarationJudgment('x', 0, type: new TypeParameterType(T));
     var y =
-        new ShadowVariableDeclaration('y', 0, type: new TypeParameterType(T));
+        new VariableDeclarationJudgment('y', 0, type: new TypeParameterType(T));
     var method = makeEmptyMethod(
         positionalParameters: [x],
         namedParameters: [y],
@@ -547,9 +547,9 @@
     var T = new TypeParameter('T', objectType);
     var U = new TypeParameter('U', objectType);
     var x =
-        new ShadowVariableDeclaration('x', 0, type: new TypeParameterType(T));
+        new VariableDeclarationJudgment('x', 0, type: new TypeParameterType(T));
     var y =
-        new ShadowVariableDeclaration('y', 0, type: new TypeParameterType(U));
+        new VariableDeclarationJudgment('y', 0, type: new TypeParameterType(U));
     var method =
         makeEmptyMethod(typeParameters: [U], positionalParameters: [x, y]);
     var substitution = Substitution.fromPairs([T], [intType]);
@@ -563,7 +563,7 @@
   void test_createForwardingStub_typeParameter_substituteUses() {
     // class C { void foo<T>(T x); }
     var typeParameter = new TypeParameter('T', objectType);
-    var param = new ShadowVariableDeclaration('x', 0,
+    var param = new VariableDeclarationJudgment('x', 0,
         type: new TypeParameterType(typeParameter));
     var method = makeEmptyMethod(
         typeParameters: [typeParameter], positionalParameters: [param]);
@@ -578,7 +578,7 @@
     var typeParameter = new TypeParameter('T', null);
     typeParameter.bound =
         new InterfaceType(listClass, [new TypeParameterType(typeParameter)]);
-    var param = new ShadowVariableDeclaration('x', 0,
+    var param = new VariableDeclarationJudgment('x', 0,
         type: new TypeParameterType(typeParameter));
     var method = makeEmptyMethod(
         typeParameters: [typeParameter], positionalParameters: [param]);
@@ -596,9 +596,9 @@
   void test_direct_isGenericCovariant() {
     var typeParameter = new TypeParameter('T', objectType);
     var u = new TypeParameter('U', new TypeParameterType(typeParameter));
-    var x = new ShadowVariableDeclaration('x', 0,
+    var x = new VariableDeclarationJudgment('x', 0,
         type: new TypeParameterType(typeParameter));
-    var y = new ShadowVariableDeclaration('y', 0,
+    var y = new VariableDeclarationJudgment('y', 0,
         type: new TypeParameterType(typeParameter));
     var method = makeEmptyMethod(
         typeParameters: [u], positionalParameters: [x], namedParameters: [y]);
@@ -708,14 +708,14 @@
 
   void test_forwardingStub_isCovariant_inherited() {
     var methodA = makeEmptyMethod(positionalParameters: [
-      new ShadowVariableDeclaration('x', 0, type: numType)
+      new VariableDeclarationJudgment('x', 0, type: numType)
     ], namedParameters: [
-      new ShadowVariableDeclaration('y', 0, type: numType)
+      new VariableDeclarationJudgment('y', 0, type: numType)
     ]);
     var methodB = makeEmptyMethod(positionalParameters: [
-      new ShadowVariableDeclaration('x', 0, type: intType)..isCovariant = true
+      new VariableDeclarationJudgment('x', 0, type: intType)..isCovariant = true
     ], namedParameters: [
-      new ShadowVariableDeclaration('y', 0, type: intType)..isCovariant = true
+      new VariableDeclarationJudgment('y', 0, type: intType)..isCovariant = true
     ]);
     var a = makeClass(name: 'A', procedures: [methodA]);
     var b = makeClass(name: 'B', procedures: [methodB]);
@@ -739,20 +739,20 @@
     var methodA = makeEmptyMethod(typeParameters: [
       new TypeParameter('U', numType)
     ], positionalParameters: [
-      new ShadowVariableDeclaration('x', 0, type: numType)
+      new VariableDeclarationJudgment('x', 0, type: numType)
     ], namedParameters: [
-      new ShadowVariableDeclaration('y', 0, type: numType)
+      new VariableDeclarationJudgment('y', 0, type: numType)
     ]);
     var typeParameterB = new TypeParameter('T', objectType);
     var methodB = makeEmptyMethod(typeParameters: [
       new TypeParameter('U', new TypeParameterType(typeParameterB))
         ..isGenericCovariantImpl = true
     ], positionalParameters: [
-      new ShadowVariableDeclaration('x', 0,
+      new VariableDeclarationJudgment('x', 0,
           type: new TypeParameterType(typeParameterB))
         ..isGenericCovariantImpl = true
     ], namedParameters: [
-      new ShadowVariableDeclaration('y', 0,
+      new VariableDeclarationJudgment('y', 0,
           type: new TypeParameterType(typeParameterB))
         ..isGenericCovariantImpl = true
     ]);
@@ -907,11 +907,11 @@
   }
 
   void test_resolve_directly_declared() {
-    var parameterA = new ShadowVariableDeclaration('x', 0,
+    var parameterA = new VariableDeclarationJudgment('x', 0,
         type: objectType, isCovariant: true);
     var methodA = makeEmptyMethod(positionalParameters: [parameterA]);
-    var parameterB =
-        new ShadowVariableDeclaration('x', 0, type: intType, isCovariant: true);
+    var parameterB = new VariableDeclarationJudgment('x', 0,
+        type: intType, isCovariant: true);
     var methodB = makeEmptyMethod(positionalParameters: [parameterB]);
     var a = makeClass(name: 'A', procedures: [methodA]);
     var b = makeClass(
@@ -987,16 +987,16 @@
 
   void test_resolve_with_added_implementation() {
     var methodA = makeEmptyMethod(positionalParameters: [
-      new ShadowVariableDeclaration('x', 0, type: numType)
+      new VariableDeclarationJudgment('x', 0, type: numType)
     ]);
     var typeParamB = new TypeParameter('T', objectType);
     var methodB = makeEmptyMethod(positionalParameters: [
-      new ShadowVariableDeclaration('x', 0,
+      new VariableDeclarationJudgment('x', 0,
           type: new TypeParameterType(typeParamB))
         ..isGenericCovariantImpl = true
     ]);
     var methodC = makeEmptyMethod(positionalParameters: [
-      new ShadowVariableDeclaration('x', 0, type: numType)
+      new VariableDeclarationJudgment('x', 0, type: numType)
     ], isAbstract: true);
     var a = makeClass(name: 'A', procedures: [methodA]);
     var b = makeClass(
diff --git a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
index 0d52517..d9a9cad 100644
--- a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
@@ -29,28 +29,17 @@
   Uri fullDillFromInitialized =
       outDir.uri.resolve("dart2js.full_from_initialized.dill");
   Uri nonexisting = outDir.uri.resolve("dart2js.nonexisting.dill");
-  Uri nonLoadable = outDir.uri.resolve("dart2js.nonloadable.dill");
 
   // Compile dart2js without initializing from dill.
   Stopwatch stopwatch = new Stopwatch()..start();
   await normalCompile(dart2jsUrl, normalDill);
   print("Normal compile took ${stopwatch.elapsedMilliseconds} ms");
 
-  // Create a file that cannot be (fully) loaded as a dill file.
-  List<int> corruptData = new File.fromUri(normalDill).readAsBytesSync();
-  for (int i = 10 * (corruptData.length ~/ 16);
-      i < 15 * (corruptData.length ~/ 16);
-      ++i) {
-    corruptData[i] = 42;
-  }
-  new File.fromUri(nonLoadable).writeAsBytesSync(corruptData);
-
   // Compile dart2js, initializing from the just-compiled dill,
   // a nonexisting file and a dill file that isn't valid.
   for (List<Object> initializationData in [
     [normalDill, true],
     [nonexisting, false],
-    //  [nonLoadable, false] // disabled for now
   ]) {
     Uri initializeWith = initializationData[0];
     bool initializeExpect = initializationData[1];
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 156b814..9e14f0e 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -115,8 +115,8 @@
   }
 }
 
-void basicTest(Map<String, String> sourceFiles, String entryPoint, bool strong,
-    List<String> invalidate, Directory outDir) async {
+Future<Null> basicTest(Map<String, String> sourceFiles, String entryPoint,
+    bool strong, List<String> invalidate, Directory outDir) async {
   Uri entryPointUri = outDir.uri.resolve(entryPoint);
   Set<String> invalidateFilenames = invalidate?.toSet() ?? new Set<String>();
   List<Uri> invalidateUris = <Uri>[];
@@ -172,7 +172,7 @@
   checkIsEqual(normalDillData, initializedDillData);
 }
 
-void newWorldTest(bool strong, List worlds) async {
+Future<Null> newWorldTest(bool strong, List worlds) async {
   final Uri sdkRoot = computePlatformBinariesLocation();
   final Uri base = Uri.parse("org-dartlang-test:///");
   final Uri sdkSummary = base.resolve("vm_platform.dill");
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
new file mode 100644
index 0000000..deced6f
--- /dev/null
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
@@ -0,0 +1,175 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async' show Future;
+
+import 'dart:io' show File;
+
+import 'package:expect/expect.dart' show Expect;
+
+import 'package:front_end/src/api_prototype/compiler_options.dart'
+    show CompilerOptions;
+
+import "package:front_end/src/api_prototype/memory_file_system.dart"
+    show MemoryFileSystem;
+
+import 'package:front_end/src/base/processed_options.dart'
+    show ProcessedOptions;
+
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
+import 'package:front_end/src/fasta/fasta_codes.dart'
+    show
+        Template,
+        templateInitializeFromDillNotSelfContained,
+        templateInitializeFromDillUnknownProblem,
+        FormattedMessage;
+
+import 'package:front_end/src/fasta/fasta_codes.dart' show FormattedMessage;
+
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+
+import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
+
+import 'package:front_end/src/fasta/severity.dart' show Severity;
+
+import 'package:kernel/kernel.dart' show Component;
+
+import 'incremental_load_from_dill_test.dart' show getOptions;
+
+Future<Null> main() async {
+  Tester tester = new Tester();
+  await tester.initialize();
+  await tester.test();
+}
+
+class Tester {
+  Uri sdkRoot;
+  Uri base;
+  Uri sdkSummary;
+  Uri initializeFrom;
+  Uri helperFile;
+  Uri entryPoint;
+  Uri platformUri;
+  List<int> sdkSummaryData;
+  List<FormattedMessage> formattedErrors;
+  List<FormattedMessage> formattedWarnings;
+  MemoryFileSystem fs;
+  CompilerOptions options;
+
+  compileExpectInitializeFailAndSpecificWarning(
+      Template expectedWarningTemplate) async {
+    formattedErrors.clear();
+    formattedWarnings.clear();
+    IncrementalCompiler compiler = new IncrementalCompiler(
+        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        initializeFrom);
+    await compiler.computeDelta();
+    if (compiler.initializedFromDill) {
+      Expect.fail("Expected to not be able to initialized from dill, but did.");
+    }
+    if (formattedErrors.isNotEmpty) {
+      Expect.fail("Got unexpected errors: $formattedErrors");
+    }
+    if (formattedWarnings.length != 1) {
+      Expect.fail(
+          "Got unexpected errors: Expected one, got this: $formattedWarnings");
+    }
+    if (formattedWarnings[0].code.template != expectedWarningTemplate) {
+      Expect.fail("Expected $expectedWarningTemplate "
+          "but got $formattedWarnings");
+    }
+  }
+
+  initialize() async {
+    sdkRoot = computePlatformBinariesLocation();
+    base = Uri.parse("org-dartlang-test:///");
+    sdkSummary = base.resolve("vm_platform.dill");
+    initializeFrom = base.resolve("initializeFrom.dill");
+    helperFile = base.resolve("helper.dart");
+    entryPoint = base.resolve("small.dart");
+    platformUri = sdkRoot.resolve("vm_platform_strong.dill");
+    sdkSummaryData = await new File.fromUri(platformUri).readAsBytes();
+    formattedErrors = <FormattedMessage>[];
+    formattedWarnings = <FormattedMessage>[];
+    fs = new MemoryFileSystem(base);
+    options = getOptions(true);
+
+    options.fileSystem = fs;
+    options.sdkRoot = null;
+    options.sdkSummary = sdkSummary;
+    options.onProblem = (FormattedMessage problem, Severity severity,
+        List<FormattedMessage> context) {
+      if (severity == Severity.error) {
+        formattedErrors.add(problem);
+      } else if (severity == Severity.warning) {
+        formattedWarnings.add(problem);
+      }
+    };
+
+    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryData);
+    fs.entityForUri(helperFile).writeAsStringSync("""
+foo() {
+    print("hello from foo");
+}
+""");
+    fs.entityForUri(entryPoint).writeAsStringSync("""
+import "helper.dart" as helper;
+main() {
+    helper.foo();
+}
+""");
+  }
+
+  Future<Null> test() async {
+    IncrementalCompiler compiler = new IncrementalCompiler(
+        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        initializeFrom);
+
+    Component componentGood = await compiler.computeDelta();
+    List<int> dataGood = serializeComponent(componentGood);
+    fs.entityForUri(initializeFrom).writeAsBytesSync(dataGood);
+
+    // Initialize from good dill file should be ok.
+    compiler = new IncrementalCompiler(
+        new CompilerContext(new ProcessedOptions(options, [entryPoint])),
+        initializeFrom);
+    compiler.invalidate(entryPoint);
+    Component component = await compiler.computeDelta();
+    if (!compiler.initializedFromDill) {
+      Expect.fail(
+          "Expected to have sucessfully initialized from dill, but didn't.");
+    }
+    if (formattedErrors.isNotEmpty) {
+      Expect.fail("Got unexpected errors: $formattedErrors");
+    }
+    if (formattedWarnings.isNotEmpty) {
+      Expect.fail("Got unexpected errors: $formattedWarnings");
+    }
+
+    // Create a partial dill file.
+    compiler.invalidate(entryPoint);
+    component = await compiler.computeDelta();
+    if (component.libraries.length != 1) {
+      Expect.fail("Expected 1 library, got ${component.libraries.length}: "
+          "${component.libraries}");
+    }
+    List<int> data = serializeComponent(component);
+    fs.entityForUri(initializeFrom).writeAsBytesSync(data);
+
+    // Initializing from partial dill should not be ok.
+    await compileExpectInitializeFailAndSpecificWarning(
+        templateInitializeFromDillNotSelfContained);
+
+    // Create a invalid dill file to load from: Should not be ok.
+    data = new List<int>.filled(42, 42);
+    fs.entityForUri(initializeFrom).writeAsBytesSync(data);
+    await compileExpectInitializeFailAndSpecificWarning(
+        templateInitializeFromDillUnknownProblem);
+  }
+}
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index 8d29cbe..0cb398a 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_test.dart
@@ -270,11 +270,12 @@
     fileSystem
         .entityForUri(Uri.parse('org-dartlang-test:///base/location/'))
         .createDirectory();
+
+    // packages/ directory is deprecated and should be ignored.
     fileSystem
         .entityForUri(Uri.parse('org-dartlang-test:///base/location/packages/'))
         .createDirectory();
 
-    // Both of these .packages file should be ignored.
     fileSystem
         .entityForUri(Uri.parse('org-dartlang-test:///.packages'))
         .writeAsStringSync('foo:bar\n');
@@ -285,8 +286,7 @@
     var processed = new ProcessedOptions(
         raw, [Uri.parse('org-dartlang-test:///base/location/script.dart')]);
     var uriTranslator = await processed.getUriTranslator();
-    checkPackageExpansion(
-        'foo', 'base/location/packages/foo', uriTranslator.packages);
+    checkPackageExpansion('foo', 'base/baz', uriTranslator.packages);
   }
 
   test_getUriTranslator_implicitPackagesFile_noPackages() async {
diff --git a/pkg/front_end/test/whole_program_test.dart b/pkg/front_end/test/whole_program_test.dart
index 6261229..d342a04 100644
--- a/pkg/front_end/test/whole_program_test.dart
+++ b/pkg/front_end/test/whole_program_test.dart
@@ -56,6 +56,7 @@
 
   final List<String> arguments = <String>[
     '--packages=${packagesFile.toFilePath()}',
+    '--no_preview_dart_2',
     '-c',
     compiler.toFilePath(),
     '--platform=${platformDill.toFilePath()}',
@@ -91,7 +92,7 @@
 }
 
 Future runHelloWorld(Uri dillFile) async {
-  final List<String> arguments = <String>['-c', dillFile.toFilePath()];
+  final List<String> arguments = <String>[dillFile.toFilePath()];
   await run('Running hello.dart', arguments, 'hello world!\n');
 }
 
diff --git a/pkg/front_end/testcases/bug32414a.dart.strong.expect b/pkg/front_end/testcases/bug32414a.dart.strong.expect
index 3e11c16..052c06d 100644
--- a/pkg/front_end/testcases/bug32414a.dart.strong.expect
+++ b/pkg/front_end/testcases/bug32414a.dart.strong.expect
@@ -5,7 +5,7 @@
 static method test() → void {
   dynamic a = 5;
   core::String b = a.{core::Object::toString}();
-  b = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  b = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   b = 42;
       ^" in let final dynamic #t2 = 42 in null;
diff --git a/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
index 96b25c6..079972f 100644
--- a/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 static method test() → void {
   dynamic a = 5;
   core::String b = a.{core::Object::toString}();
-  b = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  b = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   b = 42;
       ^" in let final core::int #t2 = 42 in null;
diff --git a/pkg/front_end/testcases/bug33298.dart b/pkg/front_end/testcases/bug33298.dart
new file mode 100644
index 0000000..e388026
--- /dev/null
+++ b/pkg/front_end/testcases/bug33298.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  String call(String s) => '$s$s';
+}
+
+class B<T> {
+  T call(T t) => t;
+}
+
+class C {
+  T call<T>(T t) => t;
+}
+
+test() {
+  A a = A();
+  List<String> list1 = ['a', 'b', 'c'].map(a.call).toList();
+  List<String> list2 = ['a', 'b', 'c'].map(a).toList();
+
+  B<String> b = B();
+  List<String> list3 = ['a', 'b', 'c'].map(b.call).toList();
+  List<String> list4 = ['a', 'b', 'c'].map(b).toList();
+
+  C c = C();
+  List<String> list5 = ['a', 'b', 'c'].map(c.call).toList();
+  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/bug33298.dart.direct.expect b/pkg/front_end/testcases/bug33298.dart.direct.expect
new file mode 100644
index 0000000..e89e403
--- /dev/null
+++ b/pkg/front_end/testcases/bug33298.dart.direct.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(core::String s) → core::String
+    return "${s}${s}";
+}
+class B<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::B::T t) → self::B::T
+    return t;
+}
+class C extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
+    return t;
+}
+static method test() → dynamic {
+  self::A a = new self::A::•();
+  core::List<core::String> list1 = <dynamic>["a", "b", "c"].map(a.call).toList();
+  core::List<core::String> list2 = <dynamic>["a", "b", "c"].map(a).toList();
+  self::B<core::String> b = new self::B::•<dynamic>();
+  core::List<core::String> list3 = <dynamic>["a", "b", "c"].map(b.call).toList();
+  core::List<core::String> list4 = <dynamic>["a", "b", "c"].map(b).toList();
+  self::C c = new self::C::•();
+  core::List<core::String> list5 = <dynamic>["a", "b", "c"].map(c.call).toList();
+  core::List<core::String> list6 = <dynamic>["a", "b", "c"].map(c).toList();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect
new file mode 100644
index 0000000..e89e403
--- /dev/null
+++ b/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(core::String s) → core::String
+    return "${s}${s}";
+}
+class B<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::B::T t) → self::B::T
+    return t;
+}
+class C extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
+    return t;
+}
+static method test() → dynamic {
+  self::A a = new self::A::•();
+  core::List<core::String> list1 = <dynamic>["a", "b", "c"].map(a.call).toList();
+  core::List<core::String> list2 = <dynamic>["a", "b", "c"].map(a).toList();
+  self::B<core::String> b = new self::B::•<dynamic>();
+  core::List<core::String> list3 = <dynamic>["a", "b", "c"].map(b.call).toList();
+  core::List<core::String> list4 = <dynamic>["a", "b", "c"].map(b).toList();
+  self::C c = new self::C::•();
+  core::List<core::String> list5 = <dynamic>["a", "b", "c"].map(c.call).toList();
+  core::List<core::String> list6 = <dynamic>["a", "b", "c"].map(c).toList();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.outline.expect b/pkg/front_end/testcases/bug33298.dart.outline.expect
new file mode 100644
index 0000000..215a8e2
--- /dev/null
+++ b/pkg/front_end/testcases/bug33298.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    ;
+  method call(core::String s) → core::String
+    ;
+}
+class B<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+  method call(self::B::T t) → self::B::T
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → void
+    ;
+  method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.expect b/pkg/front_end/testcases/bug33298.dart.strong.expect
new file mode 100644
index 0000000..5d1ae80
--- /dev/null
+++ b/pkg/front_end/testcases/bug33298.dart.strong.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(core::String s) → core::String
+    return "${s}${s}";
+}
+class B<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(generic-covariant-impl self::B::T t) → self::B::T
+    return t;
+}
+class C extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
+    return t;
+}
+static method test() → dynamic {
+  self::A a = new self::A::•();
+  core::List<core::String> list1 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(a.{self::A::call}).{core::Iterable::toList}();
+  core::List<core::String> list2 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::A #t1 = a in #t1.==(null) ?{(core::String) → core::String} null : #t1.{self::A::call}).{core::Iterable::toList}();
+  self::B<core::String> b = new self::B::•<core::String>();
+  core::List<core::String> list3 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(b.{self::B::call}).{core::Iterable::toList}();
+  core::List<core::String> list4 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::B<core::String> #t2 = b in #t2.==(null) ?{(core::String) → core::String} null : #t2.{self::B::call}).{core::Iterable::toList}();
+  self::C c = new self::C::•();
+  core::List<core::String> list5 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(c.{self::C::call}<core::String>).{core::Iterable::toList}();
+  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: A value of type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to a variable of type '(dart.core::String) \u8594 dynamic'.
+Try changing the type of the left hand side, or casting the right hand side to '(dart.core::String) \u8594 dynamic'.
+  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+                                           ^" in let final dynamic #t4 = let final self::C #t5 = c in #t5.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t5.{self::C::call} in null).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
new file mode 100644
index 0000000..f0aa840
--- /dev/null
+++ b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(core::String s) → core::String
+    return "${s}${s}";
+}
+class B<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(generic-covariant-impl self::B::T t) → self::B::T
+    return t;
+}
+class C extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
+    return t;
+}
+static method test() → dynamic {
+  self::A a = new self::A::•();
+  core::List<core::String> list1 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(a.{self::A::call}).{core::Iterable::toList}();
+  core::List<core::String> list2 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::A #t1 = a in #t1.==(null) ?{(core::String) → core::String} null : #t1.{self::A::call}).{core::Iterable::toList}();
+  self::B<core::String> b = new self::B::•<core::String>();
+  core::List<core::String> list3 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(b.{self::B::call}).{core::Iterable::toList}();
+  core::List<core::String> list4 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::B<core::String> #t2 = b in #t2.==(null) ?{(core::String) → core::String} null : #t2.{self::B::call}).{core::Iterable::toList}();
+  self::C c = new self::C::•();
+  core::List<core::String> list5 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(c.{self::C::call}<core::String>).{core::Iterable::toList}();
+  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: A value of type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to a variable of type '(dart.core::String) \u8594 dynamic'.
+Try changing the type of the left hand side, or casting the right hand side to '(dart.core::String) \u8594 dynamic'.
+  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+                                           ^" in let final <T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T #t4 = let final self::C #t5 = c in #t5.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t5.{self::C::call} in null).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index 4802c5b..a10a38b 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -3,5 +3,5 @@
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
   return () → dart.core::Null {
-    main::A::debugExpr::T k = let final dynamic #t1 = let dynamic _ = null in invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'T'.\nTry changing the type of the left hand side, or casting the right hand side to 'T'.\n  T k = new A();\n            ^" in let final dynamic #t2 = new main::A::•<dynamic>() in null;
+    main::A::debugExpr::T k = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'T'.\nTry changing the type of the left hand side, or casting the right hand side to 'T'.\n  T k = new A();\n            ^" in let final dynamic #t2 = new main::A::•<dynamic>() in null;
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
index 66d9ec3..644c45e 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
@@ -7,7 +7,7 @@
     return null;
   () → core::String g = f;
   g = () → core::String {
-    return let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    return let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
                                             ^" in let final dynamic #t2 = 1 in null;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
index 324afbd..b4515d3 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     return null;
   () → core::String g = f;
   g = () → core::String {
-    return let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    return let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
                                             ^" in let final core::int #t2 = 1 in null;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
index 2994746..e3df93c 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
@@ -15,7 +15,7 @@
   self::C<core::num> c_num = new self::C::•<core::num>(123);
   self::C<core::num> c_num2 = let final self::C<core::num> #t1 = new self::C::•<core::num>(456) in let final dynamic #t2 = #t1.{self::C::t} = 1.0 in #t1;
   self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
-  x.{self::C::t} = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{self::C::t} = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in let final dynamic #t4 = "hello" in null;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
index 3669a89..d63a39e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
   self::C<core::num> c_num = new self::C::•<core::num>(123);
   self::C<core::num> c_num2 = let final self::C<core::num> #t1 = new self::C::•<core::num>(456) in let final core::double #t2 = #t1.{self::C::t} = 1.0 in #t1;
   self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
-  x.{self::C::t} = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{self::C::t} = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in let final core::String #t4 = "hello" in null;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
index 39dec86..5808a55 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
@@ -15,7 +15,7 @@
 }
 static method test() → dynamic {
   self::C<core::int> x = self::C::•<core::int>(42);
-  x.{self::C::t} = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{self::C::t} = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in let final dynamic #t2 = "hello" in null;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
index 6259db5..14fa331 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
 }
 static method test() → dynamic {
   self::C<core::int> x = self::C::•<core::int>(42);
-  x.{self::C::t} = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{self::C::t} = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in let final core::String #t2 = "hello" in null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
index 6e8738f..a31f14b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method test() → void {
   core::List<core::int> l;
-  l = <core::int>[let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  l = <core::int>[let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
                                                                     ^" in let final dynamic #t2 = "hello" in null];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
index 9964842..993ac52 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method test() → void {
   core::List<core::int> l;
-  l = <core::int>[let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  l = <core::int>[let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
                                                                     ^" in let final core::String #t2 = "hello" in null];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
index c8f23f9..8248a92 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
@@ -25,51 +25,51 @@
 static method test() → void {
   new self::F0::•(<core::int>[]);
   new self::F0::•(<core::int>[3]);
-  new self::F0::•(<core::int>[let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•(<core::int>[let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final dynamic #t2 = "hello" in null]);
-  new self::F0::•(<core::int>[let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•(<core::int>[let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final dynamic #t4 = "hello" in null, 3]);
   new self::F1::•(a: <core::int>[]);
   new self::F1::•(a: <core::int>[3]);
-  new self::F1::•(a: <core::int>[let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in let final dynamic #t6 = "hello" in null]);
-  new self::F1::•(a: <core::int>[let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final dynamic #t8 = "hello" in null, 3]);
   new self::F2::•(<core::int>[]);
   new self::F2::•(<core::int>[3]);
-  new self::F2::•(<core::int>[let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•(<core::int>[let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final dynamic #t10 = "hello" in null]);
-  new self::F2::•(<core::int>[let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•(<core::int>[let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final dynamic #t12 = "hello" in null, 3]);
   new self::F3::•(<core::Iterable<core::int>>[]);
   new self::F3::•(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final dynamic #t14 = "hello" in null]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final dynamic #t16 = "hello" in null], <core::int>[3]]);
   new self::F4::•(a: <core::Iterable<core::int>>[]);
   new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final dynamic #t18 = "hello" in null]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final dynamic #t20 = "hello" in null], <core::int>[3]]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index 0606923..9e6ac81 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -25,51 +25,51 @@
 static method test() → void {
   new self::F0::•(<core::int>[]);
   new self::F0::•(<core::int>[3]);
-  new self::F0::•(<core::int>[let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•(<core::int>[let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final core::String #t2 = "hello" in null]);
-  new self::F0::•(<core::int>[let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•(<core::int>[let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final core::String #t4 = "hello" in null, 3]);
   new self::F1::•(a: <core::int>[]);
   new self::F1::•(a: <core::int>[3]);
-  new self::F1::•(a: <core::int>[let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in let final core::String #t6 = "hello" in null]);
-  new self::F1::•(a: <core::int>[let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final core::String #t8 = "hello" in null, 3]);
   new self::F2::•(<core::int>[]);
   new self::F2::•(<core::int>[3]);
-  new self::F2::•(<core::int>[let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•(<core::int>[let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final core::String #t10 = "hello" in null]);
-  new self::F2::•(<core::int>[let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•(<core::int>[let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final core::String #t12 = "hello" in null, 3]);
   new self::F3::•(<core::Iterable<core::int>>[]);
   new self::F3::•(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final core::String #t14 = "hello" in null]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final core::String #t16 = "hello" in null], <core::int>[3]]);
   new self::F4::•(a: <core::Iterable<core::int>>[]);
   new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final core::String #t18 = "hello" in null]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final core::String #t20 = "hello" in null], <core::int>[3]]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
index bd9133d..7c0032b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
@@ -10,51 +10,51 @@
 static method test() → void {
   self::f0(<core::int>[]);
   self::f0(<core::int>[3]);
-  self::f0(<core::int>[let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f0(<core::int>[let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in let final dynamic #t2 = "hello" in null]);
-  self::f0(<core::int>[let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f0(<core::int>[let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in let final dynamic #t4 = "hello" in null, 3]);
   self::f1(a: <core::int>[]);
   self::f1(a: <core::int>[3]);
-  self::f1(a: <core::int>[let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f1(a: <core::int>[let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                       ^" in let final dynamic #t6 = "hello" in null]);
-  self::f1(a: <core::int>[let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f1(a: <core::int>[let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final dynamic #t8 = "hello" in null, 3]);
   self::f2(<core::int>[]);
   self::f2(<core::int>[3]);
-  self::f2(<core::int>[let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f2(<core::int>[let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in let final dynamic #t10 = "hello" in null]);
-  self::f2(<core::int>[let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f2(<core::int>[let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in let final dynamic #t12 = "hello" in null, 3]);
   self::f3(<core::Iterable<core::int>>[]);
   self::f3(<core::Iterable<core::int>>[<core::int>[3]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final dynamic #t14 = "hello" in null]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final dynamic #t16 = "hello" in null], <core::int>[3]]);
   self::f4(a: <core::Iterable<core::int>>[]);
   self::f4(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final dynamic #t18 = "hello" in null]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final dynamic #t20 = "hello" in null], <core::int>[3]]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
index 52a7af1..c6f1d56 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
@@ -10,51 +10,51 @@
 static method test() → void {
   self::f0(<core::int>[]);
   self::f0(<core::int>[3]);
-  self::f0(<core::int>[let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f0(<core::int>[let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in let final core::String #t2 = "hello" in null]);
-  self::f0(<core::int>[let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f0(<core::int>[let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in let final core::String #t4 = "hello" in null, 3]);
   self::f1(a: <core::int>[]);
   self::f1(a: <core::int>[3]);
-  self::f1(a: <core::int>[let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f1(a: <core::int>[let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                       ^" in let final core::String #t6 = "hello" in null]);
-  self::f1(a: <core::int>[let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f1(a: <core::int>[let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final core::String #t8 = "hello" in null, 3]);
   self::f2(<core::int>[]);
   self::f2(<core::int>[3]);
-  self::f2(<core::int>[let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f2(<core::int>[let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in let final core::String #t10 = "hello" in null]);
-  self::f2(<core::int>[let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f2(<core::int>[let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in let final core::String #t12 = "hello" in null, 3]);
   self::f3(<core::Iterable<core::int>>[]);
   self::f3(<core::Iterable<core::int>>[<core::int>[3]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final core::String #t14 = "hello" in null]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final core::String #t16 = "hello" in null], <core::int>[3]]);
   self::f4(a: <core::Iterable<core::int>>[]);
   self::f4(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final core::String #t18 = "hello" in null]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final core::String #t20 = "hello" in null], <core::int>[3]]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index 2f7fa93..81fd737 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -7,16 +7,16 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.
+    (core::int) → core::String l2 = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::String'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
                                                                  ^" in let final dynamic #t2 = (core::String x) → core::String => "hello" in null;
-    (core::int) → core::String l3 = (core::int x) → core::String => let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::String l3 = (core::int x) → core::String => let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
                                                                             ^" in let final dynamic #t4 = 3 in null;
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final dynamic #t6 = 3 in null;
@@ -25,18 +25,18 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
             3;
             ^" in let final dynamic #t8 = 3 in null;
     (core::int) → core::String l3 = (core::int x) → core::String {
-      return let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final dynamic #t10 = 3 in null;
     };
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in let final dynamic #t12 = x in null;
@@ -45,16 +45,16 @@
   {
     (core::int) → core::List<core::String> l0 = (core::int x) → core::Null => null;
     (core::int) → core::List<core::String> l1 = (core::int x) → core::List<core::String> => <core::String>["hello"];
-    (core::int) → core::List<core::String> l2 = let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    (core::int) → core::List<core::String> l2 = let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
                                                                        ^" in let final dynamic #t14 = (core::String x) → core::List<core::String> => <core::String>["hello"] in null;
-    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                          ^" in let final dynamic #t16 = 3 in null];
     (core::int) → core::List<core::String> l4 = (core::int x) → core::List<core::String> {
-      return <core::String>[let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return <core::String>[let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in let final dynamic #t18 = 3 in null];
@@ -63,7 +63,7 @@
   {
     (core::int) → core::int l0 = (core::int x) → core::int => x;
     (core::int) → core::int l1 = (core::int x) → core::int => x.{core::num::+}(1);
-    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
             x;
             ^" in let final dynamic #t20 = x in null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
index d4df104..56253b6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
@@ -7,16 +7,16 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.
+    (core::int) → core::String l2 = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::String'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
                                                                  ^" in let final (core::String) → core::String #t2 = (core::String x) → core::String => "hello" in null;
-    (core::int) → core::String l3 = (core::int x) → core::String => let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::String l3 = (core::int x) → core::String => let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
                                                                             ^" in let final core::int #t4 = 3 in null;
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final core::int #t6 = 3 in null;
@@ -25,18 +25,18 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
             3;
             ^" in let final core::int #t8 = 3 in null;
     (core::int) → core::String l3 = (core::int x) → core::String {
-      return let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final core::int #t10 = 3 in null;
     };
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in let final core::int #t12 = x in null;
@@ -45,16 +45,16 @@
   {
     (core::int) → core::List<core::String> l0 = (core::int x) → core::Null => null;
     (core::int) → core::List<core::String> l1 = (core::int x) → core::List<core::String> => <core::String>["hello"];
-    (core::int) → core::List<core::String> l2 = let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    (core::int) → core::List<core::String> l2 = let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
                                                                        ^" in let final (core::String) → core::List<core::String> #t14 = (core::String x) → core::List<core::String> => <core::String>["hello"] in null;
-    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                          ^" in let final core::int #t16 = 3 in null];
     (core::int) → core::List<core::String> l4 = (core::int x) → core::List<core::String> {
-      return <core::String>[let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return <core::String>[let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in let final core::int #t18 = 3 in null];
@@ -63,7 +63,7 @@
   {
     (core::int) → core::int l0 = (core::int x) → core::int => x;
     (core::int) → core::int l1 = (core::int x) → core::int => x.{core::num::+}(1);
-    (core::int) → core::String l2 = (core::int x) → core::String => let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
             x;
             ^" in let final core::int #t20 = x in null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
index 9d2e2a2..bd656ad 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
@@ -25,51 +25,51 @@
 static method test() → void {
   new self::F0::•<core::int>(<core::int>[]);
   new self::F0::•<core::int>(<core::int>[3]);
-  new self::F0::•<core::int>(<core::int>[let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final dynamic #t2 = "hello" in null]);
-  new self::F0::•<core::int>(<core::int>[let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final dynamic #t4 = "hello" in null, 3]);
   new self::F1::•<core::int>(a: <core::int>[]);
   new self::F1::•<core::int>(a: <core::int>[3]);
-  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in let final dynamic #t6 = "hello" in null]);
-  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final dynamic #t8 = "hello" in null, 3]);
   new self::F2::•<core::int>(<core::int>[]);
   new self::F2::•<core::int>(<core::int>[3]);
-  new self::F2::•<core::int>(<core::int>[let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final dynamic #t10 = "hello" in null]);
-  new self::F2::•<core::int>(<core::int>[let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final dynamic #t12 = "hello" in null, 3]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final dynamic #t14 = "hello" in null]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final dynamic #t16 = "hello" in null], <core::int>[3]]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final dynamic #t18 = "hello" in null]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final dynamic #t20 = "hello" in null], <core::int>[3]]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index 2517cb9..1e39c77 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -25,51 +25,51 @@
 static method test() → void {
   new self::F0::•<core::int>(<core::int>[]);
   new self::F0::•<core::int>(<core::int>[3]);
-  new self::F0::•<core::int>(<core::int>[let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final core::String #t2 = "hello" in null]);
-  new self::F0::•<core::int>(<core::int>[let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final core::String #t4 = "hello" in null, 3]);
   new self::F1::•<core::int>(a: <core::int>[]);
   new self::F1::•<core::int>(a: <core::int>[3]);
-  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in let final core::String #t6 = "hello" in null]);
-  new self::F1::•<core::int>(a: <core::int>[let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final core::String #t8 = "hello" in null, 3]);
   new self::F2::•<core::int>(<core::int>[]);
   new self::F2::•<core::int>(<core::int>[3]);
-  new self::F2::•<core::int>(<core::int>[let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in let final core::String #t10 = "hello" in null]);
-  new self::F2::•<core::int>(<core::int>[let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in let final core::String #t12 = "hello" in null, 3]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final core::String #t14 = "hello" in null]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final core::String #t16 = "hello" in null], <core::int>[3]]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in let final core::String #t18 = "hello" in null]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in let final core::String #t20 = "hello" in null], <core::int>[3]]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index 03e0d17..c873221 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -9,16 +9,16 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
+    v = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
                                                                 ^" in let final dynamic #t2 = <T extends core::Object = dynamic>(core::String x) → core::String => "hello" in null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
                                                                            ^" in let final dynamic #t4 = 3 in null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final dynamic #t6 = 3 in null;
@@ -30,18 +30,18 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         3;
         ^" in let final dynamic #t8 = 3 in null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final dynamic #t10 = 3 in null;
     };
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in let final dynamic #t12 = x in null;
@@ -53,16 +53,16 @@
     <S extends core::Object = dynamic>(core::int) → core::List<core::String> v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
-    v = let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    v = let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
                                                                       ^" in let final dynamic #t14 = <T extends core::Object = dynamic>(core::String x) → core::List<core::String> => <core::String>["hello"] in null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in let final dynamic #t16 = 3 in null];
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> {
-      return <core::String>[let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return <core::String>[let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in let final dynamic #t18 = 3 in null];
@@ -79,7 +79,7 @@
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x;
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x.{core::num::+}(1);
     <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         x;
         ^" in let final dynamic #t20 = x in null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
index fbc3370..b541730 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
@@ -9,16 +9,16 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
+    v = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
                                                                 ^" in let final <T extends core::Object = dynamic>(core::String) → core::String #t2 = <T extends core::Object = dynamic>(core::String x) → core::String => "hello" in null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
                                                                            ^" in let final core::int #t4 = 3 in null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final core::int #t6 = 3 in null;
@@ -30,18 +30,18 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         3;
         ^" in let final core::int #t8 = 3 in null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in let final core::int #t10 = 3 in null;
     };
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in let final core::int #t12 = x in null;
@@ -53,16 +53,16 @@
     <S extends core::Object = dynamic>(core::int) → core::List<core::String> v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
-    v = let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    v = let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
                                                                       ^" in let final <T extends core::Object = dynamic>(core::String) → core::List<core::String> #t14 = <T extends core::Object = dynamic>(core::String x) → core::List<core::String> => <core::String>["hello"] in null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in let final core::int #t16 = 3 in null];
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> {
-      return <core::String>[let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+      return <core::String>[let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in let final core::int #t18 = 3 in null];
@@ -79,7 +79,7 @@
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x;
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x.{core::num::+}(1);
     <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         x;
         ^" in let final core::int #t20 = x in null;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
index 148939a..9bf8892 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
@@ -55,27 +55,27 @@
     self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a2 = new self::A::•<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a3 = new self::A::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
 Change the type of the object being constructed or the context in which it is used.
         a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, \"hello\");
                                                  ^" in let final dynamic #t2 = new self::A::•<core::int, dynamic>(3, "hello") in null;
-    self::A<core::int, core::String> a5 = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
 Change the type of the object being constructed or the context in which it is used.
         a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
                                                  ^" in let final dynamic #t4 = new self::A::named<dynamic, dynamic>(3, "hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in let final dynamic #t6 = "hello" in null, let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                               ^" in let final dynamic #t6 = "hello" in null, let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t8 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in let final dynamic #t10 = "hello" in null, let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                               ^" in let final dynamic #t10 = "hello" in null, let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t12 = 3 in null);
@@ -85,27 +85,27 @@
     self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a2 = new self::B::•<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a3 = new self::B::named<core::String, core::int>("hello", 3);
-    self::A<core::int, core::String> a4 = let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);
                                               ^" in let final dynamic #t14 = new self::B::•<core::String, dynamic>("hello", 3) in null;
-    self::A<core::int, core::String> a5 = let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
                                               ^" in let final dynamic #t16 = new self::B::named<dynamic, dynamic>("hello", 3) in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final dynamic #t18 = 3 in null, let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+                                               ^" in let final dynamic #t18 = 3 in null, let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final dynamic #t20 = "hello" in null);
-    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let dynamic _ = null in let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final dynamic #t22 = 3 in null, let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+                                               ^" in let final dynamic #t22 = 3 in null, let dynamic _ = null in let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final dynamic #t24 = "hello" in null);
@@ -115,21 +115,21 @@
     self::A<core::int, core::int> a1 = new self::C::named<core::int>(3);
     self::A<core::int, core::int> a2 = new self::C::•<core::int>(3);
     self::A<core::int, core::int> a3 = new self::C::named<core::int>(3);
-    self::A<core::int, core::int> a4 = let final dynamic #t25 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a4 = let dynamic _ = null in let final dynamic #t25 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
                                                       ^" in let final dynamic #t26 = new self::C::•<dynamic>(3) in null;
-    self::A<core::int, core::int> a5 = let final dynamic #t27 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a5 = let dynamic _ = null in let final dynamic #t27 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
                                                       ^" in let final dynamic #t28 = new self::C::named<dynamic>(3) in null;
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final dynamic #t29 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let dynamic _ = null in let final dynamic #t29 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final dynamic #t30 = "hello" in null);
-    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final dynamic #t31 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let dynamic _ = null in let final dynamic #t31 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final dynamic #t32 = "hello" in null);
@@ -139,21 +139,21 @@
     self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>("hello");
     self::A<core::int, core::String> a2 = new self::D::•<core::int, core::String>("hello");
     self::A<core::int, core::String> a3 = new self::D::named<core::String, core::String>("hello");
-    self::A<core::int, core::String> a4 = let final dynamic #t33 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let dynamic _ = null in let final dynamic #t33 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");
                                               ^" in let final dynamic #t34 = new self::D::•<core::num, dynamic>("hello") in null;
-    self::A<core::int, core::String> a5 = let final dynamic #t35 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let dynamic _ = null in let final dynamic #t35 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
                                               ^" in let final dynamic #t36 = new self::D::named<dynamic, dynamic>("hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final dynamic #t37 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let dynamic _ = null in let final dynamic #t37 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t38 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final dynamic #t39 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let dynamic _ = null in let final dynamic #t39 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t40 = 3 in null);
@@ -163,23 +163,23 @@
   }
   {
     self::A<core::int, core::String> a0 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[3], b: <core::String>["hello"]);
-    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final dynamic #t41 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let dynamic _ = null in let final dynamic #t41 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                     ^" in let final dynamic #t42 = "hello" in null], b: <core::String>[let final dynamic #t43 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                                     ^" in let final dynamic #t42 = "hello" in null], b: <core::String>[let dynamic _ = null in let final dynamic #t43 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in let final dynamic #t44 = 3 in null]);
     self::A<core::int, core::String> a2 = new self::F::named<core::int, core::String>(3, "hello", 3, "hello");
     self::A<core::int, core::String> a3 = new self::F::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t45 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let dynamic _ = null in let final dynamic #t45 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in let final dynamic #t46 = "hello" in null, let final dynamic #t47 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                               ^" in let final dynamic #t46 = "hello" in null, let dynamic _ = null in let final dynamic #t47 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t48 = 3 in null);
-    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t49 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let dynamic _ = null in let final dynamic #t49 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final dynamic #t50 = "hello" in null);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
index 4e52169..5de4511 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
@@ -55,27 +55,27 @@
     self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a2 = new self::A::•<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a3 = new self::A::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
 Change the type of the object being constructed or the context in which it is used.
         a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, \"hello\");
                                                  ^" in let final self::A<core::int, dynamic> #t2 = new self::A::•<core::int, dynamic>(3, "hello") in null;
-    self::A<core::int, core::String> a5 = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
 Change the type of the object being constructed or the context in which it is used.
         a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
                                                  ^" in let final self::A<dynamic, dynamic> #t4 = new self::A::named<dynamic, dynamic>(3, "hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in let final core::String #t6 = "hello" in null, let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                               ^" in let final core::String #t6 = "hello" in null, let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t8 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in let final core::String #t10 = "hello" in null, let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                               ^" in let final core::String #t10 = "hello" in null, let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t12 = 3 in null);
@@ -85,27 +85,27 @@
     self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a2 = new self::B::•<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a3 = new self::B::named<core::String, core::int>("hello", 3);
-    self::A<core::int, core::String> a4 = let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);
                                               ^" in let final self::B<core::String, dynamic> #t14 = new self::B::•<core::String, dynamic>("hello", 3) in null;
-    self::A<core::int, core::String> a5 = let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
                                               ^" in let final self::B<dynamic, dynamic> #t16 = new self::B::named<dynamic, dynamic>("hello", 3) in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final core::int #t18 = 3 in null, let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+                                               ^" in let final core::int #t18 = 3 in null, let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final core::String #t20 = "hello" in null);
-    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let<BottomType> _ = null in let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final core::int #t22 = 3 in null, let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+                                               ^" in let final core::int #t22 = 3 in null, let<BottomType> _ = null in let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final core::String #t24 = "hello" in null);
@@ -115,21 +115,21 @@
     self::A<core::int, core::int> a1 = new self::C::named<core::int>(3);
     self::A<core::int, core::int> a2 = new self::C::•<core::int>(3);
     self::A<core::int, core::int> a3 = new self::C::named<core::int>(3);
-    self::A<core::int, core::int> a4 = let final dynamic #t25 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a4 = let<BottomType> _ = null in let final dynamic #t25 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
                                                       ^" in let final self::C<dynamic> #t26 = new self::C::•<dynamic>(3) in null;
-    self::A<core::int, core::int> a5 = let final dynamic #t27 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a5 = let<BottomType> _ = null in let final dynamic #t27 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
                                                       ^" in let final self::C<dynamic> #t28 = new self::C::named<dynamic>(3) in null;
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let<BottomType> _ = null in let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final core::String #t30 = "hello" in null);
-    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final dynamic #t31 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let<BottomType> _ = null in let final dynamic #t31 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final core::String #t32 = "hello" in null);
@@ -139,21 +139,21 @@
     self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>("hello");
     self::A<core::int, core::String> a2 = new self::D::•<core::int, core::String>("hello");
     self::A<core::int, core::String> a3 = new self::D::named<core::String, core::String>("hello");
-    self::A<core::int, core::String> a4 = let final dynamic #t33 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let<BottomType> _ = null in let final dynamic #t33 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");
                                               ^" in let final self::D<core::num, dynamic> #t34 = new self::D::•<core::num, dynamic>("hello") in null;
-    self::A<core::int, core::String> a5 = let final dynamic #t35 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let<BottomType> _ = null in let final dynamic #t35 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
                                               ^" in let final self::D<dynamic, dynamic> #t36 = new self::D::named<dynamic, dynamic>("hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final dynamic #t37 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let<BottomType> _ = null in let final dynamic #t37 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t38 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final dynamic #t39 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let<BottomType> _ = null in let final dynamic #t39 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t40 = 3 in null);
@@ -163,23 +163,23 @@
   }
   {
     self::A<core::int, core::String> a0 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[3], b: <core::String>["hello"]);
-    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final dynamic #t41 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let<BottomType> _ = null in let final dynamic #t41 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                     ^" in let final core::String #t42 = "hello" in null], b: <core::String>[let final dynamic #t43 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                                     ^" in let final core::String #t42 = "hello" in null], b: <core::String>[let<BottomType> _ = null in let final dynamic #t43 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in let final core::int #t44 = 3 in null]);
     self::A<core::int, core::String> a2 = new self::F::named<core::int, core::String>(3, "hello", 3, "hello");
     self::A<core::int, core::String> a3 = new self::F::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t45 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let<BottomType> _ = null in let final dynamic #t45 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in let final core::String #t46 = "hello" in null, let final dynamic #t47 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                               ^" in let final core::String #t46 = "hello" in null, let<BottomType> _ = null in let final dynamic #t47 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t48 = 3 in null);
-    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final dynamic #t49 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let<BottomType> _ = null in let final dynamic #t49 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in let final core::String #t50 = "hello" in null);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
index d5b5aa9..56be18e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
                                                                                         ^" in let final dynamic #t2 = 42 in null]]) → void {}
@@ -10,11 +10,11 @@
   {
     core::List<core::int> l0 = <core::int>[];
     core::List<core::int> l1 = <core::int>[3];
-    core::List<core::int> l2 = <core::int>[let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::List<core::int> l2 = <core::int>[let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in let final dynamic #t4 = "hello" in null];
-    core::List<core::int> l3 = <core::int>[let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::List<core::int> l3 = <core::int>[let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in let final dynamic #t6 = "hello" in null, 3];
@@ -26,25 +26,25 @@
     core::List<dynamic> l3 = <dynamic>["hello", 3];
   }
   {
-    core::List<core::int> l0 = let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l0 = let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
                                                             ^" in let final dynamic #t8 = <core::num>[] in null;
-    core::List<core::int> l1 = let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l1 = let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
                                                             ^" in let final dynamic #t10 = <core::num>[3] in null;
-    core::List<core::int> l2 = let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l2 = let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in let final dynamic #t12 = <core::num>[let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+                                                            ^" in let final dynamic #t12 = <core::num>[let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in let final dynamic #t14 = "hello" in null] in null;
-    core::List<core::int> l3 = let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l3 = let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in let final dynamic #t16 = <core::num>[let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+                                                            ^" in let final dynamic #t16 = <core::num>[let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in let final dynamic #t18 = "hello" in null, 3] in null;
@@ -52,11 +52,11 @@
   {
     core::Iterable<core::int> i0 = <core::int>[];
     core::Iterable<core::int> i1 = <core::int>[3];
-    core::Iterable<core::int> i2 = <core::int>[let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Iterable<core::int> i2 = <core::int>[let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in let final dynamic #t20 = "hello" in null];
-    core::Iterable<core::int> i3 = <core::int>[let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Iterable<core::int> i3 = <core::int>[let dynamic _ = null in let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in let final dynamic #t22 = "hello" in null, 3];
@@ -64,11 +64,11 @@
   {
     const core::List<core::int> c0 = const <core::int>[];
     const core::List<core::int> c1 = const <core::int>[3];
-    const core::List<core::int> c2 = const <core::int>[let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::List<core::int> c2 = const <core::int>[let dynamic _ = null in let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                                                         ^" in let final dynamic #t24 = "hello" in null];
-    const core::List<core::int> c3 = const <core::int>[let final dynamic #t25 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::List<core::int> c3 = const <core::int>[let dynamic _ = null in let final dynamic #t25 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                                                         ^" in let final dynamic #t26 = "hello" in null, 3];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
index f2e0116..0bbe2ae 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
                                                                                         ^" in let final core::int #t2 = 42 in null]]) → void {}
@@ -10,11 +10,11 @@
   {
     core::List<core::int> l0 = <core::int>[];
     core::List<core::int> l1 = <core::int>[3];
-    core::List<core::int> l2 = <core::int>[let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::List<core::int> l2 = <core::int>[let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in let final core::String #t4 = "hello" in null];
-    core::List<core::int> l3 = <core::int>[let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::List<core::int> l3 = <core::int>[let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in let final core::String #t6 = "hello" in null, 3];
@@ -26,25 +26,25 @@
     core::List<dynamic> l3 = <dynamic>["hello", 3];
   }
   {
-    core::List<core::int> l0 = let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l0 = let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
                                                             ^" in let final core::List<core::num> #t8 = <core::num>[] in null;
-    core::List<core::int> l1 = let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l1 = let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
                                                             ^" in let final core::List<core::num> #t10 = <core::num>[3] in null;
-    core::List<core::int> l2 = let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l2 = let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in let final core::List<core::num> #t12 = <core::num>[let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+                                                            ^" in let final core::List<core::num> #t12 = <core::num>[let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in let final core::String #t14 = "hello" in null] in null;
-    core::List<core::int> l3 = let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l3 = let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
     List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in let final core::List<core::num> #t16 = <core::num>[let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+                                                            ^" in let final core::List<core::num> #t16 = <core::num>[let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in let final core::String #t18 = "hello" in null, 3] in null;
@@ -52,11 +52,11 @@
   {
     core::Iterable<core::int> i0 = <core::int>[];
     core::Iterable<core::int> i1 = <core::int>[3];
-    core::Iterable<core::int> i2 = <core::int>[let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Iterable<core::int> i2 = <core::int>[let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in let final core::String #t20 = "hello" in null];
-    core::Iterable<core::int> i3 = <core::int>[let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Iterable<core::int> i3 = <core::int>[let<BottomType> _ = null in let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in let final core::String #t22 = "hello" in null, 3];
@@ -64,11 +64,11 @@
   {
     const core::List<core::int> c0 = const <core::int>[];
     const core::List<core::int> c1 = const <core::int>[3];
-    const core::List<core::int> c2 = const <core::int>[let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::List<core::int> c2 = const <core::int>[let<BottomType> _ = null in let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                                                         ^" in let final core::String #t24 = "hello" in null];
-    const core::List<core::int> c3 = const <core::int>[let final dynamic #t25 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::List<core::int> c3 = const <core::int>[let<BottomType> _ = null in let final dynamic #t25 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                                                         ^" in let final core::String #t26 = "hello" in null, 3];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
index fc58e8e..58ac3bf 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in let final dynamic #t2 = "hello" in null: "world"}]) → void {}
@@ -10,18 +10,18 @@
   {
     core::Map<core::int, core::String> l0 = <core::int, core::String>{};
     core::Map<core::int, core::String> l1 = <core::int, core::String>{3: "hello"};
-    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, core::String> l2 = <core::int, core::String>{let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in let final dynamic #t4 = "hello" in null: "hello"};
-    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in let final dynamic #t6 = 3 in null};
-    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                            ^" in let final dynamic #t8 = "hello" in null: let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                            ^" in let final dynamic #t8 = "hello" in null: let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                   ^" in let final dynamic #t10 = 3 in null};
@@ -37,11 +37,11 @@
     core::Map<dynamic, core::String> l0 = <dynamic, core::String>{};
     core::Map<dynamic, core::String> l1 = <dynamic, core::String>{3: "hello"};
     core::Map<dynamic, core::String> l2 = <dynamic, core::String>{"hello": "hello"};
-    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in let final dynamic #t12 = 3 in null};
-    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                        ^" in let final dynamic #t14 = 3 in null};
@@ -49,26 +49,26 @@
   {
     core::Map<core::int, dynamic> l0 = <core::int, dynamic>{};
     core::Map<core::int, dynamic> l1 = <core::int, dynamic>{3: "hello"};
-    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in let final dynamic #t16 = "hello" in null: "hello"};
     core::Map<core::int, dynamic> l3 = <core::int, dynamic>{3: 3};
-    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
                                             ^" in let final dynamic #t18 = "hello" in null: 3};
   }
   {
-    core::Map<core::int, core::String> l0 = let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l0 = let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
                                                                            ^" in let final dynamic #t20 = <core::num, dynamic>{} in null;
-    core::Map<core::int, core::String> l1 = let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l1 = let dynamic _ = null in let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in let final dynamic #t22 = <core::num, dynamic>{3: "hello"} in null;
-    core::Map<core::int, core::String> l3 = let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l3 = let dynamic _ = null in let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in let final dynamic #t24 = <core::num, dynamic>{3: 3} in null;
@@ -76,18 +76,18 @@
   {
     const core::Map<core::int, core::String> l0 = const <core::int, core::String>{};
     const core::Map<core::int, core::String> l1 = const <core::int, core::String>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final dynamic #t25 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let dynamic _ = null in let final dynamic #t25 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in let final dynamic #t26 = "hello" in null: "hello"};
-    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final dynamic #t27 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let dynamic _ = null in let final dynamic #t27 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                      ^" in let final dynamic #t28 = 3 in null};
-    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final dynamic #t29 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let dynamic _ = null in let final dynamic #t29 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in let final dynamic #t30 = "hello" in null: let final dynamic #t31 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                                                              ^" in let final dynamic #t30 = "hello" in null: let dynamic _ = null in let final dynamic #t31 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                       ^" in let final dynamic #t32 = 3 in null};
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
index 1364e2d..a825f73 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in let final core::String #t2 = "hello" in null: "world"}]) → void {}
@@ -10,18 +10,18 @@
   {
     core::Map<core::int, core::String> l0 = <core::int, core::String>{};
     core::Map<core::int, core::String> l1 = <core::int, core::String>{3: "hello"};
-    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, core::String> l2 = <core::int, core::String>{let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in let final core::String #t4 = "hello" in null: "hello"};
-    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in let final core::int #t6 = 3 in null};
-    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                            ^" in let final core::String #t8 = "hello" in null: let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                            ^" in let final core::String #t8 = "hello" in null: let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                   ^" in let final core::int #t10 = 3 in null};
@@ -37,11 +37,11 @@
     core::Map<dynamic, core::String> l0 = <dynamic, core::String>{};
     core::Map<dynamic, core::String> l1 = <dynamic, core::String>{3: "hello"};
     core::Map<dynamic, core::String> l2 = <dynamic, core::String>{"hello": "hello"};
-    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in let final core::int #t12 = 3 in null};
-    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                        ^" in let final core::int #t14 = 3 in null};
@@ -49,26 +49,26 @@
   {
     core::Map<core::int, dynamic> l0 = <core::int, dynamic>{};
     core::Map<core::int, dynamic> l1 = <core::int, dynamic>{3: "hello"};
-    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in let final core::String #t16 = "hello" in null: "hello"};
     core::Map<core::int, dynamic> l3 = <core::int, dynamic>{3: 3};
-    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
                                             ^" in let final core::String #t18 = "hello" in null: 3};
   }
   {
-    core::Map<core::int, core::String> l0 = let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l0 = let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
                                                                            ^" in let final core::Map<core::num, dynamic> #t20 = <core::num, dynamic>{} in null;
-    core::Map<core::int, core::String> l1 = let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l1 = let<BottomType> _ = null in let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in let final core::Map<core::num, dynamic> #t22 = <core::num, dynamic>{3: "hello"} in null;
-    core::Map<core::int, core::String> l3 = let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l3 = let<BottomType> _ = null in let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in let final core::Map<core::num, dynamic> #t24 = <core::num, dynamic>{3: 3} in null;
@@ -76,18 +76,18 @@
   {
     const core::Map<core::int, core::String> l0 = const <core::int, core::String>{};
     const core::Map<core::int, core::String> l1 = const <core::int, core::String>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final dynamic #t25 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let<BottomType> _ = null in let final dynamic #t25 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in let final core::String #t26 = "hello" in null: "hello"};
-    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final dynamic #t27 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let<BottomType> _ = null in let final dynamic #t27 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                      ^" in let final core::int #t28 = 3 in null};
-    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let<BottomType> _ = null in let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in let final core::String #t30 = "hello" in null: let final dynamic #t31 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+                                                                              ^" in let final core::String #t30 = "hello" in null: let<BottomType> _ = null in let final dynamic #t31 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                       ^" in let final core::int #t32 = 3 in null};
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index fcaf358..a5a751e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -9,11 +9,11 @@
 }
 static method foo() → asy::Stream<core::List<core::int>> async* {
   yield<core::int>[];
-  yield let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.
+  yield let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dart.core::int>'.
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
                                                                   ^" in let final dynamic #t2 = self::MyStream::•<dynamic>() in null;
-  yield* let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.
+  yield* let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dart.core::List<dart.core::int>>'.
   yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
                                                                ^" in let final dynamic #t4 = <dynamic>[] in null;
@@ -21,11 +21,11 @@
 }
 static method bar() → core::Iterable<core::Map<core::int, core::int>> sync* {
   yield<core::int, core::int>{};
-  yield let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.
+  yield let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dart.core::int, dart.core::int>'.
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
                                                                   ^" in let final dynamic #t6 = core::List::•<dynamic>() in null;
-  yield* let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
+  yield* let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
   yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                         ^" in let final dynamic #t8 = <dynamic, dynamic>{} in null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
index f73a813..f7bfb3c 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
@@ -23,7 +23,7 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in let final dynamic #t2 = f in null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
index 62c39b7..4a8c037 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in let final self::MyFuture<core::double> #t2 = f in null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
index 1e8d4cc..cb171bf 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
@@ -23,7 +23,7 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  self::MyFuture<core::int> f2 = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
+  self::MyFuture<core::int> f2 = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.
   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                   ^" in let final dynamic #t2 = f in null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
index 2f256a9..b432115 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  self::MyFuture<core::int> f2 = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
+  self::MyFuture<core::int> f2 = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.
   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                   ^" in let final self::MyFuture<core::double> #t2 = f in null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
index 73b2edf..deb54c1 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
@@ -23,7 +23,7 @@
 }
 static method test() → void {
   asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in let final dynamic #t2 = f in null;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
index 7380ae9..94a7c5e 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 }
 static method test() → void {
   asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in let final asy::Future<core::double> #t2 = f in null;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index a2ccb18..be2d944 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final dynamic #t2 = "hi" in null));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index 372634f..f8b69c0 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final core::String #t2 = "hi" in null));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
index 3ad2061..15b6f24 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final dynamic #t2 = "hi" in null));
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index 85c2fcd..3d87abf 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final core::String #t2 = "hi" in null));
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
index f83fde4..6662a3f 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
@@ -16,26 +16,26 @@
   self::printDouble(math::min<core::double>(1.0, 2.0));
   self::printInt(self::myMax(1, 2) as{TypeError} core::int);
   self::printInt(self::myMax(1, 2) as core::int);
-  self::printInt(math::max<core::int>(1, let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::printInt(math::max<core::int>(1, let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
                                                                       ^" in let final dynamic #t2 = 2.0 in null));
-  self::printInt(math::min<core::int>(1, let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::printInt(math::min<core::int>(1, let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
                                                                       ^" in let final dynamic #t4 = 2.0 in null));
-  self::printDouble(math::max<core::double>(let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+  self::printDouble(math::max<core::double>(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
       /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
                                                                       ^" in let final dynamic #t6 = 1 in null, 2.0));
-  self::printDouble(math::min<core::double>(let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+  self::printDouble(math::min<core::double>(let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
       /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
                                                                       ^" in let final dynamic #t8 = 1 in null, 2.0));
-  self::printInt(math::min<core::int>(let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::printInt(math::min<core::int>(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hi\",
-                                             ^" in let final dynamic #t10 = "hi" in null, let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+                                             ^" in let final dynamic #t10 = "hi" in null, let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"there\"));
                                              ^" in let final dynamic #t12 = "there" in null));
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
index dd3c578..7f186ae 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
@@ -16,26 +16,26 @@
   self::printDouble(math::min<core::double>(1.0, 2.0));
   self::printInt(self::myMax(1, 2) as{TypeError} core::int);
   self::printInt(self::myMax(1, 2) as core::int);
-  self::printInt(math::max<core::int>(1, let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::printInt(math::max<core::int>(1, let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:29:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ max(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
                                                                       ^" in let final core::double #t2 = 2.0 in null));
-  self::printInt(math::min<core::int>(1, let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::printInt(math::min<core::int>(1, let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:31:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*@typeArgs=int*/ min(1, /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 2.0));
                                                                       ^" in let final core::double #t4 = 2.0 in null));
-  self::printDouble(math::max<core::double>(let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+  self::printDouble(math::max<core::double>(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:33:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
       /*@typeArgs=double*/ max(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
                                                                       ^" in let final core::int #t6 = 1 in null, 2.0));
-  self::printDouble(math::min<core::double>(let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+  self::printDouble(math::min<core::double>(let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:35:71: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
       /*@typeArgs=double*/ min(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 1, 2.0));
                                                                       ^" in let final core::int #t8 = 1 in null, 2.0));
-  self::printInt(math::min<core::int>(let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::printInt(math::min<core::int>(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hi\",
-                                             ^" in let final core::String #t10 = "hi" in null, let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+                                             ^" in let final core::String #t10 = "hi" in null, let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:40:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"there\"));
                                              ^" in let final core::String #t12 = "there" in null));
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
index a980b89..9a823d0 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
@@ -6,7 +6,7 @@
   return null;
 static method test() → dynamic {
   core::String x = self::f<core::String>(<core::String>["hi"]);
-  core::String y = self::f<core::String>(<core::String>[let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = self::f<core::String>(<core::String>[let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
                                                                            ^" in let final dynamic #t2 = 42 in null]);
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
index 4a81079..6fbf8af 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   return null;
 static method test() → dynamic {
   core::String x = self::f<core::String>(<core::String>["hi"]);
-  core::String y = self::f<core::String>(<core::String>[let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = self::f<core::String>(<core::String>[let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
                                                                            ^" in let final core::int #t2 = 42 in null]);
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index 39a38a2..f260b29 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
@@ -21,11 +21,11 @@
   self::takeIIO(math::max<core::int>);
   self::takeDDO(math::max<core::double>);
   self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final dynamic #t2 = math::max<core::num> in null);
-  self::takeDID(let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final dynamic #t4 = math::max<core::num> in null);
@@ -41,11 +41,11 @@
   self::takeIIO(math::min<core::int>);
   self::takeDDO(math::min<core::double>);
   self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final dynamic #t6 = math::min<core::num> in null);
-  self::takeDID(let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final dynamic #t8 = math::min<core::num> in null);
@@ -63,11 +63,11 @@
   self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
           . /*@target=C::m*/ m);
                              ^" in let final dynamic #t10 = new self::C::•().{self::C::m}<core::num> in null);
-  self::takeDID(let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
           . /*@target=C::m*/ m);
                              ^" in let final dynamic #t12 = new self::C::•().{self::C::m}<core::num> in null);
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
index 4a4c032..b939213 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
@@ -21,11 +21,11 @@
   self::takeIIO(math::max<core::int>);
   self::takeDDO(math::max<core::double>);
   self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final (core::num, core::num) → core::num #t2 = math::max<core::num> in null);
-  self::takeDID(let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final (core::num, core::num) → core::num #t4 = math::max<core::num> in null);
@@ -41,11 +41,11 @@
   self::takeIIO(math::min<core::int>);
   self::takeDDO(math::min<core::double>);
   self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final (core::num, core::num) → core::num #t6 = math::min<core::num> in null);
-  self::takeDID(let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final (core::num, core::num) → core::num #t8 = math::min<core::num> in null);
@@ -63,11 +63,11 @@
   self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
           . /*@target=C::m*/ m);
                              ^" in let final (core::num, core::num) → core::num #t10 = new self::C::•().{self::C::m}<core::num> in null);
-  self::takeDID(let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
           . /*@target=C::m*/ m);
                              ^" in let final (core::num, core::num) → core::num #t12 = new self::C::•().{self::C::m}<core::num> in null);
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
index e215e2a..032f49a 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method f() → void {
   core::List<core::String> y;
-  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.
+  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           1.0);
           ^" in let final dynamic #t2 = 1.0 in null);
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
index 3693a73..113e131 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method f() → void {
   core::List<core::String> y;
-  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.
+  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
           1.0);
           ^" in let final core::double #t2 = 1.0 in null);
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index 459700d..a9ca526 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -12,7 +12,7 @@
 Try correcting the name to the name of an existing method, or defining a method named '+'.
                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                        ^") as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                                                                                                            ^" in let final dynamic #t3 = (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}()) in null));
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
index 6be431f..5577717 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
 Try correcting the name to the name of an existing method, or defining a method named '+'.
                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                        ^") as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                                                                                                            ^" in let final (core::String, core::int) → core::String #t3 = (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}()) in null));
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
index 285f89e..cdf4cc7 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
@@ -23,18 +23,18 @@
   core::String s;
   core::int i;
   s = new self::B::•().{self::B::x} as{TypeError} core::String;
-  s = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  s = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
                                                              ^" in let final dynamic #t2 = new self::B::•().{self::B::y} in null;
   s = new self::B::•().{self::B::z};
-  s = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  s = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
                                                              ^" in let final dynamic #t4 = new self::B::•().{self::B::w} in null;
   i = new self::B::•().{self::B::x} as{TypeError} core::int;
   i = new self::B::•().{self::B::y};
-  i = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  i = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
                                                              ^" in let final dynamic #t6 = new self::B::•().{self::B::z} in null;
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
index 81a68df..6aedf65 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
@@ -23,18 +23,18 @@
   core::String s;
   core::int i;
   s = new self::B::•().{self::B::x} as{TypeError} core::String;
-  s = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  s = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
                                                              ^" in let final core::int #t2 = new self::B::•().{self::B::y} in null;
   s = new self::B::•().{self::B::z};
-  s = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  s = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
                                                              ^" in let final core::int #t4 = new self::B::•().{self::B::w} in null;
   i = new self::B::•().{self::B::x} as{TypeError} core::int;
   i = new self::B::•().{self::B::y};
-  i = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  i = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
                                                              ^" in let final core::String #t6 = new self::B::•().{self::B::z} in null;
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 7a49ccd..f757830 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -35,58 +35,58 @@
   /*error:UNDEFINED_IDENTIFIER*/ x
                                  ^"]/* from null */;
 static method test1() → dynamic {
-  self::a = let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
+  self::a = let dynamic _ = null in let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t5 = "hi" in null;
   self::a = new self::B::•(3);
-  self::b = let final dynamic #t6 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
+  self::b = let dynamic _ = null in let final dynamic #t6 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t7 = "hi" in null;
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
+  self::c1 = let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                    ^" in let final dynamic #t9 = <dynamic, dynamic>{} in null;
   self::c2 = <dynamic>[];
-  self::c2 = let final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
+  self::c2 = let dynamic _ = null in let final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                    ^" in let final dynamic #t11 = <dynamic, dynamic>{} in null;
   self::d = <dynamic, dynamic>{};
-  self::d = let final dynamic #t12 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
+  self::d = let dynamic _ = null in let final dynamic #t12 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
                                    ^" in let final dynamic #t13 = 3 in null;
   self::e = new self::A::•();
-  self::e = let final dynamic #t14 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
+  self::e = let dynamic _ = null in let final dynamic #t14 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                   ^" in let final dynamic #t15 = <dynamic, dynamic>{} in null;
   self::f = 3;
-  self::f = let final dynamic #t16 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
+  self::f = let dynamic _ = null in let final dynamic #t16 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final dynamic #t17 = false in null;
   self::g = 1;
-  self::g = let final dynamic #t18 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
+  self::g = let dynamic _ = null in let final dynamic #t18 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final dynamic #t19 = false in null;
-  self::h = let final dynamic #t20 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
+  self::h = let dynamic _ = null in let final dynamic #t20 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final dynamic #t21 = false in null;
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final dynamic #t22 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
+  self::j = let dynamic _ = null in let final dynamic #t22 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final dynamic #t23 = false in null;
-  self::j = let final dynamic #t24 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
+  self::j = let dynamic _ = null in let final dynamic #t24 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
                                                          ^" in let final dynamic #t25 = <dynamic>[] in null;
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 664191e..d1d2dd6 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -35,58 +35,58 @@
   /*error:UNDEFINED_IDENTIFIER*/ x
                                  ^"]/* from null */;
 static method test1() → dynamic {
-  self::a = let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
+  self::a = let<BottomType> _ = null in let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t5 = "hi" in null;
   self::a = new self::B::•(3);
-  self::b = let final dynamic #t6 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
+  self::b = let<BottomType> _ = null in let final dynamic #t6 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t7 = "hi" in null;
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final dynamic #t8 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
+  self::c1 = let<BottomType> _ = null in let final dynamic #t8 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                    ^" in let final core::Map<dynamic, dynamic> #t9 = <dynamic, dynamic>{} in null;
   self::c2 = <dynamic>[];
-  self::c2 = let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
+  self::c2 = let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                    ^" in let final core::Map<dynamic, dynamic> #t11 = <dynamic, dynamic>{} in null;
   self::d = <dynamic, dynamic>{};
-  self::d = let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
+  self::d = let<BottomType> _ = null in let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
                                    ^" in let final core::int #t13 = 3 in null;
   self::e = new self::A::•();
-  self::e = let final dynamic #t14 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
+  self::e = let<BottomType> _ = null in let final dynamic #t14 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                   ^" in let final core::Map<dynamic, dynamic> #t15 = <dynamic, dynamic>{} in null;
   self::f = 3;
-  self::f = let final dynamic #t16 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
+  self::f = let<BottomType> _ = null in let final dynamic #t16 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final core::bool #t17 = false in null;
   self::g = 1;
-  self::g = let final dynamic #t18 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
+  self::g = let<BottomType> _ = null in let final dynamic #t18 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final core::bool #t19 = false in null;
-  self::h = let final dynamic #t20 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
+  self::h = let<BottomType> _ = null in let final dynamic #t20 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final core::bool #t21 = false in null;
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final dynamic #t22 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
+  self::j = let<BottomType> _ = null in let final dynamic #t22 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in let final core::bool #t23 = false in null;
-  self::j = let final dynamic #t24 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
+  self::j = let<BottomType> _ = null in let final dynamic #t24 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
                                                          ^" in let final core::List<dynamic> #t25 = <dynamic>[] in null;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index 708d7f1..8b50c96 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
@@ -5,11 +5,11 @@
 
 static field core::int y = inf::x;
 static method test1() → dynamic {
-  inf::x = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  inf::x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t2 = "hi" in null;
-  self::y = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::y = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t4 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
index cd6e0c2..5889b18 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
@@ -5,11 +5,11 @@
 
 static field core::int y = inf::x;
 static method test1() → dynamic {
-  inf::x = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  inf::x = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t2 = "hi" in null;
-  self::y = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::y = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t4 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index c3efe0d..ea8e666 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
@@ -10,11 +10,11 @@
     ;
 }
 static method test1() → dynamic {
-  inf::A::x = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  inf::A::x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final dynamic #t2 = "hi" in null;
-  self::B::y = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::B::y = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final dynamic #t4 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
index 5932bf8..e4ef88d 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
@@ -10,11 +10,11 @@
     ;
 }
 static method test1() → dynamic {
-  inf::A::x = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  inf::A::x = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final core::String #t2 = "hi" in null;
-  self::B::y = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::B::y = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final core::String #t4 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
index ab767ce..35575d7 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
@@ -16,7 +16,7 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in let final dynamic #t2 = new self::B::•().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
index e8028b4..a825f30 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in let final core::int #t2 = new self::B::•().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
index d61fe5e..e45a825 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
@@ -16,7 +16,7 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in let final dynamic #t2 = new self::B::•().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
index d476ef7..46cd118 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in let final core::int #t2 = new self::B::•().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
index a43d1ae..693987c 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method test1() → dynamic {
   core::int x = 3;
-  x = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t2 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
index 58d47dd..efe4122 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method test1() → dynamic {
   core::int x = 3;
-  x = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t2 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
index f1715e6..f42a486 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method test2() → dynamic {
   core::int x = 3;
-  x = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t2 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
index fd663a6..93650c3 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method test2() → dynamic {
   core::int x = 3;
-  x = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t2 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
index f583bb8..4296aaf 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
@@ -11,19 +11,19 @@
     ;
   method test1() → dynamic {
     core::int a = this.{self::A::x};
-    a = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    a = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final dynamic #t2 = "hi" in null;
     a = 3;
     core::int b = this.{self::A::y};
-    b = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    b = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final dynamic #t4 = "hi" in null;
     b = 4;
     core::int c = this.{self::A::z};
-    c = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    c = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final dynamic #t6 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
index 025bb0b..e1d081e 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
@@ -11,19 +11,19 @@
     ;
   method test1() → dynamic {
     core::int a = this.{self::A::x};
-    a = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    a = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final core::String #t2 = "hi" in null;
     a = 3;
     core::int b = this.{self::A::y};
-    b = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    b = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final core::String #t4 = "hi" in null;
     b = 4;
     core::int c = this.{self::A::z};
-    c = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    c = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in let final core::String #t6 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
index 13b5afa..1da00c1 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
@@ -7,19 +7,19 @@
 static final field core::int z = 42;
 static method test1() → dynamic {
   core::int a = self::x;
-  a = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  a = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t2 = "hi" in null;
   a = 3;
   core::int b = self::y;
-  b = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  b = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t4 = "hi" in null;
   b = 4;
   core::int c = self::z;
-  c = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  c = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final dynamic #t6 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
index 3bb751c..6f715a0 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
@@ -7,19 +7,19 @@
 static final field core::int z = 42;
 static method test1() → dynamic {
   core::int a = self::x;
-  a = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  a = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t2 = "hi" in null;
   a = 3;
   core::int b = self::y;
-  b = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  b = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t4 = "hi" in null;
   b = 4;
   core::int c = self::z;
-  c = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  c = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in let final core::String #t6 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index 1f67d46..3344f00 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
@@ -19,7 +19,7 @@
 }
 static method foo() → dynamic {
   core::int y = new self::C::•().{self::C::x};
-  core::String z = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String z = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
                                                                     ^" in let final dynamic #t2 = new self::C::•().{self::C::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
index 76508fd..c4a712c 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 }
 static method foo() → dynamic {
   core::int y = new self::C::•().{self::C::x};
-  core::String z = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String z = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
                                                                     ^" in let final core::int #t2 = new self::C::•().{self::C::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
index 680dc9c..22a1397 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
@@ -16,13 +16,13 @@
   get x() → core::int
     return 3;
   get w() → core::int
-    return let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    return let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
                                                              ^" in let final dynamic #t2 = "hello" in null;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in let final dynamic #t4 = new self::B::•().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
index cecd7ae..7c184cf 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
@@ -16,13 +16,13 @@
   get x() → core::int
     return 3;
   get w() → core::int
-    return let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+    return let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
                                                              ^" in let final core::String #t2 = "hello" in null;
 }
 static method foo() → dynamic {
-  core::String y = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  core::String y = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in let final core::int #t4 = new self::B::•().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
index f7edc12..efe5253 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
@@ -17,7 +17,7 @@
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  core::int y = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
                                                                          ^" in let final dynamic #t2 = new self::B::•<core::String>().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
index dbde06b..412283f 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  core::int y = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
                                                                          ^" in let final core::String #t2 = new self::B::•<core::String>().{self::B::x} in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
index 8bd9cd0..5c0a1e4 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
@@ -29,7 +29,7 @@
   method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  core::int y = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       . /*@target=B::m*/ m(null, null);
                          ^" in let final dynamic #t2 = new self::B::•<dynamic>().{self::B::m}(null, null) in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
index 5c0657a..37a225e 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
@@ -29,7 +29,7 @@
   method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  core::int y = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       . /*@target=B::m*/ m(null, null);
                          ^" in let final core::String #t2 = new self::B::•<dynamic>().{self::B::m}(null, null) in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index a3154f4..e92f2a3 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
@@ -24,7 +24,7 @@
   method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  core::int y = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       . /*@target=A::value*/ value;
                              ^" in let final dynamic #t2 = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
index 53741ec..aa3882c 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
   method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
 }
 static method foo() → dynamic {
-  core::int y = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  core::int y = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       . /*@target=A::value*/ value;
                              ^" in let final core::String #t2 = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} in null;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
index f156e4b..4b7c312 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
@@ -14,7 +14,7 @@
     ;
   method foo(generic-covariant-impl self::Bar::T t) → void {
     for (core::String i in t) {
-      core::int x = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+      core::int x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final dynamic #t2 = i in null;
@@ -27,7 +27,7 @@
     ;
   method foo(generic-covariant-impl self::Baz::S t) → void {
     for (self::Baz::T i in t) {
-      core::int x = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
+      core::int x = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final dynamic #t4 = i in null;
@@ -38,7 +38,7 @@
 static method test() → dynamic {
   core::List<self::Foo> list = <self::Foo>[];
   for (self::Foo x in list) {
-    core::String y = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String y = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in let final dynamic #t6 = x in null;
@@ -47,7 +47,7 @@
     core::String y = x as{TypeError} core::String;
   }
   for (final self::Foo #t7 in list) {
-    core::String x = let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String x = let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
               ^" in let final dynamic #t9 = #t7 in null;
@@ -69,7 +69,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
+  for (dynamic x in let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
   for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                    ^" in let final dynamic #t14 = map in null) {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
index 6d6bba4..674ff5c 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
     ;
   method foo(generic-covariant-impl self::Bar::T t) → void {
     for (core::String i in t) {
-      core::int x = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+      core::int x = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final core::String #t2 = i in null;
@@ -27,7 +27,7 @@
     ;
   method foo(generic-covariant-impl self::Baz::S t) → void {
     for (self::Baz::T i in t) {
-      core::int x = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
+      core::int x = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final self::Baz::T #t4 = i in null;
@@ -38,7 +38,7 @@
 static method test() → dynamic {
   core::List<self::Foo> list = <self::Foo>[];
   for (self::Foo x in list) {
-    core::String y = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String y = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in let final self::Foo #t6 = x in null;
@@ -47,7 +47,7 @@
     core::String y = x as{TypeError} core::String;
   }
   for (final self::Foo #t7 in list) {
-    core::String x = let final dynamic #t8 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String x = let<BottomType> _ = null in let final dynamic #t8 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
               ^" in let final self::Foo #t9 = #t7 in null;
@@ -69,7 +69,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
+  for (dynamic x in let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
   for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                    ^" in let final core::Map<core::String, self::Foo> #t14 = map in null) {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index 5e12f30..5ebd147 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -15,7 +15,7 @@
     ;
   method foo(generic-covariant-impl self::Bar::T t) → dynamic async {
     await for (core::String i in t) {
-      core::int x = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+      core::int x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final dynamic #t2 = i in null;
@@ -28,7 +28,7 @@
     ;
   method foo(generic-covariant-impl self::Baz::S t) → dynamic async {
     await for (self::Baz::T i in t) {
-      core::int x = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
+      core::int x = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final dynamic #t4 = i in null;
@@ -43,7 +43,7 @@
 static method test() → dynamic async {
   self::MyStream<self::Foo> myStream = self::MyStream::•<self::Foo>();
   await for (self::Foo x in myStream) {
-    core::String y = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String y = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in let final dynamic #t6 = x in null;
@@ -52,7 +52,7 @@
     core::String y = x as{TypeError} core::String;
   }
   await for (final self::Foo #t7 in myStream) {
-    core::String x = let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String x = let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                     ^" in let final dynamic #t9 = #t7 in null;
@@ -74,7 +74,7 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  await for (dynamic x in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
+  await for (dynamic x in let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
   await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                          ^" in let final dynamic #t14 = map in null) {
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index e515591..616b08d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
                 if(:result) {
                   core::String i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+                    core::int x = let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final core::String #t3 = i in null;
@@ -96,7 +96,7 @@
                 if(:result) {
                   self::Baz::T i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = let final dynamic #t6 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
+                    core::int x = let<BottomType> _ = null in let final dynamic #t6 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in let final self::Baz::T #t7 = i in null;
@@ -156,7 +156,7 @@
               if(:result) {
                 self::Foo x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+                  core::String y = let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in let final self::Foo #t11 = x in null;
@@ -201,7 +201,7 @@
               if(:result) {
                 final self::Foo #t16 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String x = let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+                  core::String x = let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                     ^" in let final self::Foo #t18 = #t16 in null;
@@ -288,7 +288,7 @@
         }
         core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
         {
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: A value of type 'dart.core::Map<dart.core::String, test::Foo>' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
   await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                          ^" in let final core::Map<core::String, self::Foo> #t30 = map in null);
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
index 14cb11c..fcd2925 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field core::int x = 1;
-  constructor •([core::int x = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  constructor •([core::int x = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
                                              ^" in let final dynamic #t2 = "1" in null]) → void
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
index d5a62d4..ef10cdb 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field core::int x = 1;
-  constructor •([core::int x = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  constructor •([core::int x = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
                                              ^" in let final core::String #t2 = "1" in null]) → void
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
index 83da1c81..03fddbd 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
@@ -4,11 +4,11 @@
 
 static method test1() → dynamic {
   core::List<core::int> x = <core::int>[1, 2, 3];
-  x.{core::List::add}(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::List::add}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final dynamic #t2 = "hi" in null);
-  x.{core::List::add}(let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::List::add}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                       ^" in let final dynamic #t4 = 4.0 in null);
@@ -17,7 +17,7 @@
 }
 static method test2() → dynamic {
   core::List<core::num> x = <core::num>[1, 2.0, 3];
-  x.{core::List::add}(let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  x.{core::List::add}(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final dynamic #t6 = "hi" in null);
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
index 956676b..1b7e2aa 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
@@ -4,11 +4,11 @@
 
 static method test1() → dynamic {
   core::List<core::int> x = <core::int>[1, 2, 3];
-  x.{core::List::add}(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final core::String #t2 = "hi" in null);
-  x.{core::List::add}(let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                       ^" in let final core::double #t4 = 4.0 in null);
@@ -17,7 +17,7 @@
 }
 static method test2() → dynamic {
   core::List<core::num> x = <core::num>[1, 2.0, 3];
-  x.{core::List::add}(let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final core::String #t6 = "hi" in null);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
index a30cdb4..fdc6bfa 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
@@ -5,11 +5,11 @@
 static field core::List<core::int> x1 = <core::int>[1, 2, 3];
 static field core::List<core::num> x2 = <core::num>[1, 2.0, 3];
 static method test1() → dynamic {
-  self::x1.{core::List::add}(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::List::add}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final dynamic #t2 = "hi" in null);
-  self::x1.{core::List::add}(let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::List::add}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                        ^" in let final dynamic #t4 = 4.0 in null);
@@ -17,7 +17,7 @@
   core::List<core::num> y = self::x1;
 }
 static method test2() → dynamic {
-  self::x2.{core::List::add}(let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  self::x2.{core::List::add}(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final dynamic #t6 = "hi" in null);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
index 6972b2e..3788b95 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
@@ -5,11 +5,11 @@
 static field core::List<core::int> x1 = <core::int>[1, 2, 3];
 static field core::List<core::num> x2 = <core::num>[1, 2.0, 3];
 static method test1() → dynamic {
-  self::x1.{core::List::add}(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::List::add}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final core::String #t2 = "hi" in null);
-  self::x1.{core::List::add}(let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::List::add}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                        ^" in let final core::double #t4 = 4.0 in null);
@@ -17,7 +17,7 @@
   core::List<core::num> y = self::x1;
 }
 static method test2() → dynamic {
-  self::x2.{core::List::add}(let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  self::x2.{core::List::add}(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final core::String #t6 = "hi" in null);
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
index 0105a3f..08af811 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
@@ -9,7 +9,7 @@
     return (core::int x) → core::int => x;
   }
   function b() → asy::Future<(core::int) → core::int> async {
-    return let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+    return let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                    ^" in let final dynamic #t2 = (dynamic x) → dynamic => x in null;
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
index 2a29a2c..2155171 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
       try {
         #L1:
         {
-          :return_value = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+          :return_value = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                    ^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
index e4f4c9b..e539f33 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
@@ -5,15 +5,15 @@
 static method test1() → dynamic {
   core::Map<core::int, core::String> x = <core::int, core::String>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::Map::[]=}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in let final dynamic #t2 = "hi" in null, "w");
-  x.{core::Map::[]=}(let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::Map::[]=}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                              ^" in let final dynamic #t4 = 4.0 in null, "u");
-  x.{core::Map::[]=}(3, let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  x.{core::Map::[]=}(3, let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in let final dynamic #t6 = 42 in null);
@@ -22,12 +22,12 @@
 static method test2() → dynamic {
   core::Map<core::num, core::Pattern> x = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  x.{core::Map::[]=}(let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in let final dynamic #t8 = "hi" in null, "w");
   x.{core::Map::[]=}(4.0, "u");
-  x.{core::Map::[]=}(3, let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
+  x.{core::Map::[]=}(3, let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in let final dynamic #t10 = 42 in null);
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
index 512d00e..3405df2 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
@@ -5,15 +5,15 @@
 static method test1() → dynamic {
   core::Map<core::int, core::String> x = <core::int, core::String>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::Map::[]=}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in let final core::String #t2 = "hi" in null, "w");
-  x.{core::Map::[]=}(let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  x.{core::Map::[]=}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                              ^" in let final core::double #t4 = 4.0 in null, "u");
-  x.{core::Map::[]=}(3, let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  x.{core::Map::[]=}(3, let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in let final core::int #t6 = 42 in null);
@@ -22,12 +22,12 @@
 static method test2() → dynamic {
   core::Map<core::num, core::Pattern> x = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  x.{core::Map::[]=}(let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in let final core::String #t8 = "hi" in null, "w");
   x.{core::Map::[]=}(4.0, "u");
-  x.{core::Map::[]=}(3, let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
+  x.{core::Map::[]=}(3, let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in let final core::int #t10 = 42 in null);
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index c9dd74e..af7a290 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -6,15 +6,15 @@
 static field core::Map<core::num, core::Pattern> x2 = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in let final dynamic #t2 = "hi" in null, "w");
-  self::x1.{core::Map::[]=}(let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in let final dynamic #t4 = 4.0 in null, "u");
-  self::x1.{core::Map::[]=}(3, let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  self::x1.{core::Map::[]=}(3, let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in let final dynamic #t6 = 42 in null);
@@ -22,12 +22,12 @@
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  self::x2.{core::Map::[]=}(let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in let final dynamic #t8 = "hi" in null, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
+  self::x2.{core::Map::[]=}(3, let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in let final dynamic #t10 = 42 in null);
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
index 28834d9..05fb52e 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
@@ -6,15 +6,15 @@
 static field core::Map<core::num, core::Pattern> x2 = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in let final core::String #t2 = "hi" in null, "w");
-  self::x1.{core::Map::[]=}(let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in let final core::double #t4 = 4.0 in null, "u");
-  self::x1.{core::Map::[]=}(3, let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
+  self::x1.{core::Map::[]=}(3, let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in let final core::int #t6 = 42 in null);
@@ -22,12 +22,12 @@
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
+  self::x2.{core::Map::[]=}(let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in let final core::String #t8 = "hi" in null, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
+  self::x2.{core::Map::[]=}(3, let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in let final core::int #t10 = 42 in null);
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
index 800802c..6ed5cbf 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
@@ -10,12 +10,12 @@
 }
 static method test5() → dynamic {
   self::A a1 = new self::A::•();
-  a1.{self::A::x} = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  a1.{self::A::x} = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in let final dynamic #t2 = "hi" in null;
   self::A a2 = new self::A::•();
-  a2.{self::A::x} = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  a2.{self::A::x} = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in let final dynamic #t4 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
index 4f04d5a..cc1778f 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
@@ -10,12 +10,12 @@
 }
 static method test5() → dynamic {
   self::A a1 = new self::A::•();
-  a1.{self::A::x} = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  a1.{self::A::x} = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in let final core::String #t2 = "hi" in null;
   self::A a2 = new self::A::•();
-  a2.{self::A::x} = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  a2.{self::A::x} = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in let final core::String #t4 = "hi" in null;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
index c0b6fc9..c48a4c4 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
@@ -8,7 +8,7 @@
   return (core::int x) → core::int => x;
 }
 static method b() → asy::Future<(core::int) → core::int> async {
-  return let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+  return let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                  ^" in let final dynamic #t2 = (dynamic x) → dynamic => x in null;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
index cb53a52..684b488 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     try {
       #L1:
       {
-        :return_value = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+        :return_value = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                  ^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
index bb7f27f..cb323c5 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
@@ -4,26 +4,26 @@
 
 static method test() → dynamic async {
   core::String s;
-  for (final dynamic #t1 in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
+  for (final dynamic #t1 in let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
   for (int x in /*@error=InvalidAssignment*/ s) {}
                                              ^" in let final dynamic #t3 = s in null) {
     core::int x = #t1 as{TypeError} core::int;
   }
-  await for (final dynamic #t4 in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
+  await for (final dynamic #t4 in let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
   await for (int x in /*@error=InvalidAssignment*/ s) {}
                                                    ^" in let final dynamic #t6 = s in null) {
     core::int x = #t4 as{TypeError} core::int;
   }
   core::int y;
-  for (final dynamic #t7 in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
+  for (final dynamic #t7 in let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
   for (y in /*@error=InvalidAssignment*/ s) {}
                                          ^" in let final dynamic #t9 = s in null) {
     y = #t7 as{TypeError} core::int;
   }
-  await for (final dynamic #t10 in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
+  await for (final dynamic #t10 in let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
   await for (y in /*@error=InvalidAssignment*/ s) {}
                                                ^" in let final dynamic #t12 = s in null) {
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index bb9b75a..3357d37 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -20,14 +20,14 @@
       #L1:
       {
         core::String s;
-        for (final dynamic #t1 in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
+        for (final dynamic #t1 in let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
   for (int x in /*@error=InvalidAssignment*/ s) {}
                                              ^" in let final core::String #t3 = s in null) {
           core::int x = #t1 as{TypeError} core::int;
         }
         {
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:52: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
   await for (int x in /*@error=InvalidAssignment*/ s) {}
                                                    ^" in let final core::String #t5 = s in null);
@@ -51,14 +51,14 @@
             }
         }
         core::int y;
-        for (final dynamic #t9 in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
+        for (final dynamic #t9 in let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:42: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::Iterable<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dynamic>'.
   for (y in /*@error=InvalidAssignment*/ s) {}
                                          ^" in let final core::String #t11 = s in null) {
           y = #t9 as{TypeError} core::int;
         }
         {
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(let<BottomType> _ = null in let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::Stream<dynamic>'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dynamic>'.
   await for (y in /*@error=InvalidAssignment*/ s) {}
                                                ^" in let final core::String #t13 = s in null);
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
index 5800a96..4c88501 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
@@ -34,13 +34,13 @@
     b = #t4 as{TypeError} self::B;
   }
   for (final self::A #t5 in iterable) {
-    i = let final dynamic #t6 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+    i = let dynamic _ = null in let final dynamic #t6 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   for (i /*@error=InvalidAssignment*/ in iterable) {}
                                       ^" in let final dynamic #t7 = #t5 in null;
   }
   await for (final self::A #t8 in stream) {
-    i = let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+    i = let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   await for (i /*@error=InvalidAssignment*/ in stream) {}
                                             ^" in let final dynamic #t10 = #t8 in null;
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index c633524..24cf8c0 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -85,7 +85,7 @@
             }
         }
         for (final self::A #t9 in iterable) {
-          i = let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+          i = let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   for (i /*@error=InvalidAssignment*/ in iterable) {}
                                       ^" in let final self::A #t11 = #t9 in null;
@@ -99,7 +99,7 @@
               if(:result) {
                 final self::A #t13 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  i = let final dynamic #t14 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+                  i = let<BottomType> _ = null in let final dynamic #t14 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   await for (i /*@error=InvalidAssignment*/ in stream) {}
                                             ^" in let final self::A #t15 = #t13 in null;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
index 35a241f..d231fbe 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
@@ -55,17 +55,17 @@
     core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = super.{self::Base::[]=}(#t66, #t67) in #t67;
     core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = super.{self::Base::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() as{TypeError} core::double in let final void #t72 = super.{self::Base::[]=}(#t69, #t71) in #t71 : #t70;
     core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = super.{self::Base::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = super.{self::Base::[]=}(#t73, #t75) in #t75 : #t74;
-    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final dynamic #t79 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let dynamic _ = null in let final dynamic #t79 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
     var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
                                                              ^" in let final dynamic #t80 = super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()) in null in let final void #t81 = super.{self::Base::[]=}(#t77, #t78) in #t78;
     core::num v8 = let final core::String #t82 = "x" in let final core::num #t83 = super.{self::Base::[]}(#t82).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t84 = super.{self::Base::[]=}(#t82, #t83) in #t83;
     core::double v9 = let final core::String #t85 = "x" in let final core::double #t86 = super.{self::Base::[]}(#t85).{core::num::+}(self::getDouble()) in let final void #t87 = super.{self::Base::[]=}(#t85, #t86) in #t86;
-    core::int v10 = let final core::String #t88 = "x" in let final core::int #t89 = let final dynamic #t90 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+    core::int v10 = let final core::String #t88 = "x" in let final core::int #t89 = let dynamic _ = null in let final dynamic #t90 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
     var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
                             ^" in let final dynamic #t91 = super.{self::Base::[]}(#t88).{core::num::+}(1) in null in let final void #t92 = super.{self::Base::[]=}(#t88, #t89) in #t89;
-    core::int v11 = let final core::String #t93 = "x" in let final core::int #t94 = super.{self::Base::[]}(#t93) in let final void #t95 = super.{self::Base::[]=}(#t93, let final dynamic #t96 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+    core::int v11 = let final core::String #t93 = "x" in let final core::int #t94 = super.{self::Base::[]}(#t93) in let final void #t95 = super.{self::Base::[]=}(#t93, let dynamic _ = null in let final dynamic #t96 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
     var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
                                                              ^" in let final dynamic #t97 = #t94.{core::num::+}(1) in null) in #t94;
@@ -129,19 +129,19 @@
     core::num v2 = let final core::String #t192 = "x" in let final core::num #t193 = self::getNum() as{TypeError} core::int in let final void #t194 = super.{self::Base::[]=}(#t192, #t193) in #t193;
     core::num v4 = let final core::String #t195 = "x" in let final core::double #t196 = super.{self::Base::[]}(#t195) in #t196.{core::num::==}(null) ?{core::num} let final core::int #t197 = self::getInt() in let final void #t198 = super.{self::Base::[]=}(#t195, #t197) in #t197 : #t196;
     core::num v5 = let final core::String #t199 = "x" in let final core::double #t200 = super.{self::Base::[]}(#t199) in #t200.{core::num::==}(null) ?{core::num} let final core::num #t201 = self::getNum() as{TypeError} core::int in let final void #t202 = super.{self::Base::[]=}(#t199, #t201) in #t201 : #t200;
-    core::double v7 = let final core::String #t203 = "x" in let final core::double #t204 = let final dynamic #t205 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v7 = let final core::String #t203 = "x" in let final core::double #t204 = let dynamic _ = null in let final dynamic #t205 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
                                                                 ^" in let final dynamic #t206 = super.{self::Base::[]}(#t203).{core::double::+}(self::getInt()) in null in let final void #t207 = super.{self::Base::[]=}(#t203, #t204) in #t204;
-    core::double v8 = let final core::String #t208 = "x" in let final core::double #t209 = let final dynamic #t210 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v8 = let final core::String #t208 = "x" in let final core::double #t209 = let dynamic _ = null in let final dynamic #t210 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
                                                                 ^" in let final dynamic #t211 = super.{self::Base::[]}(#t208).{core::double::+}(self::getNum()) in null in let final void #t212 = super.{self::Base::[]=}(#t208, #t209) in #t209;
-    core::double v10 = let final core::String #t213 = "x" in let final core::double #t214 = let final dynamic #t215 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v10 = let final core::String #t213 = "x" in let final core::double #t214 = let dynamic _ = null in let final dynamic #t215 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
                                ^" in let final dynamic #t216 = super.{self::Base::[]}(#t213).{core::double::+}(1) in null in let final void #t217 = super.{self::Base::[]=}(#t213, #t214) in #t214;
-    core::double v11 = let final core::String #t218 = "x" in let final core::double #t219 = super.{self::Base::[]}(#t218) in let final void #t220 = super.{self::Base::[]=}(#t218, let final dynamic #t221 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v11 = let final core::String #t218 = "x" in let final core::double #t219 = super.{self::Base::[]}(#t218) in let final void #t220 = super.{self::Base::[]=}(#t218, let dynamic _ = null in let final dynamic #t221 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
                                                                 ^" in let final dynamic #t222 = #t219.{core::double::+}(1) in null) in #t219;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
index c520d9b..06f2a25 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
@@ -50,17 +50,17 @@
     core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = this.{self::Test3::[]=}(#t66, #t67) in #t67;
     core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = this.{self::Test3::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() as{TypeError} core::double in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71) in #t71 : #t70;
     core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = this.{self::Test3::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75) in #t75 : #t74;
-    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final dynamic #t79 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let dynamic _ = null in let final dynamic #t79 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
     var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
                                                              ^" in let final dynamic #t80 = this.{self::Test3::[]}(#t77).{core::num::+}(self::getInt()) in null in let final void #t81 = this.{self::Test3::[]=}(#t77, #t78) in #t78;
     core::num v8 = let final core::String #t82 = "x" in let final core::num #t83 = this.{self::Test3::[]}(#t82).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t84 = this.{self::Test3::[]=}(#t82, #t83) in #t83;
     core::double v9 = let final core::String #t85 = "x" in let final core::double #t86 = this.{self::Test3::[]}(#t85).{core::num::+}(self::getDouble()) in let final void #t87 = this.{self::Test3::[]=}(#t85, #t86) in #t86;
-    core::int v10 = let final core::String #t88 = "x" in let final core::int #t89 = let final dynamic #t90 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+    core::int v10 = let final core::String #t88 = "x" in let final core::int #t89 = let dynamic _ = null in let final dynamic #t90 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
     var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];
                             ^" in let final dynamic #t91 = this.{self::Test3::[]}(#t88).{core::num::+}(1) in null in let final void #t92 = this.{self::Test3::[]=}(#t88, #t89) in #t89;
-    core::int v11 = let final core::String #t93 = "x" in let final core::int #t94 = this.{self::Test3::[]}(#t93) in let final void #t95 = this.{self::Test3::[]=}(#t93, let final dynamic #t96 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+    core::int v11 = let final core::String #t93 = "x" in let final core::int #t94 = this.{self::Test3::[]}(#t93) in let final void #t95 = this.{self::Test3::[]=}(#t93, let dynamic _ = null in let final dynamic #t96 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
     var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;
                                                              ^" in let final dynamic #t97 = #t94.{core::num::+}(1) in null) in #t94;
@@ -132,19 +132,19 @@
     core::num v2 = let final core::String #t192 = "x" in let final core::num #t193 = self::getNum() as{TypeError} core::int in let final void #t194 = this.{self::Test7::[]=}(#t192, #t193) in #t193;
     core::num v4 = let final core::String #t195 = "x" in let final core::double #t196 = this.{self::Test7::[]}(#t195) in #t196.{core::num::==}(null) ?{core::num} let final core::int #t197 = self::getInt() in let final void #t198 = this.{self::Test7::[]=}(#t195, #t197) in #t197 : #t196;
     core::num v5 = let final core::String #t199 = "x" in let final core::double #t200 = this.{self::Test7::[]}(#t199) in #t200.{core::num::==}(null) ?{core::num} let final core::num #t201 = self::getNum() as{TypeError} core::int in let final void #t202 = this.{self::Test7::[]=}(#t199, #t201) in #t201 : #t200;
-    core::double v7 = let final core::String #t203 = "x" in let final core::double #t204 = let final dynamic #t205 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v7 = let final core::String #t203 = "x" in let final core::double #t204 = let dynamic _ = null in let final dynamic #t205 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
                                                                 ^" in let final dynamic #t206 = this.{self::Test7::[]}(#t203).{core::double::+}(self::getInt()) in null in let final void #t207 = this.{self::Test7::[]=}(#t203, #t204) in #t204;
-    core::double v8 = let final core::String #t208 = "x" in let final core::double #t209 = let final dynamic #t210 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v8 = let final core::String #t208 = "x" in let final core::double #t209 = let dynamic _ = null in let final dynamic #t210 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
                                                                 ^" in let final dynamic #t211 = this.{self::Test7::[]}(#t208).{core::double::+}(self::getNum()) in null in let final void #t212 = this.{self::Test7::[]=}(#t208, #t209) in #t209;
-    core::double v10 = let final core::String #t213 = "x" in let final core::double #t214 = let final dynamic #t215 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v10 = let final core::String #t213 = "x" in let final core::double #t214 = let dynamic _ = null in let final dynamic #t215 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];
                                ^" in let final dynamic #t216 = this.{self::Test7::[]}(#t213).{core::double::+}(1) in null in let final void #t217 = this.{self::Test7::[]=}(#t213, #t214) in #t214;
-    core::double v11 = let final core::String #t218 = "x" in let final core::double #t219 = this.{self::Test7::[]}(#t218) in let final void #t220 = this.{self::Test7::[]=}(#t218, let final dynamic #t221 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+    core::double v11 = let final core::String #t218 = "x" in let final core::double #t219 = this.{self::Test7::[]}(#t218) in let final void #t220 = this.{self::Test7::[]=}(#t218, let dynamic _ = null in let final dynamic #t221 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
     var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;
                                                                 ^" in let final dynamic #t222 = #t219.{core::double::+}(1) in null) in #t219;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
index 00c1fb0..abc6e6b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
@@ -43,17 +43,17 @@
   core::double v3 = let final self::Test<core::int, core::double> #t86 = t in let final core::String #t87 = "x" in let final core::double #t88 = self::getDouble() in let final void #t89 = #t86.{self::Test::[]=}(#t87, #t88) in #t88;
   core::num v5 = let final self::Test<core::int, core::double> #t90 = t in let final core::String #t91 = "x" in let final core::int #t92 = #t90.{self::Test::[]}(#t91) in #t92.{core::num::==}(null) ?{core::num} let final core::num #t93 = self::getNum() as{TypeError} core::double in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93) in #t93 : #t92;
   core::num v6 = let final self::Test<core::int, core::double> #t95 = t in let final core::String #t96 = "x" in let final core::int #t97 = #t95.{self::Test::[]}(#t96) in #t97.{core::num::==}(null) ?{core::num} let final core::double #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98) in #t98 : #t97;
-  core::int v7 = let final self::Test<core::int, core::double> #t100 = t in let final core::String #t101 = "x" in let final core::int #t102 = let final dynamic #t103 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+  core::int v7 = let final self::Test<core::int, core::double> #t100 = t in let final core::String #t101 = "x" in let final core::int #t102 = let dynamic _ = null in let final dynamic #t103 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
   var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
                                                        ^" in let final dynamic #t104 = #t100.{self::Test::[]}(#t101).{core::num::+}(self::getInt()) in null in let final void #t105 = #t100.{self::Test::[]=}(#t101, #t102) in #t102;
   core::num v8 = let final self::Test<core::int, core::double> #t106 = t in let final core::String #t107 = "x" in let final core::num #t108 = #t106.{self::Test::[]}(#t107).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t109 = #t106.{self::Test::[]=}(#t107, #t108) in #t108;
   core::double v9 = let final self::Test<core::int, core::double> #t110 = t in let final core::String #t111 = "x" in let final core::double #t112 = #t110.{self::Test::[]}(#t111).{core::num::+}(self::getDouble()) in let final void #t113 = #t110.{self::Test::[]=}(#t111, #t112) in #t112;
-  core::int v10 = let final self::Test<core::int, core::double> #t114 = t in let final core::String #t115 = "x" in let final core::int #t116 = let final dynamic #t117 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+  core::int v10 = let final self::Test<core::int, core::double> #t114 = t in let final core::String #t115 = "x" in let final core::int #t116 = let dynamic _ = null in let final dynamic #t117 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
   var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
                           ^" in let final dynamic #t118 = #t114.{self::Test::[]}(#t115).{core::num::+}(1) in null in let final void #t119 = #t114.{self::Test::[]=}(#t115, #t116) in #t116;
-  core::int v11 = let final self::Test<core::int, core::double> #t120 = t in let final core::String #t121 = "x" in let final core::int #t122 = #t120.{self::Test::[]}(#t121) in let final void #t123 = #t120.{self::Test::[]=}(#t121, let final dynamic #t124 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
+  core::int v11 = let final self::Test<core::int, core::double> #t120 = t in let final core::String #t121 = "x" in let final core::int #t122 = #t120.{self::Test::[]}(#t121) in let final void #t123 = #t120.{self::Test::[]=}(#t121, let dynamic _ = null in let final dynamic #t124 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
   var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
                                                        ^" in let final dynamic #t125 = #t122.{core::num::+}(1) in null) in #t122;
@@ -97,19 +97,19 @@
   core::num v2 = let final self::Test<core::double, core::int> #t249 = t in let final core::String #t250 = "x" in let final core::num #t251 = self::getNum() as{TypeError} core::int in let final void #t252 = #t249.{self::Test::[]=}(#t250, #t251) in #t251;
   core::num v4 = let final self::Test<core::double, core::int> #t253 = t in let final core::String #t254 = "x" in let final core::double #t255 = #t253.{self::Test::[]}(#t254) in #t255.{core::num::==}(null) ?{core::num} let final core::int #t256 = self::getInt() in let final void #t257 = #t253.{self::Test::[]=}(#t254, #t256) in #t256 : #t255;
   core::num v5 = let final self::Test<core::double, core::int> #t258 = t in let final core::String #t259 = "x" in let final core::double #t260 = #t258.{self::Test::[]}(#t259) in #t260.{core::num::==}(null) ?{core::num} let final core::num #t261 = self::getNum() as{TypeError} core::int in let final void #t262 = #t258.{self::Test::[]=}(#t259, #t261) in #t261 : #t260;
-  core::double v7 = let final self::Test<core::double, core::int> #t263 = t in let final core::String #t264 = "x" in let final core::double #t265 = let final dynamic #t266 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  core::double v7 = let final self::Test<core::double, core::int> #t263 = t in let final core::String #t264 = "x" in let final core::double #t265 = let dynamic _ = null in let final dynamic #t266 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
                                                           ^" in let final dynamic #t267 = #t263.{self::Test::[]}(#t264).{core::double::+}(self::getInt()) in null in let final void #t268 = #t263.{self::Test::[]=}(#t264, #t265) in #t265;
-  core::double v8 = let final self::Test<core::double, core::int> #t269 = t in let final core::String #t270 = "x" in let final core::double #t271 = let final dynamic #t272 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  core::double v8 = let final self::Test<core::double, core::int> #t269 = t in let final core::String #t270 = "x" in let final core::double #t271 = let dynamic _ = null in let final dynamic #t272 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
                                                           ^" in let final dynamic #t273 = #t269.{self::Test::[]}(#t270).{core::double::+}(self::getNum()) in null in let final void #t274 = #t269.{self::Test::[]=}(#t270, #t271) in #t271;
-  core::double v10 = let final self::Test<core::double, core::int> #t275 = t in let final core::String #t276 = "x" in let final core::double #t277 = let final dynamic #t278 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  core::double v10 = let final self::Test<core::double, core::int> #t275 = t in let final core::String #t276 = "x" in let final core::double #t277 = let dynamic _ = null in let final dynamic #t278 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
                              ^" in let final dynamic #t279 = #t275.{self::Test::[]}(#t276).{core::double::+}(1) in null in let final void #t280 = #t275.{self::Test::[]=}(#t276, #t277) in #t277;
-  core::double v11 = let final self::Test<core::double, core::int> #t281 = t in let final core::String #t282 = "x" in let final core::double #t283 = #t281.{self::Test::[]}(#t282) in let final void #t284 = #t281.{self::Test::[]=}(#t282, let final dynamic #t285 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
+  core::double v11 = let final self::Test<core::double, core::int> #t281 = t in let final core::String #t282 = "x" in let final core::double #t283 = #t281.{self::Test::[]}(#t282) in let final void #t284 = #t281.{self::Test::[]=}(#t282, let dynamic _ = null in let final dynamic #t285 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
                                                           ^" in let final dynamic #t286 = #t283.{core::double::+}(1) in null) in #t283;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
index 45bad0d..c06c05f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
@@ -17,19 +17,19 @@
     : super core::Object::•()
     ;
 }
-static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
+static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
                                     ^" in let final dynamic #t3 = #t1.{self::B::a}.{self::A::+}(1) in null;
-static field core::double v_prefix_mm = let final self::B #t4 = new self::B::•() in #t4.{self::B::a} = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
+static field core::double v_prefix_mm = let final self::B #t4 = new self::B::•() in #t4.{self::B::a} = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
                                        ^" in let final dynamic #t6 = #t4.{self::B::a}.{self::A::-}(1) in null;
-static field self::A v_postfix_pp = let final self::B #t7 = new self::B::•() in let final self::A #t8 = #t7.{self::B::a} in let final core::int #t9 = #t7.{self::B::a} = let final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
+static field self::A v_postfix_pp = let final self::B #t7 = new self::B::•() in let final self::A #t8 = #t7.{self::B::a} in let final core::int #t9 = #t7.{self::B::a} = let dynamic _ = null in let final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
                                                               ^" in let final dynamic #t11 = #t8.{self::A::+}(1) in null in #t8;
-static field self::A v_postfix_mm = let final self::B #t12 = new self::B::•() in let final self::A #t13 = #t12.{self::B::a} in let final core::double #t14 = #t12.{self::B::a} = let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
+static field self::A v_postfix_mm = let final self::B #t12 = new self::B::•() in let final self::A #t13 = #t12.{self::B::a} in let final core::double #t14 = #t12.{self::B::a} = let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
                                                               ^" in let final dynamic #t16 = #t13.{self::A::-}(1) in null in #t13;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
index ce574ee..bc2c686 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
@@ -17,19 +17,19 @@
     : super core::Object::•()
     ;
 }
-static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
+static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
                                     ^" in let final core::int #t3 = #t1.{self::B::a}.{self::A::+}(1) in null;
-static field core::double v_prefix_mm = let final self::B #t4 = new self::B::•() in #t4.{self::B::a} = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
+static field core::double v_prefix_mm = let final self::B #t4 = new self::B::•() in #t4.{self::B::a} = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
                                        ^" in let final core::double #t6 = #t4.{self::B::a}.{self::A::-}(1) in null;
-static field self::A v_postfix_pp = let final self::B #t7 = new self::B::•() in let final self::A #t8 = #t7.{self::B::a} in let final core::int #t9 = #t7.{self::B::a} = let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
+static field self::A v_postfix_pp = let final self::B #t7 = new self::B::•() in let final self::A #t8 = #t7.{self::B::a} in let final core::int #t9 = #t7.{self::B::a} = let<BottomType> _ = null in let final dynamic #t10 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
                                                               ^" in let final core::int #t11 = #t8.{self::A::+}(1) in null in #t8;
-static field self::A v_postfix_mm = let final self::B #t12 = new self::B::•() in let final self::A #t13 = #t12.{self::B::a} in let final core::double #t14 = #t12.{self::B::a} = let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
+static field self::A v_postfix_mm = let final self::B #t12 = new self::B::•() in let final self::A #t13 = #t12.{self::B::a} in let final core::double #t14 = #t12.{self::B::a} = let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
 var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
                                                               ^" in let final core::double #t16 = #t13.{self::A::-}(1) in null in #t13;
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
index 0be91a6..81e4b1f 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static field core::int i;
 static field core::String s;
-static field core::String x = self::i = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+static field core::String x = self::i = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
 var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
                                                              ^" in let final dynamic #t2 = self::s in null;
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect
index 85fba5a..ca548ee 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static field core::int i;
 static field core::String s;
-static field core::String x = self::i = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+static field core::String x = self::i = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
 var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
                                                              ^" in let final core::String #t2 = self::s in null;
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
index f7f07a4..32ac9fb 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
@@ -11,17 +11,17 @@
 }
 static method test(core::int i, core::String s, self::A a) → dynamic {
   i = 1;
-  i = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  i = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   i = /*@error=InvalidAssignment*/ s;
                                    ^" in let final dynamic #t2 = s in null;
   i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  i.{core::num::==}(null) ?{core::Object} i = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   i ??= /*@error=InvalidAssignment*/ s;
                                      ^" in let final dynamic #t4 = s in null : null;
   a = new self::A::•();
-  a = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
+  a = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
 Try changing the type of the left hand side, or casting the right hand side to '#lib1::A'.
   a /*@error=InvalidAssignment*/ += 1;
                                  ^" in let final dynamic #t6 = a.{self::A::+}(1) in null;
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
index dcb2006..3f357ca 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
@@ -11,17 +11,17 @@
 }
 static method test(core::int i, core::String s, self::A a) → dynamic {
   i = 1;
-  i = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  i = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   i = /*@error=InvalidAssignment*/ s;
                                    ^" in let final core::String #t2 = s in null;
   i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
+  i.{core::num::==}(null) ?{core::Object} i = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
   i ??= /*@error=InvalidAssignment*/ s;
                                      ^" in let final core::String #t4 = s in null : null;
   a = new self::A::•();
-  a = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
+  a = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
 Try changing the type of the left hand side, or casting the right hand side to '#lib1::A'.
   a /*@error=InvalidAssignment*/ += 1;
                                  ^" in let final core::String #t6 = a.{self::A::+}(1) in null;
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
index df83aa8..9c249ad 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
@@ -27,41 +27,41 @@
 static method topLevelFunction(core::int i) → void {}
 static method bad() → dynamic {
   function localFunction(core::int i) → void {}
-  core::List<core::int> a = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
+  core::List<core::int> a = let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
                                                            ^" in let final dynamic #t2 = <core::Object>[] in null;
-  core::Map<core::int, core::String> b = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> b = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
                                                                          ^" in let final dynamic #t4 = <core::Object, core::String>{} in null;
-  core::Map<core::int, core::String> c = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> c = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
                                                                       ^" in let final dynamic #t6 = <core::int, core::Object>{} in null;
-  (core::Object) → core::int d = let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.
+  (core::Object) → core::int d = let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.
 Change the type of the function expression or the context in which it is used.
   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
                                                               ^" in let final dynamic #t8 = (core::int i) → core::int => i in null;
   self::D e = self::C::fact() as{TypeError} self::D;
   self::D f = new self::D::•() as{TypeError} self::D;
-  self::D g = let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D g = let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
 Change the type of the object being constructed or the context in which it is used.
   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
                                           ^" in let final dynamic #t10 = new self::C::nonFact() in null;
-  self::D h = let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D h = let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
 Change the type of the object being constructed or the context in which it is used.
   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
                                           ^" in let final dynamic #t12 = new self::C::nonFact2() in null;
-  (core::Object) → void i = let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void i = let dynamic _ = null in let final dynamic #t13 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
 Change the type of the method or the context in which it is used.
       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
                                             ^" in let final dynamic #t14 = self::C::staticFunction in null;
-  (core::Object) → void j = let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void j = let dynamic _ = null in let final dynamic #t15 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
 Change the type of the function or the context in which it is used.
       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
                                                  ^" in let final dynamic #t16 = self::topLevelFunction in null;
-  (core::Object) → void k = let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void k = let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
 Change the type of the function or the context in which it is used.
   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
                                                                 ^" in let final dynamic #t18 = localFunction in null;
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
index 858df4a..db63dce 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
@@ -27,41 +27,41 @@
 static method topLevelFunction(core::int i) → void {}
 static method bad() → dynamic {
   function localFunction(core::int i) → void {}
-  core::List<core::int> a = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
+  core::List<core::int> a = let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
 Change the type of the list literal or the context in which it is used.
   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
                                                            ^" in let final core::List<core::Object> #t2 = <core::Object>[] in null;
-  core::Map<core::int, core::String> b = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> b = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
                                                                          ^" in let final core::Map<core::Object, core::String> #t4 = <core::Object, core::String>{} in null;
-  core::Map<core::int, core::String> c = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> c = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
                                                                       ^" in let final core::Map<core::int, core::Object> #t6 = <core::int, core::Object>{} in null;
-  (core::Object) → core::int d = let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.
+  (core::Object) → core::int d = let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.
 Change the type of the function expression or the context in which it is used.
   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
                                                               ^" in let final (core::int) → core::int #t8 = (core::int i) → core::int => i in null;
   self::D e = self::C::fact() as{TypeError} self::D;
   self::D f = new self::D::•() as{TypeError} self::D;
-  self::D g = let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D g = let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
 Change the type of the object being constructed or the context in which it is used.
   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
                                           ^" in let final self::C #t10 = new self::C::nonFact() in null;
-  self::D h = let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D h = let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
 Change the type of the object being constructed or the context in which it is used.
   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
                                           ^" in let final self::C #t12 = new self::C::nonFact2() in null;
-  (core::Object) → void i = let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void i = let<BottomType> _ = null in let final dynamic #t13 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
 Change the type of the method or the context in which it is used.
       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
                                             ^" in let final (core::int) → void #t14 = self::C::staticFunction in null;
-  (core::Object) → void j = let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void j = let<BottomType> _ = null in let final dynamic #t15 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
 Change the type of the function or the context in which it is used.
       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
                                                  ^" in let final (core::int) → void #t16 = self::topLevelFunction in null;
-  (core::Object) → void k = let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void k = let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
 Change the type of the function or the context in which it is used.
   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
                                                                 ^" in let final (core::int) → void #t18 = localFunction in null;
diff --git a/pkg/front_end/testcases/minimum_int.dart.direct.expect b/pkg/front_end/testcases/minimum_int.dart.direct.expect
index 20fea8a..4216458 100644
--- a/pkg/front_end/testcases/minimum_int.dart.direct.expect
+++ b/pkg/front_end/testcases/minimum_int.dart.direct.expect
@@ -3,5 +3,4 @@
 import "dart:core" as core;
 
 static method main() → dynamic
-  return core::print(-9223372036854775808);
-
+  return core::print(-9223372036854775808.unary-());
diff --git a/pkg/front_end/testcases/minimum_int.dart.direct.transformed.expect b/pkg/front_end/testcases/minimum_int.dart.direct.transformed.expect
index eb7af70..4216458 100644
--- a/pkg/front_end/testcases/minimum_int.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/minimum_int.dart.direct.transformed.expect
@@ -3,4 +3,4 @@
 import "dart:core" as core;
 
 static method main() → dynamic
-  return core::print(-9223372036854775808);
+  return core::print(-9223372036854775808.unary-());
diff --git a/pkg/front_end/testcases/minimum_int.dart.strong.expect b/pkg/front_end/testcases/minimum_int.dart.strong.expect
index 20fea8a..17fdfdc 100644
--- a/pkg/front_end/testcases/minimum_int.dart.strong.expect
+++ b/pkg/front_end/testcases/minimum_int.dart.strong.expect
@@ -3,5 +3,4 @@
 import "dart:core" as core;
 
 static method main() → dynamic
-  return core::print(-9223372036854775808);
-
+  return core::print(-9223372036854775808.{core::int::unary-}());
diff --git a/pkg/front_end/testcases/minimum_int.dart.strong.transformed.expect b/pkg/front_end/testcases/minimum_int.dart.strong.transformed.expect
index eb7af70..17fdfdc 100644
--- a/pkg/front_end/testcases/minimum_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/minimum_int.dart.strong.transformed.expect
@@ -3,4 +3,4 @@
 import "dart:core" as core;
 
 static method main() → dynamic
-  return core::print(-9223372036854775808);
+  return core::print(-9223372036854775808.{core::int::unary-}());
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart
new file mode 100644
index 0000000..de97201
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// This test checks that when both LHS and RHS in a mixin application have a
+// concrete implementation of a method and a noSuchMethod forwarder for it, the
+// concrete implementation stays.
+
+abstract class I {
+  foo();
+}
+
+class A {
+  foo() {}
+}
+
+class B implements I {
+  noSuchMethod(_) => null;
+}
+
+class C extends A with B {}
+
+main() {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect
new file mode 100644
index 0000000..86da90d
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+}
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+abstract class _C&A&B = self::A with self::B {
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect
new file mode 100644
index 0000000..45424c8
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+}
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+abstract class _C&A&B extends self::A implements self::B {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
new file mode 100644
index 0000000..8252a0a
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    ;
+  abstract method foo() → dynamic;
+}
+class A extends core::Object {
+  synthetic constructor •() → void
+    ;
+  method foo() → dynamic
+    ;
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    ;
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+abstract class _C&A&B = self::A with self::B {
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
new file mode 100644
index 0000000..10faf1b
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+}
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+abstract class _C&A&B = self::A with self::B {
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
new file mode 100644
index 0000000..15ead99
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+}
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+abstract class _C&A&B extends self::A implements self::B {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return null;
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart
similarity index 66%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart
rename to pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart
index fcbc2e3..6a76ef8 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// This test checks that the noSuchMethod forwarder is not duplicated in classes
-// that mix in the classes that already have the forwarder.
+// This test checks that the noSuchMethod forwarder is not assumed to be mixed
+// in and is generated for classes that mix in a user-defined noSuchMethod and
+// have an abstract method.
 
 abstract class I {
   void foo();
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
similarity index 83%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
index bf046d8..65e96b6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
@@ -17,18 +17,13 @@
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A extends core::Object implements self::A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
similarity index 99%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
index bf046d8..4211c4c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
@@ -23,12 +23,12 @@
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
similarity index 74%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
index 63d5358..e39977a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
@@ -20,6 +20,8 @@
 class B extends self::_B&Object&A {
   synthetic constructor •() → void
     ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
similarity index 83%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
index bf046d8..65e96b6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
@@ -17,18 +17,13 @@
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A extends core::Object implements self::A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+abstract class _B&Object&A = core::Object with self::A {
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
similarity index 99%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
index bf046d8..4211c4c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
@@ -23,12 +23,12 @@
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.strong.expect
deleted file mode 100644
index 0283bae..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
-}
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.strong.transformed.expect
deleted file mode 100644
index bf046d8..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.strong.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
-}
-abstract class _B&Object&A extends core::Object implements self::A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart
new file mode 100644
index 0000000..bb14b72
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// This test checks that the noSuchMethod forwarders aren't generated for the
+// abstract classes that have user-defined noSuchMethod, but rather in their
+// concrete descendants.
+
+abstract class A {
+  noSuchMethod(i) => null;
+
+  // The forwarder for [foo] shouldn't be generated here.
+  void foo();
+}
+
+class B extends A {
+  // The forwarder for [foo] should be generated here.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect
similarity index 60%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect
index 0283bae..0844ef1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect
@@ -2,26 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  method noSuchMethod(dynamic i) → dynamic
+    return null;
   abstract method foo() → void;
 }
-class A extends core::Object implements self::I {
+class B extends self::A {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect
similarity index 60%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect
index 0283bae..0844ef1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect
@@ -2,26 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  method noSuchMethod(dynamic i) → dynamic
+    return null;
   abstract method foo() → void;
 }
-class A extends core::Object implements self::I {
+class B extends self::A {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
similarity index 63%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
index 63d5358..9d07b09 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
@@ -2,24 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
   abstract method foo() → void;
 }
-class A extends core::Object implements self::I {
+class B extends self::A {
   synthetic constructor •() → void
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → void
-    ;
-}
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.expect
similarity index 66%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.expect
index 0283bae..06e4afc 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.expect
@@ -2,26 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     return null;
+  abstract method foo() → void;
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.transformed.expect
similarity index 66%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.transformed.expect
index 0283bae..06e4afc 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.transformed.expect
@@ -2,26 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     return null;
+  abstract method foo() → void;
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart
new file mode 100644
index 0000000..3ea89bf
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// This test checks that the noSuchMethod forwarders aren't generated for the
+// abstract classes that have user-defined noSuchMethod, but rather in their
+// top-most concrete descendants.  The immediate abstract children should not
+// receive the forwarders.
+
+abstract class A {
+  noSuchMethod(i) => null;
+
+  // The forwarder for [foo] shouldn't be generated here.
+  void foo();
+}
+
+abstract class B extends A {
+  // [B] shouldn't receive a forwarder.
+}
+
+class C extends B {
+  // The forwarder for [foo] should be generated here.
+}
+
+class D extends C {
+  // [D] shouldn't receiver a forwarder.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect
similarity index 66%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect
index 0283bae..8e3a340 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect
@@ -2,26 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  method noSuchMethod(dynamic i) → dynamic
+    return null;
   abstract method foo() → void;
 }
-class A extends core::Object implements self::I {
+abstract class B extends self::A {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
+class D extends self::C {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::C::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect
similarity index 66%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect
index 0283bae..8e3a340 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect
@@ -2,26 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
+  method noSuchMethod(dynamic i) → dynamic
+    return null;
   abstract method foo() → void;
 }
-class A extends core::Object implements self::I {
+abstract class B extends self::A {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
+class D extends self::C {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::C::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
similarity index 69%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
index 63d5358..7be5d2c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
@@ -2,22 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
   abstract method foo() → void;
 }
-class A extends core::Object implements self::I {
+abstract class B extends self::A {
   synthetic constructor •() → void
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+}
+class C extends self::B {
+  synthetic constructor •() → void
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
+class D extends self::C {
   synthetic constructor •() → void
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.expect
similarity index 71%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.expect
index 0283bae..8196a67 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.expect
@@ -2,26 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     return null;
+  abstract method foo() → void;
+}
+abstract class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
+class D extends self::C {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::C::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.transformed.expect
similarity index 71%
copy from pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
copy to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.transformed.expect
index 0283bae..8196a67 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_dup_from_mixin.dart.direct.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.transformed.expect
@@ -2,26 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class I extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
+abstract class A extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
     return null;
+  abstract method foo() → void;
+}
+abstract class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
 }
-abstract class _B&Object&A = core::Object with self::A {
-}
-class B extends self::_B&Object&A {
+class D extends self::C {
   synthetic constructor •() → void
-    : super core::Object::•()
+    : super self::C::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
index 6b348e6..eb883bc 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
@@ -5,7 +5,7 @@
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → void
-    : this self::Foo::_internal(x: let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
+    : this self::Foo::_internal(x: let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
 Try changing the type of the left hand side, or casting the right hand side to '#lib1::Foo::T'.
   Foo.from(String _init) : this._internal(x: _init);
                                              ^" in let final dynamic #t2 = _init in null)
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
index 6b348e6..eb883bc 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → void
-    : this self::Foo::_internal(x: let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
+    : this self::Foo::_internal(x: let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
 Try changing the type of the left hand side, or casting the right hand side to '#lib1::Foo::T'.
   Foo.from(String _init) : this._internal(x: _init);
                                              ^" in let final dynamic #t2 = _init in null)
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
index 8427437..3300422 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
   method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
+    this.{self::C::f}<self::C::g1::U>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.
     this.f<U>(1.5);
               ^" in let final dynamic #t2 = 1.5 in null);
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
index b595fdf..1de3ac1 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
   method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
+    this.{self::C::f}<self::C::g1::U>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.
     this.f<U>(1.5);
               ^" in let final core::double #t2 = 1.5 in null);
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 1447ddb..974e021 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -41,14 +41,14 @@
   return 2;
 static method main() → void {
   self::D d = new self::D::•(new self::C::•<core::num>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+  let final self::D #t1 = d in #t1.{self::D::value} = let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
   d.value /*@checkReturn=(num) -> num*/ += 1;
                                         ^" in let final dynamic #t3 = #t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
   self::expect(d.{self::D::setValue}(0), 1);
   d = new self::D::•(new self::C::•<core::num>(self::numToNum));
   self::expectTypeError(() → core::Null {
-    let final self::D #t4 = d in #t4.{self::D::value} = let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+    let final self::D #t4 = d in #t4.{self::D::value} = let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
     d.value /*@checkReturn=(num) -> num*/ += 1;
                                           ^" in let final dynamic #t6 = #t4.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 8378a4c..a09c774 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -41,14 +41,14 @@
   return 2;
 static method main() → void {
   self::D d = new self::D::•(new self::C::•<core::num>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+  let final self::D #t1 = d in #t1.{self::D::value} = let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
   d.value /*@checkReturn=(num) -> num*/ += 1;
                                         ^" in let final (core::num) → core::num #t3 = #t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
   self::expect(d.{self::D::setValue}(0), 1);
   d = new self::D::•(new self::C::•<core::num>(self::numToNum));
   self::expectTypeError(() → core::Null {
-    let final self::D #t4 = d in #t4.{self::D::value} = let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
+    let final self::D #t4 = d in #t4.{self::D::value} = let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
     d.value /*@checkReturn=(num) -> num*/ += 1;
                                           ^" in let final (core::num) → core::num #t6 = #t4.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num in null;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
index 8e6a045..6bc4680 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
@@ -19,19 +19,19 @@
   set x(self::B<(self::C::T) → void> value) → void {}
 }
 static method test(self::C<core::num> c) → void {
-  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                 ^" in let final dynamic #t3 = new self::B::•<core::num>() in null);
-  self::B<(core::num) → void> y = let final self::C<core::num> #t4 = c in #t4.{self::C::x} = (#t4.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<(core::num) → void> y = let final self::C<core::num> #t4 = c in #t4.{self::C::x} = (#t4.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                         ^" in let final dynamic #t6 = new self::B::•<core::num>() in null);
-  let final self::C<core::num> #t7 = c in (#t7.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t7 = c in (#t7.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let dynamic _ = null in let final dynamic #t8 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                  ^" in let final dynamic #t9 = new self::B::•<core::num>() in null : null;
-  self::B<core::Object> z = let final self::C<core::num> #t10 = c in let final dynamic #t11 = #t10.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t11.{core::Object::==}(null) ?{self::B<core::Object>} #t10.{self::C::x} = let final dynamic #t12 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<core::Object> z = let final self::C<core::num> #t10 = c in let final dynamic #t11 = #t10.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t11.{core::Object::==}(null) ?{self::B<core::Object>} #t10.{self::C::x} = let dynamic _ = null in let final dynamic #t12 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                          ^" in let final dynamic #t13 = new self::B::•<core::num>() in null : #t11;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
index 3180850..0bad701 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
@@ -19,19 +19,19 @@
   set x(self::B<(self::C::T) → void> value) → void {}
 }
 static method test(self::C<core::num> c) → void {
-  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                 ^" in let final self::B<core::num> #t3 = new self::B::•<core::num>() in null);
-  self::B<(core::num) → void> y = let final self::C<core::num> #t4 = c in #t4.{self::C::x} = (#t4.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<(core::num) → void> y = let final self::C<core::num> #t4 = c in #t4.{self::C::x} = (#t4.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                         ^" in let final self::B<core::num> #t6 = new self::B::•<core::num>() in null);
-  let final self::C<core::num> #t7 = c in (#t7.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final dynamic #t8 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t7 = c in (#t7.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let<BottomType> _ = null in let final dynamic #t8 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                  ^" in let final self::B<core::num> #t9 = new self::B::•<core::num>() in null : null;
-  self::B<core::Object> z = let final self::C<core::num> #t10 = c in let final self::B<(core::num) → void> #t11 = #t10.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t11.{core::Object::==}(null) ?{self::B<core::Object>} #t10.{self::C::x} = let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<core::Object> z = let final self::C<core::num> #t10 = c in let final self::B<(core::num) → void> #t11 = #t10.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t11.{core::Object::==}(null) ?{self::B<core::Object>} #t10.{self::C::x} = let<BottomType> _ = null in let final dynamic #t12 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                          ^" in let final self::B<core::num> #t13 = new self::B::•<core::num>() in null : #t11;
diff --git a/pkg/front_end/testcases/super_nsm.dart b/pkg/front_end/testcases/super_nsm.dart
new file mode 100644
index 0000000..d4cfc6d
--- /dev/null
+++ b/pkg/front_end/testcases/super_nsm.dart
@@ -0,0 +1,21 @@
+// 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.
+
+abstract class I {
+  interfaceMethod();
+}
+
+class C implements I {
+  noSuchMethod(_) => "C";
+}
+
+class D extends C {
+  noSuchMethod(_) => "D";
+  dMethod() => super.interfaceMethod();
+}
+
+main() {
+  var result = new D().dMethod();
+  if (result != "D") throw "Expected 'D' but got: '$result'";
+}
diff --git a/pkg/front_end/testcases/super_nsm.dart.direct.expect b/pkg/front_end/testcases/super_nsm.dart.direct.expect
new file mode 100644
index 0000000..6409395
--- /dev/null
+++ b/pkg/front_end/testcases/super_nsm.dart.direct.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method interfaceMethod() → dynamic;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return "C";
+  no-such-method-forwarder method interfaceMethod() → dynamic
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+class D extends self::C {
+  synthetic constructor •() → void
+    : super self::C::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return "D";
+  method dMethod() → dynamic
+    return super.{self::C::interfaceMethod}();
+}
+static method main() → dynamic {
+  dynamic result = new self::D::•().dMethod();
+  if(!result.==("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
diff --git a/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect b/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect
new file mode 100644
index 0000000..6409395
--- /dev/null
+++ b/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method interfaceMethod() → dynamic;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return "C";
+  no-such-method-forwarder method interfaceMethod() → dynamic
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+class D extends self::C {
+  synthetic constructor •() → void
+    : super self::C::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return "D";
+  method dMethod() → dynamic
+    return super.{self::C::interfaceMethod}();
+}
+static method main() → dynamic {
+  dynamic result = new self::D::•().dMethod();
+  if(!result.==("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
diff --git a/pkg/front_end/testcases/super_nsm.dart.outline.expect b/pkg/front_end/testcases/super_nsm.dart.outline.expect
new file mode 100644
index 0000000..ac7f6b6
--- /dev/null
+++ b/pkg/front_end/testcases/super_nsm.dart.outline.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    ;
+  abstract method interfaceMethod() → dynamic;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    ;
+  no-such-method-forwarder method interfaceMethod() → dynamic
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+class D extends self::C {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    ;
+  method dMethod() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_nsm.dart.strong.expect b/pkg/front_end/testcases/super_nsm.dart.strong.expect
new file mode 100644
index 0000000..5cf1472
--- /dev/null
+++ b/pkg/front_end/testcases/super_nsm.dart.strong.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method interfaceMethod() → dynamic;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return "C";
+  no-such-method-forwarder method interfaceMethod() → dynamic
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+class D extends self::C {
+  synthetic constructor •() → void
+    : super self::C::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return "D";
+  method dMethod() → dynamic
+    return super.{self::C::interfaceMethod}();
+}
+static method main() → dynamic {
+  dynamic result = new self::D::•().{self::D::dMethod}();
+  if(!result.{core::Object::==}("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
diff --git a/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect b/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect
new file mode 100644
index 0000000..5cf1472
--- /dev/null
+++ b/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  abstract method interfaceMethod() → dynamic;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return "C";
+  no-such-method-forwarder method interfaceMethod() → dynamic
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withoutType("interfaceMethod", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} dynamic;
+}
+class D extends self::C {
+  synthetic constructor •() → void
+    : super self::C::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return "D";
+  method dMethod() → dynamic
+    return super.{self::C::interfaceMethod}();
+}
+static method main() → dynamic {
+  dynamic result = new self::D::•().{self::D::dMethod}();
+  if(!result.{core::Object::==}("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
diff --git a/pkg/front_end/testcases/tabs.dart b/pkg/front_end/testcases/tabs.dart
new file mode 100644
index 0000000..28a958f
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// Test that error messages are indented correctly
+// in the presence of tabs.
+
+test() {
+	print(one);
+		print(two);
+		  print(three);
+	   	print(four);
+	   	  print(five);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/tabs.dart.direct.expect b/pkg/front_end/testcases/tabs.dart.direct.expect
new file mode 100644
index 0000000..b542e17
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart.direct.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.direct.transformed.expect b/pkg/front_end/testcases/tabs.dart.direct.transformed.expect
new file mode 100644
index 0000000..b542e17
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart.direct.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.outline.expect b/pkg/front_end/testcases/tabs.dart.outline.expect
new file mode 100644
index 0000000..a29647d
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/tabs.dart.strong.expect b/pkg/front_end/testcases/tabs.dart.strong.expect
new file mode 100644
index 0000000..83b1b86
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart.strong.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
+\tprint(one);
+\t      ^^^", "pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
+\t\tprint(two);
+\t\t      ^^^", "pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
+\t\t  print(three);
+\t\t        ^^^^^", "pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
+\t   \tprint(four);
+\t   \t      ^^^^", "pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
+\t   \t  print(five);
+\t   \t        ^^^^"]/* from null */;
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
new file mode 100644
index 0000000..83b1b86
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
+\tprint(one);
+\t      ^^^", "pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
+\t\tprint(two);
+\t\t      ^^^", "pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
+\t\t  print(three);
+\t\t        ^^^^^", "pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
+\t   \tprint(four);
+\t   \t      ^^^^", "pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
+\t   \t  print(five);
+\t   \t        ^^^^"]/* from null */;
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
index 52774b2..fe1360b 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   method method() → invalid-type
-    return let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
+    return let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
 Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
   T.String method() => \"Hello, World!\";
                        ^" in let final dynamic #t2 = "Hello, World!" in null;
@@ -16,7 +16,7 @@
   T.String method() => \"Hello, World!\";
   ^"]/* from null */;
 static method main() → dynamic {
-  core::String s = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
+  core::String s = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   T.String s = new C().method();
                        ^" in let final dynamic #t4 = new self::C::•<dynamic>().{self::C::method}() in null;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
index c26c47a..198bffd 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   method method() → invalid-type
-    return let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
+    return let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
 Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
   T.String method() => \"Hello, World!\";
                        ^" in let final core::String #t2 = "Hello, World!" in null;
@@ -16,7 +16,7 @@
   T.String method() => \"Hello, World!\";
   ^"]/* from null */;
 static method main() → dynamic {
-  core::String s = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
+  core::String s = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
   T.String s = new C().method();
                        ^" in let final invalid-type #t4 = new self::C::•<dynamic>().{self::C::method}() in null;
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 6c3add6..4ebfbb2 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -80,6 +80,24 @@
       "exclude": [
         "/testcases/.*_part[0-9]*\\.dart$",
         "/testcases/.*_lib[0-9]*\\.dart$",
+	"/testcases/bug33099",
+	"/testcases/covariant_generic",
+	"/testcases/inference/bug32291",
+	"/testcases/inference/downward_inference_miscellaneous",
+	"/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound",
+	"/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method",
+	"/testcases/inference/generic_methods_nested_generic_instantiation",
+	"/testcases/inference/infer_list_literal_nested_in_map_literal",
+	"/testcases/inference/infer_return_of_statement_lambda",
+	"/testcases/inference/override_equals",
+	"/testcases/inference/unsafe_block_closure_inference_in_map_typed",
+	"/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param",
+	"/testcases/rasta/issue_000002",
+	"/testcases/regress/issue_31766",
+	"/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast",
+	"/testcases/runtime_checks_new/mixin_forwarding_stub_field",
+	"/testcases/runtime_checks_new/mixin_forwarding_stub_setter",
+	"/testcases/runtime_checks_new/stub_checked_via_target",
         "/testcases/dartino/",
         "/testcases/shaker/",
         "/testcases/expression/"
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index 8408682..258e081 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -313,9 +313,9 @@
   }
 
   if (programName == "compile_platform") {
-    if (arguments.length != 4) {
+    if (arguments.length != 5) {
       return throw new CommandLineProblem.deprecated(
-          "Expected four arguments.");
+          "Expected five arguments.");
     }
     if (compileSdk) {
       return throw new CommandLineProblem.deprecated(
@@ -343,7 +343,7 @@
           ..verbose = verbose
           ..verify = verify,
         <Uri>[Uri.parse(arguments[0])],
-        resolveInputUri(arguments[2], extraSchemes: extraSchemes));
+        resolveInputUri(arguments[3], extraSchemes: extraSchemes));
   } else if (arguments.isEmpty) {
     return throw new CommandLineProblem.deprecated("No Dart file specified.");
   }
@@ -445,7 +445,8 @@
     case "compile_platform":
       summary = "Compiles Dart SDK platform to the Dill/Kernel IR format.";
       basicUsage = "Usage: $programName [options]"
-          " dart-library-uri libraries.json platform.dill outline.dill\n";
+          " dart-library-uri libraries.json vm_outline_strong.dill"
+          " platform.dill outline.dill\n";
   }
   StringBuffer sb = new StringBuffer(basicUsage);
   if (summary != null) {
diff --git a/pkg/front_end/tool/_fasta/compile_platform.dart b/pkg/front_end/tool/_fasta/compile_platform.dart
index 4f02bd0..d824723 100644
--- a/pkg/front_end/tool/_fasta/compile_platform.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform.dart
@@ -56,13 +56,15 @@
 Future compilePlatform(List<String> arguments) async {
   await withGlobalOptions("compile_platform", arguments, false,
       (CompilerContext c, List<String> restArguments) {
-    Uri outlineOutput = Uri.base.resolveUri(new Uri.file(restArguments.last));
-    return compilePlatformInternal(c, c.options.output, outlineOutput);
+    Uri hostPlatform = Uri.base.resolveUri(new Uri.file(restArguments[2]));
+    Uri outlineOutput = Uri.base.resolveUri(new Uri.file(restArguments[4]));
+    return compilePlatformInternal(
+        c, c.options.output, outlineOutput, hostPlatform);
   });
 }
 
-Future compilePlatformInternal(
-    CompilerContext c, Uri fullOutput, Uri outlineOutput) async {
+Future compilePlatformInternal(CompilerContext c, Uri fullOutput,
+    Uri outlineOutput, Uri hostPlatform) async {
   if (c.options.verbose) {
     print("Generating outline of ${c.options.sdkRoot} into $outlineOutput");
     print("Compiling ${c.options.sdkRoot} to $fullOutput");
@@ -89,8 +91,7 @@
   c.options.ticker.logMs("Wrote component to ${fullOutput.toFilePath()}");
 
   List<Uri> deps = result.deps.toList();
-  for (Uri dependency
-      in await computeHostDependencies(outlineOutput.resolve("./"))) {
+  for (Uri dependency in await computeHostDependencies(hostPlatform)) {
     // Add the dependencies of the compiler's own sources.
     if (dependency != outlineOutput) {
       // We're computing the dependencies for [outlineOutput], so we shouldn't
@@ -102,13 +103,12 @@
       fullOutput, new File(new File.fromUri(fullOutput).path + ".d").uri, deps);
 }
 
-Future<List<Uri>> computeHostDependencies(Uri platformLocation) async {
+Future<List<Uri>> computeHostDependencies(Uri hostPlatform) async {
   // Returns a list of source files that make up the Fasta compiler (the files
   // the Dart VM reads to run Fasta). Until Fasta is self-hosting (in strong
   // mode), this is only an approximation, albeit accurate.  Once Fasta is
   // self-hosting, this isn't an approximation. Regardless, strong mode
   // shouldn't affect which files are read.
-  Uri hostPlatform = platformLocation.resolve("vm_outline_strong.dill");
   Target hostTarget = getTarget("vm", new TargetFlags(strongMode: true));
   return getDependencies(Platform.script,
       platform: hostPlatform, target: hostTarget);
diff --git a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
index 47a5f9c..4decb5d 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
@@ -22,10 +22,12 @@
       Uri platformDill = tmp.resolve("vm_platform.dill");
       Uri outlineDill = tmp.resolve("vm_outline_strong.dill");
       ProcessResult result = await Process.run(dartVm.toFilePath(), <String>[
+        "--no_preview_dart_2",
         compilePlatform.toFilePath(),
         "-v",
         "dart:core",
         librariesJson.toFilePath(),
+        outlineDill.toFilePath(),
         platformDill.toFilePath(),
         outlineDill.toFilePath(),
       ]);
diff --git a/pkg/front_end/tool/_fasta/compile_platform_test.dart b/pkg/front_end/tool/_fasta/compile_platform_test.dart
index b09d1c6..ac0ea114 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_test.dart
@@ -22,11 +22,13 @@
       Uri platformDill = tmp.resolve("vm_platform.dill");
       Uri outlineDill = tmp.resolve("vm_outline_strong.dill");
       ProcessResult result = await Process.run(dartVm.toFilePath(), <String>[
+        "--no_preview_dart_2",
         compilePlatform.toFilePath(),
         "-v",
         "--strong",
         "dart:core",
         librariesJson.toFilePath(),
+        outlineDill.toFilePath(),
         platformDill.toFilePath(),
         outlineDill.toFilePath(),
       ]);
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 3af6703..2c27df0 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -26,6 +26,9 @@
 
 import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
 
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
 
@@ -161,6 +164,16 @@
   }
 }
 
+incrementalEntryPoint(List<String> arguments) async {
+  installAdditionalTargets();
+  await withGlobalOptions("incremental", arguments, true,
+      (CompilerContext c, _) {
+    // TODO(ahe): Extend this entry point so it can replace
+    // batchEntryPoint.
+    new IncrementalCompiler(c);
+  });
+}
+
 Future<KernelTarget> outline(List<String> arguments) async {
   try {
     return await withGlobalOptions("outline", arguments, true,
diff --git a/pkg/front_end/tool/_fasta/resolve_input_uri_test.dart b/pkg/front_end/tool/_fasta/resolve_input_uri_test.dart
index 7020ffc..d644f92 100644
--- a/pkg/front_end/tool/_fasta/resolve_input_uri_test.dart
+++ b/pkg/front_end/tool/_fasta/resolve_input_uri_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:io' show Platform;
+
 import 'package:test/test.dart';
 
 import 'resolve_input_uri.dart';
@@ -17,8 +19,15 @@
   });
 
   test('unknown schemes are not recognized by default', () {
-    expect(resolveInputUri('test:foo').scheme, 'file');
-    expect(resolveInputUri('org-dartlang-foo:bar').scheme, 'file');
+    expect(resolveInputUri('c:/foo').scheme, 'file');
+    if (Platform.isWindows) {
+      /// : is an invalid path character in windows.
+      expect(() => resolveInputUri('test:foo').scheme, throws);
+      expect(() => resolveInputUri('org-dartlang-foo:bar').scheme, throws);
+    } else {
+      expect(resolveInputUri('test:foo').scheme, 'file');
+      expect(resolveInputUri('org-dartlang-foo:bar').scheme, 'file');
+    }
   });
 
   test('more schemes can be supported', () {
diff --git a/pkg/front_end/tool/fasta b/pkg/front_end/tool/fasta
index eb455cd..32485f4 100755
--- a/pkg/front_end/tool/fasta
+++ b/pkg/front_end/tool/fasta
@@ -68,4 +68,4 @@
 
 shift
 
-exec "${DART_VM}" -c "${SCRIPT}" "$@"
+exec "${DART_VM}" --no_preview_dart_2 -c "${SCRIPT}" "$@"
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 5e01828..56555cc 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -22,6 +22,18 @@
   String toString() => '$filename:$byteIndex: $message at $path';
 }
 
+class InvalidKernelVersionError {
+  final String message;
+
+  InvalidKernelVersionError(this.message);
+}
+
+class CanonicalNameError {
+  final String message;
+
+  CanonicalNameError(this.message);
+}
+
 class _ComponentIndex {
   static const numberOfFixedFields = 9;
 
@@ -390,7 +402,7 @@
   /// computed ahead of time.
   ///
   /// The input bytes may contain multiple files concatenated.
-  void readComponent(Component component) {
+  void readComponent(Component component, {bool checkCanonicalNames: false}) {
     List<int> componentFileSizes = _indexComponents();
     if (componentFileSizes.length > 1) {
       _disableLazyReading = true;
@@ -400,6 +412,10 @@
       _readOneComponent(component, componentFileSizes[componentFileIndex]);
       ++componentFileIndex;
     }
+
+    if (checkCanonicalNames) {
+      _checkCanonicalNameChildren(component.root);
+    }
   }
 
   /// Deserializes the source and stores it in [component].
@@ -426,7 +442,8 @@
   ///
   /// This should *only* be used when there is a reason to not allow
   /// concatenated files.
-  void readSingleFileComponent(Component component) {
+  void readSingleFileComponent(Component component,
+      {bool checkCanonicalNames: false}) {
     List<int> componentFileSizes = _indexComponents();
     if (componentFileSizes.isEmpty) throw "Invalid component data.";
     _readOneComponent(component, componentFileSizes[0]);
@@ -440,6 +457,48 @@
       }
       throw 'Unrecognized bytes following component data';
     }
+
+    if (checkCanonicalNames) {
+      _checkCanonicalNameChildren(component.root);
+    }
+  }
+
+  void _checkCanonicalNameChildren(CanonicalName parent) {
+    for (CanonicalName child in parent.children) {
+      if (child.name != '@methods' &&
+          child.name != '@typedefs' &&
+          child.name != '@fields' &&
+          child.name != '@getters' &&
+          child.name != '@setters' &&
+          child.name != '@factories' &&
+          child.name != '@constructors') {
+        bool checkReferenceNode = true;
+        if (child.reference == null) {
+          // OK for "if private: URI of library" part of "Qualified name"...
+          Iterable<CanonicalName> children = child.children;
+          if (parent.parent != null &&
+              children.isNotEmpty &&
+              children.first.name.startsWith("_")) {
+            // OK then.
+            checkReferenceNode = false;
+          } else {
+            throw new CanonicalNameError(
+                "Null reference (${child.name}) ($child).");
+          }
+        }
+        if (checkReferenceNode) {
+          if (child.reference.canonicalName != child) {
+            throw new CanonicalNameError(
+                "Canonical name and reference doesn't agree.");
+          }
+          if (child.reference.node == null) {
+            throw new CanonicalNameError(
+                "Reference is null (${child.name}) ($child).");
+          }
+        }
+      }
+      _checkCanonicalNameChildren(child);
+    }
   }
 
   _ComponentIndex _readComponentIndex(int componentFileSize) {
@@ -520,7 +579,8 @@
 
     final int formatVersion = readUint32();
     if (formatVersion != Tag.BinaryFormatVersion) {
-      throw fail('Invalid kernel binary format version '
+      throw new InvalidKernelVersionError(
+          'Invalid kernel binary format version '
           '(found ${formatVersion}, expected ${Tag.BinaryFormatVersion})');
     }
 
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 4aa9003..6fbc693 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -30,6 +30,11 @@
 ///         "@fields"
 ///         Qualified name
 ///
+///      Typedef:
+///         Canonical name of enclosing class
+///         "@typedefs"
+///         Name text
+///
 ///      Procedure that is not an accessor or factory:
 ///         Canonical name of enclosing class or library
 ///         "@methods"
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index cf18494..4e62d58 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -719,8 +719,14 @@
         }
       } else if (arguments.length == 1) {
         final Constant other = arguments[0];
+        final op = node.name.name;
         if (other is IntConstant) {
-          switch (node.name.name) {
+          if ((op == '<<' || op == '>>') && other.value < 0) {
+            errorReporter.negativeShift(contextChain,
+                node.arguments.positional.first, receiver, op, other);
+            throw const _AbortCurrentEvaluation();
+          }
+          switch (op) {
             case '|':
               return canonicalize(
                   new IntConstant(receiver.value | other.value));
@@ -739,12 +745,18 @@
           }
         }
 
-        if (other is IntConstant || other is DoubleConstant) {
-          final num value = (other is IntConstant)
-              ? other.value
-              : (other as DoubleConstant).value;
+        if (other is IntConstant) {
+          if (other.value == 0 && (op == '%' || op == '~/')) {
+            errorReporter.zeroDivisor(
+                contextChain, node.arguments.positional.first, receiver, op);
+            throw const _AbortCurrentEvaluation();
+          }
+
           return evaluateBinaryNumericOperation(
-              node.name.name, receiver.value, value, node);
+              node.name.name, receiver.value, other.value, node);
+        } else if (other is DoubleConstant) {
+          return evaluateBinaryNumericOperation(
+              node.name.name, receiver.value, other.value, node);
         }
 
         errorReporter.invalidBinaryOperandType(
@@ -1150,9 +1162,6 @@
     }
     return value;
   }
-
-  static const kMaxInt64 = (1 << 63) - 1;
-  static const kMinInt64 = -(1 << 63);
 }
 
 /// Holds the necessary information for a constant object, namely
@@ -1256,6 +1265,10 @@
       List<TreeNode> context, TreeNode node, Procedure target);
   invalidStringInterpolationOperand(
       List<TreeNode> context, TreeNode node, Constant constant);
+  zeroDivisor(
+      List<TreeNode> context, TreeNode node, IntConstant receiver, String op);
+  negativeShift(List<TreeNode> context, TreeNode node, IntConstant receiver,
+      String op, IntConstant argument);
   nonConstLiteral(List<TreeNode> context, TreeNode node, String klass);
   duplicateKey(List<TreeNode> context, TreeNode node, Constant key);
   failedAssertion(List<TreeNode> context, TreeNode node, String message);
@@ -1323,6 +1336,24 @@
         node);
   }
 
+  zeroDivisor(
+      List<TreeNode> context, TreeNode node, IntConstant receiver, String op) {
+    report(
+        context,
+        "Binary operator '$op' on '${receiver.value}' requires non-zero "
+        "divisor, but divisor was '0'.",
+        node);
+  }
+
+  negativeShift(List<TreeNode> context, TreeNode node, IntConstant receiver,
+      String op, IntConstant argument) {
+    report(
+        context,
+        "Binary operator '$op' on '${receiver.value}' requires non-negative "
+        "operand, but was '${argument.value}'.",
+        node);
+  }
+
   nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
     report(
         context,
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index d546fe4..d132d11 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -180,6 +180,9 @@
       // Factory constructors are not cloned.
       if (procedure.isFactory) continue;
 
+      // NoSuchMethod forwarders aren't cloned.
+      if (procedure.isNoSuchMethodForwarder) continue;
+
       Procedure clone = cloner.clone(procedure);
       // Linear search for a forwarding stub with the same name.
       for (int i = 0; i < originalLength; ++i) {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 0c49070..7a258a5 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -147,9 +147,45 @@
 [ $jscl ]
 kernel/test/*: SkipByDesign # Uses dart:io and bigints.
 
+[ $no_preview_dart_2 ]
+dev_compiler/*: SkipByDesign # uses Dart 2.
+
 [ $arch == x64 && $runtime == vm && $system == windows && $checked ]
 analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
 
+# analyzer using the fasta parser
+[ $builder_tag == analyzer_use_fasta && $runtime == vm ]
+analysis_server/test/analysis/get_errors_test: Fail
+analysis_server/test/completion_test: Fail
+analysis_server/test/domain_completion_test: Fail
+analysis_server/test/edit/fixes_test: Fail
+analysis_server/test/integration/analysis/package_root_test: Pass, RuntimeError # Issue 33382
+analysis_server/test/services/completion/dart/keyword_contributor_test: Fail
+analysis_server/test/services/completion/dart/override_contributor_test: Fail
+analysis_server/test/services/completion/statement/statement_completion_test: Fail
+analysis_server/test/services/correction/fix_test: Fail
+analysis_server/test/services/refactoring/extract_local_test: Fail
+analyzer/test/generated/compile_time_error_code_driver_test: Fail
+analyzer/test/generated/compile_time_error_code_test: Fail
+analyzer/test/generated/declaration_resolver_test: Fail
+analyzer/test/generated/hint_code_driver_test: Fail
+analyzer/test/generated/hint_code_test: Fail
+analyzer/test/generated/invalid_code_driver_test: Fail
+analyzer/test/generated/non_error_resolver_driver_test: Fail
+analyzer/test/generated/non_error_resolver_test: Fail
+analyzer/test/generated/parser_test: Fail
+analyzer/test/generated/resolver_test: Fail
+analyzer/test/generated/utilities_test: Fail
+analyzer/test/src/context/context_test: Fail
+analyzer/test/src/dart/constant/evaluation_test: Fail
+analyzer/test/src/summary/prelinker_test: Fail
+analyzer/test/src/summary/summarize_ast_strong_test: Fail
+analyzer/test/src/summary/summarize_ast_test: Fail
+analyzer_plugin/test/src/utilities/completion/completion_target_test: Fail
+analyzer_plugin/test/src/utilities/completion/optype_test: Fail
+analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test: Fail
+analyzer_plugin/test/utilities/completion/completion_target_test: Fail
+
 [ $builder_tag != dart2js_analyzer && $compiler == dart2js ]
 analysis_server/test/*: Skip # Issue 26813
 analyzer/test/*: Skip # Issue 26813
@@ -163,7 +199,6 @@
 analyzer/test/src/summary/resynthesize_ast_test: StaticWarning, Pass
 analyzer/test/src/summary/resynthesize_kernel_test: StaticWarning, Pass
 front_end/test/incremental_dart2js_load_from_dill_test: StaticWarning, Pass
-front_end/test/incremental_load_from_dill_test: StaticWarning, Pass
 
 # ILLEGAL_ASYNC_RETURN_TYPE warnings
 [ $compiler == dart2analyzer && !$preview_dart_2 && !$strong && ($system == macos || $system == windows) ]
@@ -172,7 +207,6 @@
 analyzer/test/src/summary/resynthesize_ast_test: StaticWarning
 analyzer/test/src/summary/resynthesize_kernel_test: StaticWarning
 front_end/test/incremental_dart2js_load_from_dill_test: StaticWarning
-front_end/test/incremental_load_from_dill_test: StaticWarning
 
 # Analyze dev_compiler but only run its tests on the vm
 [ $compiler != dart2analyzer && $runtime != vm ]
@@ -221,6 +255,7 @@
 front_end/tool/perf_test: Slow, Pass
 
 [ $runtime == vm && $checked ]
+analysis_server/test/benchmarks_test: Pass, Slow
 analysis_server/test/completion_test: Pass, Slow
 analysis_server/test/integration/edit/sort_members_test: Pass, Slow
 analysis_server/test/services/correction/fix_test: Pass, Slow
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index eedfdee..7ec5b51 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -53,12 +53,14 @@
 //   4 - Compile an individual expression in some context (for debugging
 //       purposes).
 //   5 - List program dependencies (for creating depfiles)
+//   6 - Isolate shutdown that potentially should result in compiler cleanup.
 const int kCompileTag = 0;
 const int kUpdateSourcesTag = 1;
 const int kAcceptTag = 2;
 const int kTrainTag = 3;
 const int kCompileExpressionTag = 4;
 const int kListDependenciesTag = 5;
+const int kNotifyIsolateShutdownTag = 6;
 
 bool allowDartInternalImport = false;
 
@@ -345,6 +347,12 @@
   port.send(result.toResponse());
 }
 
+Future _processIsolateShutdownNotification(request) async {
+  final int isolateId = request[1];
+  isolateCompilers.remove(isolateId);
+  isolateDependencies.remove(isolateId);
+}
+
 Future _processLoadRequest(request) async {
   if (verbose) print("DFE: request: $request");
 
@@ -360,6 +368,11 @@
     return;
   }
 
+  if (tag == kNotifyIsolateShutdownTag) {
+    await _processIsolateShutdownNotification(request);
+    return;
+  }
+
   final SendPort port = request[1];
   final String inputFileUri = request[2];
   final Uri script =
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index b6b0ad1..c0c07ff 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -158,6 +158,10 @@
   StringReference nativeName;
 }
 
+type ConstantSubtypeTestCache extends ConstantPoolEntry {
+  Byte tag = 24;
+}
+
 */
 
 enum ConstantTag {
@@ -185,6 +189,7 @@
   kClosureFunction,
   kEndClosureFunctionScope,
   kNativeEntry,
+  kSubtypeTestCache,
 }
 
 abstract class ConstantPoolEntry {
@@ -251,6 +256,8 @@
         return new ConstantEndClosureFunctionScope.readFromBinary(source);
       case ConstantTag.kNativeEntry:
         return new ConstantNativeEntry.readFromBinary(source);
+      case ConstantTag.kSubtypeTestCache:
+        return new ConstantSubtypeTestCache.readFromBinary(source);
     }
     throw 'Unexpected constant tag $tag';
   }
@@ -1041,6 +1048,31 @@
       other is ConstantNativeEntry && this.nativeName == other.nativeName;
 }
 
+class ConstantSubtypeTestCache extends ConstantPoolEntry {
+  ConstantSubtypeTestCache();
+
+  @override
+  ConstantTag get tag => ConstantTag.kSubtypeTestCache;
+
+  @override
+  void writeValueToBinary(BinarySink sink) {}
+
+  ConstantSubtypeTestCache.readFromBinary(BinarySource source);
+
+  @override
+  String toString() => 'SubtypeTestCache';
+
+  // ConstantSubtypeTestCache entries are created per subtype test site and
+  // should not be merged, so ConstantSubtypeTestCache class uses identity
+  // [hashCode] and [operator ==].
+
+  @override
+  int get hashCode => identityHashCode(this);
+
+  @override
+  bool operator ==(other) => identical(this, other);
+}
+
 class ConstantPool {
   final List<ConstantPoolEntry> entries = <ConstantPoolEntry>[];
   final Map<ConstantPoolEntry, int> _canonicalizationCache =
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 4e218c8..953ae1c 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -250,8 +250,6 @@
     _genPushReceiver();
     initializer.accept(this);
 
-    // TODO(alexmarkov): assignability check
-
     final int cpIndex = cp.add(new ConstantFieldOffset(field));
     asm.emitStoreFieldTOS(cpIndex);
   }
@@ -585,7 +583,7 @@
   void _genEqualsOperatorNullHandling(Member member) {
     if (member.name.name != '==' ||
         locals.numParameters != 2 ||
-        member.enclosingClass != coreTypes.objectClass) {
+        member.enclosingClass == coreTypes.objectClass) {
       return;
     }
 
@@ -663,10 +661,9 @@
     }
     asm.emitCheckStack();
 
-    // TODO(alexmarkov): add type checks for parameters
-
     final bool isClosure =
         node is FunctionDeclaration || node is FunctionExpression;
+
     if (isClosure) {
       asm.emitPush(locals.closureVarIndexInFrame);
       asm.emitLoadFieldTOS(cp.add(new ConstantFieldOffset(closureContext)));
@@ -691,6 +688,10 @@
         asm.emitPopLocal(locals.typeArgsVarIndexInFrame);
       }
     }
+
+    if (isClosure || (node is Procedure && node.isInstanceMember)) {
+      _checkArguments(function);
+    }
   }
 
   void _setupInitialContext(FunctionNode function) {
@@ -716,6 +717,44 @@
     }
   }
 
+  void _checkArguments(FunctionNode function) {
+    for (var typeParam in function.typeParameters) {
+      if (!typeEnvironment.isTop(typeParam.bound)) {
+        final DartType type = new TypeParameterType(typeParam);
+        _genPushInstantiatorAndFunctionTypeArguments([type, typeParam.bound]);
+        asm.emitPushConstant(cp.add(new ConstantType(type)));
+        asm.emitPushConstant(cp.add(new ConstantType(typeParam.bound)));
+        asm.emitPushConstant(cp.add(new ConstantString(typeParam.name)));
+        asm.emitAssertSubtype();
+      }
+    }
+    function.positionalParameters.forEach(_genArgumentTypeCheck);
+    function.namedParameters.forEach(_genArgumentTypeCheck);
+  }
+
+  void _genArgumentTypeCheck(VariableDeclaration variable) {
+    if (typeEnvironment.isTop(variable.type)) {
+      return;
+    }
+    if (locals.isCaptured(variable)) {
+      asm.emitPush(locals.getOriginalParamSlotIndex(variable));
+    } else {
+      asm.emitPush(locals.getVarIndexInFrame(variable));
+    }
+    _genAssertAssignable(variable.type, name: variable.name);
+    asm.emitDrop1();
+  }
+
+  void _genAssertAssignable(DartType type, {String name = ''}) {
+    assert(!typeEnvironment.isTop(type));
+    _genPushInstantiatorAndFunctionTypeArguments([type]);
+    asm.emitPushConstant(cp.add(new ConstantType(type)));
+    asm.emitPushConstant(cp.add(new ConstantString(name)));
+    bool isIntOk = typeEnvironment.isSubtypeOf(typeEnvironment.intType, type);
+    int subtypeTestCacheCpIndex = cp.add(new ConstantSubtypeTestCache());
+    asm.emitAssertAssignable(isIntOk ? 1 : 0, subtypeTestCacheCpIndex);
+  }
+
   void _pushAssemblerState() {
     savedAssemblers.add(asm);
     asm = new BytecodeAssembler();
@@ -964,25 +1003,20 @@
   visitAsExpression(AsExpression node) {
     node.operand.accept(this);
 
-    if (node.type == const DynamicType()) {
+    final type = node.type;
+    if (typeEnvironment.isTop(type)) {
       return;
     }
     if (node.isTypeError) {
-      // TODO(alexmarkov): type checks
-      return;
-    }
-    if (hasTypeParameters([node.type])) {
-      _genPushInstantiatorAndFunctionTypeArguments([node.type]);
+      _genAssertAssignable(type);
     } else {
-      _genPushNull(); // Instantiator type arguments.
-      _genPushNull(); // Function type arguments.
+      _genPushInstantiatorAndFunctionTypeArguments([type]);
+      asm.emitPushConstant(cp.add(new ConstantType(type)));
+      final argDescIndex = cp.add(new ConstantArgDesc(4));
+      final icdataIndex = cp.add(new ConstantICData(
+          InvocationKind.method, objectAs.name, argDescIndex));
+      asm.emitInstanceCall1(4, icdataIndex);
     }
-    final typeIndex = cp.add(new ConstantType(node.type));
-    asm.emitPushConstant(typeIndex);
-    final argDescIndex = cp.add(new ConstantArgDesc(4));
-    final icdataIndex = cp.add(
-        new ConstantICData(InvocationKind.method, objectAs.name, argDescIndex));
-    asm.emitInstanceCall1(4, icdataIndex);
   }
 
   @override
@@ -1123,7 +1157,6 @@
       asm.emitPush(temp);
       _genPushInt(i);
       node.expressions[i].accept(this);
-      // TODO(alexmarkov): assignable check
       asm.emitStoreIndexedTOS();
     }
 
@@ -1361,7 +1394,6 @@
     _genDupTOS(locals.tempIndexInFrame(node));
     final target = node.target;
     if (target is Field) {
-      // TODO(alexmarkov): assignable check
       int cpIndex = cp.add(new ConstantField(target));
       asm.emitStoreStaticTOS(cpIndex);
     } else {
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 928cac8..162890e 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -27,6 +27,7 @@
         DartType,
         Field,
         FileUriNode,
+        IntConstant,
         Procedure,
         StaticGet,
         TreeNode;
@@ -283,6 +284,20 @@
     reportIt(context, message, node);
   }
 
+  zeroDivisor(
+      List<TreeNode> context, TreeNode node, IntConstant receiver, String op) {
+    final message = codes.templateConstEvalZeroDivisor
+        .withArguments(op, '${receiver.value}');
+    reportIt(context, message, node);
+  }
+
+  negativeShift(List<TreeNode> context, TreeNode node, IntConstant receiver,
+      String op, IntConstant argument) {
+    final message = codes.templateConstEvalNegativeShift
+        .withArguments(op, '${receiver.value}', '${argument.value}');
+    reportIt(context, message, node);
+  }
+
   nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
     final message =
         codes.templateConstEvalNonConstantLiteral.withArguments(klass);
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 6f72b9f..cd54d28 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -523,45 +523,45 @@
   Push                 r0
   PushConstant         CP#4
   StoreFieldTOS        CP#1
-  Allocate             CP#20
+  Allocate             CP#23
   StoreLocal           r4
   Push                 r4
-  PushConstant         CP#18
-  StoreFieldTOS        CP#21
+  PushConstant         CP#7
+  StoreFieldTOS        CP#24
   Push                 r4
-  PushConstant         CP#18
-  StoreFieldTOS        CP#22
+  PushConstant         CP#7
+  StoreFieldTOS        CP#25
   Push                 r4
   PushConstant         CP#5
-  StoreFieldTOS        CP#23
+  StoreFieldTOS        CP#26
   Push                 r4
   Push                 r0
   StoreFieldTOS        CP#6
   PopLocal             r3
   Push                 r3
-  PushConstant         CP#27
-  InstanceCall1        2, CP#28
+  PushConstant         CP#30
+  InstanceCall1        2, CP#31
   Drop1
   Push                 r3
-  PushConstant         CP#29
-  InstanceCall1        2, CP#30
+  PushConstant         CP#32
+  InstanceCall1        2, CP#33
   Drop1
   Push                 r2
-  PushConstant         CP#31
-  IndirectStaticCall   1, CP#15
+  PushConstant         CP#34
+  IndirectStaticCall   1, CP#19
   Drop1
   Push                 r0
   LoadFieldTOS         CP#1
-  PushConstant         CP#32
-  IndirectStaticCall   1, CP#15
+  PushConstant         CP#35
+  IndirectStaticCall   1, CP#19
   Drop1
   Push                 r0
   LoadFieldTOS         CP#0
   PopLocal             r0
   Push                 r0
   LoadFieldTOS         CP#1
-  PushConstant         CP#33
-  IndirectStaticCall   1, CP#15
+  PushConstant         CP#36
+  IndirectStaticCall   1, CP#19
   Drop1
   Push                 r0
   LoadFieldTOS         CP#0
@@ -573,30 +573,30 @@
   StoreFieldTOS        CP#0
   PopLocal             r0
   Push                 r0
-  PushConstant         CP#34
+  PushConstant         CP#37
   StoreFieldTOS        CP#1
-  Allocate             CP#20
+  Allocate             CP#23
   StoreLocal           r3
   Push                 r3
-  PushConstant         CP#18
-  StoreFieldTOS        CP#21
+  PushConstant         CP#7
+  StoreFieldTOS        CP#24
   Push                 r3
-  PushConstant         CP#18
-  StoreFieldTOS        CP#22
+  PushConstant         CP#7
+  StoreFieldTOS        CP#25
   Push                 r3
-  PushConstant         CP#35
-  StoreFieldTOS        CP#23
+  PushConstant         CP#38
+  StoreFieldTOS        CP#26
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#6
   PopLocal             r2
   Push                 r2
-  InstanceCall1        1, CP#38
+  InstanceCall1        1, CP#41
   Drop1
   Push                 r0
   LoadFieldTOS         CP#0
   PopLocal             r0
-  PushConstant         CP#18
+  PushConstant         CP#7
   ReturnTOS
 }
 ConstantPool {
@@ -607,40 +607,43 @@
   [4] = Int 3
   [5] = ClosureFunction <anonymous closure> (dart.core::int y) → dart.core::Null;
   [6] = FieldOffset dart.core::_Closure::_context
-  [7] = ArgDesc num-args 2, num-type-args 0, names []
-  [8] = ICData target-name '+', arg-desc CP#7
-  [9] = Int 5
-  [10] = ICData target-name '>', arg-desc CP#7
-  [11] = Bool true
-  [12] = Int 4
-  [13] = ClosureFunction closure2 () → void;
-  [14] = ICData target-name '+', arg-desc CP#7
-  [15] = ArgDesc num-args 1, num-type-args 0, names []
-  [16] = ICData get target-name 'foo', arg-desc CP#15
-  [17] = ICData target-name '+', arg-desc CP#7
-  [18] = Null
-  [19] = EndClosureFunctionScope
-  [20] = Class dart.core::_Closure
-  [21] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
-  [22] = FieldOffset dart.core::_Closure::_function_type_arguments
-  [23] = FieldOffset dart.core::_Closure::_function
-  [24] = ICData target-name 'call', arg-desc CP#15
-  [25] = StaticICData target 'dart.core::print', arg-desc CP#15
-  [26] = EndClosureFunctionScope
-  [27] = Int 10
-  [28] = ICData target-name 'call', arg-desc CP#7
-  [29] = Int 11
-  [30] = ICData target-name 'call', arg-desc CP#7
-  [31] = StaticICData target 'dart.core::print', arg-desc CP#15
-  [32] = StaticICData target 'dart.core::print', arg-desc CP#15
-  [33] = StaticICData target 'dart.core::print', arg-desc CP#15
-  [34] = Int 42
-  [35] = ClosureFunction <anonymous closure> () → dart.core::Null;
-  [36] = ICData set target-name 'foo', arg-desc CP#7
-  [37] = EndClosureFunctionScope
-  [38] = ICData target-name 'call', arg-desc CP#15
+  [7] = Null
+  [8] = Type dart.core::int
+  [9] = String 'y'
+  [10] = SubtypeTestCache
+  [11] = ArgDesc num-args 2, num-type-args 0, names []
+  [12] = ICData target-name '+', arg-desc CP#11
+  [13] = Int 5
+  [14] = ICData target-name '>', arg-desc CP#11
+  [15] = Bool true
+  [16] = Int 4
+  [17] = ClosureFunction closure2 () → void;
+  [18] = ICData target-name '+', arg-desc CP#11
+  [19] = ArgDesc num-args 1, num-type-args 0, names []
+  [20] = ICData get target-name 'foo', arg-desc CP#19
+  [21] = ICData target-name '+', arg-desc CP#11
+  [22] = EndClosureFunctionScope
+  [23] = Class dart.core::_Closure
+  [24] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [25] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [26] = FieldOffset dart.core::_Closure::_function
+  [27] = ICData target-name 'call', arg-desc CP#19
+  [28] = StaticICData target 'dart.core::print', arg-desc CP#19
+  [29] = EndClosureFunctionScope
+  [30] = Int 10
+  [31] = ICData target-name 'call', arg-desc CP#11
+  [32] = Int 11
+  [33] = ICData target-name 'call', arg-desc CP#11
+  [34] = StaticICData target 'dart.core::print', arg-desc CP#19
+  [35] = StaticICData target 'dart.core::print', arg-desc CP#19
+  [36] = StaticICData target 'dart.core::print', arg-desc CP#19
+  [37] = Int 42
+  [38] = ClosureFunction <anonymous closure> () → dart.core::Null;
+  [39] = ICData set target-name 'foo', arg-desc CP#11
+  [40] = EndClosureFunctionScope
+  [41] = ICData target-name 'call', arg-desc CP#19
 }
-Closure CP#13 {
+Closure CP#17 {
   Entry                3
   CheckStack
   Push                 FP[-5]
@@ -655,7 +658,7 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#1
   PushConstant         CP#3
-  InstanceCall1        2, CP#14
+  InstanceCall1        2, CP#18
   StoreLocal           r2
   StoreFieldTOS        CP#1
   Push                 r2
@@ -667,16 +670,16 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#1
-  InstanceCall1        1, CP#16
+  InstanceCall1        1, CP#20
   Push                 r0
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#1
-  InstanceCall1        2, CP#17
+  InstanceCall1        2, CP#21
   StoreLocal           r2
   StoreFieldTOS        CP#1
   Push                 r2
   Drop1
-  PushConstant         CP#18
+  PushConstant         CP#7
   ReturnTOS
 
 }
@@ -687,6 +690,13 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#6
   PopLocal             r0
+  Push                 FP[-5]
+  PushConstant         CP#7
+  PushConstant         CP#7
+  PushConstant         CP#8
+  PushConstant         CP#9
+  AssertAssignable     1, CP#10
+  Drop1
   AllocateContext      1
   StoreLocal           r1
   Push                 r1
@@ -708,7 +718,7 @@
   Push                 r0
   LoadFieldTOS         CP#1
   PushConstant         CP#2
-  InstanceCall1        2, CP#8
+  InstanceCall1        2, CP#12
   StoreLocal           r2
   StoreFieldTOS        CP#1
   Push                 r2
@@ -717,9 +727,9 @@
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#1
-  PushConstant         CP#9
-  InstanceCall1        2, CP#10
-  PushConstant         CP#11
+  PushConstant         CP#13
+  InstanceCall1        2, CP#14
+  PushConstant         CP#15
   IfNeStrictTOS
   Jump                 L1
   AllocateContext      1
@@ -729,41 +739,41 @@
   StoreFieldTOS        CP#0
   PopLocal             r0
   Push                 r0
-  PushConstant         CP#12
+  PushConstant         CP#16
   StoreFieldTOS        CP#1
-  Allocate             CP#20
+  Allocate             CP#23
   StoreLocal           r2
   Push                 r2
-  PushConstant         CP#18
-  StoreFieldTOS        CP#21
+  PushConstant         CP#7
+  StoreFieldTOS        CP#24
   Push                 r2
-  PushConstant         CP#18
-  StoreFieldTOS        CP#22
+  PushConstant         CP#7
+  StoreFieldTOS        CP#25
   Push                 r2
-  PushConstant         CP#13
-  StoreFieldTOS        CP#23
+  PushConstant         CP#17
+  StoreFieldTOS        CP#26
   Push                 r2
   Push                 r0
   StoreFieldTOS        CP#6
   PopLocal             r3
   Push                 r3
-  InstanceCall1        1, CP#24
+  InstanceCall1        1, CP#27
   Drop1
   Push                 r0
   LoadFieldTOS         CP#1
-  PushConstant         CP#25
-  IndirectStaticCall   1, CP#15
+  PushConstant         CP#28
+  IndirectStaticCall   1, CP#19
   Drop1
   Push                 r0
   LoadFieldTOS         CP#0
   PopLocal             r0
 L1:
-  PushConstant         CP#18
+  PushConstant         CP#7
   ReturnTOS
 
 }
 
-Closure CP#35 {
+Closure CP#38 {
   Entry                3
   CheckStack
   Push                 FP[-5]
@@ -775,11 +785,11 @@
   Push                 r0
   LoadFieldTOS         CP#1
   StoreLocal           r2
-  InstanceCall1        2, CP#36
+  InstanceCall1        2, CP#39
   Drop1
   Push                 r2
   Drop1
-  PushConstant         CP#18
+  PushConstant         CP#7
   ReturnTOS
 
 }
@@ -918,7 +928,7 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#12
-  InstanceCall1        2, CP#24
+  InstanceCall1        2, CP#27
   Drop1
   Push                 r0
   CloneContext
@@ -926,8 +936,8 @@
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#2
-  PushConstant         CP#25
-  InstanceCall1        2, CP#26
+  PushConstant         CP#28
+  InstanceCall1        2, CP#29
   StoreLocal           r3
   StoreFieldTOS        CP#2
   Push                 r3
@@ -966,11 +976,14 @@
   [19] = FieldOffset dart.core::_Closure::_function
   [20] = ICData target-name 'add', arg-desc CP#8
   [21] = ClosureFunction <anonymous closure> (dart.core::int ii) → dart.core::Null;
-  [22] = ICData target-name '+', arg-desc CP#8
-  [23] = EndClosureFunctionScope
-  [24] = ICData target-name 'add', arg-desc CP#8
-  [25] = Int 1
-  [26] = ICData target-name '+', arg-desc CP#8
+  [22] = Type dart.core::int
+  [23] = String 'ii'
+  [24] = SubtypeTestCache
+  [25] = ICData target-name '+', arg-desc CP#8
+  [26] = EndClosureFunctionScope
+  [27] = ICData target-name 'add', arg-desc CP#8
+  [28] = Int 1
+  [29] = ICData target-name '+', arg-desc CP#8
 }
 Closure CP#11 {
   Entry                2
@@ -996,12 +1009,19 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#12
   PopLocal             r0
+  Push                 FP[-5]
+  PushConstant         CP#14
+  PushConstant         CP#14
+  PushConstant         CP#22
+  PushConstant         CP#23
+  AssertAssignable     1, CP#24
+  Drop1
   Push                 r0
   Push                 FP[-5]
   Push                 r0
   LoadFieldTOS         CP#0
   LoadFieldTOS         CP#2
-  InstanceCall1        2, CP#22
+  InstanceCall1        2, CP#25
   StoreLocal           r2
   StoreFieldTOS        CP#2
   Push                 r2
@@ -1026,94 +1046,104 @@
   Entry                5
   CheckStack
   Push                 FP[-5]
-  InstanceCall1        1, CP#1
+  PushConstant         CP#0
+  PushConstant         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#2
+  AssertAssignable     0, CP#3
+  Drop1
+  Push                 FP[-5]
+  InstanceCall1        1, CP#5
   PopLocal             r2
 L2:
   CheckStack
   Push                 r2
-  InstanceCall1        1, CP#2
-  PushConstant         CP#3
+  InstanceCall1        1, CP#6
+  PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L1
   AllocateContext      1
   StoreLocal           r1
   Push                 r1
   Push                 r0
-  StoreFieldTOS        CP#4
+  StoreFieldTOS        CP#8
   PopLocal             r0
   Push                 r0
   Push                 r2
-  InstanceCall1        1, CP#5
-  StoreFieldTOS        CP#6
-  Allocate             CP#14
+  InstanceCall1        1, CP#9
+  StoreFieldTOS        CP#10
+  Allocate             CP#17
   StoreLocal           r4
   Push                 r4
-  PushConstant         CP#12
-  StoreFieldTOS        CP#15
+  PushConstant         CP#0
+  StoreFieldTOS        CP#18
   Push                 r4
-  PushConstant         CP#12
-  StoreFieldTOS        CP#16
+  PushConstant         CP#0
+  StoreFieldTOS        CP#19
   Push                 r4
-  PushConstant         CP#7
-  StoreFieldTOS        CP#17
+  PushConstant         CP#11
+  StoreFieldTOS        CP#20
   Push                 r4
   Push                 r0
-  StoreFieldTOS        CP#8
+  StoreFieldTOS        CP#12
   PopLocal             r3
   Push                 r3
-  InstanceCall1        1, CP#18
+  InstanceCall1        1, CP#21
   Drop1
   Push                 r0
-  LoadFieldTOS         CP#6
-  PushConstant         CP#19
-  IndirectStaticCall   1, CP#0
+  LoadFieldTOS         CP#10
+  PushConstant         CP#22
+  IndirectStaticCall   1, CP#4
   Drop1
   Push                 r0
-  LoadFieldTOS         CP#4
+  LoadFieldTOS         CP#8
   PopLocal             r0
   Jump                 L2
 L1:
-  PushConstant         CP#12
+  PushConstant         CP#0
   ReturnTOS
 }
 ConstantPool {
-  [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'iterator', arg-desc CP#0
-  [2] = ICData target-name 'moveNext', arg-desc CP#0
-  [3] = Bool true
-  [4] = ContextOffset parent
-  [5] = ICData get target-name 'current', arg-desc CP#0
-  [6] = ContextOffset var [0]
-  [7] = ClosureFunction <anonymous closure> () → dart.core::Null;
-  [8] = FieldOffset dart.core::_Closure::_context
-  [9] = Int 1
-  [10] = ArgDesc num-args 2, num-type-args 0, names []
-  [11] = ICData target-name '+', arg-desc CP#10
-  [12] = Null
-  [13] = EndClosureFunctionScope
-  [14] = Class dart.core::_Closure
-  [15] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
-  [16] = FieldOffset dart.core::_Closure::_function_type_arguments
-  [17] = FieldOffset dart.core::_Closure::_function
-  [18] = ICData target-name 'call', arg-desc CP#0
-  [19] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [0] = Null
+  [1] = Type dart.core::List<dart.core::int>
+  [2] = String 'list'
+  [3] = SubtypeTestCache
+  [4] = ArgDesc num-args 1, num-type-args 0, names []
+  [5] = ICData get target-name 'iterator', arg-desc CP#4
+  [6] = ICData target-name 'moveNext', arg-desc CP#4
+  [7] = Bool true
+  [8] = ContextOffset parent
+  [9] = ICData get target-name 'current', arg-desc CP#4
+  [10] = ContextOffset var [0]
+  [11] = ClosureFunction <anonymous closure> () → dart.core::Null;
+  [12] = FieldOffset dart.core::_Closure::_context
+  [13] = Int 1
+  [14] = ArgDesc num-args 2, num-type-args 0, names []
+  [15] = ICData target-name '+', arg-desc CP#14
+  [16] = EndClosureFunctionScope
+  [17] = Class dart.core::_Closure
+  [18] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [19] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [20] = FieldOffset dart.core::_Closure::_function
+  [21] = ICData target-name 'call', arg-desc CP#4
+  [22] = StaticICData target 'dart.core::print', arg-desc CP#4
 }
-Closure CP#7 {
+Closure CP#11 {
   Entry                3
   CheckStack
   Push                 FP[-5]
-  LoadFieldTOS         CP#8
+  LoadFieldTOS         CP#12
   PopLocal             r0
   Push                 r0
   Push                 r0
-  LoadFieldTOS         CP#6
-  PushConstant         CP#9
-  InstanceCall1        2, CP#11
+  LoadFieldTOS         CP#10
+  PushConstant         CP#13
+  InstanceCall1        2, CP#15
   StoreLocal           r2
-  StoreFieldTOS        CP#6
+  StoreFieldTOS        CP#10
   Push                 r2
   Drop1
-  PushConstant         CP#12
+  PushConstant         CP#0
   ReturnTOS
 
 }
@@ -1140,24 +1170,24 @@
   Push                 r0
   PushConstant         CP#1
   StoreFieldTOS        CP#2
-  Allocate             CP#9
+  Allocate             CP#12
   StoreLocal           r3
   Push                 r3
-  PushConstant         CP#7
-  StoreFieldTOS        CP#10
+  PushConstant         CP#5
+  StoreFieldTOS        CP#13
   Push                 r3
-  PushConstant         CP#7
-  StoreFieldTOS        CP#11
+  PushConstant         CP#5
+  StoreFieldTOS        CP#14
   Push                 r3
   PushConstant         CP#3
-  StoreFieldTOS        CP#12
+  StoreFieldTOS        CP#15
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#4
   PopLocal             r2
   Push                 r2
-  PushConstant         CP#13
-  InstanceCall1        2, CP#14
+  PushConstant         CP#16
+  InstanceCall1        2, CP#17
   Drop1
   Push                 r0
   LoadFieldTOS         CP#2
@@ -1165,7 +1195,7 @@
   Push                 r0
   LoadFieldTOS         CP#0
   PopLocal             r0
-  PushConstant         CP#7
+  PushConstant         CP#5
   ReturnTOS
 }
 ConstantPool {
@@ -1174,16 +1204,19 @@
   [2] = ContextOffset var [0]
   [3] = ClosureFunction <anonymous closure> (dart.core::int y) → dart.core::Null;
   [4] = FieldOffset dart.core::_Closure::_context
-  [5] = ArgDesc num-args 2, num-type-args 0, names []
-  [6] = ICData target-name '+', arg-desc CP#5
-  [7] = Null
-  [8] = EndClosureFunctionScope
-  [9] = Class dart.core::_Closure
-  [10] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
-  [11] = FieldOffset dart.core::_Closure::_function_type_arguments
-  [12] = FieldOffset dart.core::_Closure::_function
-  [13] = Int 3
-  [14] = ICData target-name 'call', arg-desc CP#5
+  [5] = Null
+  [6] = Type dart.core::int
+  [7] = String 'y'
+  [8] = SubtypeTestCache
+  [9] = ArgDesc num-args 2, num-type-args 0, names []
+  [10] = ICData target-name '+', arg-desc CP#9
+  [11] = EndClosureFunctionScope
+  [12] = Class dart.core::_Closure
+  [13] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [14] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [15] = FieldOffset dart.core::_Closure::_function
+  [16] = Int 3
+  [17] = ICData target-name 'call', arg-desc CP#9
 }
 Closure CP#3 {
   Entry                3
@@ -1191,16 +1224,23 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#4
   PopLocal             r0
+  Push                 FP[-5]
+  PushConstant         CP#5
+  PushConstant         CP#5
+  PushConstant         CP#6
+  PushConstant         CP#7
+  AssertAssignable     1, CP#8
+  Drop1
   Push                 r0
   Push                 r0
   LoadFieldTOS         CP#2
   Push                 FP[-5]
-  InstanceCall1        2, CP#6
+  InstanceCall1        2, CP#10
   StoreLocal           r2
   StoreFieldTOS        CP#2
   Push                 r2
   Drop1
-  PushConstant         CP#7
+  PushConstant         CP#5
   ReturnTOS
 
 }
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart b/pkg/vm/testcases/bytecode/type_ops.dart
index 664dc6e..687d58f 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart
+++ b/pkg/vm/testcases/bytecode/type_ops.dart
@@ -21,6 +21,8 @@
 class D<P, Q> extends C<int, Q, P> {
   Map<P, Q> foo;
 
+  D(tt) : foo = tt;
+
   foo2(y) {
     if (y is A<P>) {
       print('21');
@@ -40,6 +42,22 @@
     }
     return (z as Map<T2, Q>).values;
   }
+
+  Map<P, Q> foo4(w) {
+    List<Map<P, Q>> list = [w];
+    return w;
+  }
+}
+
+List<Iterable> globalVar;
+
+void foo5(x) {
+  globalVar = x;
+}
+
+class E<P extends String> {
+  factory E() => null;
+  void foo6<T extends P, U extends List<T>>(Map<T, U> map) {}
 }
 
 main() {}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index 16f4aaf..eb5a775 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -66,25 +66,39 @@
     ;
 }
 class D<P extends core::Object = dynamic, Q extends core::Object = dynamic> extends self::C<core::int, self::D::Q, self::D::P> {
-  generic-covariant-impl field core::Map<self::D::P, self::D::Q> foo = null;
+  generic-covariant-impl field core::Map<self::D::P, self::D::Q> foo;
 [@vm.bytecode=
 Bytecode {
   Entry                0
   CheckStack
+  Push                 FP[-6]
   Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
   PushConstant         CP#1
-  IndirectStaticCall   1, CP#0
-  Drop1
   PushConstant         CP#2
+  PushConstant         CP#3
+  AssertAssignable     0, CP#4
+  StoreFieldTOS        CP#5
+  Push                 FP[-6]
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#6
+  Drop1
+  PushConstant         CP#1
   ReturnTOS
 }
 ConstantPool {
-  [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::C::', arg-desc CP#0
-  [2] = Null
+  [0] = TypeArgumentsFieldOffset #lib::D
+  [1] = Null
+  [2] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [3] = String ''
+  [4] = SubtypeTestCache
+  [5] = FieldOffset #lib::D::foo
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
+  [7] = StaticICData target '#lib::C::', arg-desc CP#6
 }
-]  synthetic constructor •() → void
-    : super self::C::•()
+]  constructor •(dynamic tt) → void
+    : self::D::foo = tt as{TypeError} core::Map<self::D::P, self::D::Q>, super self::C::•()
     ;
 [@vm.bytecode=
 Bytecode {
@@ -120,8 +134,14 @@
 L2:
   Push                 FP[-6]
   Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#13
+  PushConstant         CP#14
+  AssertAssignable     0, CP#15
   StoreLocal           r0
-  InstanceCall1        2, CP#14
+  InstanceCall1        2, CP#17
   Drop1
   Push                 r0
   Drop1
@@ -142,8 +162,11 @@
   [10] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#3
   [11] = String '22'
   [12] = StaticICData target 'dart.core::print', arg-desc CP#7
-  [13] = ArgDesc num-args 2, num-type-args 0, names []
-  [14] = ICData set target-name 'foo', arg-desc CP#13
+  [13] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [14] = String ''
+  [15] = SubtypeTestCache
+  [16] = ArgDesc num-args 2, num-type-args 0, names []
+  [17] = ICData set target-name 'foo', arg-desc CP#16
 }
 ]  method foo2(dynamic y) → dynamic {
     if(y is self::A<self::D::P>) {
@@ -223,7 +246,119 @@
     }
     return (z as core::Map<self::D::foo3::T2, self::D::Q>).{core::Map::values};
   }
+[@vm.bytecode=
+Bytecode {
+  Entry                2
+  CheckStack
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#1
+  InstantiateTypeArgumentsTOS 1, CP#2
+  StoreLocal           r1
+  Push                 r1
+  PushConstant         CP#3
+  CreateArrayTOS
+  StoreLocal           r1
+  Push                 r1
+  PushConstant         CP#4
+  Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#5
+  PushConstant         CP#6
+  AssertAssignable     0, CP#7
+  StoreIndexedTOS
+  PushConstant         CP#9
+  IndirectStaticCall   2, CP#8
+  PopLocal             r0
+  Push                 FP[-5]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#5
+  PushConstant         CP#6
+  AssertAssignable     0, CP#10
+  ReturnTOS
+  PushConstant         CP#1
+  ReturnTOS
 }
+ConstantPool {
+  [0] = TypeArgumentsFieldOffset #lib::D
+  [1] = Null
+  [2] = TypeArgs [dart.core::Map<#lib::D::P, #lib::D::Q>]
+  [3] = Int 1
+  [4] = Int 0
+  [5] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [6] = String ''
+  [7] = SubtypeTestCache
+  [8] = ArgDesc num-args 1, num-type-args 1, names []
+  [9] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#8
+  [10] = SubtypeTestCache
+}
+]  method foo4(dynamic w) → core::Map<self::D::P, self::D::Q> {
+    core::List<core::Map<self::D::P, self::D::Q>> list = <core::Map<self::D::P, self::D::Q>>[w as{TypeError} core::Map<self::D::P, self::D::Q>];
+    return w as{TypeError} core::Map<self::D::P, self::D::Q>;
+  }
+}
+class E<P extends core::String = core::String> extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]  static factory •<P extends core::String = dynamic>() → self::E<self::E::•::P>
+    return null;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  Push                 FP[-6]
+  LoadFieldTOS         CP#0
+  Push                 FP[-7]
+  PushConstant         CP#1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  AssertSubtype
+  PushConstant         CP#4
+  Push                 FP[-7]
+  PushConstant         CP#5
+  PushConstant         CP#6
+  PushConstant         CP#7
+  AssertSubtype
+  Push                 FP[-5]
+  PushConstant         CP#4
+  Push                 FP[-7]
+  PushConstant         CP#8
+  PushConstant         CP#9
+  AssertAssignable     0, CP#10
+  Drop1
+  PushConstant         CP#4
+  ReturnTOS
+}
+ConstantPool {
+  [0] = TypeArgumentsFieldOffset #lib::E
+  [1] = Type #lib::E::foo6::T
+  [2] = Type #lib::E::P
+  [3] = String 'T'
+  [4] = Null
+  [5] = Type #lib::E::foo6::U
+  [6] = Type dart.core::List<#lib::E::foo6::T>
+  [7] = String 'U'
+  [8] = Type dart.core::Map<#lib::E::foo6::T, #lib::E::foo6::U>
+  [9] = String 'map'
+  [10] = SubtypeTestCache
+}
+]  method foo6<generic-covariant-impl T extends self::E::P = self::E::P, U extends core::List<self::E::foo6::T> = core::List<self::E::P>>(core::Map<self::E::foo6::T, self::E::foo6::U> map) → void {}
+}
+static field core::List<core::Iterable<dynamic>> globalVar;
 [@vm.bytecode=
 Bytecode {
   Entry                0
@@ -290,6 +425,33 @@
 }
 [@vm.bytecode=
 Bytecode {
+  Entry                1
+  CheckStack
+  Push                 FP[-5]
+  PushConstant         CP#0
+  PushConstant         CP#0
+  PushConstant         CP#1
+  PushConstant         CP#2
+  AssertAssignable     0, CP#3
+  StoreLocal           r0
+  Push                 r0
+  StoreStaticTOS       CP#4
+  Drop1
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = Type dart.core::List<dart.core::Iterable<dynamic>>
+  [2] = String ''
+  [3] = SubtypeTestCache
+  [4] = Field #lib::globalVar
+}
+]static method foo5(dynamic x) → void {
+  self::globalVar = x as{TypeError} core::List<core::Iterable<dynamic>>;
+}
+[@vm.bytecode=
+Bytecode {
   Entry                0
   CheckStack
   PushConstant         CP#0
diff --git a/pkg/vm/tool/dart2 b/pkg/vm/tool/dart2
deleted file mode 100755
index a41cfc2..0000000
--- a/pkg/vm/tool/dart2
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-
-# Script for running JIT mode VM with Dart 2 pipeline: using Fasta in DFE
-# isolate and strong mode semantics.
-
-function follow_links() {
-  file="$1"
-  while [ -h "$file" ]; do
-    # On Mac OS, readlink -f doesn't work.
-    file="$(readlink "$file")"
-  done
-  echo "$file"
-}
-
-# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
-PROG_NAME="$(follow_links "$BASH_SOURCE")"
-
-# Handle the case where dart-sdk/bin has been symlinked to.
-CUR_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
-
-if [[ `uname` == 'Darwin' ]]; then
-  OUT_DIR="$CUR_DIR"/../../../xcodebuild/
-else
-  OUT_DIR="$CUR_DIR"/../../../out/
-fi
-
-export DART_CONFIGURATION=${DART_CONFIGURATION:-ReleaseX64}
-export DART_USE_SDK=${DART_USE_SDK:0}
-BUILD_DIR="$OUT_DIR$DART_CONFIGURATION"
-
-if [[ $DART_USE_SDK -eq 1 ]]; then
-  DART_BINARY="$BUILD_DIR"/dart-sdk/bin/dart
-  KERNEL_BINARIES_DIR="$BUILD_DIR"/dart-sdk/lib/_internal
-else
-  DART_BINARY="$BUILD_DIR"/dart
-  KERNEL_BINARIES_DIR="$BUILD_DIR"
-fi
-
-exec "$DART_BINARY"                                                            \
-     --preview_dart_2                                                          \
-     --strong                                                                  \
-     --reify-generic-functions                                                 \
-     "$@"
diff --git a/pkg/vm/tool/dart2.bat b/pkg/vm/tool/dart2.bat
deleted file mode 100644
index 5d82e33..0000000
--- a/pkg/vm/tool/dart2.bat
+++ /dev/null
@@ -1,38 +0,0 @@
-@echo off
-REM Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-REM for details. All rights reserved. Use of this source code is governed by a
-REM BSD-style license that can be found in the LICENSE file.
-
-REM Script for running JIT mode VM with Dart 2 pipeline: using Fasta in DFE
-REM isolate and strong mode semantics.
-
-set SCRIPTPATH=%~dp0
-
-REM Does the path have a trailing slash? If so, remove it.
-if %SCRIPTPATH:~-1%==\ set SCRIPTPATH=%SCRIPTPATH:~0,-1%
-
-set OUT_DIR=%SCRIPTPATH%/../../../out/
-
-REM Remove trailing spaces if line is not empty
-if not "%DART_CONFIGURATION%" == "" (
-  set DART_CONFIGURATION=%DART_CONFIGURATION: =%
-)
-if "%DART_CONFIGURATION%"=="" set DART_CONFIGURATION=ReleaseX64
-
-if "%DART_USE_SDK%"=="" set DART_USE_SDK=0
-set BUILD_DIR=%OUT_DIR%%DART_CONFIGURATION%
-
-if not "_%DART_VM_OPTIONS%_" == "__" (
-  set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% %DART_VM_OPTIONS%
-)
-
-if "%DART_USE_SDK%"=="1" (
-  set DART_BINARY=%BUILD_DIR%/dart-sdk/bin/dart
-  set KERNEL_BINARIES_DIR=%BUILD_DIR%/dart-sdk/lib/_internal
-) else (
-  set DART_BINARY=%BUILD_DIR%/dart
-  set KERNEL_BINARIES_DIR=%BUILD_DIR%
-)
-set KERNEL_SERVICE_SNAPSHOT=%BUILD_DIR%/gen/kernel-service.dart.snapshot
-
-"%DART_BINARY%" --preview_dart_2 --strong --reify-generic-functions %*
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 577560e..27506b0 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -8,6 +8,7 @@
 import("../../sdk/lib/cli/cli_sources.gni")
 import("../../utils/generate_entry_points_json.gni")
 import("../runtime_args.gni")
+import("../vm/heap/heap_sources.gni")
 import("../vm/compiler/compiler_sources.gni")
 import("../vm/vm_sources.gni")
 import("builtin_impl_sources.gni")
@@ -272,7 +273,6 @@
       ":generate_web_sql_cc_file",
     ]
     if (is_fuchsia) {
-      deps += [ "//zircon/public/lib/launchpad" ]
       public_deps = [
         "//zircon/public/lib/fdio",
       ]
@@ -348,9 +348,6 @@
              ":generate_cli_cc_file",
              ":generate_cli_patch_cc_file",
            ] + extra_deps
-    if (is_fuchsia) {
-      deps += [ "//zircon/public/lib/launchpad" ]
-    }
 
     sources = [
       # Include generated source files.
@@ -596,10 +593,7 @@
     deps += [ "//third_party/boringssl" ]
 
     if (is_fuchsia) {
-      deps += [
-        "//garnet/public/lib/netstack/c",
-        "//zircon/public/lib/launchpad",
-      ]
+      deps += [ "//garnet/public/lib/netstack/c" ]
       public_deps = [
         "//zircon/public/lib/fdio",
       ]
@@ -705,6 +699,14 @@
       "--target_os",
       current_os,
     ]
+    if (defined(invoker.size_symbol)) {
+      args += [
+        "--size_symbol_name",
+        invoker.size_symbol,
+        "--target_arch",
+        current_cpu,
+      ]
+    }
     if (invoker.executable) {
       args += [ "--executable" ]
     }
@@ -758,64 +760,37 @@
   executable = true
 }
 
-template("dill_to_cc") {
-  assert(defined(invoker.dill_file), "Need dill_file in $target_name.")
-  assert(defined(invoker.data_symbol), "Need data_symbol in $target_name.")
-  assert(defined(invoker.size_symbol), "Need size_symbol in $target_name.")
-  assert(defined(invoker.output), "Need output in $target_name.")
-
-  extra_deps = []
-  if (defined(invoker.deps)) {
-    extra_deps += invoker.deps
-  }
-
-  action(target_name) {
-    deps = extra_deps
-    script = "../tools/dill_to_data_cc.py"
-    inputs = [
-      "../tools/dill_to_data_cc.py",
-      invoker.dill_file,
-    ]
-    outputs = [
-      invoker.output,
-    ]
-    args = [
-      "--dill_file=" + rebase_path(invoker.dill_file),
-      "--data_symbol=" + invoker.data_symbol,
-      "--size_symbol=" + invoker.size_symbol,
-      "--output=" + rebase_path(invoker.output),
-    ]
-  }
-}
-
-dill_to_cc("kernel_service_dill_cc") {
+bin_to_assembly("kernel_service_dill_S") {
   deps = [
     "../../utils/kernel-service:kernel_service_dill",
   ]
-  dill_file = "$root_gen_dir/kernel_service.dill"
-  data_symbol = "kKernelServiceDill"
+  input = "$root_gen_dir/kernel_service.dill"
+  output = "$root_gen_dir/kernel_service.dill.S"
+  symbol = "kKernelServiceDill"
   size_symbol = "kKernelServiceDillSize"
-  output = "$root_gen_dir/kernel_service.dill.cc"
+  executable = false
 }
 
-dill_to_cc("platform_dill_cc") {
+bin_to_assembly("platform_dill_S") {
   deps = [
     "../vm:vm_legacy_platform",
   ]
-  dill_file = "$root_out_dir/vm_platform.dill"
-  data_symbol = "kPlatformDill"
+  input = "$root_out_dir/vm_platform.dill"
+  output = "$target_gen_dir/vm_platform.dill.S"
+  symbol = "kPlatformDill"
   size_symbol = "kPlatformDillSize"
-  output = "$target_gen_dir/vm_platform.dill.cc"
+  executable = false
 }
 
-dill_to_cc("platform_strong_dill_cc") {
+bin_to_assembly("platform_strong_dill_S") {
   deps = [
     "../vm:vm_platform",
   ]
-  dill_file = "$root_out_dir/vm_platform_strong.dill"
-  data_symbol = "kPlatformStrongDill"
+  input = "$root_out_dir/vm_platform_strong.dill"
+  output = "$target_gen_dir/vm_platform_strong.dill.S"
+  symbol = "kPlatformStrongDill"
   size_symbol = "kPlatformStrongDillSize"
-  output = "$target_gen_dir/vm_platform_strong.dill.cc"
+  executable = false
 }
 
 source_set("dart_snapshot_cc") {
@@ -835,14 +810,14 @@
 
 source_set("dart_kernel_platform_cc") {
   deps = [
-    ":kernel_service_dill_cc",
-    ":platform_dill_cc",
-    ":platform_strong_dill_cc",
+    ":kernel_service_dill_S",
+    ":platform_dill_S",
+    ":platform_strong_dill_S",
   ]
   sources = [
-    "$root_gen_dir/kernel_service.dill.cc",
-    "$target_gen_dir/vm_platform.dill.cc",
-    "$target_gen_dir/vm_platform_strong.dill.cc",
+    "$root_gen_dir/kernel_service.dill.S",
+    "$target_gen_dir/vm_platform.dill.S",
+    "$target_gen_dir/vm_platform_strong.dill.S",
   ]
 }
 
@@ -896,10 +871,6 @@
              "$dart_zlib_path",
            ] + extra_deps
 
-    if (is_fuchsia) {
-      deps += [ "//zircon/public/lib/launchpad" ]
-    }
-
     defines = extra_defines
     if (exclude_kernel_service) {
       defines += [ "EXCLUDE_CFE_AND_KERNEL_PLATFORM" ]
@@ -1156,6 +1127,7 @@
   # the tests here.
   vm_tests = rebase_path(vm_sources_tests, ".", "../vm")
   compiler_tests = rebase_path(compiler_sources_tests, ".", "../vm/compiler")
+  heap_tests = rebase_path(heap_sources_tests, ".", "../vm/heap")
 
   sources = [
               "builtin_nolib.cc",
@@ -1164,7 +1136,7 @@
               "run_vm_tests.cc",
               "snapshot_utils.cc",
               "snapshot_utils.h",
-            ] + builtin_impl_tests + vm_tests + compiler_tests
+            ] + builtin_impl_tests + vm_tests + compiler_tests + heap_tests
 
   if (!is_win) {
     ldflags = [ "-rdynamic" ]
diff --git a/runtime/bin/embedded_dart_io.cc b/runtime/bin/embedded_dart_io.cc
index d6ab7e2..f13233a 100644
--- a/runtime/bin/embedded_dart_io.cc
+++ b/runtime/bin/embedded_dart_io.cc
@@ -4,6 +4,7 @@
 
 #include "bin/embedded_dart_io.h"
 
+#include "bin/crypto.h"
 #include "bin/directory.h"
 #include "bin/eventhandler.h"
 #include "bin/platform.h"
@@ -40,5 +41,9 @@
   Process::GetRSSInformation(&(info->max_rss), &(info->current_rss));
 }
 
+bool GetEntropy(uint8_t* buffer, intptr_t length) {
+  return Crypto::GetRandomBytes(length, buffer);
+}
+
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/embedded_dart_io.h b/runtime/bin/embedded_dart_io.h
index 0133b85..2eb3f71 100644
--- a/runtime/bin/embedded_dart_io.h
+++ b/runtime/bin/embedded_dart_io.h
@@ -38,6 +38,11 @@
 // Set dart:io implementation specific fields of Dart_EmbedderInformation.
 void GetIOEmbedderInformation(Dart_EmbedderInformation* info);
 
+// Generates 'length' random bytes into 'buffer'. Returns true on success
+// and false on failure. This is appropriate to assign to
+// Dart_InitializeParams.entropy_source.
+bool GetEntropy(uint8_t* buffer, intptr_t length);
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/extensions_fuchsia.cc b/runtime/bin/extensions_fuchsia.cc
index db447a3..a177c4c 100644
--- a/runtime/bin/extensions_fuchsia.cc
+++ b/runtime/bin/extensions_fuchsia.cc
@@ -10,7 +10,6 @@
 #include <dlfcn.h>
 #include <fcntl.h>
 #include <lib/fdio/io.h>
-#include <launchpad/vmo.h>
 #include <zircon/dlfcn.h>
 
 #include "platform/assert.h"
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 1859422..76dec67 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -503,6 +503,7 @@
   }
 
   if (isolate == NULL) {
+    Log::PrintErr("%s\n", *error);
     delete isolate_data;
     return NULL;
   }
@@ -1302,7 +1303,7 @@
                                       application_kernel_buffer_size);
     // Since we saw a dill file, it means we have to turn on all the
     // preview_dart_2 options.
-    Options::SetPreviewDart2Options(&vm_options);
+    Options::SetDart2Options(&vm_options);
   }
 #endif
 
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 0282762..e162713 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -63,19 +63,17 @@
 CB_OPTIONS_LIST(CB_OPTION_DEFINITION)
 #undef CB_OPTION_DEFINITION
 
-void Options::SetPreviewDart2Options(CommandLineOptions* vm_options) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Options::dfe()->set_use_dfe();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  OPTION_FIELD(preview_dart_2) = true;
+void Options::SetDart2Options(CommandLineOptions* vm_options) {
   vm_options->AddArgument("--strong");
   vm_options->AddArgument("--reify-generic-functions");
   vm_options->AddArgument("--sync-async");
 }
 
-bool OPTION_FIELD(preview_dart_2) = false;
-DEFINE_BOOL_OPTION_CB(preview_dart_2,
-                      { Options::SetPreviewDart2Options(vm_options); });
+void Options::SetDart1Options(CommandLineOptions* vm_options) {
+  vm_options->AddArgument("--no-strong");
+  vm_options->AddArgument("--no-reify-generic-functions");
+  vm_options->AddArgument("--no-sync-async");
+}
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 DFE* Options::dfe_ = NULL;
@@ -338,6 +336,9 @@
   const char* kPrefix = "--";
   const intptr_t kPrefixLen = strlen(kPrefix);
 
+  // Set Dart 2 as the default option.
+  Options::SetDart2Options(vm_options);
+
   // Store the executable name.
   Platform::SetExecutableName(argv[0]);
 
@@ -381,6 +382,13 @@
     }
   }
 
+  if (Options::no_preview_dart_2()) {
+    Options::SetDart1Options(vm_options);
+  } else {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    Options::dfe()->set_use_dfe();
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+  }
   if (Options::deterministic()) {
     // Both an embedder and VM flag.
     vm_options->AddArgument("--deterministic");
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index b5e87d2..0592ffa 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -42,7 +42,8 @@
   V(trace_loading, trace_loading)                                              \
   V(short_socket_read, short_socket_read)                                      \
   V(short_socket_write, short_socket_write)                                    \
-  V(disable_exit, exit_disabled)
+  V(disable_exit, exit_disabled)                                               \
+  V(no_preview_dart_2, no_preview_dart_2)
 
 // Boolean flags that have a short form.
 #define SHORT_BOOL_OPTIONS_LIST(V)                                             \
@@ -107,8 +108,9 @@
   CB_OPTIONS_LIST(CB_OPTIONS_DECL)
 #undef CB_OPTIONS_DECL
 
-  static bool preview_dart_2() { return preview_dart_2_; }
-  static void SetPreviewDart2Options(CommandLineOptions* vm_options);
+  static bool preview_dart_2() { return !no_preview_dart_2(); }
+  static void SetDart2Options(CommandLineOptions* vm_options);
+  static void SetDart1Options(CommandLineOptions* vm_options);
 
   static dart::HashMap* environment() { return environment_; }
 
@@ -143,7 +145,6 @@
   ENUM_OPTIONS_LIST(ENUM_OPTION_DECL)
 #undef ENUM_OPTION_DECL
 
-  static bool preview_dart_2_;
   static dart::HashMap* environment_;
 
 // Frontend argument processing.
@@ -175,8 +176,6 @@
   ENUM_OPTIONS_LIST(ENUM_OPTION_FRIEND)
 #undef ENUM_OPTION_FRIEND
 
-  friend class OptionProcessor_preview_dart_2;
-
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(Options);
 };
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index fb52be3..615d32a 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -12,9 +12,8 @@
 #include <lib/fdio/io.h>
 #include <lib/fdio/namespace.h>
 #include <lib/fdio/private.h>
+#include <lib/fdio/spawn.h>
 #include <lib/fdio/util.h>
-#include <launchpad/launchpad.h>
-#include <launchpad/vmo.h>
 #include <poll.h>
 #include <pthread.h>
 #include <stdbool.h>
@@ -23,6 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <zircon/process.h>
+#include <zircon/processargs.h>
 #include <zircon/status.h>
 #include <zircon/syscalls.h>
 #include <zircon/syscalls/object.h>
@@ -548,7 +548,6 @@
       program_arguments_[i + 1] = arguments[i];
     }
     program_arguments_[arguments_length + 1] = NULL;
-    program_arguments_count_ = arguments_length + 1;
 
     program_environment_ = NULL;
     if (environment != NULL) {
@@ -585,27 +584,46 @@
     LOG_INFO("ProcessStarter: Start() set up exit_pipe_fds (%d, %d)\n",
              exit_pipe_fds[0], exit_pipe_fds[1]);
 
-    // Set up a launchpad.
-    launchpad_t* lp = NULL;
-    zx_status_t status = SetupLaunchpad(&lp);
+    NamespaceScope ns(namespc_, path_);
+    const int pathfd =
+        TEMP_FAILURE_RETRY(openat64(ns.fd(), ns.path(), O_RDONLY));
+    zx_handle_t vmo = ZX_HANDLE_INVALID;
+    zx_status_t status = fdio_get_vmo_clone(pathfd, &vmo);
+    VOID_TEMP_FAILURE_RETRY(close(pathfd));
     if (status != ZX_OK) {
       close(exit_pipe_fds[0]);
       close(exit_pipe_fds[1]);
+      *os_error_message_ = DartUtils::ScopedCopyCString(
+          "Failed to load executable for process start.");
       return status;
     }
-    ASSERT(lp != NULL);
 
-    // Launch it.
-    LOG_INFO("ProcessStarter: Start() Calling launchpad_start\n");
+    fdio_spawn_action_t actions[4];
+    memset(actions, 0, sizeof(actions));
+    AddPipe(0, &write_out_, &actions[0]);
+    AddPipe(1, &read_in_, &actions[1]);
+    AddPipe(2, &read_err_, &actions[2]);
+    actions[3] = {
+      .action = FDIO_SPAWN_ACTION_SET_NAME,
+      .name.data = program_arguments_[0],
+    };
+
+    // TODO(zra): Use the supplied working directory when fdio_spawn_vmo adds an
+    // API to set it.
+
+    LOG_INFO("ProcessStarter: Start() Calling fdio_spawn_vmo\n");
     zx_handle_t process = ZX_HANDLE_INVALID;
-    const char* errormsg = NULL;
-    status = launchpad_go(lp, &process, &errormsg);
-    lp = NULL;  // launchpad_go() calls launchpad_destroy() on the launchpad.
+    char err_msg[FDIO_SPAWN_ERR_MSG_MAX_LENGTH];
+    uint32_t flags = FDIO_SPAWN_CLONE_JOB | FDIO_SPAWN_CLONE_LDSVC |
+        FDIO_SPAWN_CLONE_NAMESPACE;
+    status = fdio_spawn_vmo(ZX_HANDLE_INVALID, flags, vmo, program_arguments_,
+                            program_environment_, 4, actions, &process, err_msg);
+
     if (status != ZX_OK) {
-      LOG_ERR("ProcessStarter: Start() launchpad_start failed\n");
+      LOG_ERR("ProcessStarter: Start() fdio_spawn_vmo failed\n");
       close(exit_pipe_fds[0]);
       close(exit_pipe_fds[1]);
-      ReportStartError(errormsg);
+      ReportStartError(err_msg);
       return status;
     }
 
@@ -652,39 +670,14 @@
     *os_error_message_ = message;
   }
 
-  zx_status_t SetupLaunchpad(launchpad_t** launchpad) {
-    // TODO(zra): Use the supplied working directory when launchpad adds an
-    // API to set it.
-    ASSERT(launchpad != NULL);
-    launchpad_t* lp = NULL;
-    launchpad_create(ZX_HANDLE_INVALID, program_arguments_[0], &lp);
-    launchpad_set_args(lp, program_arguments_count_, program_arguments_);
-    launchpad_set_environ(lp, program_environment_);
-    launchpad_clone(lp, LP_CLONE_FDIO_NAMESPACE);
-    launchpad_add_pipe(lp, &write_out_, 0);
-    launchpad_add_pipe(lp, &read_in_, 1);
-    launchpad_add_pipe(lp, &read_err_, 2);
-    launchpad_add_vdso_vmo(lp);
-
-    NamespaceScope ns(namespc_, path_);
-    const int pathfd =
-        TEMP_FAILURE_RETRY(openat64(ns.fd(), ns.path(), O_RDONLY));
-    launchpad_load_from_fd(lp, pathfd);
-    VOID_TEMP_FAILURE_RETRY(close(pathfd));
-
-    // If there were any errors, grab launchpad's error message and put it in
-    // the os_error_message_ field.
-    zx_status_t status = launchpad_get_status(lp);
-    if (status != ZX_OK) {
-      const intptr_t kMaxMessageSize = 256;
-      char* message = DartUtils::ScopedCString(kMaxMessageSize);
-      snprintf(message, kMaxMessageSize, "launchpad failed: %s, %s",
-               zx_status_get_string(status), launchpad_error_message(lp));
-      *os_error_message_ = message;
+  zx_status_t AddPipe(int target_fd, int* local_fd,
+                      fdio_spawn_action_t* action) {
+    zx_status_t status = fdio_pipe_half(&action->h.handle, &action->h.id);
+    if (status < 0)
       return status;
-    }
-
-    *launchpad = lp;
+    *local_fd = status;
+    action->action = FDIO_SPAWN_ACTION_ADD_HANDLE;
+    action->h.id = PA_HND(PA_HND_TYPE(action->h.id), target_fd);
     return ZX_OK;
   }
 
@@ -693,7 +686,6 @@
   int write_out_;  // Pipe for stdin to child process.
 
   char** program_arguments_;
-  intptr_t program_arguments_count_;
   char** program_environment_;
 
   Namespace* namespc_;
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 2b9f0d4..3f1c653 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -42,9 +42,7 @@
     OS::PrintErr("Integer_bitAndFromInteger %s & %s\n", right.ToCString(),
                  left.ToCString());
   }
-  const Integer& result = Integer::Handle(left.BitOp(Token::kBIT_AND, right));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left.BitOp(Token::kBIT_AND, right);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) {
@@ -56,9 +54,7 @@
     OS::PrintErr("Integer_bitOrFromInteger %s | %s\n", left.ToCString(),
                  right.ToCString());
   }
-  const Integer& result = Integer::Handle(left.BitOp(Token::kBIT_OR, right));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left.BitOp(Token::kBIT_OR, right);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) {
@@ -70,9 +66,7 @@
     OS::PrintErr("Integer_bitXorFromInteger %s ^ %s\n", left.ToCString(),
                  right.ToCString());
   }
-  const Integer& result = Integer::Handle(left.BitOp(Token::kBIT_XOR, right));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left.BitOp(Token::kBIT_XOR, right);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) {
@@ -84,10 +78,7 @@
     OS::PrintErr("Integer_addFromInteger %s + %s\n", left_int.ToCString(),
                  right_int.ToCString());
   }
-  const Integer& result =
-      Integer::Handle(left_int.ArithmeticOp(Token::kADD, right_int));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left_int.ArithmeticOp(Token::kADD, right_int);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) {
@@ -99,10 +90,7 @@
     OS::PrintErr("Integer_subFromInteger %s - %s\n", left_int.ToCString(),
                  right_int.ToCString());
   }
-  const Integer& result =
-      Integer::Handle(left_int.ArithmeticOp(Token::kSUB, right_int));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left_int.ArithmeticOp(Token::kSUB, right_int);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) {
@@ -114,10 +102,7 @@
     OS::PrintErr("Integer_mulFromInteger %s * %s\n", left_int.ToCString(),
                  right_int.ToCString());
   }
-  const Integer& result =
-      Integer::Handle(left_int.ArithmeticOp(Token::kMUL, right_int));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left_int.ArithmeticOp(Token::kMUL, right_int);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 2) {
@@ -126,10 +111,7 @@
   ASSERT(CheckInteger(right_int));
   ASSERT(CheckInteger(left_int));
   ASSERT(!right_int.IsZero());
-  const Integer& result =
-      Integer::Handle(left_int.ArithmeticOp(Token::kTRUNCDIV, right_int));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left_int.ArithmeticOp(Token::kTRUNCDIV, right_int);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) {
@@ -145,10 +127,7 @@
     // Should have been caught before calling into runtime.
     UNIMPLEMENTED();
   }
-  const Integer& result =
-      Integer::Handle(left_int.ArithmeticOp(Token::kMOD, right_int));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
+  return left_int.ArithmeticOp(Token::kMOD, right_int);
 }
 
 DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 2) {
@@ -232,28 +211,35 @@
 
 static RawInteger* ShiftOperationHelper(Token::Kind kind,
                                         const Integer& value,
-                                        const Smi& amount) {
-  if (amount.Value() < 0) {
+                                        const Integer& amount) {
+  if (amount.AsInt64Value() < 0) {
     Exceptions::ThrowArgumentError(amount);
   }
-  if (value.IsSmi()) {
-    const Smi& smi_value = Smi::Cast(value);
-    return smi_value.ShiftOp(kind, amount, Heap::kNew);
+  return value.ShiftOp(kind, amount, Heap::kNew);
+}
+
+DEFINE_NATIVE_ENTRY(Integer_shrFromInteger, 2) {
+  const Integer& amount = Integer::CheckedHandle(arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
+  ASSERT(CheckInteger(amount));
+  ASSERT(CheckInteger(value));
+  if (FLAG_trace_intrinsified_natives) {
+    OS::PrintErr("Integer_shrFromInteger: %s >> %s\n", value.ToCString(),
+                 amount.ToCString());
   }
-  ASSERT(value.IsMint());
-  const int64_t mint_value = value.AsInt64Value();
-  intptr_t shift_count = amount.Value();
-  switch (kind) {
-    case Token::kSHL:
-      return Integer::New(
-          Utils::ShiftLeftWithTruncation(mint_value, shift_count), Heap::kNew);
-    case Token::kSHR:
-      shift_count = Utils::Minimum(shift_count, Mint::kBits);
-      return Integer::New(mint_value >> shift_count, Heap::kNew);
-    default:
-      UNIMPLEMENTED();
-      return Integer::null();
+  return ShiftOperationHelper(Token::kSHR, value, amount);
+}
+
+DEFINE_NATIVE_ENTRY(Integer_shlFromInteger, 2) {
+  const Integer& amount = Integer::CheckedHandle(arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
+  ASSERT(CheckInteger(amount));
+  ASSERT(CheckInteger(value));
+  if (FLAG_trace_intrinsified_natives) {
+    OS::PrintErr("Integer_shlFromInteger: %s << %s\n", value.ToCString(),
+                 amount.ToCString());
   }
+  return ShiftOperationHelper(Token::kSHL, value, amount);
 }
 
 DEFINE_NATIVE_ENTRY(Smi_bitAndFromSmi, 2) {
@@ -268,32 +254,6 @@
   return Smi::New(left_value.Value() & right_value.Value());
 }
 
-DEFINE_NATIVE_ENTRY(Smi_shrFromInt, 2) {
-  const Smi& amount = Smi::CheckedHandle(arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
-  ASSERT(CheckInteger(amount));
-  ASSERT(CheckInteger(value));
-  const Integer& result =
-      Integer::Handle(ShiftOperationHelper(Token::kSHR, value, amount));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
-}
-
-DEFINE_NATIVE_ENTRY(Smi_shlFromInt, 2) {
-  const Smi& amount = Smi::CheckedHandle(arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
-  ASSERT(CheckInteger(amount));
-  ASSERT(CheckInteger(value));
-  if (FLAG_trace_intrinsified_natives) {
-    OS::PrintErr("Smi_shlFromInt: %s << %s\n", value.ToCString(),
-                 amount.ToCString());
-  }
-  const Integer& result =
-      Integer::Handle(ShiftOperationHelper(Token::kSHL, value, amount));
-  // A null result indicates that a bigint operation is required.
-  return result.IsNull() ? result.raw() : result.AsValidInteger();
-}
-
 DEFINE_NATIVE_ENTRY(Smi_bitNegate, 1) {
   const Smi& operand = Smi::CheckedHandle(arguments->NativeArgAt(0));
   if (FLAG_trace_intrinsified_natives) {
@@ -339,14 +299,4 @@
   return Smi::New(result);
 }
 
-DEFINE_NATIVE_ENTRY(Mint_shlFromInt, 2) {
-  // Use the preallocated out of memory exception to avoid calling
-  // into dart code or allocating any code.
-  const Instance& exception =
-      Instance::Handle(isolate->object_store()->out_of_memory());
-  Exceptions::Throw(thread, exception);
-  UNREACHABLE();
-  return 0;
-}
-
 }  // namespace dart
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index fe33e66..eb2d165 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -47,6 +47,8 @@
   int _bitAndFromInteger(int other) native "Integer_bitAndFromInteger";
   int _bitOrFromInteger(int other) native "Integer_bitOrFromInteger";
   int _bitXorFromInteger(int other) native "Integer_bitXorFromInteger";
+  int _shrFromInteger(int other) native "Integer_shrFromInteger";
+  int _shlFromInteger(int other) native "Integer_shlFromInteger";
   int _addFromInteger(int other) native "Integer_addFromInteger";
   int _subFromInteger(int other) native "Integer_subFromInteger";
   int _mulFromInteger(int other) native "Integer_mulFromInteger";
@@ -56,8 +58,8 @@
     return other - (other ~/ this) * this;
   }
 
-  int operator >>(int other) => other._shrFromInt(this);
-  int operator <<(int other) => other._shlFromInt(this);
+  int operator >>(int other) => other._shrFromInteger(this);
+  int operator <<(int other) => other._shlFromInteger(this);
 
   bool operator <(num other) {
     return other > this;
@@ -461,8 +463,6 @@
   int operator &(int other) => other._bitAndFromSmi(this);
 
   int _bitAndFromSmi(_Smi other) native "Smi_bitAndFromSmi";
-  int _shrFromInt(int other) native "Smi_shrFromInt";
-  int _shlFromInt(int other) native "Smi_shlFromInt";
 
   /**
    * The digits of '00', '01', ... '99' as a single array.
@@ -659,15 +659,4 @@
   int get bitLength native "Mint_bitLength";
 
   int _bitAndFromSmi(_Smi other) => _bitAndFromInteger(other);
-
-  // Shift by mint exceeds range that can be handled by the VM.
-  int _shrFromInt(int other) {
-    if (other < 0) {
-      return -1;
-    } else {
-      return 0;
-    }
-  }
-
-  int _shlFromInt(int other) native "Mint_shlFromInt";
 }
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index 9d2f62d..a871e7c 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -11,12 +11,12 @@
   const factory int.fromEnvironment(String name, {int defaultValue})
       native "Integer_fromEnvironment";
 
-  int _shrFromInt(int other);
-  int _shlFromInt(int other);
   int _bitAndFromSmi(_Smi other);
   int _bitAndFromInteger(int other);
   int _bitOrFromInteger(int other);
   int _bitXorFromInteger(int other);
+  int _shrFromInteger(int other);
+  int _shlFromInteger(int other);
 
   static int _tryParseSmi(String str, int first, int last) {
     assert(first <= last);
@@ -90,7 +90,7 @@
           if (index == end) {
             return _throwFormatException(onError, source, index, null);
           }
-          int result = _parseRadix(source, 16, index, end, sign);
+          int result = _parseRadix(source, 16, index, end, sign, sign > 0);
           if (result == null) {
             return _throwFormatException(onError, source, null, null);
           }
@@ -99,7 +99,7 @@
       }
       radix = 10;
     }
-    int result = _parseRadix(source, radix, start, end, sign);
+    int result = _parseRadix(source, radix, start, end, sign, false);
     if (result == null) {
       return _throwFormatException(onError, source, null, radix);
     }
@@ -131,7 +131,7 @@
   }
 
   static int _parseRadix(
-      String source, int radix, int start, int end, int sign) {
+      String source, int radix, int start, int end, int sign, bool allowU64) {
     int tableIndex = (radix - 2) * 4 + (is64Bit ? 2 : 0);
     int blockSize = _PARSE_LIMITS[tableIndex];
     int length = end - start;
@@ -174,7 +174,7 @@
           // platform, the multiplier and block size, which are used to
           // compute it, do.
           int X = is64Bit ? 1 : 0;
-          if (radix == 16 &&
+          if (allowU64 &&
               !(result >= _int64UnsignedOverflowLimits[X] &&
                   (result > _int64UnsignedOverflowLimits[X] ||
                       smi > _int64UnsignedSmiOverflowLimits[X])) &&
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index c3a6a6c..a9a0550 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -7,7 +7,7 @@
 #include "lib/invocation_mirror.h"
 #include "vm/code_patcher.h"
 #include "vm/exceptions.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
 #include "vm/stack_frame.h"
diff --git a/runtime/observatory/tests/service/eval_internal_class_test.dart b/runtime/observatory/tests/service/eval_internal_class_test.dart
index 0e7beb1..0abee5e 100644
--- a/runtime/observatory/tests/service/eval_internal_class_test.dart
+++ b/runtime/observatory/tests/service/eval_internal_class_test.dart
@@ -12,24 +12,38 @@
 
     Class classLibrary = await root.clazz.load();
     print(classLibrary);
-    dynamic result = await classLibrary.evaluate('3 + 4');
-    print(result);
-    expect(result is DartError, isTrue);
-    expect(result.message, contains('can be evaluated only'));
+    {
+      bool caughtExceptions = false;
+      try {
+        dynamic result = await classLibrary.evaluate('3 + 4');
+        print(result);
+      } on ServerRpcException catch (e) {
+        expect(e.toString(), contains('can be evaluated only'));
+        caughtExceptions = true;
+      }
+      expect(caughtExceptions, isTrue);
+    }
 
     Class classClass = await classLibrary.clazz.load();
     print(classClass);
-    result = await classClass.evaluate('3 + 4');
-    print(result);
-    expect(result is DartError, isTrue);
-    expect(result.message, contains('can be evaluated only'));
+    {
+      bool caughtExceptions = false;
+      try {
+        dynamic result = await classClass.evaluate('3 + 4');
+        print(result);
+      } on ServerRpcException catch (e) {
+        expect(e.toString(), contains('can be evaluated only'));
+        caughtExceptions = true;
+      }
+      expect(caughtExceptions, isTrue);
+    }
 
     Instance someArray = await root.evaluate("new List(2)");
     print(someArray);
     expect(someArray is Instance, isTrue);
     Class classArray = await someArray.clazz.load();
     print(classArray);
-    result = await classArray.evaluate('3 + 4');
+    dynamic result = await classArray.evaluate('3 + 4');
     print(result);
     expect(result is Instance, isTrue);
     expect(result.valueAsString, equals('7'));
diff --git a/runtime/observatory/tests/service/eval_test.dart b/runtime/observatory/tests/service/eval_test.dart
index 8a7ff74..a461a1d 100644
--- a/runtime/observatory/tests/service/eval_test.dart
+++ b/runtime/observatory/tests/service/eval_test.dart
@@ -57,22 +57,19 @@
     print(result);
     expect(result.valueAsString, equals('105'));
 
-    result = await lib.evaluate('globalVar + staticVar + 5');
-    expect(result.type, equals('Error'));
+    await expectError(() => lib.evaluate('globalVar + staticVar + 5'));
 
     result = await cls.evaluate('globalVar + staticVar + 5');
     print(result);
     expect(result.valueAsString, equals('1105'));
 
-    result = await cls.evaluate('this + 5');
-    expect(result.type, equals('Error'));
+    await expectError(() => cls.evaluate('this + 5'));
 
     result = await instance.evaluate('this + 5');
     print(result);
     expect(result.valueAsString, equals('10005'));
 
-    result = await instance.evaluate('this + frog');
-    expect(result.type, equals('Error'));
+    await expectError(() => instance.evaluate('this + frog'));
   },
   resumeIsolate,
   hasStoppedAtBreakpoint,
@@ -93,4 +90,19 @@
   }
 ];
 
+expectError(func) async {
+  bool gotException = false;
+  dynamic result;
+  try {
+    result = await func();
+    expect(result.type, equals('Error')); // dart1 semantics
+  } on ServerRpcException catch (e) {
+    expect(e.code, equals(ServerRpcException.kExpressionCompilationError));
+    gotException = true;
+  }
+  if (result?.type != 'Error') {
+    expect(gotException, true); // dart2 semantics
+  }
+}
+
 main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction);
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index aa06e10..63598af 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -16,8 +16,6 @@
 process_service_test: Pass, Fail # Issue 24344
 
 [ $compiler == app_jit ]
-async_step_out_test: RuntimeError # Issue 29158, Async debugging
-awaiter_async_stack_contents_test: RuntimeError # Issue 29158, Async debugging
 bad_reload_test: RuntimeError # Issue 27806
 complex_reload_test: RuntimeError # Issue 27806
 debugger_location_second_test: Skip # Issue 28180
@@ -30,8 +28,7 @@
 next_through_for_each_loop_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 next_through_implicit_call_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 pause_on_unhandled_async_exceptions2_test: Pass, RuntimeError, Timeout, Crash # Issue 29178
-regress_28980_test: RuntimeError # Issue 29158, Async debugging
-set_library_debuggable_test: RuntimeError # Issue 29158, Async debugging
+process_service_test: RuntimeError # Spawned process runs in Dart2 mode
 set_name_rpc_test: RuntimeError # Issue 27806
 step_through_constructor_calls_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
 step_through_function_test: RuntimeError # Snapshots don't include source and generated source is not 1-to-1. The column offsets are thus off.
@@ -81,16 +78,18 @@
 [ $mode == debug && ($arch == simarm || $arch == simarm64) ]
 *: SkipSlow
 
+[ $runtime == vm && ($compiler == app_jit || $compiler == none) ]
+coverage_leaf_function_test: RuntimeError
+coverage_optimized_function_test: RuntimeError
+get_object_rpc_test: RuntimeError # Spawned process runs in Dart2 mode
+get_source_report_test: RuntimeError # Spawned process runs in Dart2 mode
+
 [ !$strong && ($compiler == dartk || $compiler == dartkp) ]
 *: Skip
 
 [ ($compiler == none || $compiler == precompiler) && ($runtime == dart_precompiled || $runtime == vm) ]
-async_step_out_test: RuntimeError # Issue 29158, Async debugging
-awaiter_async_stack_contents_test: RuntimeError # Issue 29158, Async debugging
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
-regress_28980_test: RuntimeError # Issue 29158, Async debugging
-set_library_debuggable_test: RuntimeError # Issue 29158, Async debugging
 
 [ $arch != ia32 || $arch != x64 || $system != linux ]
 get_native_allocation_samples_test: Skip # Unsupported.
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index fd0455f..1786a6f 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -24,8 +24,6 @@
 causal_async_star_stack_contents_test: RuntimeError
 causal_async_star_stack_presence_test: RuntimeError
 complex_reload_test: RuntimeError
-coverage_leaf_function_test: RuntimeError
-coverage_optimized_function_test: RuntimeError
 debugger_inspect_test: Skip # Timeout
 debugger_location_second_test: RuntimeError
 debugger_location_test: RuntimeError
@@ -87,7 +85,6 @@
 pause_on_unhandled_async_exceptions2_test: RuntimeError
 pause_on_unhandled_async_exceptions_test: RuntimeError
 positive_token_pos_test: RuntimeError
-process_service_test: RuntimeError
 regress_28443_test: RuntimeError
 regress_28980_test: RuntimeError
 rewind_optimized_out_test: RuntimeError
@@ -231,8 +228,6 @@
 bad_reload_test: Skip # Times out on sim architectures, also RuntimeError.
 break_on_activation_test: RuntimeError # Issue #33087
 complex_reload_test: Skip # Times out on sim architectures, also RuntimeError.
-coverage_leaf_function_test: RuntimeError # Please triage.
-coverage_optimized_function_test: RuntimeError # Please triage.
 debugger_inspect_test: RuntimeError, Timeout # Issue #33087
 developer_service_get_isolate_id_test: RuntimeError # Issue #33087
 eval_internal_class_test: RuntimeError # Issue #33087
@@ -249,7 +244,6 @@
 get_instances_rpc_test: RuntimeError # Issue #33087
 get_object_rpc_test: RuntimeError # Please triage.
 get_retaining_path_rpc_test: RuntimeError # Issue #33087
-get_source_report_test: RuntimeError # Please triage.
 get_user_level_retaining_path_rpc_test: RuntimeError # Issue #33087
 instance_field_order_rpc_test: RuntimeError # Issue #33087
 pause_on_exceptions_test: RuntimeError, Timeout # Issue #33087
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index bf3dca8..15f0007 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -553,10 +553,9 @@
 
 bool isKernel() {
   for (String argument in Platform.executableArguments) {
-    if (argument.startsWith("--preview_dart_2") || argument.startsWith("--dfe"))
-      return true;
+    if (argument.startsWith("--no-preview_dart_2")) return false;
   }
-  return false;
+  return true;
 }
 
 E ifKernel<E>(E then, E otherwise) {
diff --git a/runtime/tests/vm/dart/slow_path_shared_stub_test.dart b/runtime/tests/vm/dart/slow_path_shared_stub_test.dart
new file mode 100644
index 0000000..87ce2ed
--- /dev/null
+++ b/runtime/tests/vm/dart/slow_path_shared_stub_test.dart
@@ -0,0 +1,83 @@
+// 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.
+
+// VMOptions=--optimization_counter_threshold=10 --no-background-compilation --shared-slow-path-triggers-gc
+
+// This tests the stackmaps and environments for safepoints corresponding to
+// slow-path code which uses shared runtime stubs.
+
+import 'package:expect/expect.dart';
+import 'dart:math';
+
+class C {
+  C talk(C _) => _;
+}
+
+int getPositiveNum() {
+  return (new DateTime.now()).millisecondsSinceEpoch;
+}
+
+C getC() {
+  if (getPositiveNum() == 0) {
+    return new C();
+  } else {
+    return null;
+  }
+}
+
+int global;
+
+int getNum() {
+  return global++;
+}
+
+test0(int k) {
+  var x = getC();
+  var y = getNum();
+  try {
+    y = getNum();
+    x = getC();
+    x.talk(x).talk(x);
+    y = getNum();
+  } catch (e) {
+    Expect.equals(x, null);
+    Expect.equals(y, k);
+  }
+}
+
+test1(int k) {
+  var x = getC();
+  var y = getNum();
+  double z = getPositiveNum().toDouble();
+  while (z > 1) {
+    z = sqrt(z - 0.1);
+  }
+  try {
+    y = getNum();
+    x = getC();
+    z = z.ceil().toDouble();
+    var k = z / 2;
+    x.talk(x).talk(x);
+    z = k / 2;
+    y = getNum();
+  } catch (e) {
+    Expect.equals(x, null);
+    Expect.equals(y, k);
+    Expect.equals(z, 1);
+  }
+}
+
+main() {
+  global = 1;
+
+  for (int i = 0; i < 100; ++i) {
+    test0(2 * (i + 1));
+  }
+
+  global = 1;
+
+  for (int i = 0; i < 100; ++i) {
+    test1(2 * (i + 1));
+  }
+}
diff --git a/runtime/tests/vm/dart/snapshot_version_test.dart b/runtime/tests/vm/dart/snapshot_version_test.dart
index 2dcde10..7034458 100644
--- a/runtime/tests/vm/dart/snapshot_version_test.dart
+++ b/runtime/tests/vm/dart/snapshot_version_test.dart
@@ -6,8 +6,10 @@
 import "package:expect/expect.dart";
 
 main() {
-  var result = Process.runSync(Platform.executable,
-      [Platform.script.resolve('./bad_snapshot').toFilePath()]);
+  var result = Process.runSync(Platform.executable, [
+    '--no-preview-dart-2',
+    Platform.script.resolve('./bad_snapshot').toFilePath()
+  ]);
   print("=== stdout ===\n ${result.stdout}");
   print("=== stderr ===\n ${result.stderr}");
   Expect.equals(253, result.exitCode);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d129fcb..d52b4c8 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -100,6 +100,7 @@
 
 [ $system == windows ]
 cc/CorelibCompilerStats: Skip
+cc/Profiler_ContextAllocation: Fail, Pass # Flaky on Windows --- sometimes give "profiler_test.cc: 1107: error: expected: !walker.Down()"
 cc/Service_Profile: Skip
 
 [ !$strong ]
@@ -148,6 +149,7 @@
 
 [ $compiler == dartk && $mode == debug && $runtime == vm ]
 cc/PrintJSON: Crash
+cc/Profiler_FunctionInline: Fail
 cc/Service_TokenStream: Crash
 
 # Enabling of dartk for sim{arm,arm64,dbc64} revelaed these test failures, which
@@ -205,7 +207,6 @@
 
 [ $compiler == dartk && $system == windows ]
 cc/IsolateReload_LibraryLookup: Fail, Crash
-cc/Profiler_ContextAllocation: Fail, Pass # Flaky on Windows --- sometimes give "profiler_test.cc: 1107: error: expected: !walker.Down()"
 cc/Profiler_FunctionTicks: Fail, Pass
 cc/Profiler_ToggleRecordAllocation: Fail, Pass
 cc/Profiler_TrivialRecordAllocation: Fail, Pass
diff --git a/runtime/tools/bin_to_assembly.py b/runtime/tools/bin_to_assembly.py
index 941a050..8bc5d8c 100755
--- a/runtime/tools/bin_to_assembly.py
+++ b/runtime/tools/bin_to_assembly.py
@@ -25,6 +25,10 @@
                     action="store_true", default=False)
   parser.add_option("--target_os",
                     action="store", type="string")
+  parser.add_option("--size_symbol_name",
+                    action="store", type="string")
+  parser.add_option("--target_arch",
+                    action="store", type="string")
 
   (options, args) = parser.parse_args()
   if not options.output:
@@ -78,18 +82,53 @@
       output_file.write(".balign 32\n")
       output_file.write("%s:\n" % options.symbol_name)
 
+    size = 0
     with open(options.input, "rb") as input_file:
       if options.target_os in ["win"]:
         for byte in input_file.read():
           output_file.write("byte %d\n" % ord(byte))
-        output_file.write("end\n")
+          size += 1
       else:
         for byte in input_file.read():
           output_file.write(".byte %d\n" % ord(byte))
+          size += 1
 
     if options.target_os not in ["mac", "ios", "win"]:
       output_file.write(".size {0}, .-{0}\n".format(options.symbol_name))
 
+    if options.size_symbol_name:
+      if not options.target_arch:
+        sys.stderr.write("--target_arch not specified\n")
+        parser.print_help();
+        return -1
+
+      is64bit = 0
+      if options.target_arch:
+        if options.target_arch in ["arm64", "x64"]:
+          is64bit = 1
+
+      if options.target_os in ["win"]:
+        output_file.write("public %s\n" % options.size_symbol_name)
+        output_file.write("%s label byte\n" % options.size_symbol_name)
+        if (is64bit == 1):
+          output_file.write("qword %d\n" % size )
+        else:
+          output_file.write("dword %d\n" % size )
+      else:
+        if options.target_os in ["mac", "ios"]:
+          output_file.write(".global _%s\n" % options.size_symbol_name)
+          output_file.write("_%s:\n" % options.size_symbol_name)
+        else:
+          output_file.write(".global %s\n" % options.size_symbol_name)
+          output_file.write("%s:\n" % options.size_symbol_name)
+        if (is64bit == 1):
+          output_file.write(".quad %d\n" % size )
+        else:
+          output_file.write(".long %d\n" % size )
+
+    if options.target_os in ["win"]:
+      output_file.write("end\n")
+
   return 0
 
 if __name__ == "__main__":
diff --git a/runtime/tools/dill_to_data_cc.py b/runtime/tools/dill_to_data_cc.py
deleted file mode 100755
index b3b1211..0000000
--- a/runtime/tools/dill_to_data_cc.py
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-# Script to create a cc file with uint8 array of bytes corresponding to the
-# content of given a dill file.
-
-import optparse
-import sys
-
-# Option => Help mapping.
-OPTION_MAP = {
-  'dill_file': 'Path to the input dill file.',
-  'data_symbol': 'The C name for the data array.',
-  'size_symbol': 'The C name for the data size variable.',
-  'output': 'Path to the generated cc file.',
-}
-
-
-def BuildOptionParser():
-  parser = optparse.OptionParser()
-  for opt, help_text in OPTION_MAP.iteritems():
-    parser.add_option('--%s' % opt, type='string', help=help_text)
-  return parser
-
-
-def ValidateOptions(options):
-  for opt in OPTION_MAP.keys():
-    if getattr(options, opt) is None:
-      sys.stderr.write('--%s option not specified.\n' % opt)
-      return False
-  return True
-
-
-def WriteData(input_filename, data_symbol, output_file):
-  output_file.write('uint8_t %s[] = {\n' % data_symbol)
-  with open(input_filename, 'rb') as f:
-    first = True
-    size = 0
-    for byte in f.read():
-      if first:
-        output_file.write('  %d' % ord(byte))
-        first = False
-      else:
-        output_file.write(',\n  %d' % ord(byte))
-      size += 1
-  output_file.write('\n};\n')
-  return size
-
-
-def WriteSize(size_symbol, size, output_file):
-  output_file.write('intptr_t %s = %d;\n' % (size_symbol, size))
-
-
-def Main():
-  opt_parser = BuildOptionParser()
-  (options, args) = opt_parser.parse_args()
-  if not ValidateOptions(options):
-    opt_parser.print_help()
-    return 1
-  if args:
-    sys.stderr.write('Unknown args: "%s"\n' % str(args))
-    parser.print_help()
-    return 1
-
-  with open(options.output, 'w') as output_file:
-    output_file.write('#include <stdint.h>\n')
-    output_file.write('extern "C" {\n')
-    size = WriteData(options.dill_file, options.data_symbol, output_file)
-    WriteSize(options.size_symbol, size, output_file)
-    output_file.write("}")
-
-
-if __name__ == '__main__':
-  sys.exit(Main())
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index a3f1640..33bd09d 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -33,6 +33,7 @@
 import("../configs.gni")
 import("../runtime_args.gni")
 import("compiler/compiler_sources.gni")
+import("heap/heap_sources.gni")
 import("vm_sources.gni")
 
 config("libdart_vm_config") {
@@ -75,7 +76,8 @@
                                   "*_test.cc",
                                   "*_test.h",
                                 ])
-  sources = vm_sources + rebase_path(compiler_sources, ".", "./compiler/")
+  sources = vm_sources + rebase_path(compiler_sources, ".", "./compiler/") +
+            rebase_path(heap_sources, ".", "./heap/")
   include_dirs = [ ".." ]
 }
 
diff --git a/runtime/vm/ast_printer_test.cc b/runtime/vm/ast_printer_test.cc
index 7f73a8d..4385f84 100644
--- a/runtime/vm/ast_printer_test.cc
+++ b/runtime/vm/ast_printer_test.cc
@@ -4,10 +4,8 @@
 
 #include "vm/ast_printer.h"
 #include "platform/assert.h"
-#include "vm/heap.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
-#include "vm/object_store.h"
 #include "vm/unit_test.h"
 
 namespace dart {
diff --git a/runtime/vm/ast_test.cc b/runtime/vm/ast_test.cc
index 302c1d9..b1a062e 100644
--- a/runtime/vm/ast_test.cc
+++ b/runtime/vm/ast_test.cc
@@ -4,10 +4,8 @@
 
 #include "vm/ast.h"
 #include "platform/assert.h"
-#include "vm/heap.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
-#include "vm/object_store.h"
 #include "vm/unit_test.h"
 
 namespace dart {
diff --git a/runtime/vm/benchmark_test.h b/runtime/vm/benchmark_test.h
index 58f4eee..eb08041 100644
--- a/runtime/vm/benchmark_test.h
+++ b/runtime/vm/benchmark_test.h
@@ -9,7 +9,6 @@
 
 #include "vm/dart.h"
 #include "vm/globals.h"
-#include "vm/heap.h"
 #include "vm/isolate.h"
 #include "vm/malloc_hooks.h"
 #include "vm/object.h"
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index cdbb56d..30360b7 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -43,6 +43,8 @@
   V(Integer_equalToInteger, 2)                                                 \
   V(Integer_fromEnvironment, 3)                                                \
   V(Integer_parse, 1)                                                          \
+  V(Integer_shlFromInteger, 2)                                                 \
+  V(Integer_shrFromInteger, 2)                                                 \
   V(Bool_fromEnvironment, 3)                                                   \
   V(CapabilityImpl_factory, 1)                                                 \
   V(CapabilityImpl_equals, 2)                                                  \
@@ -55,13 +57,10 @@
   V(SendPortImpl_get_hashcode, 1)                                              \
   V(SendPortImpl_sendInternal_, 2)                                             \
   V(Smi_bitAndFromSmi, 2)                                                      \
-  V(Smi_shlFromInt, 2)                                                         \
-  V(Smi_shrFromInt, 2)                                                         \
   V(Smi_bitNegate, 1)                                                          \
   V(Smi_bitLength, 1)                                                          \
   V(Mint_bitNegate, 1)                                                         \
   V(Mint_bitLength, 1)                                                         \
-  V(Mint_shlFromInt, 2)                                                        \
   V(Developer_debugger, 2)                                                     \
   V(Developer_getIsolateIDFromSendPort, 1)                                     \
   V(Developer_getServerInfo, 1)                                                \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 5ae8029..5bdfcb8 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -7,7 +7,7 @@
 #include "vm/compiler/jit/compiler.h"
 #include "vm/flags.h"
 #include "vm/hash_table.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/kernel_loader.h"
 #include "vm/log.h"
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index c07f14a..f0434a3 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -6,9 +6,8 @@
 
 #include "platform/atomic.h"
 #include "vm/flags.h"
-#include "vm/freelist.h"
 #include "vm/growable_array.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
 #include "vm/visitor.h"
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 378b2e6..de660dd 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -8,7 +8,7 @@
 #include "vm/bootstrap.h"
 #include "vm/compiler/backend/code_statistics.h"
 #include "vm/dart.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/image_snapshot.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 1e2da8c..7c64239 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -12,7 +12,7 @@
 #include "vm/globals.h"
 #include "vm/growable_array.h"
 #include "vm/hash_map.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/object.h"
 #include "vm/snapshot.h"
 #include "vm/type_testing_stubs.h"
diff --git a/runtime/vm/compiler/assembler/assembler.cc b/runtime/vm/compiler/assembler/assembler.cc
index c2dc4e7..7b7a2ff 100644
--- a/runtime/vm/compiler/assembler/assembler.cc
+++ b/runtime/vm/compiler/assembler/assembler.cc
@@ -8,7 +8,7 @@
 
 #include "platform/utils.h"
 #include "vm/cpu.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/memory_region.h"
 #include "vm/os.h"
 #include "vm/zone.h"
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 10b2c61..1916d62 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -698,6 +698,8 @@
   void BranchLink(const Code& code, Patchability patchable);
   void BranchLinkToRuntime();
 
+  void CallNullErrorShared(bool save_fpu_registers) { UNREACHABLE(); }
+
   // Branch and link to an entry address. Call sequence can be patched.
   void BranchLinkPatchable(const StubEntry& stub_entry);
   void BranchLinkPatchable(const Code& code);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 368e4a3..ba5897e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -255,8 +255,7 @@
         return kUnsignedWord;
       case kTypedDataInt64ArrayCid:
       case kTypedDataUint64ArrayCid:
-        UNREACHABLE();
-        return kByte;
+        return kDWord;
       case kTypedDataFloat32ArrayCid:
         return kSWord;
       case kTypedDataFloat64ArrayCid:
@@ -1380,6 +1379,8 @@
   void BranchLinkPatchable(const StubEntry& stub_entry);
   void BranchLinkToRuntime();
 
+  void CallNullErrorShared(bool save_fpu_registers) { UNREACHABLE(); }
+
   // Emit a call that shares its object pool entries with other calls
   // that have the same equivalence marker.
   void BranchLinkWithEquivalence(const StubEntry& stub_entry,
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index ae69a35..692d9c8 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -7,7 +7,7 @@
 
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/cpu.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/instructions.h"
 #include "vm/memory_region.h"
 #include "vm/runtime_entry.h"
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index 24783cb..6694a85 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -644,6 +644,8 @@
   void Call(const StubEntry& stub_entry, bool movable_target = false);
   void CallToRuntime();
 
+  void CallNullErrorShared(bool save_fpu_registers) { UNREACHABLE(); }
+
   void Jmp(const StubEntry& stub_entry);
   void J(Condition condition, const StubEntry& stub_entry);
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 7bcd4a0..76f051f 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -8,7 +8,7 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/backend/locations.h"
 #include "vm/cpu.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/instructions.h"
 #include "vm/memory_region.h"
 #include "vm/runtime_entry.h"
@@ -100,6 +100,14 @@
   call(TMP);
 }
 
+void Assembler::CallNullErrorShared(bool save_fpu_registers) {
+  uword entry_point_offset =
+      save_fpu_registers
+          ? Thread::null_error_shared_with_fpu_regs_entry_point_offset()
+          : Thread::null_error_shared_without_fpu_regs_entry_point_offset();
+  call(Address(THR, entry_point_offset));
+}
+
 void Assembler::pushq(Register reg) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitRegisterREX(reg, REX_NONE);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 569a962..df75109 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -695,6 +695,9 @@
   void CallPatchable(const StubEntry& stub_entry);
   void Call(const StubEntry& stub_entry);
   void CallToRuntime();
+
+  void CallNullErrorShared(bool save_fpu_registers);
+
   // Emit a call that shares its object pool entries with other calls
   // that have the same equivalence marker.
   void CallWithEquivalence(const StubEntry& stub_entry,
@@ -758,6 +761,8 @@
   void LeaveCallRuntimeFrame();
 
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
+  void CallRuntimeSavingRegisters(const RuntimeEntry& entry,
+                                  intptr_t argument_count);
 
   // Call runtime function. Reserves shadow space on the stack before calling
   // if platform ABI requires that. Does not restore RSP after the call itself.
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index a25530c..6e7089e 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -11,7 +11,7 @@
 
 #include "platform/utils.h"
 #include "vm/allocation.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/instructions.h"
 #include "vm/os.h"
 #include "vm/stack_frame.h"
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 9716e1c..90112c2 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -6,6 +6,7 @@
 
 #include "vm/compiler/backend/flow_graph_compiler.h"
 
+#include "platform/utils.h"
 #include "vm/bit_vector.h"
 #include "vm/compiler/backend/code_statistics.h"
 #include "vm/compiler/backend/il_printer.h"
@@ -681,7 +682,8 @@
 // See StackFrame::VisitObjectPointers for the details of how stack map is
 // interpreted.
 void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs,
-                                        intptr_t slow_path_argument_count) {
+                                        intptr_t slow_path_argument_count,
+                                        Environment* env) {
   if (is_optimizing() || locs->live_registers()->HasUntaggedValues()) {
     const intptr_t spill_area_size =
         is_optimizing() ? flow_graph_.graph_entry()->spill_slot_count() : 0;
@@ -689,9 +691,20 @@
     RegisterSet* registers = locs->live_registers();
     ASSERT(registers != NULL);
     const intptr_t kFpuRegisterSpillFactor = kFpuRegisterSize / kWordSize;
-    const intptr_t live_registers_size =
-        registers->CpuRegisterCount() +
-        (registers->FpuRegisterCount() * kFpuRegisterSpillFactor);
+    intptr_t saved_registers_size = 0;
+    const bool using_shared_stub = locs->call_on_shared_slow_path();
+    if (using_shared_stub) {
+      saved_registers_size =
+          Utils::CountOneBitsWord(kDartAvailableCpuRegs) +
+          (registers->FpuRegisterCount() > 0
+               ? kFpuRegisterSpillFactor * kNumberOfFpuRegisters
+               : 0) +
+          1 /*saved PC*/;
+    } else {
+      saved_registers_size =
+          registers->CpuRegisterCount() +
+          (registers->FpuRegisterCount() * kFpuRegisterSpillFactor);
+    }
 
     BitmapBuilder* bitmap = locs->stack_bitmap();
 
@@ -706,19 +719,22 @@
 // append the live registers to it again. The bitmap produced by both calls
 // will be the same.
 #if !defined(TARGET_ARCH_DBC)
-    ASSERT(bitmap->Length() <= (spill_area_size + live_registers_size));
+    ASSERT(bitmap->Length() <= (spill_area_size + saved_registers_size));
     bitmap->SetLength(spill_area_size);
 #else
-    if (bitmap->Length() <= (spill_area_size + live_registers_size)) {
+    ASSERT(slow_path_argument_count == 0);
+    if (bitmap->Length() <= (spill_area_size + saved_registers_size)) {
       bitmap->SetLength(Utils::Maximum(bitmap->Length(), spill_area_size));
     }
 #endif
 
+    ASSERT(slow_path_argument_count == 0 || !using_shared_stub);
+
     // Mark the bits in the stack map in the same order we push registers in
     // slow path code (see FlowGraphCompiler::SaveLiveRegisters).
     //
     // Slow path code can have registers at the safepoint.
-    if (!locs->always_calls()) {
+    if (!locs->always_calls() && !using_shared_stub) {
       RegisterSet* regs = locs->live_registers();
       if (regs->FpuRegisterCount() > 0) {
         // Denote FPU registers with 0 bits in the stackmap.  Based on the
@@ -737,6 +753,7 @@
           }
         }
       }
+
       // General purpose registers have the highest register number at the
       // highest address (i.e., first in the stackmap).
       for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; --i) {
@@ -747,7 +764,27 @@
       }
     }
 
-    // Arguments pushed on top of live registers in the slow path are tagged.
+    if (using_shared_stub) {
+      // To simplify the code in the shared stub, we create an untagged hole
+      // in the stack frame where the shared stub can leave the return address
+      // before saving registers.
+      bitmap->Set(bitmap->Length(), false);
+      if (registers->FpuRegisterCount() > 0) {
+        bitmap->SetRange(bitmap->Length(),
+                         bitmap->Length() +
+                             kNumberOfFpuRegisters * kFpuRegisterSpillFactor -
+                             1,
+                         false);
+      }
+      for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; --i) {
+        if ((kReservedCpuRegisters & (1 << i)) != 0) continue;
+        const Register reg = static_cast<Register>(i);
+        bitmap->Set(bitmap->Length(),
+                    locs->live_registers()->ContainsRegister(reg));
+      }
+    }
+
+    // Arguments pushed after live registers in the slow path are tagged.
     for (intptr_t i = 0; i < slow_path_argument_count; ++i) {
       bitmap->Set(bitmap->Length(), true);
     }
@@ -767,7 +804,16 @@
 //     MaterializeObjectInstr::RemapRegisters
 //
 Environment* FlowGraphCompiler::SlowPathEnvironmentFor(
-    Instruction* instruction) {
+    Instruction* instruction,
+    intptr_t num_slow_path_args) {
+  const bool using_shared_stub =
+      instruction->locs()->call_on_shared_slow_path();
+  const bool shared_stub_save_fpu_registers =
+      using_shared_stub &&
+      instruction->locs()->live_registers()->FpuRegisterCount() > 0;
+  // TODO(sjindel): Modify logic below to account for slow-path args with shared
+  // stubs.
+  ASSERT(!using_shared_stub || num_slow_path_args == 0);
   if (instruction->env() == NULL) {
     ASSERT(!is_optimizing());
     return NULL;
@@ -777,6 +823,10 @@
   // 1. Iterate the registers in the order they will be spilled to compute
   //    the slots they will be spilled to.
   intptr_t next_slot = StackSize() + env->CountArgsPushed();
+  if (using_shared_stub) {
+    // The PC from the call to the shared stub is pushed here.
+    next_slot++;
+  }
   RegisterSet* regs = instruction->locs()->live_registers();
   intptr_t fpu_reg_slots[kNumberOfFpuRegisters];
   intptr_t cpu_reg_slots[kNumberOfCpuRegisters];
@@ -790,16 +840,21 @@
       next_slot += kFpuRegisterSpillFactor;
       fpu_reg_slots[i] = (next_slot - 1);
     } else {
+      if (using_shared_stub && shared_stub_save_fpu_registers) {
+        next_slot += kFpuRegisterSpillFactor;
+      }
       fpu_reg_slots[i] = -1;
     }
   }
   // General purpose registers are spilled from highest to lowest register
   // number.
   for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; --i) {
+    if ((kReservedCpuRegisters & (1 << i)) != 0) continue;
     Register reg = static_cast<Register>(i);
     if (regs->ContainsRegister(reg)) {
       cpu_reg_slots[i] = next_slot++;
     } else {
+      if (using_shared_stub) next_slot++;
       cpu_reg_slots[i] = -1;
     }
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index f31d130..8e05c21 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -583,8 +583,10 @@
                     TokenPosition token_pos,
                     intptr_t null_check_name_idx);
 
+  // 'environment' is required if 'using_shared_stub'.
   void RecordSafepoint(LocationSummary* locs,
-                       intptr_t slow_path_argument_count = 0);
+                       intptr_t slow_path_argument_count = 0,
+                       Environment* env = NULL);
 
   Label* AddDeoptStub(intptr_t deopt_id,
                       ICData::DeoptReasonId reason,
@@ -626,7 +628,8 @@
   void ClobberDeadTempRegisters(LocationSummary* locs);
 #endif
 
-  Environment* SlowPathEnvironmentFor(Instruction* instruction);
+  Environment* SlowPathEnvironmentFor(Instruction* instruction,
+                                      intptr_t num_slow_path_args);
 
   intptr_t CurrentTryIndex() const {
     if (current_block_ == NULL) {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 9890b36..ca1dcbf 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -1900,7 +1900,7 @@
     case Token::kTRUNCDIV:
     case Token::kMOD:
       // Check right value for zero.
-      if (right.IsSmi() && right.AsInt64Value() == 0) {
+      if (right.AsInt64Value() == 0) {
         break;  // Will throw.
       }
     // Fall through.
@@ -1912,9 +1912,8 @@
     }
     case Token::kSHL:
     case Token::kSHR:
-      if (left.IsSmi() && right.IsSmi() && (Smi::Cast(right).Value() >= 0)) {
-        result =
-            Smi::Cast(left).ShiftOp(op_kind(), Smi::Cast(right), Heap::kOld);
+      if (right.AsInt64Value() >= 0) {
+        result = left.ShiftOp(op_kind(), right, Heap::kOld);
       }
       break;
     case Token::kBIT_AND:
@@ -3980,24 +3979,42 @@
 
   virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
 
+  virtual void EmitSharedStubCall(Assembler* assembler,
+                                  bool save_fpu_registers) {
+    UNREACHABLE();
+  }
+
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
       __ Comment("slow path %s operation", name());
     }
+    bool use_shared_stub =
+        instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
+    bool live_fpu_registers =
+        instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
+    ASSERT(!use_shared_stub || num_args_ == 0);
     __ Bind(entry_label());
     LocationSummary* locs = instruction()->locs();
     // Save registers as they are needed for lazy deopt / exception handling.
-    compiler->SaveLiveRegisters(locs);
+    if (!use_shared_stub) {
+      compiler->SaveLiveRegisters(locs);
+    }
     for (intptr_t i = 0; i < num_args_; ++i) {
       __ PushRegister(locs->in(i).reg());
     }
-    __ CallRuntime(runtime_entry_, num_args_);
+    if (use_shared_stub) {
+      EmitSharedStubCall(compiler->assembler(), live_fpu_registers);
+    } else {
+      __ CallRuntime(runtime_entry_, num_args_);
+    }
     compiler->AddDescriptor(
         RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
         instruction()->deopt_id(), instruction()->token_pos(), try_index_);
     AddMetadataForRuntimeCall(compiler);
-    compiler->RecordSafepoint(locs, num_args_);
-    Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+    ASSERT(instruction()->env() != nullptr);
+    compiler->RecordSafepoint(locs, num_args_, instruction()->env());
+    Environment* env =
+        compiler->SlowPathEnvironmentFor(instruction(), num_args_);
     compiler->EmitCatchEntryState(env, try_index_);
     __ Breakpoint();
   }
@@ -4042,7 +4059,9 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+      zone, kNumInputs, kNumTemps,
+      UseSharedSlowPathStub(opt) ? LocationSummary::kCallOnSharedSlowPath
+                                 : LocationSummary::kCallOnSlowPath);
   locs->set_in(0, Location::RequiresRegister());
   return locs;
 }
@@ -4059,6 +4078,11 @@
 
   const char* name() override { return "check null"; }
 
+  void EmitSharedStubCall(Assembler* assembler,
+                          bool save_fpu_registers) override {
+    assembler->CallNullErrorShared(save_fpu_registers);
+  }
+
   void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) override {
     const String& function_name = instruction()->AsCheckNull()->function_name();
     const intptr_t name_index =
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 3ce1bb1..bcafcbd 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -1007,6 +1007,8 @@
 
   void Unsupported(FlowGraphCompiler* compiler);
 
+  virtual bool UseSharedSlowPathStub(bool is_optimizing) const { return false; }
+
  protected:
   // GetDeoptId and/or CopyDeoptIdFrom.
   friend class CallSiteInliner;
@@ -6902,6 +6904,15 @@
   virtual TokenPosition token_pos() const { return token_pos_; }
   const String& function_name() const { return function_name_; }
 
+  bool UseSharedSlowPathStub(bool is_optimizing) const {
+#if defined(TARGET_ARCH_X64)
+    return FLAG_enable_slow_path_sharing && FLAG_precompiled_mode &&
+           is_optimizing;
+#else
+    return false;
+#endif
+  }
+
   DECLARE_INSTRUCTION(CheckNull)
 
   // CheckNull can implicitly call Dart code (NoSuchMethodError constructor),
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 269f1b4..42daf66 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -2934,6 +2934,8 @@
 class CheckStackOverflowSlowPath
     : public TemplateSlowPathCode<CheckStackOverflowInstr> {
  public:
+  static constexpr intptr_t kNumSlowPathArgs = 0;
+
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
       : TemplateSlowPathCode(instruction) {}
 
@@ -2951,11 +2953,12 @@
     // pending_deoptimization_env_ is needed to generate a runtime call that
     // may throw an exception.
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
-    Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+    Environment* env =
+        compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
     compiler->pending_deoptimization_env_ = env;
     compiler->GenerateRuntimeCall(
         instruction()->token_pos(), instruction()->deopt_id(),
-        kStackOverflowRuntimeEntry, 0, instruction()->locs());
+        kStackOverflowRuntimeEntry, kNumSlowPathArgs, instruction()->locs());
 
     if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
@@ -3100,6 +3103,8 @@
   CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
       : TemplateSlowPathCode(instruction), try_index_(try_index) {}
 
+  static constexpr intptr_t kNumSlowPathArgs = 2;
+
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
       __ Comment("slow path smi operation");
@@ -3111,7 +3116,8 @@
 
     compiler->SaveLiveRegisters(locs);
     if (instruction()->env() != NULL) {
-      Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+      Environment* env =
+          compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
       compiler->pending_deoptimization_env_ = env;
     }
     __ Push(locs->in(0).reg());
@@ -3122,8 +3128,7 @@
         Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_,
-        /* slow_path_argument_count = */ 2);
+        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, Operand(R0));
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -3230,6 +3235,8 @@
 class CheckedSmiComparisonSlowPath
     : public TemplateSlowPathCode<CheckedSmiComparisonInstr> {
  public:
+  static constexpr intptr_t kNumSlowPathArgs = 2;
+
   CheckedSmiComparisonSlowPath(CheckedSmiComparisonInstr* instruction,
                                intptr_t try_index,
                                BranchLabels labels,
@@ -3250,7 +3257,8 @@
 
     compiler->SaveLiveRegisters(locs);
     if (instruction()->env() != NULL) {
-      Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+      Environment* env =
+          compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
       compiler->pending_deoptimization_env_ = env;
     }
     __ Push(locs->in(0).reg());
@@ -3261,8 +3269,7 @@
         Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_,
-        /* slow_path_argument_count = */ 2);
+        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, Operand(R0));
     compiler->RestoreLiveRegisters(locs);
     compiler->pending_deoptimization_env_ = NULL;
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index d8bbde3..983914d 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1047,6 +1047,7 @@
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
     case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
@@ -1200,7 +1201,8 @@
   }
 
   if (representation() == kUnboxedInt64) {
-    ASSERT(class_id() == kTypedDataInt64ArrayCid);
+    ASSERT(class_id() == kTypedDataInt64ArrayCid ||
+           class_id() == kTypedDataUint64ArrayCid);
     Register result = locs()->out(0).reg();
     if (aligned()) {
       __ ldr(result, element_address, kDoubleWord);
@@ -1336,6 +1338,7 @@
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
     case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
@@ -1380,6 +1383,8 @@
     case kTypedDataUint16ArrayCid:
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       locs->set_in(2, Location::RequiresRegister());
       break;
     case kTypedDataFloat32ArrayCid:
@@ -1508,6 +1513,16 @@
       }
       break;
     }
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid: {
+      const Register value = locs()->in(2).reg();
+      if (aligned()) {
+        __ str(value, element_address, kDoubleWord);
+      } else {
+        __ StoreUnaligned(value, address, scratch, kDoubleWord);
+      }
+      break;
+    }
     case kTypedDataFloat32ArrayCid: {
       const VRegister value_reg = locs()->in(2).fpu_reg();
       if (aligned()) {
@@ -2681,6 +2696,8 @@
 class CheckStackOverflowSlowPath
     : public TemplateSlowPathCode<CheckStackOverflowInstr> {
  public:
+  static constexpr intptr_t kNumSlowPathArgs = 0;
+
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
       : TemplateSlowPathCode(instruction) {}
 
@@ -2698,11 +2715,12 @@
     // pending_deoptimization_env_ is needed to generate a runtime call that
     // may throw an exception.
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
-    Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+    Environment* env =
+        compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
     compiler->pending_deoptimization_env_ = env;
     compiler->GenerateRuntimeCall(
         instruction()->token_pos(), instruction()->deopt_id(),
-        kStackOverflowRuntimeEntry, 0, instruction()->locs());
+        kStackOverflowRuntimeEntry, kNumSlowPathArgs, instruction()->locs());
 
     if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
@@ -2851,6 +2869,8 @@
 
 class CheckedSmiSlowPath : public TemplateSlowPathCode<CheckedSmiOpInstr> {
  public:
+  static constexpr intptr_t kNumSlowPathArgs = 2;
+
   CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
       : TemplateSlowPathCode(instruction), try_index_(try_index) {}
 
@@ -2865,7 +2885,8 @@
 
     compiler->SaveLiveRegisters(locs);
     if (instruction()->env() != NULL) {
-      Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+      Environment* env =
+          compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
       compiler->pending_deoptimization_env_ = env;
     }
     __ Push(locs->in(0).reg());
@@ -2876,8 +2897,7 @@
         Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_,
-        /* slow_path_argument_count = */ 2);
+        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, R0);
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -2986,6 +3006,8 @@
 class CheckedSmiComparisonSlowPath
     : public TemplateSlowPathCode<CheckedSmiComparisonInstr> {
  public:
+  static constexpr intptr_t kNumSlowPathArgs = 2;
+
   CheckedSmiComparisonSlowPath(CheckedSmiComparisonInstr* instruction,
                                intptr_t try_index,
                                BranchLabels labels,
@@ -3006,7 +3028,8 @@
 
     compiler->SaveLiveRegisters(locs);
     if (instruction()->env() != NULL) {
-      Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+      Environment* env =
+          compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
       compiler->pending_deoptimization_env_ = env;
     }
     __ Push(locs->in(0).reg());
@@ -3017,8 +3040,7 @@
         Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_,
-        /* slow_path_argument_count = */ 2);
+        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, R0);
     compiler->RestoreLiveRegisters(locs);
     compiler->pending_deoptimization_env_ = NULL;
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index e400614..97e7ac1 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -2537,7 +2537,8 @@
     // pending_deoptimization_env_ is needed to generate a runtime call that
     // may throw an exception.
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
-    Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+    Environment* env = compiler->SlowPathEnvironmentFor(
+        instruction(), /*num_slow_path_args=*/0);
     compiler->pending_deoptimization_env_ = env;
     compiler->GenerateRuntimeCall(
         instruction()->token_pos(), instruction()->deopt_id(),
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 2d410db..f66d347 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1093,8 +1093,8 @@
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
       return CompileType::FromCid(kSmiCid);
-
     case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       return CompileType::Int();
 
     default:
@@ -1124,6 +1124,7 @@
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
     case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
@@ -1229,7 +1230,8 @@
   }
 
   if (representation() == kUnboxedInt64) {
-    ASSERT(class_id() == kTypedDataInt64ArrayCid);
+    ASSERT(class_id() == kTypedDataInt64ArrayCid ||
+           class_id() == kTypedDataUint64ArrayCid);
     if ((index_scale() == 1) && index.IsRegister()) {
       __ SmiUntag(index.reg());
     }
@@ -1361,6 +1363,7 @@
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
     case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
@@ -1421,6 +1424,7 @@
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
     case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       locs->set_in(2, Location::RequiresRegister());
       break;
     case kTypedDataFloat32ArrayCid:
@@ -1525,7 +1529,8 @@
       __ movl(element_address, value);
       break;
     }
-    case kTypedDataInt64ArrayCid: {
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid: {
       Register value = locs()->in(2).reg();
       __ movq(element_address, value);
       break;
@@ -2612,6 +2617,8 @@
 class CheckStackOverflowSlowPath
     : public TemplateSlowPathCode<CheckStackOverflowInstr> {
  public:
+  static constexpr intptr_t kNumSlowPathArgs = 0;
+
   explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
       : TemplateSlowPathCode(instruction) {}
 
@@ -2628,11 +2635,12 @@
     // pending_deoptimization_env_ is needed to generate a runtime call that
     // may throw an exception.
     ASSERT(compiler->pending_deoptimization_env_ == NULL);
-    Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+    Environment* env =
+        compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
     compiler->pending_deoptimization_env_ = env;
     compiler->GenerateRuntimeCall(
         instruction()->token_pos(), instruction()->deopt_id(),
-        kStackOverflowRuntimeEntry, 0, instruction()->locs());
+        kStackOverflowRuntimeEntry, kNumSlowPathArgs, instruction()->locs());
 
     if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
         instruction()->in_loop()) {
@@ -2798,6 +2806,8 @@
   CheckedSmiSlowPath(CheckedSmiOpInstr* instruction, intptr_t try_index)
       : TemplateSlowPathCode(instruction), try_index_(try_index) {}
 
+  static constexpr intptr_t kNumSlowPathArgs = 2;
+
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     if (Assembler::EmittingComments()) {
       __ Comment("slow path smi operation");
@@ -2809,7 +2819,8 @@
 
     compiler->SaveLiveRegisters(locs);
     if (instruction()->env() != NULL) {
-      Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+      Environment* env =
+          compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
       compiler->pending_deoptimization_env_ = env;
     }
     __ pushq(locs->in(0).reg());
@@ -2820,8 +2831,7 @@
         Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_,
-        /* slow_path_argument_count = */ 2);
+        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ MoveRegister(result, RAX);
     compiler->RestoreLiveRegisters(locs);
     __ jmp(exit_label());
@@ -2954,6 +2964,8 @@
 class CheckedSmiComparisonSlowPath
     : public TemplateSlowPathCode<CheckedSmiComparisonInstr> {
  public:
+  static constexpr intptr_t kNumSlowPathArgs = 2;
+
   CheckedSmiComparisonSlowPath(CheckedSmiComparisonInstr* instruction,
                                intptr_t try_index,
                                BranchLabels labels,
@@ -2974,7 +2986,8 @@
 
     compiler->SaveLiveRegisters(locs);
     if (instruction()->env() != NULL) {
-      Environment* env = compiler->SlowPathEnvironmentFor(instruction());
+      Environment* env =
+          compiler->SlowPathEnvironmentFor(instruction(), kNumSlowPathArgs);
       compiler->pending_deoptimization_env_ = env;
     }
     __ pushq(locs->in(0).reg());
@@ -2985,8 +2998,7 @@
         Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_,
-        /* slow_path_argument_count = */ 2);
+        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ MoveRegister(result, RAX);
     compiler->RestoreLiveRegisters(locs);
     compiler->pending_deoptimization_env_ = NULL;
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 65f2d38..4ef1a33 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -3104,6 +3104,7 @@
     }
     // Replace all uses of this definition with the result.
     if (call->HasUses()) {
+      ASSERT(last->IsDefinition());
       call->ReplaceUsesWith(last->AsDefinition());
     }
     // Finally insert the sequence other definition in place of this one in the
@@ -3359,17 +3360,19 @@
                               can_speculate);
     case MethodRecognizer::kInt32ArrayGetIndexed:
     case MethodRecognizer::kUint32ArrayGetIndexed:
-      if (!CanUnboxInt32()) return false;
+      if (!CanUnboxInt32()) {
+        return false;
+      }
       return InlineGetIndexed(flow_graph, kind, call, receiver, entry, last,
                               can_speculate);
-
     case MethodRecognizer::kInt64ArrayGetIndexed:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
       return InlineGetIndexed(flow_graph, kind, call, receiver, entry, last,
                               can_speculate);
-
+    case MethodRecognizer::kUint64ArrayGetIndexed:
+      break;  // TODO(ajcbik): do this too?
     default:
       break;
   }
@@ -3416,6 +3419,8 @@
       }
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, /* value_check = */ NULL, entry, last);
+    case MethodRecognizer::kUint64ArraySetIndexed:
+      return false;  // TODO(ajcbik): do this too?
     case MethodRecognizer::kFloat32ArraySetIndexed:
     case MethodRecognizer::kFloat64ArraySetIndexed: {
       if (!CanUnboxDouble()) {
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index ec6ab97..2d66b54 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -516,6 +516,17 @@
     ASSERT(kNumberOfFpuRegisters <= (kWordSize * kBitsPerByte));
   }
 
+  void AddAllNonReservedRegisters() {
+    for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
+      Add(Location::FpuRegisterLocation(static_cast<FpuRegister>(i)));
+    }
+
+    for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; --i) {
+      if (kReservedCpuRegisters & (1 << i)) continue;
+      Add(Location::RegisterLocation(static_cast<Register>(i)));
+    }
+  }
+
   void Add(Location loc, Representation rep = kTagged) {
     if (loc.IsRegister()) {
       cpu_registers_.Add(loc.reg());
@@ -610,8 +621,10 @@
   enum ContainsCall {
     kNoCall,  // Used registers must be reserved as tmp.
     kCall,    // Registers have been saved and can be used without reservation.
-    kCallCalleeSafe,  // Registers will be saved by the callee.
-    kCallOnSlowPath   // Used registers must be reserved as tmp.
+    kCallCalleeSafe,       // Registers will be saved by the callee.
+    kCallOnSlowPath,       // Used registers must be reserved as tmp.
+    kCallOnSharedSlowPath  // Registers used to invoke shared stub must be
+                           // reserved as tmp.
   };
 
   LocationSummary(Zone* zone,
@@ -702,6 +715,10 @@
 
   bool HasCallOnSlowPath() { return can_call() && !always_calls(); }
 
+  bool call_on_shared_slow_path() const {
+    return contains_call_ == kCallOnSharedSlowPath;
+  }
+
   void PrintTo(BufferFormatter* f) const;
 
   static LocationSummary* Make(Zone* zone,
diff --git a/runtime/vm/compiler/cha.cc b/runtime/vm/compiler/cha.cc
index 32a5146..5a2fcdd 100644
--- a/runtime/vm/compiler/cha.cc
+++ b/runtime/vm/compiler/cha.cc
@@ -7,7 +7,6 @@
 #include "vm/compiler/cha.h"
 #include "vm/class_table.h"
 #include "vm/flags.h"
-#include "vm/freelist.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
 #include "vm/visitor.h"
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index d950842..6ab263e 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -19,7 +19,7 @@
 #include "vm/compiler/jit/compiler.h"
 #include "vm/exceptions.h"
 #include "vm/flags.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 68ac2f7..c440292 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -998,6 +998,7 @@
     kClosureFunction,
     kEndClosureFunctionScope,
     kNativeEntry,
+    kSubtypeTestCache,
   };
 
   enum InvocationKind {
@@ -1100,7 +1101,7 @@
           }
           field = H.LookupFieldByKernelField(target);
           cls = field.Owner();
-          elem = cls.LookupStaticFunction(name);
+          elem = cls.LookupFunctionAllowPrivate(name);
         } else {
           if ((kind == InvocationKind::method) && H.IsGetter(target)) {
             UNIMPLEMENTED();  // TODO(regis): Revisit.
@@ -1340,6 +1341,9 @@
         name = H.DartString(builder_->ReadStringReference()).raw();
         obj = NativeEntry(function, name);
       } break;
+      case ConstantPoolTag::kSubtypeTestCache: {
+        obj = SubtypeTestCache::New();
+      } break;
       default:
         UNREACHABLE();
     }
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index 2e28b70..7547302 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -54,6 +54,22 @@
     }
     return false;
   }
+  switch (function.recognized_kind()) {
+    case MethodRecognizer::kInt64ArrayGetIndexed:
+    case MethodRecognizer::kInt64ArraySetIndexed:
+    case MethodRecognizer::kUint64ArrayGetIndexed:
+    case MethodRecognizer::kUint64ArraySetIndexed:
+      // TODO(ajcbik): consider 32-bit as well.
+      if (kBitsPerWord == 64 && FlowGraphCompiler::SupportsUnboxedInt64()) {
+        break;
+      }
+      if (FLAG_trace_intrinsifier) {
+        THR_Print("No, 64-bit int intrinsic on 32-bit platform.\n");
+      }
+      return false;
+    default:
+      break;
+  }
   if (FLAG_trace_intrinsifier) {
     THR_Print("Yes.\n");
   }
@@ -523,6 +539,11 @@
     case kTypedDataUint16ArrayCid:
       // Nothing to do.
       break;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      result = builder.AddDefinition(
+          BoxInstr::Create(kUnboxedInt64, new Value(result)));
+      break;
     default:
       UNREACHABLE();
       break;
@@ -572,6 +593,12 @@
       value = builder.AddUnboxInstr(kUnboxedUint32, new Value(value),
                                     /* is_checked = */ false);
       break;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      value = builder.AddUnboxInstr(kUnboxedInt64, new Value(value),
+                                    /* is_checked = */ false);
+      break;
+
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
@@ -660,6 +687,8 @@
 DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(Uint16Array)
 DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(Int32Array)
 DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(Uint32Array)
+DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(Int64Array)
+DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(Uint64Array)
 
 #undef DEFINE_ARRAY_GETTER_SETTER_INTRINSICS
 #undef DEFINE_ARRAY_GETTER_INTRINSIC
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index 7505d2d..ecc20f6 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -97,6 +97,10 @@
     case kInt64ArraySetIndexed:
       return kTypedDataInt64ArrayCid;
 
+    case kUint64ArrayGetIndexed:
+    case kUint64ArraySetIndexed:
+      return kTypedDataUint64ArrayCid;
+
     case kFloat32x4ArrayGetIndexed:
     case kFloat32x4ArraySetIndexed:
       return kTypedDataFloat32x4ArrayCid;
diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h
index bb61216..a29f9b4 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -118,8 +118,6 @@
   V(_Int32x4, withFlagY, Int32x4WithFlagY, Int32x4, 0x6485a9c4)                \
   V(_Int32x4, withFlagZ, Int32x4WithFlagZ, Int32x4, 0x267acdfa)                \
   V(_Int32x4, withFlagW, Int32x4WithFlagW, Int32x4, 0x345ac675)                \
-  V(_Int64List, [], Int64ArrayGetIndexed, Dynamic, 0x51eafb97)                 \
-  V(_Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x376181fb)                \
   V(_HashVMBase, get:_index, LinkedHashMap_getIndex, TypedDataUint32Array,     \
       0x02477157)                                                              \
   V(_HashVMBase, set:_index, LinkedHashMap_setIndex, Dynamic, 0x4fc8d5e0)      \
@@ -231,8 +229,8 @@
   V(_IntegerImplementation, <, Integer_lessThan, Bool, 0x365d1eba)             \
   V(_IntegerImplementation, <=, Integer_lessEqualThan, Bool, 0x74b5eb64)       \
   V(_IntegerImplementation, >=, Integer_greaterEqualThan, Bool, 0x4260c184)    \
-  V(_IntegerImplementation, <<, Integer_shl, Dynamic, 0x4db3bf69)              \
-  V(_IntegerImplementation, >>, Integer_sar, Dynamic, 0x70172b76)              \
+  V(_IntegerImplementation, <<, Integer_shl, Dynamic, 0x371c45fa)              \
+  V(_IntegerImplementation, >>, Integer_sar, Dynamic, 0x2b630578)              \
   V(_Double, toInt, DoubleToInteger, Dynamic, 0x26ef344b)                      \
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
@@ -299,6 +297,10 @@
   V(_Int32List, []=, Int32ArraySetIndexed, Dynamic, 0x1adf9823)                \
   V(_Uint32List, [], Uint32ArrayGetIndexed, Dynamic, 0x188658ce)               \
   V(_Uint32List, []=, Uint32ArraySetIndexed, Dynamic, 0x01f51a79)              \
+  V(_Int64List, [], Int64ArrayGetIndexed, Dynamic, 0x51eafb97)                 \
+  V(_Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x376181fb)                \
+  V(_Uint64List, [], Uint64ArrayGetIndexed, Dynamic, 0x4b2a1ba2)               \
+  V(_Uint64List, []=, Uint64ArraySetIndexed, Dynamic, 0x5f881bd4)              \
   V(_Float64List, [], Float64ArrayGetIndexed, Double, 0x0a714486)              \
   V(_Float64List, []=, Float64ArraySetIndexed, Dynamic, 0x04937367)            \
   V(_Float32List, [], Float32ArrayGetIndexed, Double, 0x5ade301f)              \
@@ -495,8 +497,8 @@
   V(_IntegerImplementation, <, Integer_lessThan, 0x365d1eba)                   \
   V(_IntegerImplementation, <=, Integer_lessEqualThan, 0x74b5eb64)             \
   V(_IntegerImplementation, >=, Integer_greaterEqualThan, 0x4260c184)          \
-  V(_IntegerImplementation, <<, Integer_shl, 0x4db3bf69)                       \
-  V(_IntegerImplementation, >>, Integer_sar, 0x70172b76)                       \
+  V(_IntegerImplementation, <<, Integer_shl, 0x371c45fa)                       \
+  V(_IntegerImplementation, >>, Integer_sar, 0x2b630578)                       \
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index c73e135..8eb3586 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -7,9 +7,9 @@
 #include "vm/class_finalizer.h"
 #include "vm/code_patcher.h"
 #include "vm/dart_api_impl.h"
+#include "vm/heap/safepoint.h"
 #include "vm/kernel_isolate.h"
 #include "vm/object.h"
-#include "vm/safepoint.h"
 #include "vm/symbols.h"
 #include "vm/thread_pool.h"
 #include "vm/unit_test.h"
@@ -208,11 +208,13 @@
     TestCase::LoadTestScript("", NULL);
   }
   Library& lib = Library::Handle(Library::CoreLibrary());
-
   const String& expression = String::Handle(
       String::New("(){ return (){ return (){ return 3 + 4; }(); }(); }()"));
   Object& val = Object::Handle();
-  val = lib.Evaluate(expression, Array::empty_array(), Array::empty_array());
+  val = Api::UnwrapHandle(
+      TestCase::EvaluateExpression(lib, expression,
+                                   /* param_names= */ Array::empty_array(),
+                                   /* param_values= */ Array::empty_array()));
 
   EXPECT(!val.IsNull());
   EXPECT(!val.IsError());
@@ -226,12 +228,13 @@
     TestCase::LoadTestScript("", NULL);
   }
   Library& lib = Library::Handle(Library::CoreLibrary());
-
   const String& expression = String::Handle(String::New("3 + 4"));
   Object& val = Object::Handle();
+  val = Api::UnwrapHandle(
+      TestCase::EvaluateExpression(lib, expression,
+                                   /* param_names= */ Array::empty_array(),
+                                   /* param_values= */ Array::empty_array()));
 
-  // Run once to ensure everything we touch is compiled.
-  val = lib.Evaluate(expression, Array::empty_array(), Array::empty_array());
   EXPECT(!val.IsNull());
   EXPECT(!val.IsError());
   EXPECT(val.IsInteger());
@@ -240,7 +243,10 @@
   intptr_t initial_class_table_size =
       Isolate::Current()->class_table()->NumCids();
 
-  val = lib.Evaluate(expression, Array::empty_array(), Array::empty_array());
+  val = Api::UnwrapHandle(
+      TestCase::EvaluateExpression(lib, expression,
+                                   /* param_names= */ Array::empty_array(),
+                                   /* param_values= */ Array::empty_array()));
   EXPECT(!val.IsNull());
   EXPECT(!val.IsError());
   EXPECT(val.IsInteger());
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 3032fcf..0038c40 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -119,6 +119,7 @@
 
 typedef uint32_t RegList;
 const RegList kAllCpuRegistersList = 0xFFFF;
+const RegList kAllFpuRegistersList = 0xFFFF;
 
 const RegList kReservedCpuRegisters =
     (1 << SPREG) | (1 << FPREG) | (1 << TMP) | (1 << PP) | (1 << THR);
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index 052f5ed..240bd2d 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -10,7 +10,7 @@
 
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/cpuinfo.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/simulator.h"
diff --git a/runtime/vm/cpu_ia32.cc b/runtime/vm/cpu_ia32.cc
index 475f01c..b6d21f2 100644
--- a/runtime/vm/cpu_ia32.cc
+++ b/runtime/vm/cpu_ia32.cc
@@ -11,7 +11,7 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/constants_ia32.h"
 #include "vm/cpuinfo.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 
diff --git a/runtime/vm/cpu_x64.cc b/runtime/vm/cpu_x64.cc
index 55b9754..33c04b0 100644
--- a/runtime/vm/cpu_x64.cc
+++ b/runtime/vm/cpu_x64.cc
@@ -11,7 +11,7 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/constants_x64.h"
 #include "vm/cpuinfo.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 06adc84..afedf3b 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -4,7 +4,6 @@
 
 #include "vm/dart.h"
 
-#include "vm/become.h"
 #include "vm/clustered_snapshot.h"
 #include "vm/code_observers.h"
 #include "vm/cpu.h"
@@ -12,9 +11,11 @@
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
 #include "vm/flags.h"
-#include "vm/freelist.h"
 #include "vm/handles.h"
-#include "vm/heap.h"
+#include "vm/heap/become.h"
+#include "vm/heap/freelist.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/store_buffer.h"
 #include "vm/isolate.h"
 #include "vm/kernel_isolate.h"
 #include "vm/malloc_hooks.h"
@@ -28,7 +29,6 @@
 #include "vm/service_isolate.h"
 #include "vm/simulator.h"
 #include "vm/snapshot.h"
-#include "vm/store_buffer.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
 #include "vm/thread_interrupter.h"
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 3109abd..ebee057 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -24,6 +24,7 @@
 #include "vm/exceptions.h"
 #include "vm/flags.h"
 #include "vm/growable_array.h"
+#include "vm/heap/verifier.h"
 #include "vm/image_snapshot.h"
 #include "vm/isolate_reload.h"
 #include "vm/kernel_isolate.h"
@@ -50,7 +51,6 @@
 #include "vm/timer.h"
 #include "vm/unicode.h"
 #include "vm/uri.h"
-#include "vm/verifier.h"
 #include "vm/version.h"
 
 namespace dart {
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 375fc6d..76747d5 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -6,9 +6,9 @@
 #define RUNTIME_VM_DART_API_IMPL_H_
 
 #include "vm/allocation.h"
+#include "vm/heap/safepoint.h"
 #include "vm/native_arguments.h"
 #include "vm/object.h"
-#include "vm/safepoint.h"
 #include "vm/thread_registry.h"
 #include "vm/timeline.h"
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index f0ada37..b88dd39 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -14,10 +14,10 @@
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_api_state.h"
 #include "vm/debugger_api_impl_test.h"
+#include "vm/heap/verifier.h"
 #include "vm/lockers.h"
 #include "vm/timeline.h"
 #include "vm/unit_test.h"
-#include "vm/verifier.h"
 
 namespace dart {
 
diff --git a/runtime/vm/dart_api_state.cc b/runtime/vm/dart_api_state.cc
index ba2359b..5a8a024 100644
--- a/runtime/vm/dart_api_state.cc
+++ b/runtime/vm/dart_api_state.cc
@@ -6,7 +6,7 @@
 
 #include "platform/assert.h"
 #include "platform/utils.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/thread.h"
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 84953b9..c27ce69 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -13,13 +13,13 @@
 #include "vm/flags.h"
 #include "vm/growable_array.h"
 #include "vm/handles.h"
+#include "vm/heap/weak_table.h"
 #include "vm/object.h"
 #include "vm/os.h"
 #include "vm/os_thread.h"
 #include "vm/raw_object.h"
 #include "vm/thread_pool.h"
 #include "vm/visitor.h"
-#include "vm/weak_table.h"
 
 #include "vm/handles_impl.h"
 
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 82afa1e..1ab87c0 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -8,11 +8,11 @@
 #include "vm/class_finalizer.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/debugger.h"
+#include "vm/heap/safepoint.h"
 #include "vm/interpreter.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
 #include "vm/runtime_entry.h"
-#include "vm/safepoint.h"
 #include "vm/simulator.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 4b243a8..b597adb 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include <include/dart_api.h>
 #include "include/dart_tools_api.h"
 
 #include "vm/class_finalizer.h"
@@ -232,39 +233,50 @@
   return Dart_NewInteger(bpt->id());
 }
 
-DART_EXPORT Dart_Handle Dart_EvaluateExpr(Dart_Handle target_in,
-                                          Dart_Handle expr_in) {
+DART_EXPORT Dart_Handle Dart_EvaluateStaticExpr(Dart_Handle lib_handle,
+                                                Dart_Handle expr_in) {
   DARTSCOPE(Thread::Current());
   CHECK_DEBUGGER(T->isolate());
 
-  const Object& target = Object::Handle(Z, Api::UnwrapHandle(target_in));
-  if (target.IsError()) return target_in;
+  const Object& target = Object::Handle(Z, Api::UnwrapHandle(lib_handle));
+  if (target.IsError()) return lib_handle;
   if (target.IsNull()) {
     return Api::NewError("%s expects argument 'target' to be non-null",
                          CURRENT_FUNC);
   }
+  const Library& lib = Library::Cast(target);
   UNWRAP_AND_CHECK_PARAM(String, expr, expr_in);
-  // Type extends Instance, must check first.
-  if (target.IsType()) {
-    const Class& cls = Class::Handle(Z, Type::Cast(target).type_class());
-    return Api::NewHandle(
-        T, cls.Evaluate(expr, Array::empty_array(), Array::empty_array()));
-  } else if (target.IsInstance()) {
-    const Instance& inst = Instance::Cast(target);
-    const Class& receiver_cls = Class::Handle(Z, inst.clazz());
-    return Api::NewHandle(
-        T, inst.Evaluate(receiver_cls, expr, Array::empty_array(),
-                         Array::empty_array()));
-  } else if (target.IsLibrary()) {
-    const Library& lib = Library::Cast(target);
+
+  if (!KernelIsolate::IsRunning()) {
     return Api::NewHandle(
         T, lib.Evaluate(expr, Array::empty_array(), Array::empty_array()));
-  } else if (target.IsClass()) {
-    const Class& cls = Class::Cast(target);
-    return Api::NewHandle(
-        T, cls.Evaluate(expr, Array::empty_array(), Array::empty_array()));
+  } else {
+    Dart_KernelCompilationResult compilation_result;
+    {
+      TransitionVMToNative transition(T);
+      compilation_result = KernelIsolate::CompileExpressionToKernel(
+          expr.ToCString(),
+          /* definitions= */ Array::empty_array(),
+          /* type_defintions= */ Array::empty_array(),
+          String::Handle(lib.url()).ToCString(),
+          /* klass= */ nullptr,
+          /* is_static= */ false);
+    }
+    if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+      return Api::NewError("Failed to compile expression.");
+    }
+
+    const uint8_t* kernel_bytes = compilation_result.kernel;
+    intptr_t kernel_length = compilation_result.kernel_size;
+    return Api::NewHandle(T, lib.EvaluateCompiledExpression(
+                                 kernel_bytes, kernel_length,
+                                 /* type_definitions= */
+                                 Array::empty_array(),
+                                 /* param_values= */
+                                 Array::empty_array(),
+                                 /* type_param_values= */
+                                 TypeArguments::null_type_arguments()));
   }
-  return Api::NewError("%s: unsupported target type", CURRENT_FUNC);
 }
 
 DART_EXPORT Dart_Handle Dart_GetLibraryIds() {
diff --git a/runtime/vm/debugger_api_impl_test.h b/runtime/vm/debugger_api_impl_test.h
index 022beaa..f68f645 100644
--- a/runtime/vm/debugger_api_impl_test.h
+++ b/runtime/vm/debugger_api_impl_test.h
@@ -180,23 +180,16 @@
 
 /**
  * Execute the expression given in string \expr in the context
- * of \target.
+ * of \lib_handle library, as if it were a top-level function in it.
  *
  * Requires there to be a current isolate.
  *
- * The expression is evaluated in the context of \target.
- * If \target is a Dart object, the expression is evaluated as if
- * it were an instance method of the class of the object.
- * If \target is a Class, the expression is evaluated as if it
- * were a static method of that class.
- * If \target is a Library, the expression is evaluated as if it
- * were a top-level function in that library.
- *
  * \return A handle to the computed value, or an error object if
  * the compilation of the expression fails, or if the evaluation throws
  * an error.
  */
-DART_EXPORT Dart_Handle Dart_EvaluateExpr(Dart_Handle target, Dart_Handle expr);
+DART_EXPORT Dart_Handle Dart_EvaluateStaticExpr(Dart_Handle lib_handle,
+                                                Dart_Handle expr);
 
 /**
  * Returns a handle to the library \library_id.
diff --git a/runtime/vm/find_code_object_test.cc b/runtime/vm/find_code_object_test.cc
index 0be5a94..1fe3662 100644
--- a/runtime/vm/find_code_object_test.cc
+++ b/runtime/vm/find_code_object_test.cc
@@ -5,8 +5,8 @@
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler/jit/compiler.h"
+#include "vm/heap/pages.h"
 #include "vm/object.h"
-#include "vm/pages.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 #include "vm/unit_test.h"
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 50afd6e..670fd1a 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -159,7 +159,7 @@
   C(stress_async_stacks, false, false, bool, false,                            \
     "Stress test async stack traces")                                          \
   P(strong, bool, false, "Enable strong mode.")                                \
-  P(sync_async, bool, true, "Start `async` functions synchronously.")          \
+  P(sync_async, bool, false, "Start `async` functions synchronously.")         \
   R(support_ast_printer, false, bool, true, "Support the AST printer.")        \
   R(support_compiler_stats, false, bool, true, "Support compiler stats.")      \
   R(support_disassembler, false, bool, true, "Support the disassembler.")      \
@@ -197,6 +197,9 @@
     "Enables heap verification before GC.")                                    \
   D(verify_gc_contains, bool, false,                                           \
     "Enables verification of address contains during GC.")                     \
-  D(verify_on_transition, bool, false, "Verify on dart <==> VM.")
+  D(verify_on_transition, bool, false, "Verify on dart <==> VM.")              \
+  P(enable_slow_path_sharing, bool, true, "Enable sharing of slow-path code.") \
+  P(shared_slow_path_triggers_gc, bool, false,                                 \
+    "TESTING: slow-path triggers a GC.")
 
 #endif  // RUNTIME_VM_FLAG_LIST_H_
diff --git a/runtime/vm/flags_test.cc b/runtime/vm/flags_test.cc
index 476bfb8..c9950db 100644
--- a/runtime/vm/flags_test.cc
+++ b/runtime/vm/flags_test.cc
@@ -4,7 +4,7 @@
 
 #include "vm/flags.h"
 #include "platform/assert.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/unit_test.h"
 
 namespace dart {
diff --git a/runtime/vm/handles_impl.h b/runtime/vm/handles_impl.h
index 9e2d9f9..901a837 100644
--- a/runtime/vm/handles_impl.h
+++ b/runtime/vm/handles_impl.h
@@ -5,7 +5,7 @@
 #ifndef RUNTIME_VM_HANDLES_IMPL_H_
 #define RUNTIME_VM_HANDLES_IMPL_H_
 
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/thread.h"
 #include "vm/visitor.h"
 
diff --git a/runtime/vm/handles_test.cc b/runtime/vm/handles_test.cc
index 0c63482..040225e 100644
--- a/runtime/vm/handles_test.cc
+++ b/runtime/vm/handles_test.cc
@@ -6,7 +6,7 @@
 #include "platform/assert.h"
 #include "vm/dart_api_state.h"
 #include "vm/flags.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/object.h"
 #include "vm/unit_test.h"
 #include "vm/zone.h"
diff --git a/runtime/vm/become.cc b/runtime/vm/heap/become.cc
similarity index 99%
rename from runtime/vm/become.cc
rename to runtime/vm/heap/become.cc
index b6512c6..7c611aa 100644
--- a/runtime/vm/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -2,16 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/become.h"
+#include "vm/heap/become.h"
 
 #include "platform/assert.h"
 #include "platform/utils.h"
 
 #include "vm/dart_api_state.h"
+#include "vm/heap/safepoint.h"
 #include "vm/isolate_reload.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
-#include "vm/safepoint.h"
 #include "vm/timeline.h"
 #include "vm/visitor.h"
 
diff --git a/runtime/vm/become.h b/runtime/vm/heap/become.h
similarity index 96%
rename from runtime/vm/become.h
rename to runtime/vm/heap/become.h
index ca25361..9d3263a2 100644
--- a/runtime/vm/become.h
+++ b/runtime/vm/heap/become.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_BECOME_H_
-#define RUNTIME_VM_BECOME_H_
+#ifndef RUNTIME_VM_HEAP_BECOME_H_
+#define RUNTIME_VM_HEAP_BECOME_H_
 
 #include "vm/allocation.h"
 #include "vm/raw_object.h"
@@ -96,4 +96,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_BECOME_H_
+#endif  // RUNTIME_VM_HEAP_BECOME_H_
diff --git a/runtime/vm/gc_compactor.cc b/runtime/vm/heap/compactor.cc
similarity index 98%
rename from runtime/vm/gc_compactor.cc
rename to runtime/vm/heap/compactor.cc
index b10d0b6..12815bf 100644
--- a/runtime/vm/gc_compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/gc_compactor.h"
+#include "vm/heap/compactor.h"
 
-#include "vm/become.h"
 #include "vm/globals.h"
-#include "vm/heap.h"
-#include "vm/pages.h"
+#include "vm/heap/become.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/pages.h"
 #include "vm/thread_barrier.h"
 #include "vm/timeline.h"
 
diff --git a/runtime/vm/gc_compactor.h b/runtime/vm/heap/compactor.h
similarity index 91%
rename from runtime/vm/gc_compactor.h
rename to runtime/vm/heap/compactor.h
index 7ae687f..903bf0e 100644
--- a/runtime/vm/gc_compactor.h
+++ b/runtime/vm/heap/compactor.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_GC_COMPACTOR_H_
-#define RUNTIME_VM_GC_COMPACTOR_H_
+#ifndef RUNTIME_VM_HEAP_COMPACTOR_H_
+#define RUNTIME_VM_HEAP_COMPACTOR_H_
 
 #include "vm/allocation.h"
 #include "vm/dart_api_state.h"
@@ -52,4 +52,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_GC_COMPACTOR_H_
+#endif  // RUNTIME_VM_HEAP_COMPACTOR_H_
diff --git a/runtime/vm/freelist.cc b/runtime/vm/heap/freelist.cc
similarity index 99%
rename from runtime/vm/freelist.cc
rename to runtime/vm/heap/freelist.cc
index c90fead..e4f690f 100644
--- a/runtime/vm/freelist.cc
+++ b/runtime/vm/heap/freelist.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/freelist.h"
+#include "vm/heap/freelist.h"
 
 #include "vm/bit_set.h"
 #include "vm/hash_map.h"
diff --git a/runtime/vm/freelist.h b/runtime/vm/heap/freelist.h
similarity index 96%
rename from runtime/vm/freelist.h
rename to runtime/vm/heap/freelist.h
index e5fa43d..10e0beb 100644
--- a/runtime/vm/freelist.h
+++ b/runtime/vm/heap/freelist.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_FREELIST_H_
-#define RUNTIME_VM_FREELIST_H_
+#ifndef RUNTIME_VM_HEAP_FREELIST_H_
+#define RUNTIME_VM_HEAP_FREELIST_H_
 
 #include "platform/assert.h"
 #include "vm/allocation.h"
@@ -133,4 +133,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_FREELIST_H_
+#endif  // RUNTIME_VM_HEAP_FREELIST_H_
diff --git a/runtime/vm/freelist_test.cc b/runtime/vm/heap/freelist_test.cc
similarity index 99%
rename from runtime/vm/freelist_test.cc
rename to runtime/vm/heap/freelist_test.cc
index 63137f1..d3a0ae9 100644
--- a/runtime/vm/freelist_test.cc
+++ b/runtime/vm/heap/freelist_test.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/freelist.h"
+#include "vm/heap/freelist.h"
 #include "platform/assert.h"
 #include "vm/unit_test.h"
 
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap/heap.cc
similarity index 99%
rename from runtime/vm/heap.cc
rename to runtime/vm/heap/heap.cc
index cd47729..376f9b7 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -2,20 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/flags.h"
+#include "vm/heap/pages.h"
+#include "vm/heap/safepoint.h"
+#include "vm/heap/scavenger.h"
+#include "vm/heap/verifier.h"
+#include "vm/heap/weak_table.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/object.h"
 #include "vm/object_set.h"
 #include "vm/os.h"
-#include "vm/pages.h"
 #include "vm/raw_object.h"
-#include "vm/safepoint.h"
-#include "vm/scavenger.h"
 #include "vm/service.h"
 #include "vm/service_event.h"
 #include "vm/service_isolate.h"
@@ -23,9 +25,7 @@
 #include "vm/tags.h"
 #include "vm/thread_pool.h"
 #include "vm/timeline.h"
-#include "vm/verifier.h"
 #include "vm/virtual_memory.h"
-#include "vm/weak_table.h"
 
 namespace dart {
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap/heap.h
similarity index 97%
rename from runtime/vm/heap.h
rename to runtime/vm/heap/heap.h
index 2edf4cf..d4c2cf1 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_HEAP_H_
-#define RUNTIME_VM_HEAP_H_
+#ifndef RUNTIME_VM_HEAP_HEAP_H_
+#define RUNTIME_VM_HEAP_HEAP_H_
 
 #include "platform/assert.h"
 #include "vm/allocation.h"
 #include "vm/flags.h"
 #include "vm/globals.h"
-#include "vm/pages.h"
-#include "vm/scavenger.h"
-#include "vm/spaces.h"
-#include "vm/weak_table.h"
+#include "vm/heap/pages.h"
+#include "vm/heap/scavenger.h"
+#include "vm/heap/spaces.h"
+#include "vm/heap/weak_table.h"
 
 namespace dart {
 
@@ -317,8 +317,7 @@
   bool VerifyGC(MarkExpectation mark_expectation = kForbidMarked) const;
 
   // Helper functions for garbage collection.
-  void CollectNewSpaceGarbage(Thread* thread,
-                              GCReason reason);
+  void CollectNewSpaceGarbage(Thread* thread, GCReason reason);
   void CollectOldSpaceGarbage(Thread* thread, GCType type, GCReason reason);
   void EvacuateNewSpace(Thread* thread, GCReason reason);
 
@@ -418,4 +417,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_HEAP_H_
+#endif  // RUNTIME_VM_HEAP_HEAP_H_
diff --git a/runtime/vm/heap/heap_sources.gni b/runtime/vm/heap/heap_sources.gni
new file mode 100644
index 0000000..7fa7986
--- /dev/null
+++ b/runtime/vm/heap/heap_sources.gni
@@ -0,0 +1,42 @@
+# 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.
+
+# This file contains all sources (vm and tests) for the compiler pipeline.
+# Unit test files need to have a "_test" suffix appended to the name.
+heap_sources = [
+  "become.cc",
+  "become.h",
+  "compactor.cc",
+  "compactor.h",
+  "freelist.cc",
+  "freelist.h",
+  "heap.cc",
+  "heap.h",
+  "marker.cc",
+  "marker.h",
+  "pages.cc",
+  "pages.h",
+  "safepoint.cc",
+  "safepoint.h",
+  "scavenger.cc",
+  "scavenger.h",
+  "spaces.h",
+  "store_buffer.cc",
+  "store_buffer.h",
+  "sweeper.cc",
+  "sweeper.h",
+  "verifier.cc",
+  "verifier.h",
+  "weak_code.cc",
+  "weak_code.h",
+  "weak_table.cc",
+  "weak_table.h",
+]
+
+heap_sources_tests = [
+  "freelist_test.cc",
+  "heap_test.cc",
+  "pages_test.cc",
+  "scavenger_test.cc",
+]
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap/heap_test.cc
similarity index 99%
rename from runtime/vm/heap_test.cc
rename to runtime/vm/heap/heap_test.cc
index 23def28f..1281e13 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -5,10 +5,10 @@
 #include "platform/globals.h"
 
 #include "platform/assert.h"
-#include "vm/become.h"
 #include "vm/dart_api_impl.h"
 #include "vm/globals.h"
-#include "vm/heap.h"
+#include "vm/heap/become.h"
+#include "vm/heap/heap.h"
 #include "vm/unit_test.h"
 
 namespace dart {
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/heap/marker.cc
similarity index 99%
rename from runtime/vm/gc_marker.cc
rename to runtime/vm/heap/marker.cc
index 21aa17d..3d0004d 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/gc_marker.h"
+#include "vm/heap/marker.h"
 
 #include "vm/allocation.h"
 #include "vm/dart_api_state.h"
+#include "vm/heap/pages.h"
+#include "vm/heap/store_buffer.h"
 #include "vm/isolate.h"
 #include "vm/log.h"
 #include "vm/object_id_ring.h"
-#include "vm/pages.h"
 #include "vm/raw_object.h"
 #include "vm/stack_frame.h"
-#include "vm/store_buffer.h"
 #include "vm/thread_barrier.h"
 #include "vm/thread_pool.h"
 #include "vm/thread_registry.h"
diff --git a/runtime/vm/gc_marker.h b/runtime/vm/heap/marker.h
similarity index 88%
rename from runtime/vm/gc_marker.h
rename to runtime/vm/heap/marker.h
index 7bfa182..6926468 100644
--- a/runtime/vm/gc_marker.h
+++ b/runtime/vm/heap/marker.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_GC_MARKER_H_
-#define RUNTIME_VM_GC_MARKER_H_
+#ifndef RUNTIME_VM_HEAP_MARKER_H_
+#define RUNTIME_VM_HEAP_MARKER_H_
 
 #include "vm/allocation.h"
 #include "vm/os_thread.h"  // Mutex.
@@ -25,9 +25,7 @@
   explicit GCMarker(Heap* heap) : heap_(heap), marked_bytes_(0) {}
   ~GCMarker() {}
 
-  void MarkObjects(Isolate* isolate,
-                   PageSpace* page_space,
-                   bool collect_code);
+  void MarkObjects(Isolate* isolate, PageSpace* page_space, bool collect_code);
 
   intptr_t marked_words() { return marked_bytes_ >> kWordSizeLog2; }
 
@@ -60,4 +58,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_GC_MARKER_H_
+#endif  // RUNTIME_VM_HEAP_MARKER_H_
diff --git a/runtime/vm/pages.cc b/runtime/vm/heap/pages.cc
similarity index 99%
rename from runtime/vm/pages.cc
rename to runtime/vm/heap/pages.cc
index 288f8ff..344932e 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/pages.h"
+#include "vm/heap/pages.h"
 
 #include "platform/address_sanitizer.h"
 #include "platform/assert.h"
-#include "vm/become.h"
 #include "vm/compiler_stats.h"
-#include "vm/gc_compactor.h"
-#include "vm/gc_marker.h"
-#include "vm/gc_sweeper.h"
+#include "vm/heap/become.h"
+#include "vm/heap/compactor.h"
+#include "vm/heap/marker.h"
+#include "vm/heap/safepoint.h"
+#include "vm/heap/sweeper.h"
 #include "vm/lockers.h"
 #include "vm/log.h"
 #include "vm/object.h"
 #include "vm/object_set.h"
 #include "vm/os_thread.h"
-#include "vm/safepoint.h"
 #include "vm/virtual_memory.h"
 
 namespace dart {
diff --git a/runtime/vm/pages.h b/runtime/vm/heap/pages.h
similarity index 98%
rename from runtime/vm/pages.h
rename to runtime/vm/heap/pages.h
index b0dfc7a..9901fea 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_PAGES_H_
-#define RUNTIME_VM_PAGES_H_
+#ifndef RUNTIME_VM_HEAP_PAGES_H_
+#define RUNTIME_VM_HEAP_PAGES_H_
 
-#include "vm/freelist.h"
 #include "vm/globals.h"
+#include "vm/heap/freelist.h"
+#include "vm/heap/spaces.h"
 #include "vm/lockers.h"
 #include "vm/ring_buffer.h"
-#include "vm/spaces.h"
 #include "vm/thread.h"
 #include "vm/virtual_memory.h"
 
@@ -460,4 +460,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_PAGES_H_
+#endif  // RUNTIME_VM_HEAP_PAGES_H_
diff --git a/runtime/vm/pages_test.cc b/runtime/vm/heap/pages_test.cc
similarity index 97%
rename from runtime/vm/pages_test.cc
rename to runtime/vm/heap/pages_test.cc
index 85a0d30..1db6113 100644
--- a/runtime/vm/pages_test.cc
+++ b/runtime/vm/heap/pages_test.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/pages.h"
+#include "vm/heap/pages.h"
 #include "platform/assert.h"
 #include "vm/unit_test.h"
 
diff --git a/runtime/vm/safepoint.cc b/runtime/vm/heap/safepoint.cc
similarity index 99%
rename from runtime/vm/safepoint.cc
rename to runtime/vm/heap/safepoint.cc
index 4fb88a4..2dbde70 100644
--- a/runtime/vm/safepoint.cc
+++ b/runtime/vm/heap/safepoint.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/safepoint.h"
+#include "vm/heap/safepoint.h"
 
 #include "vm/thread.h"
 #include "vm/thread_registry.h"
diff --git a/runtime/vm/safepoint.h b/runtime/vm/heap/safepoint.h
similarity index 98%
rename from runtime/vm/safepoint.h
rename to runtime/vm/heap/safepoint.h
index 92f4709..191323f 100644
--- a/runtime/vm/safepoint.h
+++ b/runtime/vm/heap/safepoint.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_SAFEPOINT_H_
-#define RUNTIME_VM_SAFEPOINT_H_
+#ifndef RUNTIME_VM_HEAP_SAFEPOINT_H_
+#define RUNTIME_VM_HEAP_SAFEPOINT_H_
 
 #include "vm/globals.h"
 #include "vm/lockers.h"
@@ -374,4 +374,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_SAFEPOINT_H_
+#endif  // RUNTIME_VM_HEAP_SAFEPOINT_H_
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/heap/scavenger.cc
similarity index 99%
rename from runtime/vm/scavenger.cc
rename to runtime/vm/heap/scavenger.cc
index 3121e86..32462c0 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -2,24 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/scavenger.h"
+#include "vm/heap/scavenger.h"
 
 #include "vm/dart.h"
 #include "vm/dart_api_state.h"
 #include "vm/flag_list.h"
+#include "vm/heap/safepoint.h"
+#include "vm/heap/store_buffer.h"
+#include "vm/heap/verifier.h"
+#include "vm/heap/weak_table.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/object.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_set.h"
-#include "vm/safepoint.h"
 #include "vm/stack_frame.h"
-#include "vm/store_buffer.h"
 #include "vm/thread_registry.h"
 #include "vm/timeline.h"
-#include "vm/verifier.h"
 #include "vm/visitor.h"
-#include "vm/weak_table.h"
 
 namespace dart {
 
diff --git a/runtime/vm/scavenger.h b/runtime/vm/heap/scavenger.h
similarity index 98%
rename from runtime/vm/scavenger.h
rename to runtime/vm/heap/scavenger.h
index 8945766..45e0c3c 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/heap/scavenger.h
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_SCAVENGER_H_
-#define RUNTIME_VM_SCAVENGER_H_
+#ifndef RUNTIME_VM_HEAP_SCAVENGER_H_
+#define RUNTIME_VM_HEAP_SCAVENGER_H_
 
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/dart.h"
 #include "vm/flags.h"
 #include "vm/globals.h"
+#include "vm/heap/spaces.h"
 #include "vm/raw_object.h"
 #include "vm/ring_buffer.h"
-#include "vm/spaces.h"
 #include "vm/virtual_memory.h"
 #include "vm/visitor.h"
 
@@ -330,4 +330,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_SCAVENGER_H_
+#endif  // RUNTIME_VM_HEAP_SCAVENGER_H_
diff --git a/runtime/vm/scavenger_test.cc b/runtime/vm/heap/scavenger_test.cc
similarity index 97%
rename from runtime/vm/scavenger_test.cc
rename to runtime/vm/heap/scavenger_test.cc
index 80848f6f..64b2a31 100644
--- a/runtime/vm/scavenger_test.cc
+++ b/runtime/vm/heap/scavenger_test.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/scavenger.h"
+#include "vm/heap/scavenger.h"
 #include "platform/assert.h"
 #include "vm/unit_test.h"
 #include "vm/visitor.h"
diff --git a/runtime/vm/spaces.h b/runtime/vm/heap/spaces.h
similarity index 85%
rename from runtime/vm/spaces.h
rename to runtime/vm/heap/spaces.h
index 33e2031..3325d2f 100644
--- a/runtime/vm/spaces.h
+++ b/runtime/vm/heap/spaces.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_SPACES_H_
-#define RUNTIME_VM_SPACES_H_
+#ifndef RUNTIME_VM_HEAP_SPACES_H_
+#define RUNTIME_VM_HEAP_SPACES_H_
 
 // This file contains utilities shared by old and new space.
 // TODO(koda): Create Space base class with Space::CurrentUsage().
@@ -20,4 +20,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_SPACES_H_
+#endif  // RUNTIME_VM_HEAP_SPACES_H_
diff --git a/runtime/vm/store_buffer.cc b/runtime/vm/heap/store_buffer.cc
similarity index 99%
rename from runtime/vm/store_buffer.cc
rename to runtime/vm/heap/store_buffer.cc
index 851c847..00bf036 100644
--- a/runtime/vm/store_buffer.cc
+++ b/runtime/vm/heap/store_buffer.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/store_buffer.h"
+#include "vm/heap/store_buffer.h"
 
 #include "platform/assert.h"
 #include "vm/lockers.h"
diff --git a/runtime/vm/store_buffer.h b/runtime/vm/heap/store_buffer.h
similarity index 97%
rename from runtime/vm/store_buffer.h
rename to runtime/vm/heap/store_buffer.h
index 4dab0f7..75aef6f 100644
--- a/runtime/vm/store_buffer.h
+++ b/runtime/vm/heap/store_buffer.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_STORE_BUFFER_H_
-#define RUNTIME_VM_STORE_BUFFER_H_
+#ifndef RUNTIME_VM_HEAP_STORE_BUFFER_H_
+#define RUNTIME_VM_HEAP_STORE_BUFFER_H_
 
 #include "platform/assert.h"
 #include "vm/globals.h"
@@ -175,4 +175,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_STORE_BUFFER_H_
+#endif  // RUNTIME_VM_HEAP_STORE_BUFFER_H_
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/heap/sweeper.cc
similarity index 97%
rename from runtime/vm/gc_sweeper.cc
rename to runtime/vm/heap/sweeper.cc
index a064f2d..092ba69 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/heap/sweeper.cc
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/gc_sweeper.h"
+#include "vm/heap/sweeper.h"
 
-#include "vm/freelist.h"
 #include "vm/globals.h"
-#include "vm/heap.h"
+#include "vm/heap/freelist.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/pages.h"
+#include "vm/heap/safepoint.h"
 #include "vm/lockers.h"
-#include "vm/pages.h"
-#include "vm/safepoint.h"
 #include "vm/thread_pool.h"
 #include "vm/timeline.h"
 
diff --git a/runtime/vm/gc_sweeper.h b/runtime/vm/heap/sweeper.h
similarity index 92%
rename from runtime/vm/gc_sweeper.h
rename to runtime/vm/heap/sweeper.h
index ba9aaef..609b962 100644
--- a/runtime/vm/gc_sweeper.h
+++ b/runtime/vm/heap/sweeper.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_GC_SWEEPER_H_
-#define RUNTIME_VM_GC_SWEEPER_H_
+#ifndef RUNTIME_VM_HEAP_SWEEPER_H_
+#define RUNTIME_VM_HEAP_SWEEPER_H_
 
 #include "vm/globals.h"
 
@@ -43,4 +43,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_GC_SWEEPER_H_
+#endif  // RUNTIME_VM_HEAP_SWEEPER_H_
diff --git a/runtime/vm/verifier.cc b/runtime/vm/heap/verifier.cc
similarity index 97%
rename from runtime/vm/verifier.cc
rename to runtime/vm/heap/verifier.cc
index 65d854b..808036c 100644
--- a/runtime/vm/verifier.cc
+++ b/runtime/vm/heap/verifier.cc
@@ -2,13 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/verifier.h"
+#include "vm/heap/verifier.h"
 
 #include "platform/assert.h"
 #include "vm/dart.h"
 #include "vm/dart_api_state.h"
-#include "vm/freelist.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_set.h"
diff --git a/runtime/vm/verifier.h b/runtime/vm/heap/verifier.h
similarity index 95%
rename from runtime/vm/verifier.h
rename to runtime/vm/heap/verifier.h
index 57b374b..f12ba82 100644
--- a/runtime/vm/verifier.h
+++ b/runtime/vm/heap/verifier.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_VERIFIER_H_
-#define RUNTIME_VM_VERIFIER_H_
+#ifndef RUNTIME_VM_HEAP_VERIFIER_H_
+#define RUNTIME_VM_HEAP_VERIFIER_H_
 
 #include "vm/flags.h"
 #include "vm/globals.h"
@@ -86,4 +86,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_VERIFIER_H_
+#endif  // RUNTIME_VM_HEAP_VERIFIER_H_
diff --git a/runtime/vm/weak_code.cc b/runtime/vm/heap/weak_code.cc
similarity index 98%
rename from runtime/vm/weak_code.cc
rename to runtime/vm/heap/weak_code.cc
index b7a2dda..c1a3d53 100644
--- a/runtime/vm/weak_code.cc
+++ b/runtime/vm/heap/weak_code.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/weak_code.h"
+#include "vm/heap/weak_code.h"
 
 #include "platform/assert.h"
 
diff --git a/runtime/vm/weak_code.h b/runtime/vm/heap/weak_code.h
similarity index 90%
rename from runtime/vm/weak_code.h
rename to runtime/vm/heap/weak_code.h
index 42da4d7..74b4389 100644
--- a/runtime/vm/weak_code.h
+++ b/runtime/vm/heap/weak_code.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_WEAK_CODE_H_
-#define RUNTIME_VM_WEAK_CODE_H_
+#ifndef RUNTIME_VM_HEAP_WEAK_CODE_H_
+#define RUNTIME_VM_HEAP_WEAK_CODE_H_
 
 #include "vm/allocation.h"
 #include "vm/globals.h"
@@ -39,4 +39,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_WEAK_CODE_H_
+#endif  // RUNTIME_VM_HEAP_WEAK_CODE_H_
diff --git a/runtime/vm/weak_table.cc b/runtime/vm/heap/weak_table.cc
similarity index 98%
rename from runtime/vm/weak_table.cc
rename to runtime/vm/heap/weak_table.cc
index f9f44f1..4fd7917 100644
--- a/runtime/vm/weak_table.cc
+++ b/runtime/vm/heap/weak_table.cc
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/weak_table.h"
+#include "vm/heap/weak_table.h"
 
 #include "platform/assert.h"
 #include "vm/raw_object.h"
diff --git a/runtime/vm/weak_table.h b/runtime/vm/heap/weak_table.h
similarity index 97%
rename from runtime/vm/weak_table.h
rename to runtime/vm/heap/weak_table.h
index 783013b..c7970cf 100644
--- a/runtime/vm/weak_table.h
+++ b/runtime/vm/heap/weak_table.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef RUNTIME_VM_WEAK_TABLE_H_
-#define RUNTIME_VM_WEAK_TABLE_H_
+#ifndef RUNTIME_VM_HEAP_WEAK_TABLE_H_
+#define RUNTIME_VM_HEAP_WEAK_TABLE_H_
 
 #include "vm/globals.h"
 
@@ -188,4 +188,4 @@
 
 }  // namespace dart
 
-#endif  // RUNTIME_VM_WEAK_TABLE_H_
+#endif  // RUNTIME_VM_HEAP_WEAK_TABLE_H_
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 162f58b..90fa8fb 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -9,7 +9,7 @@
 #include "vm/dwarf.h"
 #include "vm/hash.h"
 #include "vm/hash_map.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/json_writer.h"
 #include "vm/object.h"
 #include "vm/stub_code.h"
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 4d58732..5dbbdd5 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -599,6 +599,14 @@
 }
 #endif  // defined(DEBUG)
 
+bool Interpreter::IsTracing() const {
+#if defined(DEBUG)
+  return IsTracingExecution();
+#else
+  return false;
+#endif
+}
+
 // Calls into the Dart runtime are based on this interface.
 typedef void (*InterpreterRuntimeCall)(NativeArguments arguments);
 
@@ -909,34 +917,38 @@
                                      RawObject * *arg0, Thread * thread);
     invokestub entrypoint = reinterpret_cast<invokestub>(
         StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint());
+    RawObject* result;
     Exit(thread, *FP, call_top + 1, *pc);
     {
       InterpreterSetjmpBuffer buffer(this);
       if (!setjmp(buffer.buffer_)) {
         thread->set_vm_tag(reinterpret_cast<uword>(entrypoint));
-        RawObject* result = entrypoint(code, argdesc, call_base, thread);
+        result = entrypoint(code, argdesc, call_base, thread);
         thread->set_vm_tag(VMTag::kDartTagId);
         thread->set_top_exit_frame_info(0);
         ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
-
-        // It is legit to call the constructor of an error object, however a
-        // result of class UnhandledException must be propagated.
-        if (result->IsHeapObject() &&
-            result->GetClassId() == kUnhandledExceptionCid) {
-          // TODO(regis): Shoudn't the callee have set these and thrown?
-          special_[kExceptionSpecialIndex] = result;
-          special_[kStackTraceSpecialIndex] = Object::null();
-          return false;
-        }
-
-        // Pop args and push result.
-        *SP = call_base;
-        **SP = result;
-        return true;
       } else {
         return false;
       }
     }
+    // Pop args and push result.
+    *SP = call_base;
+    **SP = result;
+
+    // It is legit to call the constructor of an error object, however a
+    // result of class UnhandledException must be propagated.
+    if (result->IsHeapObject() &&
+        result->GetClassId() == kUnhandledExceptionCid) {
+      (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
+      (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
+      (*SP)[2] = 0;  // Space for result.
+      Exit(thread, *FP, *SP + 3, *pc);
+      NativeArguments args(thread, 2, *SP, *SP + 2);
+      if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
+        return false;
+      }
+    }
+    return true;
   }
   ASSERT(Function::HasBytecode(function));
   // Bytecode was loaded in the above compilation step.
@@ -1275,9 +1287,9 @@
       if (IsTracingExecution()) {                                              \
         THR_Print("%" Pu64 " ", icount_);                                      \
         THR_Print("Returning exception from interpreter 0x%" Px                \
-                  " at fp_ 0x%" Px "\n",                                       \
-                  reinterpret_cast<uword>(this),                               \
-                  reinterpret_cast<uword>(fp_));                               \
+                  " at fp_ 0x%" Px " exit 0x%" Px "\n",                        \
+                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_), \
+                  exit_fp);                                                    \
       }                                                                        \
       ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());                    \
       return special_[kExceptionSpecialIndex];                                 \
@@ -1409,9 +1421,10 @@
 #if defined(DEBUG)
   if (IsTracingExecution()) {
     THR_Print("%" Pu64 " ", icount_);
-    THR_Print("%s interpreter 0x%" Px " at fp_ 0x%" Px " %s\n",
+    THR_Print("%s interpreter 0x%" Px " at fp_ 0x%" Px " exit 0x%" Px " %s\n",
               reentering ? "Re-entering" : "Entering",
               reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
+              thread->top_exit_frame_info(),
               Function::Handle(code.function()).ToCString());
   }
 #endif
@@ -3090,8 +3103,10 @@
 #if defined(DEBUG)
       if (IsTracingExecution()) {
         THR_Print("%" Pu64 " ", icount_);
-        THR_Print("Returning from interpreter 0x%" Px " at fp_ 0x%" Px "\n",
-                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_));
+        THR_Print("Returning from interpreter 0x%" Px " at fp_ 0x%" Px
+                  " exit 0x%" Px "\n",
+                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
+                  exit_fp);
       }
       ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());
       const intptr_t argc = reinterpret_cast<uword>(pc) >> 2;
@@ -4437,6 +4452,8 @@
     RawObject* raw_exception = thread->active_exception();
     RawObject* raw_stacktrace = thread->active_stacktrace();
     ASSERT(raw_exception != Object::null());
+    thread->set_active_exception(Object::null_object());
+    thread->set_active_stacktrace(Object::null_object());
     special_[kExceptionSpecialIndex] = raw_exception;
     special_[kStackTraceSpecialIndex] = raw_stacktrace;
     pc_ = thread->resume_pc();
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 0a87cc4..ef71e71 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -51,12 +51,6 @@
   // High address (KBC stack grows up).
   uword stack_limit() const { return stack_limit_; }
 
-  // The thread's top_exit_frame_info refers to a Dart frame in the interpreter
-  // stack. The interpreter's top_exit_frame_info refers to a C++ frame in the
-  // native stack.
-  uword top_exit_frame_info() const { return top_exit_frame_info_; }
-  void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
-
   // Returns true if the interpreter's stack contains the given frame.
   // TODO(regis): Once the interpreter shares the native stack, we may rely on
   // a new thread vm_tag to identify an interpreter frame and we will not need
@@ -99,6 +93,8 @@
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
+  bool IsTracing() const;
+
  private:
   uintptr_t* stack_;
   uword stack_base_;
@@ -187,13 +183,13 @@
                           RawObject*** SP,
                           uint32_t** pc);
 
-#if !defined(PRODUCT)
+#if defined(DEBUG)
   // Returns true if tracing of executed instructions is enabled.
   bool IsTracingExecution() const;
 
   // Prints bytecode instruction at given pc for instruction tracing.
   void TraceInstruction(uint32_t* pc) const;
-#endif  // !defined(PRODUCT)
+#endif  // defined(DEBUG)
 
   // Longjmp support for exceptions.
   InterpreterSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index f0840c0..21ab5e0 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -19,7 +19,10 @@
 #include "vm/debugger.h"
 #include "vm/deopt_instructions.h"
 #include "vm/flags.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/safepoint.h"
+#include "vm/heap/store_buffer.h"
+#include "vm/heap/verifier.h"
 #include "vm/image_snapshot.h"
 #include "vm/interpreter.h"
 #include "vm/isolate_reload.h"
@@ -34,13 +37,11 @@
 #include "vm/port.h"
 #include "vm/profiler.h"
 #include "vm/reusable_handles.h"
-#include "vm/safepoint.h"
 #include "vm/service.h"
 #include "vm/service_event.h"
 #include "vm/service_isolate.h"
 #include "vm/simulator.h"
 #include "vm/stack_frame.h"
-#include "vm/store_buffer.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
 #include "vm/tags.h"
@@ -49,7 +50,6 @@
 #include "vm/timeline.h"
 #include "vm/timeline_analysis.h"
 #include "vm/timer.h"
-#include "vm/verifier.h"
 #include "vm/visitor.h"
 
 namespace dart {
@@ -1854,6 +1854,10 @@
           "--check-reloaded is enabled.\n");
     }
   }
+
+  // TODO(33514): Ideally this should be moved to Dart_ShutdownIsolate,
+  // next to ServiceIsolate::SendIsolateShutdownMessage().
+  KernelIsolate::NotifyAboutIsolateShutdown(Isolate::Current());
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
   // Then, proceed with low-level teardown.
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 2dad860..7097f5a 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -14,6 +14,7 @@
 #include "vm/fixed_cache.h"
 #include "vm/growable_array.h"
 #include "vm/handles.h"
+#include "vm/heap/verifier.h"
 #include "vm/megamorphic_cache_table.h"
 #include "vm/metrics.h"
 #include "vm/os_thread.h"
@@ -22,7 +23,6 @@
 #include "vm/thread.h"
 #include "vm/timer.h"
 #include "vm/token_position.h"
-#include "vm/verifier.h"
 
 namespace dart {
 
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 4832667..6f7c825 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -4,11 +4,12 @@
 
 #include "vm/isolate_reload.h"
 
-#include "vm/become.h"
 #include "vm/bit_vector.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_api_impl.h"
 #include "vm/hash_table.h"
+#include "vm/heap/become.h"
+#include "vm/heap/safepoint.h"
 #include "vm/isolate.h"
 #include "vm/kernel_isolate.h"
 #include "vm/kernel_loader.h"
@@ -17,7 +18,6 @@
 #include "vm/object_store.h"
 #include "vm/parser.h"
 #include "vm/runtime_entry.h"
-#include "vm/safepoint.h"
 #include "vm/service_event.h"
 #include "vm/stack_frame.h"
 #include "vm/thread.h"
@@ -1025,7 +1025,7 @@
     return;
   }
 
-  *modified_sources = new (zone_) Dart_SourceFile[*count];
+  *modified_sources = zone_->Alloc<Dart_SourceFile>(*count);
   for (intptr_t i = 0; i < *count; ++i) {
     (*modified_sources)[i].uri = modified_sources_uris[i];
     (*modified_sources)[i].source = NULL;
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index da65506..c320591 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -7,11 +7,11 @@
 #include "include/dart_native_api.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
+#include "vm/heap/safepoint.h"
 #include "vm/json_stream.h"
 #include "vm/message.h"
 #include "vm/metrics.h"
 #include "vm/object.h"
-#include "vm/safepoint.h"
 #include "vm/service.h"
 #include "vm/service_event.h"
 #include "vm/thread_registry.h"
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index dd39430..b5efb44 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -54,6 +54,7 @@
 const int KernelIsolate::kTrainTag = 3;
 const int KernelIsolate::kCompileExpressionTag = 4;
 const int KernelIsolate::kListDependenciesTag = 5;
+const int KernelIsolate::kNotifyIsolateShutdown = 6;
 
 Dart_IsolateCreateCallback KernelIsolate::create_callback_ = NULL;
 Monitor* KernelIsolate::monitor_ = new Monitor();
@@ -89,7 +90,7 @@
     api_flags.enable_error_on_bad_override = false;
     api_flags.reify_generic_functions = false;
     api_flags.strong = false;
-    api_flags.sync_async = true;
+    api_flags.sync_async = false;
 #if !defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC)
     api_flags.use_field_guards = true;
 #endif
@@ -787,6 +788,34 @@
                                         NULL, 0, source_files_count,
                                         source_files, true, NULL);
 }
+
+void KernelIsolate::NotifyAboutIsolateShutdown(const Isolate* isolate) {
+  if (!KernelIsolate::IsRunning()) {
+    return;
+  }
+  Dart_Port kernel_port = WaitForKernelPort();
+  if (kernel_port == ILLEGAL_PORT) {
+    return;
+  }
+
+  Dart_CObject tag;
+  tag.type = Dart_CObject_kInt32;
+  tag.value.as_int32 = KernelIsolate::kNotifyIsolateShutdown;
+
+  Dart_CObject isolate_id;
+  isolate_id.type = Dart_CObject_kInt64;
+  isolate_id.value.as_int64 =
+      isolate != NULL ? static_cast<int64_t>(isolate->main_port()) : 0;
+
+  Dart_CObject message;
+  message.type = Dart_CObject_kArray;
+  Dart_CObject* message_arr[] = {&tag, &isolate_id};
+  message.value.as_array.values = message_arr;
+  message.value.as_array.length = ARRAY_SIZE(message_arr);
+  // Send the message.
+  Dart_PostCObject(kernel_port, &message);
+}
+
 #endif  // DART_PRECOMPILED_RUNTIME
 
 }  // namespace dart
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index d888630..5275308 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -27,6 +27,7 @@
   static const int kTrainTag;
   static const int kCompileExpressionTag;
   static const int kListDependenciesTag;
+  static const int kNotifyIsolateShutdown;
 
   static void Run();
 
@@ -61,6 +62,8 @@
 
   static Dart_KernelCompilationResult ListDependencies();
 
+  static void NotifyAboutIsolateShutdown(const Isolate* isolate);
+
  protected:
   static Monitor* monitor_;
   static Dart_IsolateCreateCallback create_callback_;
diff --git a/runtime/vm/lockers.cc b/runtime/vm/lockers.cc
index 63104ca..7a43e4a 100644
--- a/runtime/vm/lockers.cc
+++ b/runtime/vm/lockers.cc
@@ -4,7 +4,7 @@
 
 #include "vm/lockers.h"
 #include "platform/assert.h"
-#include "vm/safepoint.h"
+#include "vm/heap/safepoint.h"
 
 namespace dart {
 
diff --git a/runtime/vm/longjump.cc b/runtime/vm/longjump.cc
index e41a8c4..36d5031 100644
--- a/runtime/vm/longjump.cc
+++ b/runtime/vm/longjump.cc
@@ -38,11 +38,6 @@
   // since there can be only one per isolate.
   uword top_exit_frame_info =
       thread->IsMutatorThread() ? sim->top_exit_frame_info() : 0;
-#elif defined(DART_USE_INTERPRETER)
-  Interpreter* interpreter = Interpreter::Current();
-  ASSERT(interpreter->top_exit_frame_info() == 0);
-  uword top_exit_frame_info = 0;
-  // TODO(regis): Determine if top exit frame is jitted or interpreted.
 #else
   uword top_exit_frame_info = thread->top_exit_frame_info();
 #endif
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index 3aaf67e..8b033c5 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -10,10 +10,10 @@
 #include "vm/code_patcher.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_api_state.h"
+#include "vm/heap/safepoint.h"
 #include "vm/native_symbol.h"
 #include "vm/object_store.h"
 #include "vm/reusable_handles.h"
-#include "vm/safepoint.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 #include "vm/tags.h"
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index 638d1c1..6c1e5ef 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -10,10 +10,10 @@
 #include "vm/allocation.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/exceptions.h"
+#include "vm/heap/verifier.h"
 #include "vm/log.h"
 #include "vm/native_arguments.h"
 #include "vm/runtime_entry.h"
-#include "vm/verifier.h"
 
 #include "include/dart_api.h"
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 2428bab..dac4c85 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -6,7 +6,6 @@
 
 #include "include/dart_api.h"
 #include "platform/assert.h"
-#include "vm/become.h"
 #include "vm/bit_vector.h"
 #include "vm/bootstrap.h"
 #include "vm/class_finalizer.h"
@@ -31,7 +30,9 @@
 #include "vm/growable_array.h"
 #include "vm/hash.h"
 #include "vm/hash_table.h"
-#include "vm/heap.h"
+#include "vm/heap/become.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/weak_code.h"
 #include "vm/isolate_reload.h"
 #include "vm/kernel.h"
 #include "vm/kernel_isolate.h"
@@ -54,7 +55,6 @@
 #include "vm/type_table.h"
 #include "vm/type_testing_stubs.h"
 #include "vm/unicode.h"
-#include "vm/weak_code.h"
 #include "vm/zone_text_buffer.h"
 
 namespace dart {
@@ -1215,6 +1215,8 @@
           reinterpret_cast<RawTypedData*>(RawObject::FromAddr(addr));
       uword new_tags = RawObject::ClassIdTag::update(kTypedDataInt8ArrayCid, 0);
       new_tags = RawObject::SizeTag::update(leftover_size, new_tags);
+      new_tags = RawObject::VMHeapObjectTag::update(obj.raw()->IsVMHeapObject(),
+                                                    new_tags);
       uint32_t tags = raw->ptr()->tags_;
       uint32_t old_tags;
       // TODO(iposva): Investigate whether CompareAndSwapWord is necessary.
@@ -1235,6 +1237,8 @@
       RawObject* raw = reinterpret_cast<RawObject*>(RawObject::FromAddr(addr));
       uword new_tags = RawObject::ClassIdTag::update(kInstanceCid, 0);
       new_tags = RawObject::SizeTag::update(leftover_size, new_tags);
+      new_tags = RawObject::VMHeapObjectTag::update(
+          obj.raw()->ptr()->IsVMHeapObject(), new_tags);
       uint32_t tags = raw->ptr()->tags_;
       uint32_t old_tags;
       // TODO(iposva): Investigate whether CompareAndSwapWord is necessary.
@@ -3189,15 +3193,6 @@
   return String::ConcatAll(Array::Handle(Array::MakeFixedLength(src_pieces)));
 }
 
-static RawObject* EvaluateWithDFEHelper(const String& expression,
-                                        const Array& definitions,
-                                        const Array& type_definitions,
-                                        const String& library_url,
-                                        const String& klass,
-                                        bool is_static,
-                                        const Array& arguments,
-                                        const TypeArguments& type_arguments);
-
 RawFunction* Function::EvaluateHelper(const Class& cls,
                                       const String& expr,
                                       const Array& param_names,
@@ -11404,16 +11399,12 @@
                              const Array& param_values,
                              const Array& type_param_names,
                              const TypeArguments& type_param_values) const {
-  if (kernel_data() == TypedData::null() ||
-      !FLAG_enable_kernel_expression_compilation) {
-    // Evaluate the expression as a static function of the toplevel class.
-    Class& top_level_class = Class::Handle(toplevel_class());
-    ASSERT(top_level_class.is_finalized());
-    return top_level_class.Evaluate(expr, param_names, param_values);
-  }
-  return EvaluateWithDFEHelper(expr, param_names, type_param_names,
-                               String::Handle(url()), String::Handle(), false,
-                               param_values, type_param_values);
+  ASSERT(kernel_data() == TypedData::null() ||
+         !FLAG_enable_kernel_expression_compilation);
+  // Evaluate the expression as a static function of the toplevel class.
+  Class& top_level_class = Class::Handle(toplevel_class());
+  ASSERT(top_level_class.is_finalized());
+  return top_level_class.Evaluate(expr, param_names, param_values);
 }
 
 RawObject* Library::EvaluateCompiledExpression(
@@ -11481,135 +11472,6 @@
 };
 typedef UnorderedHashMap<LibraryLookupTraits> LibraryLookupMap;
 
-static RawObject* EvaluateWithDFEHelper(const String& expression,
-                                        const Array& definitions,
-                                        const Array& type_definitions,
-                                        const String& library_url,
-                                        const String& klass,
-                                        bool is_static,
-                                        const Array& arguments,
-                                        const TypeArguments& type_arguments) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  const String& error_str = String::Handle(
-      String::New("Kernel service isolate not available in precompiled mode."));
-  return ApiError::New(error_str);
-#else
-  Isolate* I = Isolate::Current();
-  Thread* T = Thread::Current();
-
-  Dart_KernelCompilationResult compilation_result;
-  {
-    TransitionVMToNative transition(T);
-    compilation_result = KernelIsolate::CompileExpressionToKernel(
-        expression.ToCString(), definitions, type_definitions,
-        library_url.ToCString(), klass.IsNull() ? NULL : klass.ToCString(),
-        is_static);
-  }
-
-  GrowableObjectArray& libraries =
-      GrowableObjectArray::Handle(T->zone(), I->object_store()->libraries());
-
-  Function& callee = Function::Handle();
-  intptr_t num_cids = I->class_table()->NumCids();
-  intptr_t num_libs = libraries.Length();
-
-  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
-    const String& prefix =
-        String::Handle(String::New("Kernel isolate rejected this request:\n"));
-    const String& error_str = String::Handle(String::Concat(
-        prefix, String::Handle(String::New(compilation_result.error))));
-    free(compilation_result.error);
-    return ApiError::New(error_str);
-  }
-
-  const uint8_t* kernel_file = compilation_result.kernel;
-  intptr_t kernel_length = compilation_result.kernel_size;
-  ASSERT(kernel_file != NULL);
-
-  kernel::Program* kernel_pgm =
-      kernel::Program::ReadFromBuffer(kernel_file, kernel_length, true);
-
-  if (kernel_pgm == NULL) {
-    return ApiError::New(String::Handle(
-        String::New("Kernel isolate returned ill-formed kernel.")));
-  }
-
-  kernel_pgm->set_release_buffer_callback(ReleaseFetchedBytes);
-
-  // Load the program with the debug procedure as a regular, independent
-  // program.
-  kernel::KernelLoader loader(kernel_pgm);
-  const Object& result = Object::Handle(loader.LoadProgram());
-  if (result.IsError()) return result.raw();
-  ASSERT(I->class_table()->NumCids() > num_cids &&
-         libraries.Length() == num_libs + 1);
-  const Library& loaded =
-      Library::Handle(Library::LookupLibrary(T, Symbols::EvalSourceUri()));
-  ASSERT(!loaded.IsNull());
-
-  String& debug_name = String::Handle(
-      String::New(Symbols::Symbol(Symbols::kDebugProcedureNameId)));
-  Class& fake_class = Class::Handle();
-  if (!klass.IsNull()) {
-    fake_class = loaded.LookupClass(Symbols::DebugClassName());
-    ASSERT(!fake_class.IsNull());
-    callee = fake_class.LookupFunctionAllowPrivate(debug_name);
-  } else {
-    callee = loaded.LookupFunctionAllowPrivate(debug_name);
-  }
-  ASSERT(!callee.IsNull());
-
-  // Save the loaded library's kernel data to the generic "data" field of the
-  // callee, so it doesn't require access it's parent library during
-  // compilation.
-  callee.SetKernelDataAndScript(Script::Handle(callee.script()),
-                                TypedData::Handle(loaded.kernel_data()),
-                                loaded.kernel_offset());
-
-  // Reparent the callee to the real enclosing class so we can remove the fake
-  // class and library from the object store.
-  const Library& real_library =
-      Library::Handle(Library::LookupLibrary(T, library_url));
-  ASSERT(!real_library.IsNull());
-  Class& real_class = Class::Handle();
-  if (!klass.IsNull()) {
-    real_class = real_library.LookupClassAllowPrivate(klass);
-  } else {
-    real_class = real_library.toplevel_class();
-  }
-  ASSERT(!real_class.IsNull());
-
-  callee.set_owner(real_class);
-
-  // Unlink the fake library and class from the object store.
-  libraries.SetLength(num_libs);
-  I->class_table()->SetNumCids(num_cids);
-  if (!fake_class.IsNull()) {
-    fake_class.set_id(kIllegalCid);
-  }
-  LibraryLookupMap libraries_map(I->object_store()->libraries_map());
-  bool removed = libraries_map.Remove(Symbols::EvalSourceUri());
-  ASSERT(removed);
-  I->object_store()->set_libraries_map(libraries_map.Release());
-
-  if (type_definitions.Length() == 0) {
-    return DartEntry::InvokeFunction(callee, arguments);
-  }
-
-  intptr_t num_type_args = type_arguments.Length();
-  Array& real_arguments = Array::Handle(Array::New(arguments.Length() + 1));
-  real_arguments.SetAt(0, type_arguments);
-  Object& arg = Object::Handle();
-  for (intptr_t i = 0; i < arguments.Length(); ++i) {
-    arg = arguments.At(i);
-    real_arguments.SetAt(i + 1, arg);
-  }
-  const Array& args_desc = Array::Handle(
-      ArgumentsDescriptor::New(num_type_args, arguments.Length()));
-  return DartEntry::InvokeFunction(callee, real_arguments, args_desc);
-#endif
-}
-
 static RawObject* EvaluateCompiledExpressionHelper(
     const uint8_t* kernel_bytes,
     intptr_t kernel_length,
@@ -19287,18 +19149,11 @@
         return Integer::New(left_value + right_value, space);
       case Token::kSUB:
         return Integer::New(left_value - right_value, space);
-      case Token::kMUL: {
-        if (Smi::kBits < 32) {
-          // In 32-bit mode, the product of two Smis fits in a 64-bit result.
-          return Integer::New(static_cast<int64_t>(left_value) *
-                                  static_cast<int64_t>(right_value),
-                              space);
-        } else {
-          ASSERT(sizeof(intptr_t) == sizeof(int64_t));
-          return Integer::New(Utils::MulWithWrapAround(left_value, right_value),
-                              space);
-        }
-      }
+      case Token::kMUL:
+        return Integer::New(
+            Utils::MulWithWrapAround(static_cast<int64_t>(left_value),
+                                     static_cast<int64_t>(right_value)),
+            space);
       case Token::kTRUNCDIV:
         return Integer::New(left_value / right_value, space);
       case Token::kMOD: {
@@ -19396,40 +19251,21 @@
   }
 }
 
-// TODO(srdjan): Clarify handling of negative right operand in a shift op.
-RawInteger* Smi::ShiftOp(Token::Kind kind,
-                         const Smi& other,
-                         Heap::Space space) const {
-  intptr_t result = 0;
-  const intptr_t left_value = Value();
-  const intptr_t right_value = other.Value();
-  ASSERT(right_value >= 0);
+RawInteger* Integer::ShiftOp(Token::Kind kind,
+                             const Integer& other,
+                             Heap::Space space) const {
+  int64_t a = AsInt64Value();
+  int64_t b = other.AsInt64Value();
+  ASSERT(b >= 0);
   switch (kind) {
-    case Token::kSHL: {
-      if ((left_value == 0) || (right_value == 0)) {
-        return raw();
-      }
-      {  // Check for overflow.
-        int cnt = Utils::BitLength(left_value);
-        if (right_value > (Smi::kBits - cnt)) {
-          return Integer::New(
-              Utils::ShiftLeftWithTruncation(left_value, right_value), space);
-        }
-      }
-      result = left_value << right_value;
-      break;
-    }
-    case Token::kSHR: {
-      const intptr_t shift_amount =
-          (right_value >= kBitsPerWord) ? (kBitsPerWord - 1) : right_value;
-      result = left_value >> shift_amount;
-      break;
-    }
+    case Token::kSHL:
+      return Integer::New(Utils::ShiftLeftWithTruncation(a, b), space);
+    case Token::kSHR:
+      return Integer::New(a >> Utils::Minimum<int64_t>(b, Mint::kBits), space);
     default:
       UNIMPLEMENTED();
+      return Integer::null();
   }
-  ASSERT(Smi::IsValid(result));
-  return Smi::New(result);
 }
 
 bool Smi::Equals(const Instance& other) const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index e09544a..89513ea 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -15,7 +15,7 @@
 #include "vm/globals.h"
 #include "vm/growable_array.h"
 #include "vm/handles.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/json_stream.h"
 #include "vm/os.h"
@@ -6842,6 +6842,9 @@
   RawInteger* BitOp(Token::Kind operation,
                     const Integer& other,
                     Heap::Space space = Heap::kNew) const;
+  RawInteger* ShiftOp(Token::Kind operation,
+                      const Integer& other,
+                      Heap::Space space = Heap::kNew) const;
 
  private:
   OBJECT_IMPLEMENTATION(Integer, Number);
@@ -6895,10 +6898,6 @@
     return (value >= kMinValue) && (value <= kMaxValue);
   }
 
-  RawInteger* ShiftOp(Token::Kind kind,
-                      const Smi& other,
-                      Heap::Space space = Heap::kNew) const;
-
   void operator=(RawSmi* value) {
     raw_ = value;
     CHECK_HANDLE();
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 6686b52..baf1b79 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "include/dart_api.h"
+
 #include "platform/globals.h"
 
 #include "vm/class_finalizer.h"
@@ -4356,7 +4358,9 @@
   EXPECT(result.IsIdenticalTo(expected));
 }
 
-static void CheckIdenticalHashStructure(const Instance& a, const Instance& b) {
+static void CheckIdenticalHashStructure(Thread* T,
+                                        const Instance& a,
+                                        const Instance& b) {
   const char* kScript =
       "(a, b) {\n"
       "  if (a._usedData != b._usedData ||\n"
@@ -4391,7 +4395,8 @@
   param_values.SetAt(1, b);
   name = String::New(kScript);
   Library& lib = Library::Handle(Library::CollectionLibrary());
-  EXPECT(lib.Evaluate(name, param_names, param_values) == Bool::True().raw());
+  EXPECT(Api::UnwrapHandle(TestCase::EvaluateExpression(
+             lib, name, param_names, param_values)) == Bool::True().raw());
 }
 
 TEST_CASE(LinkedHashMap) {
@@ -4419,7 +4424,7 @@
 
   // 3. Expect them to have identical structure.
   TransitionNativeToVM transition(thread);
-  CheckIdenticalHashStructure(dart_map, cc_map);
+  CheckIdenticalHashStructure(thread, dart_map, cc_map);
 }
 
 TEST_CASE(LinkedHashMap_iteration) {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index c2090ec..a7a67b3 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -22,7 +22,8 @@
 #include "vm/growable_array.h"
 #include "vm/handles.h"
 #include "vm/hash_table.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/safepoint.h"
 #include "vm/isolate.h"
 #include "vm/longjump.h"
 #include "vm/native_arguments.h"
@@ -32,7 +33,6 @@
 #include "vm/os.h"
 #include "vm/regexp_assembler.h"
 #include "vm/resolver.h"
-#include "vm/safepoint.h"
 #include "vm/scanner.h"
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index cbe81d8..92833a5 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -4,10 +4,10 @@
 
 #include "vm/raw_object.h"
 
-#include "vm/become.h"
 #include "vm/class_table.h"
 #include "vm/dart.h"
-#include "vm/freelist.h"
+#include "vm/heap/become.h"
+#include "vm/heap/freelist.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/visitor.h"
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index a99794c..9a87566 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -14,6 +14,7 @@
 #include "vm/deopt_instructions.h"
 #include "vm/exceptions.h"
 #include "vm/flags.h"
+#include "vm/heap/verifier.h"
 #include "vm/instructions.h"
 #include "vm/interpreter.h"
 #include "vm/kernel_isolate.h"
@@ -27,7 +28,6 @@
 #include "vm/symbols.h"
 #include "vm/thread_registry.h"
 #include "vm/type_testing_stubs.h"
-#include "vm/verifier.h"
 
 namespace dart {
 
@@ -180,6 +180,10 @@
   const Code& code = Code::Handle(zone, caller_frame->LookupDartCode());
   const uword pc_offset = caller_frame->pc() - code.PayloadStart();
 
+  if (FLAG_shared_slow_path_triggers_gc) {
+    Isolate::Current()->heap()->CollectAllGarbage();
+  }
+
   const CodeSourceMap& map =
       CodeSourceMap::Handle(zone, code.code_source_map());
   ASSERT(!map.IsNull());
@@ -1734,12 +1738,26 @@
   const Code& bytecode = Code::Handle(zone, function.Bytecode());
   Object& result = Object::Handle(zone);
   Interpreter* interpreter = Interpreter::Current();
+#if defined(DEBUG)
+  uword exit_fp = thread->top_exit_frame_info();
+  ASSERT(exit_fp != 0);
+  if (interpreter->IsTracing()) {
+    THR_Print("Interpreting call to %s exit 0x%" Px "\n", function.ToCString(),
+              exit_fp);
+  }
+#endif
   ASSERT(interpreter != NULL);
   {
     TransitionToGenerated transition(thread);
     result = interpreter->Call(bytecode, orig_arguments_desc, orig_arguments,
                                thread);
   }
+#if defined(DEBUG)
+  ASSERT(thread->top_exit_frame_info() == exit_fp);
+  if (interpreter->IsTracing()) {
+    THR_Print("Returning from interpreted function %s\n", function.ToCString());
+  }
+#endif
   if (result.IsError()) {
     if (result.IsLanguageError()) {
       Exceptions::ThrowCompileTimeError(LanguageError::Cast(result));
@@ -1749,7 +1767,7 @@
   }
 #else
   UNREACHABLE();
-#endif
+#endif  // defined(DART_USE_INTERPRETER)
 }
 
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index 86c109d..4dd4935 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -7,9 +7,9 @@
 
 #include "vm/allocation.h"
 #include "vm/flags.h"
+#include "vm/heap/safepoint.h"
 #include "vm/native_arguments.h"
 #include "vm/runtime_entry_list.h"
-#include "vm/safepoint.h"
 #include "vm/tags.h"
 
 namespace dart {
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 9308a89..fc90307 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -15,6 +15,7 @@
 #include "vm/dart_api_state.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
+#include "vm/heap/safepoint.h"
 #include "vm/isolate.h"
 #include "vm/kernel_isolate.h"
 #include "vm/lockers.h"
@@ -33,7 +34,6 @@
 #include "vm/profiler.h"
 #include "vm/profiler_service.h"
 #include "vm/reusable_handles.h"
-#include "vm/safepoint.h"
 #include "vm/service_event.h"
 #include "vm/service_isolate.h"
 #include "vm/source_report.h"
@@ -2435,7 +2435,8 @@
 
 static const MethodParameter* build_expression_evaluation_scope_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
-    new IdParameter("frameIndex", true),
+    new IdParameter("frameIndex", false),
+    new IdParameter("targetId", false),
     NULL,
 };
 
@@ -2457,14 +2458,87 @@
       GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
   const GrowableObjectArray& param_values =
       GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  const GrowableObjectArray& type_params_names =
+      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+  String& klass_name = String::Handle(zone);
+  String& library_uri = String::Handle(zone);
+  bool isStatic = false;
+
   if (BuildScope(thread, js, param_names, param_values)) {
     return true;
   }
 
-  ActivationFrame* frame = stack->FrameAt(framePos);
-  const GrowableObjectArray& type_params_names =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  frame->BuildParameters(param_names, param_values, type_params_names);
+  if (js->HasParam("frameIndex")) {
+    // building scope in the context of a given frame
+    DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
+    intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
+    if (framePos >= stack->Length()) {
+      PrintInvalidParamError(js, "frameIndex");
+      return true;
+    }
+
+    ActivationFrame* frame = stack->FrameAt(framePos);
+    frame->BuildParameters(param_names, param_values, type_params_names);
+
+    if (frame->function().is_static()) {
+      const Class& cls = Class::Handle(zone, frame->function().Owner());
+      if (!cls.IsTopLevel()) {
+        klass_name ^= cls.UserVisibleName();
+      }
+      library_uri ^= Library::Handle(zone, cls.library()).url();
+      isStatic = !cls.IsTopLevel();
+    } else {
+      const Class& method_cls = Class::Handle(zone, frame->function().origin());
+      library_uri ^= Library::Handle(zone, method_cls.library()).url();
+      klass_name ^= method_cls.UserVisibleName();
+    }
+  } else {
+    // building scope in the context of a given object
+    if (!js->HasParam("targetId")) {
+      js->PrintError(kInvalidParams,
+                     "Either targetId or frameIndex has to be provided.");
+      return true;
+    }
+    const char* target_id = js->LookupParam("targetId");
+
+    ObjectIdRing::LookupResult lookup_result;
+    Object& obj = Object::Handle(
+        zone, LookupHeapObject(thread, target_id, &lookup_result));
+    if (obj.raw() == Object::sentinel().raw()) {
+      PrintInvalidParamError(js, "targetId");
+      return true;
+    }
+    if (obj.IsLibrary()) {
+      const Library& lib = Library::Cast(obj);
+      library_uri ^= lib.url();
+    } else if (obj.IsClass() || ((obj.IsInstance() || obj.IsNull()) &&
+                                 !ContainsNonInstance(obj))) {
+      Class& cls = Class::Handle(zone);
+      if (obj.IsClass()) {
+        cls ^= obj.raw();
+      } else {
+        Instance& instance = Instance::Handle(zone);
+        instance ^= obj.raw();
+        cls ^= instance.clazz();
+      }
+      if (cls.id() < kInstanceCid || cls.id() == kTypeArgumentsCid) {
+        js->PrintError(
+            kInvalidParams,
+            "Expressions can be evaluated only with regular Dart instances");
+        return true;
+      }
+
+      if (!cls.IsTopLevel()) {
+        klass_name ^= cls.UserVisibleName();
+      }
+      library_uri ^= Library::Handle(zone, cls.library()).url();
+    } else {
+      js->PrintError(kInvalidParams,
+                     "%s: invalid 'targetId' parameter: "
+                     "Cannot evaluate against a VM-internal object",
+                     js->method());
+    }
+  }
 
   JSONObject report(js);
   {
@@ -2485,21 +2559,6 @@
       jsonTypeParamsNames.AddValue(type_param_name.ToCString());
     }
   }
-  String& klass_name = String::Handle(zone);
-  String& library_uri = String::Handle(zone);
-  bool isStatic = false;
-  if (frame->function().is_static()) {
-    const Class& cls = Class::Handle(zone, frame->function().Owner());
-    if (!cls.IsTopLevel()) {
-      klass_name ^= cls.UserVisibleName();
-    }
-    library_uri ^= Library::Handle(zone, cls.library()).url();
-    isStatic = !cls.IsTopLevel();
-  } else {
-    const Class& method_cls = Class::Handle(zone, frame->function().origin());
-    library_uri ^= Library::Handle(zone, method_cls.library()).url();
-    klass_name ^= method_cls.UserVisibleName();
-  }
   report.AddProperty("libraryUri", library_uri.ToCString());
   if (!klass_name.IsNull()) {
     report.AddProperty("klass", klass_name.ToCString());
@@ -2622,7 +2681,8 @@
 
 static const MethodParameter* evaluate_compiled_expression_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
-    new UIntParameter("frameIndex", true),
+    new UIntParameter("frameIndex", false),
+    new IdParameter("targetId", false),
     new StringParameter("kernelBytes", true),
     NULL,
 };
@@ -2647,26 +2707,102 @@
   if (BuildScope(thread, js, param_names, param_values)) {
     return true;
   }
-
-  ActivationFrame* frame = stack->FrameAt(frame_pos);
   const GrowableObjectArray& type_params_names =
       GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  TypeArguments& type_arguments = TypeArguments::Handle(
-      zone,
-      frame->BuildParameters(param_names, param_values, type_params_names));
 
   intptr_t kernel_length;
   const char* kernel_bytes_str = js->LookupParam("kernelBytes");
   uint8_t* kernel_bytes = DecodeBase64(zone, kernel_bytes_str, &kernel_length);
 
-  const Object& result = Object::Handle(
-      zone, frame->EvaluateCompiledExpression(
-                kernel_bytes, kernel_length,
-                Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
-                Array::Handle(zone, Array::MakeFixedLength(param_values)),
-                type_arguments));
-  result.PrintJSON(js, true);
-  return true;
+  if (js->HasParam("frameIndex")) {
+    DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
+    intptr_t frame_pos = UIntParameter::Parse(js->LookupParam("frameIndex"));
+    if (frame_pos >= stack->Length()) {
+      PrintInvalidParamError(js, "frameIndex");
+      return true;
+    }
+
+    ActivationFrame* frame = stack->FrameAt(frame_pos);
+    TypeArguments& type_arguments = TypeArguments::Handle(
+        zone,
+        frame->BuildParameters(param_names, param_values, type_params_names));
+
+    const Object& result = Object::Handle(
+        zone,
+        frame->EvaluateCompiledExpression(
+            kernel_bytes, kernel_length,
+            Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
+            Array::Handle(zone, Array::MakeFixedLength(param_values)),
+            type_arguments));
+    result.PrintJSON(js, true);
+    return true;
+  } else {
+    // evaluating expression in the context of a given object
+    if (!js->HasParam("targetId")) {
+      js->PrintError(kInvalidParams,
+                     "Either targetId or frameIndex has to be provided.");
+      return true;
+    }
+    const char* target_id = js->LookupParam("targetId");
+    ObjectIdRing::LookupResult lookup_result;
+    Object& obj = Object::Handle(
+        zone, LookupHeapObject(thread, target_id, &lookup_result));
+    if (obj.raw() == Object::sentinel().raw()) {
+      if (lookup_result == ObjectIdRing::kCollected) {
+        PrintSentinel(js, kCollectedSentinel);
+      } else if (lookup_result == ObjectIdRing::kExpired) {
+        PrintSentinel(js, kExpiredSentinel);
+      } else {
+        PrintInvalidParamError(js, "targetId");
+      }
+      return true;
+    }
+    TypeArguments& type_arguments = TypeArguments::Handle(zone);
+    if (obj.IsLibrary()) {
+      const Library& lib = Library::Cast(obj);
+      const Object& result = Object::Handle(
+          zone,
+          lib.EvaluateCompiledExpression(
+              kernel_bytes, kernel_length,
+              Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
+              Array::Handle(zone, Array::MakeFixedLength(param_values)),
+              type_arguments));
+      result.PrintJSON(js, true);
+      return true;
+    }
+    if (obj.IsClass()) {
+      const Class& cls = Class::Cast(obj);
+      const Object& result = Object::Handle(
+          zone,
+          cls.EvaluateCompiledExpression(
+              kernel_bytes, kernel_length,
+              Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
+              Array::Handle(zone, Array::MakeFixedLength(param_values)),
+              type_arguments));
+      result.PrintJSON(js, true);
+      return true;
+    }
+    if ((obj.IsInstance() || obj.IsNull()) && !ContainsNonInstance(obj)) {
+      // We don't use Instance::Cast here because it doesn't allow null.
+      Instance& instance = Instance::Handle(zone);
+      instance ^= obj.raw();
+      const Class& receiver_cls = Class::Handle(zone, instance.clazz());
+      const Object& result = Object::Handle(
+          zone,
+          instance.EvaluateCompiledExpression(
+              receiver_cls, kernel_bytes, kernel_length,
+              Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
+              Array::Handle(zone, Array::MakeFixedLength(param_values)),
+              type_arguments));
+      result.PrintJSON(js, true);
+      return true;
+    }
+    js->PrintError(kInvalidParams,
+                   "%s: invalid 'targetId' parameter: "
+                   "Cannot evaluate against a VM-internal object",
+                   js->method());
+    return true;
+  }
 }
 
 static const MethodParameter* evaluate_in_frame_params[] = {
diff --git a/runtime/vm/service_event.h b/runtime/vm/service_event.h
index d0db082..2a267f9 100644
--- a/runtime/vm/service_event.h
+++ b/runtime/vm/service_event.h
@@ -6,7 +6,7 @@
 #define RUNTIME_VM_SERVICE_EVENT_H_
 
 #include "vm/globals.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 
 namespace dart {
 
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 3a53ad4..7291161 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -10,12 +10,12 @@
 #include "vm/debugger.h"
 #include "vm/debugger_api_impl_test.h"
 #include "vm/globals.h"
+#include "vm/heap/safepoint.h"
 #include "vm/message_handler.h"
 #include "vm/object_id_ring.h"
 #include "vm/os.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
-#include "vm/safepoint.h"
 #include "vm/service.h"
 #include "vm/unit_test.h"
 
@@ -76,7 +76,7 @@
 
 static RawArray* Eval(Dart_Handle lib, const char* expr) {
   const String& dummy_isolate_id = String::Handle(String::New("isolateId"));
-  Dart_Handle expr_val = Dart_EvaluateExpr(lib, NewString(expr));
+  Dart_Handle expr_val = Dart_EvaluateStaticExpr(lib, NewString(expr));
   EXPECT_VALID(expr_val);
   Zone* zone = Thread::Current()->zone();
   const GrowableObjectArray& value =
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 21d5e11..9c0e5b6 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -3947,6 +3947,8 @@
     RawObject* raw_exception = thread->active_exception();
     RawObject* raw_stacktrace = thread->active_stacktrace();
     ASSERT(raw_exception != Object::null());
+    thread->set_active_exception(Object::null_object());
+    thread->set_active_stacktrace(Object::null_object());
     special_[kExceptionSpecialIndex] = raw_exception;
     special_[kStackTraceSpecialIndex] = raw_stacktrace;
     pc_ = thread->resume_pc();
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 5f97708..26fe952 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -9,7 +9,7 @@
 #include "vm/class_finalizer.h"
 #include "vm/dart.h"
 #include "vm/exceptions.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/longjump.h"
 #include "vm/message.h"
 #include "vm/object.h"
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 63e6fb4..940b83c 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -5,9 +5,9 @@
 #include "vm/stack_frame.h"
 
 #include "platform/memory_sanitizer.h"
-#include "vm/become.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/deopt_instructions.h"
+#include "vm/heap/become.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index 6facc4f..896c8bd 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -9,9 +9,9 @@
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
+#include "vm/heap/verifier.h"
 #include "vm/resolver.h"
 #include "vm/unit_test.h"
-#include "vm/verifier.h"
 #include "vm/zone.h"
 
 namespace dart {
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 05baaee..4069e998 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -10,8 +10,8 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/flags.h"
+#include "vm/heap/safepoint.h"
 #include "vm/object_store.h"
-#include "vm/safepoint.h"
 #include "vm/snapshot.h"
 #include "vm/virtual_memory.h"
 #include "vm/visitor.h"
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 1f836fb..99dd71b 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -77,7 +77,9 @@
   V(LazySpecializeTypeTest)                                                    \
   V(CallClosureNoSuchMethod)                                                   \
   V(FrameAwaitingMaterialization)                                              \
-  V(AsynchronousGapMarker)
+  V(AsynchronousGapMarker)                                                     \
+  V(NullErrorSharedWithFPURegs)                                                \
+  V(NullErrorSharedWithoutFPURegs)
 
 #else
 #define VM_STUB_CODE_LIST(V)                                                   \
@@ -200,6 +202,9 @@
   static RawCode* Generate(const char* name,
                            void (*GenerateStub)(Assembler* assembler));
 
+  static void GenerateNullErrorShared(Assembler* assembler,
+                                      bool save_fpu_registers);
+
   static void GenerateMegamorphicMissStub(Assembler* assembler);
   static void GenerateAllocationStubForClass(Assembler* assembler,
                                              const Class& cls);
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 70e9cb6..37aa4b6 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -11,7 +11,7 @@
 #include "vm/compiler/jit/compiler.h"
 #include "vm/cpu.h"
 #include "vm/dart_entry.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/instructions.h"
 #include "vm/isolate.h"
 #include "vm/object_store.h"
@@ -102,9 +102,26 @@
   __ StoreToOffset(kWord, R2, THR, Thread::top_exit_frame_info_offset());
 
   __ LeaveStubFrame();
+
+  // The following return can jump to a lazy-deopt stub, which assumes R0
+  // contains a return value and will save it in a GC-visible way.  We therefore
+  // have to ensure R0 does not contain any garbage value left from the C
+  // function we called (which has return type "void").
+  // (See GenerateDeoptimizationSequence::saved_result_slot_from_fp.)
+  __ LoadImmediate(R0, 0);
   __ Ret();
 }
 
+void StubCode::GenerateNullErrorSharedWithoutFPURegsStub(Assembler* assembler) {
+  // TODO(sjindel): implement.
+  __ Breakpoint();
+}
+
+void StubCode::GenerateNullErrorSharedWithFPURegsStub(Assembler* assembler) {
+  // TODO(sjindel): implement.
+  __ Breakpoint();
+}
+
 // Input parameters:
 //   R0 : stop message (const char*).
 // Must preserve all registers.
@@ -1677,6 +1694,8 @@
   __ PopList((1 << R4) | (1 << R9));  // Restore arg desc. and IC data.
   __ LeaveStubFrame();
 
+  // When using the interpreter, the function's code may now point to the
+  // InterpretCall stub. Make sure R0, R4, and R9 are preserved.
   __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(R2, FieldAddress(R0, Function::entry_point_offset()));
   __ bx(R2);
@@ -2121,7 +2140,10 @@
 // Does not return.
 void StubCode::GenerateRunExceptionHandlerStub(Assembler* assembler) {
   __ LoadFromOffset(kWord, LR, THR, Thread::resume_pc_offset());
-  __ LoadImmediate(R2, 0);
+
+  ASSERT(Thread::CanLoadFromThread(Object::null_object()));
+  __ LoadFromOffset(kWord, R2, THR,
+                    Thread::OffsetFromThread(Object::null_object()));
 
   // Exception object.
   __ LoadFromOffset(kWord, R0, THR, Thread::active_exception_offset());
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index b7c6f15..647ae0b 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -9,7 +9,7 @@
 #include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/instructions.h"
 #include "vm/object_store.h"
 #include "vm/runtime_entry.h"
@@ -121,9 +121,24 @@
   __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset());
 
   __ LeaveStubFrame();
+
+  // The following return can jump to a lazy-deopt stub, which assumes R0
+  // contains a return value and will save it in a GC-visible way.  We therefore
+  // have to ensure R0 does not contain any garbage value left from the C
+  // function we called (which has return type "void").
+  // (See GenerateDeoptimizationSequence::saved_result_slot_from_fp.)
+  __ LoadImmediate(R0, 0);
   __ ret();
 }
 
+void StubCode::GenerateNullErrorSharedWithoutFPURegsStub(Assembler* assembler) {
+  __ Breakpoint();
+}
+
+void StubCode::GenerateNullErrorSharedWithFPURegsStub(Assembler* assembler) {
+  __ Breakpoint();
+}
+
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ Stop("GeneratePrintStopMessageStub");
 }
@@ -1724,6 +1739,8 @@
   __ Pop(R5);  // Restore IC Data.
   __ LeaveStubFrame();
 
+  // When using the interpreter, the function's code may now point to the
+  // InterpretCall stub. Make sure R0, R4, and R5 are preserved.
   __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
   __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
   __ br(R2);
@@ -2171,7 +2188,9 @@
 // Does not return.
 void StubCode::GenerateRunExceptionHandlerStub(Assembler* assembler) {
   __ LoadFromOffset(LR, THR, Thread::resume_pc_offset());
-  __ LoadImmediate(R2, 0);
+
+  ASSERT(Thread::CanLoadFromThread(Object::null_object()));
+  __ LoadFromOffset(R2, THR, Thread::OffsetFromThread(Object::null_object()));
 
   // Exception object.
   __ LoadFromOffset(R0, THR, Thread::active_exception_offset());
diff --git a/runtime/vm/stub_code_dbc.cc b/runtime/vm/stub_code_dbc.cc
index 130e4f8..a6e6a76 100644
--- a/runtime/vm/stub_code_dbc.cc
+++ b/runtime/vm/stub_code_dbc.cc
@@ -10,7 +10,7 @@
 #include "vm/compiler/jit/compiler.h"
 #include "vm/cpu.h"
 #include "vm/dart_entry.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/instructions.h"
 #include "vm/object_store.h"
 #include "vm/runtime_entry.h"
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index bae80ce..bdc494b 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -9,11 +9,11 @@
 #include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/scavenger.h"
 #include "vm/instructions.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
-#include "vm/scavenger.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/tags.h"
@@ -89,9 +89,24 @@
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveFrame();
+
+  // The following return can jump to a lazy-deopt stub, which assumes EAX
+  // contains a return value and will save it in a GC-visible way.  We therefore
+  // have to ensure EAX does not contain any garbage value left from the C
+  // function we called (which has return type "void").
+  // (See GenerateDeoptimizationSequence::saved_result_slot_from_fp.)
+  __ xorl(EAX, EAX);
   __ ret();
 }
 
+void StubCode::GenerateNullErrorSharedWithoutFPURegsStub(Assembler* assembler) {
+  __ Breakpoint();
+}
+
+void StubCode::GenerateNullErrorSharedWithFPURegsStub(Assembler* assembler) {
+  __ Breakpoint();
+}
+
 // Input parameters:
 //   ESP : points to return address.
 //   EAX : stop message (const char*).
@@ -1606,8 +1621,10 @@
   __ popl(EDX);  // Restore arguments descriptor array.
   __ LeaveFrame();
 
-  __ movl(EAX, FieldAddress(EAX, Function::entry_point_offset()));
-  __ jmp(EAX);
+  // When using the interpreter, the function's code may now point to the
+  // InterpretCall stub. Make sure EAX, ECX, and EDX are preserved.
+  __ movl(EBX, FieldAddress(EAX, Function::entry_point_offset()));
+  __ jmp(EBX);
 }
 
 void StubCode::GenerateInterpretCallStub(Assembler* assembler) {
@@ -1853,15 +1870,18 @@
   ASSERT(kStackTraceObjectReg == EDX);
   __ movl(EBX, Address(THR, Thread::resume_pc_offset()));
 
+  ASSERT(Thread::CanLoadFromThread(Object::null_object()));
+  __ movl(ECX, Address(THR, Thread::OffsetFromThread(Object::null_object())));
+
   // Load the exception from the current thread.
   Address exception_addr(THR, Thread::active_exception_offset());
   __ movl(kExceptionObjectReg, exception_addr);
-  __ movl(exception_addr, Immediate(0));
+  __ movl(exception_addr, ECX);
 
   // Load the stacktrace from the current thread.
   Address stacktrace_addr(THR, Thread::active_stacktrace_offset());
   __ movl(kStackTraceObjectReg, stacktrace_addr);
-  __ movl(stacktrace_addr, Immediate(0));
+  __ movl(stacktrace_addr, ECX);
 
   __ jmp(EBX);  // Jump to continuation point.
 }
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 532a4ea..111357c 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -12,12 +12,13 @@
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/jit/compiler.h"
+#include "vm/constants_x64.h"
 #include "vm/dart_entry.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/scavenger.h"
 #include "vm/instructions.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
-#include "vm/scavenger.h"
 #include "vm/stack_frame.h"
 #include "vm/tags.h"
 #include "vm/type_testing_stubs.h"
@@ -97,9 +98,59 @@
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveStubFrame();
+
+  // The following return can jump to a lazy-deopt stub, which assumes RAX
+  // contains a return value and will save it in a GC-visible way.  We therefore
+  // have to ensure RAX does not contain any garbage value left from the C
+  // function we called (which has return type "void").
+  // (See GenerateDeoptimizationSequence::saved_result_slot_from_fp.)
+  __ xorq(RAX, RAX);
   __ ret();
 }
 
+void StubCode::GenerateNullErrorShared(Assembler* assembler,
+                                       bool save_fpu_registers) {
+  // We want the saved registers to appear like part of the caller's frame, so
+  // we push them before calling EnterStubFrame.
+  __ PushRegisters(kDartAvailableCpuRegs,
+                   save_fpu_registers ? kAllFpuRegistersList : 0);
+
+  const intptr_t kSavedCpuRegisterSlots =
+      Utils::CountOneBitsWord(kDartAvailableCpuRegs);
+
+  const intptr_t kSavedFpuRegisterSlots =
+      save_fpu_registers ? kNumberOfFpuRegisters * kFpuRegisterSize / kWordSize
+                         : 0;
+
+  const intptr_t kAllSavedRegistersSlots =
+      kSavedCpuRegisterSlots + kSavedFpuRegisterSlots;
+
+  // Copy down the return address so the stack layout is correct.
+  __ pushq(Address(RSP, kAllSavedRegistersSlots * kWordSize));
+
+  const intptr_t stub_offset =
+      save_fpu_registers
+          ? Thread::null_error_shared_with_fpu_regs_stub_offset()
+          : Thread::null_error_shared_without_fpu_regs_stub_offset();
+  __ movq(CODE_REG, Address(THR, stub_offset));
+
+  __ EnterStubFrame();
+
+  __ movq(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
+  __ movq(RBX, Address(THR, Thread::OffsetFromThread(&kNullErrorRuntimeEntry)));
+  __ movq(R10, Immediate(/*argument_count=*/0));
+  __ call(Address(THR, Thread::call_to_runtime_entry_point_offset()));
+  __ Breakpoint();
+}
+
+void StubCode::GenerateNullErrorSharedWithoutFPURegsStub(Assembler* assembler) {
+  GenerateNullErrorShared(assembler, false);
+}
+
+void StubCode::GenerateNullErrorSharedWithFPURegsStub(Assembler* assembler) {
+  GenerateNullErrorShared(assembler, true);
+}
+
 // Input parameters:
 //   RSP : points to return address.
 //   RDI : stop message (const char*).
@@ -791,8 +842,8 @@
   __ movq(RAX, Address(THR, Thread::top_exit_frame_info_offset()));
   __ pushq(RAX);
 
-  // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
-  // code below.
+// The constant kExitLinkSlotFromEntryFp must be kept in sync with the
+// code below.
 #if defined(DEBUG)
   {
     Label ok;
@@ -930,8 +981,8 @@
   __ movq(RAX, Address(THR, Thread::top_exit_frame_info_offset()));
   __ pushq(RAX);
 
-  // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
-  // code below.
+// The constant kExitLinkSlotFromEntryFp must be kept in sync with the
+// code below.
 #if defined(DEBUG)
   {
     Label ok;
@@ -1815,14 +1866,41 @@
 // RAX: Function.
 void StubCode::GenerateInterpretCallStub(Assembler* assembler) {
 #if defined(DART_USE_INTERPRETER)
+  const intptr_t thread_offset = NativeArguments::thread_offset();
+  const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
+  const intptr_t argv_offset = NativeArguments::argv_offset();
+  const intptr_t retval_offset = NativeArguments::retval_offset();
+
   __ EnterStubFrame();
-  __ movq(RDI, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to Dart VM C++ code.
+  __ movq(Address(THR, Thread::top_exit_frame_info_offset()), RBP);
+
+#if defined(DEBUG)
+  {
+    Label ok;
+    // Check that we are always entering from Dart code.
+    __ movq(R8, Immediate(VMTag::kDartTagId));
+    __ cmpq(R8, Assembler::VMTagAddress());
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the thread is executing VM code.
+  __ movq(RCX, Immediate(kInterpretCallRuntimeEntry.GetEntryPoint()));
+  __ movq(Assembler::VMTagAddress(), RCX);
+
+  // Push result and first 3 arguments of the interpreted function call.
   __ pushq(Immediate(0));  // Setup space on stack for result.
   __ pushq(RAX);           // Function.
   __ pushq(RBX);           // ICData/MegamorphicCache.
   __ pushq(R10);           // Arguments descriptor array.
 
   // Adjust arguments count.
+  __ movq(RDI, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   __ cmpq(FieldAddress(R10, ArgumentsDescriptor::type_args_len_offset()),
           Immediate(0));
   __ movq(R10, RDI);
@@ -1831,12 +1909,43 @@
   __ addq(R10, Immediate(Smi::RawValue(1)));  // Include the type arguments.
   __ Bind(&args_count_ok);
 
+  // Push 4th Dart argument of the interpreted function call.
   // R10: Smi-tagged arguments array length.
   PushArrayOfArguments(assembler);
   const intptr_t kNumArgs = 4;
-  __ CallRuntime(kInterpretCallRuntimeEntry, kNumArgs);
-  __ Drop(kNumArgs);
-  __ popq(RAX);  // Return value.
+
+  // Set callee-saved RBX to point to first one of the 4 Dart arguments.
+  __ leaq(RBX, Address(RSP, (kNumArgs - 1) * kWordSize));
+
+  // Reserve space for native args and align frame before entering C++ world.
+  __ subq(RSP, Immediate(sizeof(NativeArguments)));
+  if (OS::ActivationFrameAlignment() > 1) {
+    __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+  }
+
+  // Pass NativeArguments structure by value and call runtime.
+  __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
+  __ movq(Address(RSP, argc_tag_offset), Immediate(kNumArgs));  // Set argc.
+  // Compute argv.
+  __ movq(Address(RSP, argv_offset), RBX);    // Set argv in NativeArguments.
+  __ addq(RBX, Immediate(1 * kWordSize));     // Retval is next to 1st argument.
+  __ movq(Address(RSP, retval_offset), RBX);  // Set retval in NativeArguments.
+#if defined(_WIN64)
+  ASSERT(sizeof(NativeArguments) > CallingConventions::kRegisterTransferLimit);
+  __ movq(CallingConventions::kArg1Reg, RSP);
+#endif
+  __ movq(RCX, Immediate(kInterpretCallRuntimeEntry.GetEntryPoint()));
+  __ CallCFunction(RCX);
+
+  // Mark that the thread is executing Dart code.
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+
+  // Reset exit frame information in Isolate structure.
+  __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
+
+  // Load result of interpreted function call into RAX.
+  __ movq(RAX, Address(RBX, 0));
+
   __ LeaveStubFrame();
   __ ret();
 #else
@@ -2282,15 +2391,18 @@
   __ movq(CallingConventions::kArg1Reg,
           Address(THR, Thread::resume_pc_offset()));
 
+  ASSERT(Thread::CanLoadFromThread(Object::null_object()));
+  __ movq(TMP, Address(THR, Thread::OffsetFromThread(Object::null_object())));
+
   // Load the exception from the current thread.
   Address exception_addr(THR, Thread::active_exception_offset());
   __ movq(kExceptionObjectReg, exception_addr);
-  __ movq(exception_addr, Immediate(0));
+  __ movq(exception_addr, TMP);
 
   // Load the stacktrace from the current thread.
   Address stacktrace_addr(THR, Thread::active_stacktrace_offset());
   __ movq(kStackTraceObjectReg, stacktrace_addr);
-  __ movq(stacktrace_addr, Immediate(0));
+  __ movq(stacktrace_addr, TMP);
 
   __ jmp(CallingConventions::kArg1Reg);  // Jump to continuation point.
 }
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 62d93a8..5d62829 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -248,7 +248,6 @@
 }
 
 void Thread::set_active_exception(const Object& value) {
-  ASSERT(!value.IsNull());
   active_exception_ = value.raw();
 }
 
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index d524b9d..eb81ca54 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -12,9 +12,9 @@
 #include "vm/bitfield.h"
 #include "vm/globals.h"
 #include "vm/handles.h"
+#include "vm/heap/store_buffer.h"
 #include "vm/os_thread.h"
 #include "vm/runtime_entry_list.h"
-#include "vm/store_buffer.h"
 
 namespace dart {
 
@@ -94,6 +94,10 @@
     StubCode::InvokeDartCodeFromBytecode_entry()->code(), NULL)                \
   V(RawCode*, call_to_runtime_stub_, StubCode::CallToRuntime_entry()->code(),  \
     NULL)                                                                      \
+  V(RawCode*, null_error_shared_without_fpu_regs_stub_,                        \
+    StubCode::NullErrorSharedWithoutFPURegs_entry()->code(), NULL)             \
+  V(RawCode*, null_error_shared_with_fpu_regs_stub_,                           \
+    StubCode::NullErrorSharedWithFPURegs_entry()->code(), NULL)                \
   V(RawCode*, monomorphic_miss_stub_,                                          \
     StubCode::MonomorphicMiss_entry()->code(), NULL)                           \
   V(RawCode*, ic_lookup_through_code_stub_,                                    \
@@ -134,6 +138,10 @@
     StubCode::UpdateStoreBuffer_entry()->EntryPoint(), 0)                      \
   V(uword, call_to_runtime_entry_point_,                                       \
     StubCode::CallToRuntime_entry()->EntryPoint(), 0)                          \
+  V(uword, null_error_shared_without_fpu_regs_entry_point_,                    \
+    StubCode::NullErrorSharedWithoutFPURegs_entry()->EntryPoint(), 0)          \
+  V(uword, null_error_shared_with_fpu_regs_entry_point_,                       \
+    StubCode::NullErrorSharedWithFPURegs_entry()->EntryPoint(), 0)             \
   V(uword, megamorphic_call_checked_entry_,                                    \
     StubCode::MegamorphicCall_entry()->EntryPoint(), 0)                        \
   V(uword, monomorphic_miss_entry_,                                            \
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index e4155eb..92e04a1 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/assert.h"
+#include "vm/heap/safepoint.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/profiler.h"
-#include "vm/safepoint.h"
 #include "vm/stack_frame.h"
 #include "vm/thread_pool.h"
 #include "vm/unit_test.h"
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 7e3cd7a..836fa3f 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -689,6 +689,40 @@
   return Api::Success();
 }
 
+Dart_Handle TestCase::EvaluateExpression(const Library& lib,
+                                         const String& expr,
+                                         const Array& param_names,
+                                         const Array& param_values) {
+  Thread* thread = Thread::Current();
+
+  Object& val = Object::Handle();
+  if (!KernelIsolate::IsRunning()) {
+    val = lib.Evaluate(expr, param_names, param_values);
+  } else {
+    Dart_KernelCompilationResult compilation_result;
+    {
+      TransitionVMToNative transition(thread);
+      compilation_result = KernelIsolate::CompileExpressionToKernel(
+          expr.ToCString(), param_names, Array::empty_array(),
+          String::Handle(lib.url()).ToCString(), /* klass=*/nullptr,
+          /* is_static= */ false);
+    }
+    if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+      return Dart_NewApiError(compilation_result.error);
+    }
+
+    const uint8_t* kernel_bytes = compilation_result.kernel;
+    intptr_t kernel_length = compilation_result.kernel_size;
+
+    val = lib.EvaluateCompiledExpression(kernel_bytes, kernel_length,
+                                         Array::empty_array(), param_values,
+                                         TypeArguments::null_type_arguments());
+
+    free(const_cast<uint8_t*>(kernel_bytes));
+  }
+  return Api::NewHandle(thread, val.raw());
+}
+
 #if !defined(PRODUCT)
 static bool IsHex(int c) {
   return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f');
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index ee2c328..5dd5122 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -13,7 +13,7 @@
 #include "vm/dart.h"
 #include "vm/dart_api_state.h"
 #include "vm/globals.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/isolate.h"
 #include "vm/longjump.h"
 #include "vm/object.h"
@@ -350,6 +350,11 @@
   static Dart_Handle LoadCoreTestScript(const char* script,
                                         Dart_NativeEntryResolver resolver);
 
+  static Dart_Handle EvaluateExpression(const Library& lib,
+                                        const String& expr,
+                                        const Array& param_names,
+                                        const Array& param_values);
+
   static Dart_Handle lib();
   static const char* url();
   static Dart_Isolate CreateTestIsolateFromSnapshot(uint8_t* buffer,
diff --git a/runtime/vm/virtual_memory_test.cc b/runtime/vm/virtual_memory_test.cc
index 7d725d0..9454ecf 100644
--- a/runtime/vm/virtual_memory_test.cc
+++ b/runtime/vm/virtual_memory_test.cc
@@ -4,7 +4,7 @@
 
 #include "vm/virtual_memory.h"
 #include "platform/assert.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/unit_test.h"
 
 namespace dart {
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index d227772..93d8ac3 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -16,8 +16,6 @@
   "base64.cc",
   "base64.h",
   "base_isolate.h",
-  "become.cc",
-  "become.h",
   "bit_vector.cc",
   "bit_vector.h",
   "bitfield.h",
@@ -102,14 +100,6 @@
   "flag_list.h",
   "flags.cc",
   "flags.h",
-  "freelist.cc",
-  "freelist.h",
-  "gc_compactor.cc",
-  "gc_compactor.h",
-  "gc_marker.cc",
-  "gc_marker.h",
-  "gc_sweeper.cc",
-  "gc_sweeper.h",
   "gdb_helpers.cc",
   "globals.h",
   "growable_array.h",
@@ -118,8 +108,6 @@
   "handles_impl.h",
   "hash_map.h",
   "hash_table.h",
-  "heap.cc",
-  "heap.h",
   "image_snapshot.cc",
   "image_snapshot.h",
   "instructions.h",
@@ -215,8 +203,6 @@
   "os_thread_win.cc",
   "os_thread_win.h",
   "os_win.cc",
-  "pages.cc",
-  "pages.h",
   "parser.cc",
   "parser.h",
   "port.cc",
@@ -264,12 +250,8 @@
   "runtime_entry_ia32.cc",
   "runtime_entry_list.h",
   "runtime_entry_x64.cc",
-  "safepoint.cc",
-  "safepoint.h",
   "scanner.cc",
   "scanner.h",
-  "scavenger.cc",
-  "scavenger.h",
   "scope_timer.h",
   "scopes.cc",
   "scopes.h",
@@ -297,7 +279,6 @@
   "snapshot_ids.h",
   "source_report.cc",
   "source_report.h",
-  "spaces.h",
   "stack_frame.cc",
   "stack_frame.h",
   "stack_frame_arm.h",
@@ -308,8 +289,6 @@
   "stack_frame_x64.h",
   "stack_trace.cc",
   "stack_trace.h",
-  "store_buffer.cc",
-  "store_buffer.h",
   "stub_code.cc",
   "stub_code.h",
   "stub_code_arm.cc",
@@ -359,8 +338,6 @@
   "unicode_data.cc",
   "uri.cc",
   "uri.h",
-  "verifier.cc",
-  "verifier.h",
   "virtual_memory.cc",
   "virtual_memory.h",
   "virtual_memory_android.cc",
@@ -369,10 +346,6 @@
   "virtual_memory_macos.cc",
   "virtual_memory_win.cc",
   "visitor.h",
-  "weak_code.cc",
-  "weak_code.h",
-  "weak_table.cc",
-  "weak_table.h",
   "zone.cc",
   "zone.h",
   "zone_text_buffer.cc",
@@ -385,9 +358,9 @@
   "ast_printer_test.cc",
   "ast_test.cc",
   "atomic_test.cc",
+  "base64_test.cc",
   "benchmark_test.cc",
   "benchmark_test.h",
-  "base64_test.cc",
   "bit_set_test.cc",
   "bit_vector_test.cc",
   "bitfield_test.cc",
@@ -410,13 +383,11 @@
   "find_code_object_test.cc",
   "fixed_cache_test.cc",
   "flags_test.cc",
-  "freelist_test.cc",
   "growable_array_test.cc",
   "guard_field_test.cc",
   "handles_test.cc",
   "hash_map_test.cc",
   "hash_table_test.cc",
-  "heap_test.cc",
   "instructions_arm64_test.cc",
   "instructions_arm_test.cc",
   "instructions_ia32_test.cc",
@@ -444,7 +415,6 @@
   "object_test.cc",
   "object_x64_test.cc",
   "os_test.cc",
-  "pages_test.cc",
   "parser_test.cc",
   "port_test.cc",
   "profiler_test.cc",
@@ -452,7 +422,6 @@
   "resolver_test.cc",
   "ring_buffer_test.cc",
   "scanner_test.cc",
-  "scavenger_test.cc",
   "scopes_test.cc",
   "service_test.cc",
   "snapshot_test.cc",
diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
index ef35be1..313e452 100644
--- a/runtime/vm/zone.cc
+++ b/runtime/vm/zone.cc
@@ -9,7 +9,7 @@
 #include "vm/dart_api_state.h"
 #include "vm/flags.h"
 #include "vm/handles_impl.h"
-#include "vm/heap.h"
+#include "vm/heap/heap.h"
 #include "vm/os.h"
 
 namespace dart {
diff --git a/samples/sample_extension/test/sample_extension_test_helper.dart b/samples/sample_extension/test/sample_extension_test_helper.dart
index 6141a88..72819b9 100644
--- a/samples/sample_extension/test/sample_extension_test_helper.dart
+++ b/samples/sample_extension/test/sample_extension_test_helper.dart
@@ -73,11 +73,16 @@
         snapshot = script;
       } else {
         snapshot = join(testDirectory, "$test.snapshot");
-        await run(Platform.executable,
-            ['--snapshot=$snapshot', '--snapshot-kind=$snapshotKind', script]);
+        List<String> args = new List<String>.from(Platform.executableArguments);
+        args.add('--snapshot=$snapshot');
+        args.add('--snapshot-kind=$snapshotKind');
+        args.add(script);
+        await run(Platform.executable, args);
       }
 
-      await run(Platform.executable, [snapshot]);
+      List<String> args = new List<String>.from(Platform.executableArguments);
+      args.add(snapshot);
+      await run(Platform.executable, args);
     }
   } finally {
     await tempDirectory.deleteSync(recursive: true);
diff --git a/samples/samples.status b/samples/samples.status
index c45d91c..aeefd6e 100644
--- a/samples/samples.status
+++ b/samples/samples.status
@@ -5,14 +5,15 @@
 [ $arch == arm ]
 sample_extension/test/*: Skip # Issue 14705
 
+[ $builder_tag == optimization_counter_threshold ]
+sample_extension/test/sample_extension_app_snapshot_test: SkipByDesign # This test is too slow for testing with low optimization counter threshold.
+
+[ $compiler == app_jit ]
+sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
+
 [ $compiler == dart2analyzer ]
 build_dart: Skip
 
-[ $compiler == dartkp ]
-sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
-sample_extension/test/sample_extension_script_snapshot_test: RuntimeError
-sample_extension/test/sample_extension_test: RuntimeError
-
 [ $compiler == precompiler ]
 sample_extension/test/*: Skip # These tests attempt to spawn another script using the precompiled runtime.
 
@@ -28,8 +29,16 @@
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
+[ $compiler == app_jitk || $compiler == dartk || $compiler == dartkp ]
+sample_extension/test/sample_extension_app_snapshot_test: RuntimeError
+sample_extension/test/sample_extension_script_snapshot_test: RuntimeError
+sample_extension/test/sample_extension_test: RuntimeError
+
 # Skip tests that use dart:io
 [ $runtime == d8 || $browser ]
 build_dart/*: Skip
 build_dart_simple/*: Skip
 sample_extension/*: Skip
+
+[ $hot_reload || $hot_reload_rollback ]
+sample_extension/test/sample_extension_script_snapshot_test: SkipByDesign # This test makes a script snapshot, which implies not exercising Dart code.
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index a15213c..c84f526 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -44,7 +44,7 @@
 # ........dartfmt.dart.snapshot
 # ........dartdevc.dart.snapshot
 # ........dartdevk.dart.snapshot
-# ........kernel_summary_worker.dart.snapshot
+# ........kernel_worker.dart.snapshot
 # ........pub.dart.snapshot
 # ........pub2.dart.snapshot
 #.........resources/
@@ -170,8 +170,8 @@
     "../utils/dartfmt",
   ],
   [
-    "kernel_summary_worker",
-    "../utils/bazel:kernel_summary_worker",
+    "kernel_worker",
+    "../utils/bazel:kernel_worker",
   ],
   [
     "pub",
diff --git a/sdk/bin/dart2js b/sdk/bin/dart2js
index 9af877f..b4c1938 100755
--- a/sdk/bin/dart2js
+++ b/sdk/bin/dart2js
@@ -41,7 +41,6 @@
     EXTRA_VM_OPTIONS+=('--enable-asserts')
     ;;
 esac
-EXTRA_VM_OPTIONS+=('--preview-dart-2')
 
 # We allow extra vm options to be passed in through an environment variable.
 if [[ $DART_VM_OPTIONS ]]; then
diff --git a/sdk/bin/dart2js.bat b/sdk/bin/dart2js.bat
index 3f3fd9d..9341ad8 100644
--- a/sdk/bin/dart2js.bat
+++ b/sdk/bin/dart2js.bat
@@ -20,7 +20,7 @@
 set DART=%BIN_DIR%\dart
 
 set EXTRA_OPTIONS=
-set EXTRA_VM_OPTIONS=--preview-dart-2
+set EXTRA_VM_OPTIONS=
 
 if _%DART2JS_DEVELOPER_MODE%_ == _1_ (
   set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --enable-asserts
diff --git a/sdk/bin/dart2js_sdk b/sdk/bin/dart2js_sdk
index 3896e71..70c60b7 100755
--- a/sdk/bin/dart2js_sdk
+++ b/sdk/bin/dart2js_sdk
@@ -48,7 +48,6 @@
     EXTRA_VM_OPTIONS+=('--enable-asserts')
     ;;
 esac
-EXTRA_VM_OPTIONS+=('--preview-dart-2')
 
 # We allow extra vm options to be passed in through an environment variable.
 if [[ $DART_VM_OPTIONS ]]; then
diff --git a/sdk/bin/dart2js_sdk.bat b/sdk/bin/dart2js_sdk.bat
index 3b1aa66..acc4e17 100755
--- a/sdk/bin/dart2js_sdk.bat
+++ b/sdk/bin/dart2js_sdk.bat
@@ -21,7 +21,7 @@
 set SNAPSHOT=%BIN_DIR%\snapshots\dart2js.dart.snapshot
 
 set EXTRA_OPTIONS=
-set EXTRA_VM_OPTIONS=--preview-dart-2
+set EXTRA_VM_OPTIONS=
 
 if _%DART2JS_DEVELOPER_MODE%_ == _1_ (
   set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --enable-asserts
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index 49f4bcc..7ea062c 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -47,4 +47,4 @@
 
 DEV_OPTIONS="--use-analysis-driver-memory-byte-store"
 
-exec "$DART" "--preview-dart-2" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
+exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index b4a1de2..efa3a6a 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -40,7 +40,7 @@
 
 set ANALYZER=%DART_ROOT%\pkg\analyzer_cli\bin\analyzer.dart
 
-"%DART%" "--preview-dart-2" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
+"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartanalyzer_sdk b/sdk/bin/dartanalyzer_sdk
index 90d09de..28f37ab 100755
--- a/sdk/bin/dartanalyzer_sdk
+++ b/sdk/bin/dartanalyzer_sdk
@@ -28,4 +28,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "--preview-dart-2" "$SNAPSHOT" "$SDK_ARG" "$@"
+exec "$DART" "$SNAPSHOT" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index 82125f0..ab66885 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -22,7 +22,7 @@
 
 set SDK_ARG=--dart-sdk=%SDK_DIR%
 
-"%DART%" "--preview-dart-2" "%SNAPSHOT%" "%SDK_ARG%" %*
+"%DART%" "%SNAPSHOT%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartdevc b/sdk/bin/dartdevc
index e0c8e7a..5b75ad2 100755
--- a/sdk/bin/dartdevc
+++ b/sdk/bin/dartdevc
@@ -45,4 +45,4 @@
 
 DEV_COMPILER="$DART_ROOT/pkg/dev_compiler/bin/dartdevc.dart"
 
-exec "$DART" "--preview-dart-2" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$DEV_COMPILER" "$SDK_ARG" "$@"
+exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$DEV_COMPILER" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartdevc.bat b/sdk/bin/dartdevc.bat
index d636eee..fec39e4 100644
--- a/sdk/bin/dartdevc.bat
+++ b/sdk/bin/dartdevc.bat
@@ -36,7 +36,7 @@
 
 set DEV_COMPILER=%DART_ROOT%\third_party\pkg\dev_compiler\bin\dartdevc.dart
 
-"%DART%" "--preview-dart-2" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "DEV_COMPILER%" "%SDK_ARG%" %*
+"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "DEV_COMPILER%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartdevc_sdk b/sdk/bin/dartdevc_sdk
index aebe28d..7bc98de 100755
--- a/sdk/bin/dartdevc_sdk
+++ b/sdk/bin/dartdevc_sdk
@@ -28,4 +28,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "--preview-dart-2" "$SNAPSHOT" "$SDK_ARG" "$@"
+exec "$DART" "$SNAPSHOT" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartdevc_sdk.bat b/sdk/bin/dartdevc_sdk.bat
index f931a28..5dbf707 100644
--- a/sdk/bin/dartdevc_sdk.bat
+++ b/sdk/bin/dartdevc_sdk.bat
@@ -22,7 +22,7 @@
 
 set SDK_ARG=--dart-sdk=%SDK_DIR%
 
-"%DART%" "--preview-dart-2" "%SNAPSHOT%" "%SDK_ARG%" %*
+"%DART%" "%SNAPSHOT%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartdevk b/sdk/bin/dartdevk
index 6d75105..f6111dc 100755
--- a/sdk/bin/dartdevk
+++ b/sdk/bin/dartdevk
@@ -43,4 +43,4 @@
 
 DEV_COMPILER="$DART_ROOT/pkg/dev_compiler/bin/dartdevk.dart"
 
-exec "$DART" "--preview-dart-2" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$DEV_COMPILER" "$@"
+exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$DEV_COMPILER" "$@"
diff --git a/sdk/bin/dartdevk.bat b/sdk/bin/dartdevk.bat
index 79c09c5..154162a 100644
--- a/sdk/bin/dartdevk.bat
+++ b/sdk/bin/dartdevk.bat
@@ -34,7 +34,7 @@
 
 set DEV_COMPILER=%DART_ROOT%\pkg\dev_compiler\bin\dartdevk.dart
 
-"%DART%" "--preview-dart-2" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%DEV_COMPILER%" %*
+"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%DEV_COMPILER%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartdevk_sdk b/sdk/bin/dartdevk_sdk
index dc790e4..098775a 100755
--- a/sdk/bin/dartdevk_sdk
+++ b/sdk/bin/dartdevk_sdk
@@ -26,4 +26,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "--preview-dart-2" "$SNAPSHOT" "--packages=$SDK_DIR/../../../.packages" "$@"
+exec "$DART" "$SNAPSHOT" "--packages=$SDK_DIR/../../../.packages" "$@"
diff --git a/sdk/bin/dartdevk_sdk.bat b/sdk/bin/dartdevk_sdk.bat
index 3879afb..8e490ef 100644
--- a/sdk/bin/dartdevk_sdk.bat
+++ b/sdk/bin/dartdevk_sdk.bat
@@ -20,7 +20,7 @@
 rem Remove trailing backslash if there is one
 if %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
 
-"%DART%" "--preview-dart-2" "%SNAPSHOT%" "--packages=%SDK_DIR%\..\..\..\.packages" %*
+"%DART%" "%SNAPSHOT%" "--packages=%SDK_DIR%\..\..\..\.packages" %*
 
 endlocal
 
diff --git a/sdk/bin/dartdoc b/sdk/bin/dartdoc
index 73d81e0..d81a581 100755
--- a/sdk/bin/dartdoc
+++ b/sdk/bin/dartdoc
@@ -26,4 +26,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "--preview-dart-2" --packages="$BIN_DIR/snapshots/resources/dartdoc/.packages" "$SNAPSHOT" "$@"
+exec "$DART" "--packages=$BIN_DIR/snapshots/resources/dartdoc/.packages" "$SNAPSHOT" "$@"
diff --git a/sdk/bin/dartdoc.bat b/sdk/bin/dartdoc.bat
index fdab3b5..8c2c900 100644
--- a/sdk/bin/dartdoc.bat
+++ b/sdk/bin/dartdoc.bat
@@ -14,7 +14,7 @@
 set DART=%BIN_DIR%\dart
 set SNAPSHOT=%BIN_DIR%\snapshots\dartdoc.dart.snapshot
 
-"%DART%" "--preview-dart-2" --packages="%BIN_DIR%/snapshots/resources/dartdoc/.packages" "%SNAPSHOT%" %*
+"%DART%" "--packages=%BIN_DIR%/snapshots/resources/dartdoc/.packages" "%SNAPSHOT%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartfmt b/sdk/bin/dartfmt
index fb58a1e..ad54140 100755
--- a/sdk/bin/dartfmt
+++ b/sdk/bin/dartfmt
@@ -28,4 +28,4 @@
 
 DARTFMT="$DART_ROOT/third_party/pkg_tested/dart_style/bin/format.dart"
 
-exec "$DART" "--preview-dart-2" "--packages=$DART_ROOT/.packages" "$DARTFMT" "$@"
+exec "$DART" "--packages=$DART_ROOT/.packages" "$DARTFMT" "$@"
diff --git a/sdk/bin/dartfmt.bat b/sdk/bin/dartfmt.bat
index f668f56..7a7412b 100644
--- a/sdk/bin/dartfmt.bat
+++ b/sdk/bin/dartfmt.bat
@@ -27,7 +27,7 @@
 
 set DARTFMT=%DART_ROOT%\third_party\pkg_tested\dart_style\bin\format.dart
 
-"%DART%" "--preview-dart-2" "--packages=%DART_ROOT%\.packages" "%DARTFMT%" %*
+"%DART%" "--packages=%DART_ROOT%\.packages" "%DARTFMT%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartfmt_sdk b/sdk/bin/dartfmt_sdk
index b6b98c4..273733c 100755
--- a/sdk/bin/dartfmt_sdk
+++ b/sdk/bin/dartfmt_sdk
@@ -26,4 +26,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "--preview-dart-2" "$SNAPSHOT" "$@"
+exec "$DART" "$SNAPSHOT" "$@"
diff --git a/sdk/bin/dartfmt_sdk.bat b/sdk/bin/dartfmt_sdk.bat
index f746a72..295b977 100644
--- a/sdk/bin/dartfmt_sdk.bat
+++ b/sdk/bin/dartfmt_sdk.bat
@@ -14,7 +14,7 @@
 set DART=%BIN_DIR%\dart
 set SNAPSHOT=%BIN_DIR%\snapshots\dartfmt.dart.snapshot
 
-"%DART%" "--preview-dart-2" "%SNAPSHOT%" %*
+"%DART%" "%SNAPSHOT%" %*
 
 endlocal
 
diff --git a/sdk/bin/pub_sdk b/sdk/bin/pub_sdk
index 74a86ca..85d3b97 100755
--- a/sdk/bin/pub_sdk
+++ b/sdk/bin/pub_sdk
@@ -41,10 +41,10 @@
 
 # Run the pub snapshot.
 DART="$BIN_DIR/dart"
-if array_contains "--preview-dart-2" "${VM_OPTIONS[@]}"; then
-  SNAPSHOT="$BIN_DIR/snapshots/pub2.dart.snapshot"
+if array_contains "--no-preview-dart-2" "${VM_OPTIONS[@]}"; then
+  SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
   exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
 else
-  SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
+  SNAPSHOT="$BIN_DIR/snapshots/pub2.dart.snapshot"
   exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
 fi
diff --git a/sdk/bin/pub_sdk.bat b/sdk/bin/pub_sdk.bat
index 1c400bd..564e512 100644
--- a/sdk/bin/pub_sdk.bat
+++ b/sdk/bin/pub_sdk.bat
@@ -18,20 +18,20 @@
 IF %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
 
 set VM_OPTIONS=
-set USING_DART_2=
+set USING_DART_1=
 
 rem We allow extra vm options to be passed in through an environment variable.
 if not "_%DART_VM_OPTIONS%_" == "__" (
   set VM_OPTIONS=%VM_OPTIONS% %DART_VM_OPTIONS%
   for %%o in (%DART_VM_OPTIONS%) do (
-    if "%%o" equ "--preview-dart-2" set USING_DART_2=y
+    if "%%o" equ "--no-preview-dart-2" set USING_DART_1=y
   )
 )
 
-if defined USING_DART_2 (
-  "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub2.dart.snapshot" %*
-) else (
+if defined USING_DART_1 (
   "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub.dart.snapshot" %*
+) else (
+  "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub2.dart.snapshot" %*
 )
 
 endlocal
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index e590c9c..e27baf5 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -2947,3 +2947,14 @@
     return _reduce(resultDigits, resultUsed);
   }
 }
+
+/// Creates an invocation object used in noSuchMethod forwarding stubs.
+///
+/// The signature is hardwired to the kernel nodes generated in the
+/// `Dart2jsTarget` and read in the `KernelSsaGraphBuilder`.
+external Invocation _createInvocationMirror(
+    String memberName,
+    List typeArguments,
+    List positionalArguments,
+    Map<String, dynamic> namedArguments,
+    int kind);
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index fd9e485..9e2f105 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -251,9 +251,9 @@
 }
 
 createUnmangledInvocationMirror(
-    Symbol symbol, internalName, kind, arguments, argumentNames) {
+    Symbol symbol, internalName, kind, arguments, argumentNames, types) {
   return new JSInvocationMirror(
-      symbol, internalName, kind, arguments, argumentNames, 0);
+      symbol, internalName, kind, arguments, argumentNames, types);
 }
 
 void throwInvalidReflectionError(String memberName) {
@@ -1258,8 +1258,13 @@
     String selectorName =
         '${JS_GET_NAME(JsGetName.CALL_PREFIX)}\$$argumentCount$names';
 
-    return function.noSuchMethod(createUnmangledInvocationMirror(#call,
-        selectorName, JSInvocationMirror.METHOD, arguments, namedArgumentList));
+    return function.noSuchMethod(createUnmangledInvocationMirror(
+        #call,
+        selectorName,
+        JSInvocationMirror.METHOD,
+        arguments,
+        namedArgumentList,
+        0));
   }
 
   /**
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 795a5f2..74a6352 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -1343,6 +1343,8 @@
 /// Called from generated code.
 @NoInline()
 instantiatedGenericFunctionType(genericFunctionRti, parameters) {
+  if (genericFunctionRti == null) return null;
+
   assert(isDartFunctionType(genericFunctionRti));
 
   var genericBoundsTag =
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index 02bca23..a6a9946 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -5,30 +5,36 @@
 part of dart.core;
 
 /**
- * An arbitrarily large integer.
+ * An integer number.
  *
- * **Note:** When compiling to JavaScript, integers are
- * implemented as JavaScript numbers. When compiling to JavaScript,
- * integers are therefore restricted to 53 significant bits because
- * all JavaScript numbers are double-precision floating point
- * values. The behavior of the operators and methods in the [int]
+ * The default implementation of `int` is 64-bit two's complement integers
+ * with operations that wrap to that range on overflow.
+ *
+ * **Note:** When compiling to JavaScript, integers are restricted to valus
+ * that can be represented exactly by double-precision floating point values.
+ * The available integer values include all integers between -2^53 and 2^53,
+ * and some integers with larger magnitude. That includes some integers larger
+ * than 2^63.
+ * The behavior of the operators and methods in the [int]
  * class therefore sometimes differs between the Dart VM and Dart code
- * compiled to JavaScript.
+ * compiled to JavaScript. For example, the bitwise operators truncate their
+ * operands to 32-bit integers when compiled to JavaScript.
  *
- * It is a compile-time error for a class to attempt to extend or implement int.
+ * Classes cannot extend, implement, or mix in `int`.
  */
 abstract class int extends num {
   /**
    * Returns the integer value of the given environment declaration [name].
    *
    * The result is the same as would be returned by:
-   *
-   *     int.parse(const String.fromEnvironment(name, defaultValue: ""),
-   *               (_) => defaultValue)
-   *
+   * ```
+   * int.tryParse(const String.fromEnvironment(name, defaultValue: ""))
+   *     ?? defaultValue
+   * ```
    * Example:
-   *
-   *     const int.fromEnvironment("defaultPort", defaultValue: 80)
+   * ```
+   * const int.fromEnvironment("defaultPort", defaultValue: 80)
+   * ```
    */
   // The .fromEnvironment() constructors are special in that we do not want
   // users to call them using "new". We prohibit that by giving them bodies
@@ -157,17 +163,18 @@
    *
    * To find the number of bits needed to store the value as a signed value,
    * add one, i.e. use `x.bitLength + 1`.
+   * ```
+   * x.bitLength == (-x-1).bitLength
    *
-   *      x.bitLength == (-x-1).bitLength
-   *
-   *      3.bitLength == 2;     // 00000011
-   *      2.bitLength == 2;     // 00000010
-   *      1.bitLength == 1;     // 00000001
-   *      0.bitLength == 0;     // 00000000
-   *      (-1).bitLength == 0;  // 11111111
-   *      (-2).bitLength == 1;  // 11111110
-   *      (-3).bitLength == 2;  // 11111101
-   *      (-4).bitLength == 2;  // 11111100
+   * 3.bitLength == 2;     // 00000011
+   * 2.bitLength == 2;     // 00000010
+   * 1.bitLength == 1;     // 00000001
+   * 0.bitLength == 0;     // 00000000
+   * (-1).bitLength == 0;  // 11111111
+   * (-2).bitLength == 1;  // 11111110
+   * (-3).bitLength == 2;  // 11111101
+   * (-4).bitLength == 2;  // 11111100
+   * ```
    */
   int get bitLength;
 
@@ -175,21 +182,22 @@
    * Returns the least significant [width] bits of this integer as a
    * non-negative number (i.e. unsigned representation).  The returned value has
    * zeros in all bit positions higher than [width].
-   *
-   *     (-1).toUnsigned(5) == 31   // 11111111  ->  00011111
-   *
+   * ```
+   * (-1).toUnsigned(5) == 31   // 11111111  ->  00011111
+   * ```
    * This operation can be used to simulate arithmetic from low level languages.
    * For example, to increment an 8 bit quantity:
-   *
-   *     q = (q + 1).toUnsigned(8);
-   *
+   * ```
+   * q = (q + 1).toUnsigned(8);
+   * ```
    * `q` will count from `0` up to `255` and then wrap around to `0`.
    *
    * If the input fits in [width] bits without truncation, the result is the
    * same as the input.  The minimum width needed to avoid truncation of `x` is
    * given by `x.bitLength`, i.e.
-   *
-   *     x == x.toUnsigned(x.bitLength);
+   * ```
+   * x == x.toUnsigned(x.bitLength);
+   * ```
    */
   int toUnsigned(int width);
 
@@ -199,24 +207,26 @@
    * to fit in [width] bits using an signed 2-s complement representation.  The
    * returned value has the same bit value in all positions higher than [width].
    *
-   *                                    V--sign bit-V
-   *     16.toSigned(5) == -16   //  00010000 -> 11110000
-   *     239.toSigned(5) == 15   //  11101111 -> 00001111
-   *                                    ^           ^
-   *
+   * ```
+   *                                V--sign bit-V
+   * 16.toSigned(5) == -16   //  00010000 -> 11110000
+   * 239.toSigned(5) == 15   //  11101111 -> 00001111
+   *                                ^           ^
+   * ```
    * This operation can be used to simulate arithmetic from low level languages.
    * For example, to increment an 8 bit signed quantity:
-   *
-   *     q = (q + 1).toSigned(8);
-   *
+   * ```
+   * q = (q + 1).toSigned(8);
+   * ```
    * `q` will count from `0` up to `127`, wrap to `-128` and count back up to
    * `127`.
    *
    * If the input value fits in [width] bits without truncation, the result is
    * the same as the input.  The minimum width needed to avoid truncation of `x`
    * is `x.bitLength + 1`, i.e.
-   *
-   *     x == x.toSigned(x.bitLength + 1);
+   * ```
+   * x == x.toSigned(x.bitLength + 1);
+   * ```
    */
   int toSigned(int width);
 
@@ -271,8 +281,8 @@
    * Returns a String-representation of this integer.
    *
    * The returned string is parsable by [parse].
-   * For any `int` [:i:], it is guaranteed that
-   * [:i == int.parse(i.toString()):].
+   * For any `int` `i`, it is guaranteed that
+   * `i == int.parse(i.toString())`.
    */
   String toString();
 
@@ -289,7 +299,7 @@
   /**
    * Parse [source] as a, possibly signed, integer literal and return its value.
    *
-   * The [source] must be a non-empty sequence of base-[radix] digits,
+   * The [source] must be either a non-empty sequence of base-[radix] digits,
    * optionally prefixed with a minus or plus sign ('-' or '+').
    *
    * The [radix] must be in the range 2..36. The digits used are
@@ -299,30 +309,36 @@
    *
    * If no [radix] is given then it defaults to 10. In this case, the [source]
    * digits may also start with `0x`, in which case the number is interpreted
-   * as a hexadecimal literal, which effectively means that the `0x` is ignored
-   * and the radix is instead set to 16.
+   * as a hexadecimal integer literal,
+   * When `int` is implemented by 64-bit signed integers,
+   * hexadecimal integer literals may represent values larger than
+   * 2<sup>63</sup>, in which case the value is parsed as if it is an
+   * *unsigned* number, and the resulting value is the corresponding
+   * signed integer value.
    *
-   * For any int [:n:] and radix [:r:], it is guaranteed that
-   * [:n == int.parse(n.toRadixString(r), radix: r):].
+   * For any int `n` and valid radix `r`, it is guaranteed that
+   * `n == int.parse(n.toRadixString(r), radix: r)`.
    *
-   * If the [source] is not a valid integer literal, optionally prefixed by a
-   * sign, the [onError] is called with the [source] as argument, and its return
-   * value is used instead. If no [onError] is provided, a [FormatException]
-   * is thrown.
+   * If the [source] does not contain a valid integer literal,
+   * optionally prefixed by a sign, a [FormatException] is thrown
+   * (unless the deprecated [onError] parameter is used, see below).
    *
-   * The [onError] handler can be chosen to return `null`.  This is preferable
-   * to to throwing and then immediately catching the [FormatException].
+   * Instead of throwing and immediately catching the [FormatException],
+   * instead use [tryParse] to handle a parsing error.
    * Example:
-   *
-   *     var value = int.parse(text, onError: (source) => null);
-   *     if (value == null) ... handle the problem
-   *
-   * The [onError] function is only invoked if [source] is a [String]. It is
-   * not invoked if the [source] is, for example, `null`.
+   * ```dart
+   * var value = int.tryParse(text);
+   * if (value == null) ... handle the problem
+   * ```
    *
    * The [onError] parameter is deprecated and will be removed.
-   * Instead of `int.parse(string, onError: (string) { ... })`,
+   * Instead of `int.parse(string, onError: (string) => ...)`,
    * you should use `int.tryParse(string) ?? (...)`.
+   *
+   * When source is not valid and [onError] is provided,
+   * whenever a [FormatException] would be thrown,
+   * [onError] is instead called with [source] as argument,
+   * and the result of that call is returned by [parse].
    */
   external static int parse(String source,
       {int radix, @deprecated int onError(String source)});
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index ee8e653..e7fe7d4 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -8,20 +8,6 @@
  * check out the [Element] class, the base class for many of the HTML
  * DOM types.
  *
- * ## Other resources
- *
- * * If you've never written a web app before, try our
- * tutorials&mdash;[A Game of Darts](http://dartlang.org/docs/tutorials).
- *
- * * To see some web-based Dart apps in action and to play with the code,
- * download
- * [Dart Editor](http://www.dartlang.org/#get-started)
- * and run its built-in examples.
- *
- * * For even more examples, see
- * [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
- * on Github.
- *
  * {@category Web}
  */
 library dart.dom.html;
@@ -145,7 +131,6 @@
   HtmlElement.created() : super.created();
 
   // From NoncedElement
-  @DomName('HTMLElement.nonce')
   String nonce;
 }
 
@@ -153,17 +138,12 @@
  * Emitted for any setlike IDL entry needs a callback signature.
  * Today there is only one.
  */
-@DomName('FontFaceSetForEachCallback')
-@Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AbortPaymentEvent')
-@Experimental() // untriaged
 @Native("AbortPaymentEvent")
 class AbortPaymentEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -171,8 +151,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AbortPaymentEvent.AbortPaymentEvent')
-  @DocsEditable()
   factory AbortPaymentEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return AbortPaymentEvent._create_1(type, eventInitDict_1);
@@ -180,18 +158,12 @@
   static AbortPaymentEvent _create_1(type, eventInitDict) => JS(
       'AbortPaymentEvent', 'new AbortPaymentEvent(#,#)', type, eventInitDict);
 
-  @DomName('AbortPaymentEvent.respondWith')
-  @DocsEditable()
-  @Experimental() // untriaged
   void respondWith(Future paymentAbortedResponse) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AbsoluteOrientationSensor')
-@Experimental() // untriaged
 @Native("AbsoluteOrientationSensor")
 class AbsoluteOrientationSensor extends OrientationSensor {
   // To suppress missing implicit constructor warnings.
@@ -199,8 +171,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AbsoluteOrientationSensor.AbsoluteOrientationSensor')
-  @DocsEditable()
   factory AbsoluteOrientationSensor([Map sensorOptions]) {
     if (sensorOptions != null) {
       var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
@@ -219,8 +189,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AbstractWorker')
 abstract class AbstractWorker extends Interceptor implements EventTarget {
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() {
@@ -233,23 +201,16 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('AbstractWorker.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
   /// Stream of `error` events handled by this [AbstractWorker].
-  @DomName('AbstractWorker.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Accelerometer')
-@Experimental() // untriaged
 @Native("Accelerometer")
 class Accelerometer extends Sensor {
   // To suppress missing implicit constructor warnings.
@@ -257,8 +218,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Accelerometer.Accelerometer')
-  @DocsEditable()
   factory Accelerometer([Map sensorOptions]) {
     if (sensorOptions != null) {
       var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
@@ -271,28 +230,16 @@
   static Accelerometer _create_2() =>
       JS('Accelerometer', 'new Accelerometer()');
 
-  @DomName('Accelerometer.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num x;
 
-  @DomName('Accelerometer.y')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num y;
 
-  @DomName('Accelerometer.z')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AccessibleNode')
-@Experimental() // untriaged
 @Native("AccessibleNode")
 class AccessibleNode extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -300,321 +247,139 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AccessibleNode.accessibleclickEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> accessibleClickEvent =
       const EventStreamProvider<Event>('accessibleclick');
 
-  @DomName('AccessibleNode.accessiblecontextmenuEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> accessibleContextMenuEvent =
       const EventStreamProvider<Event>('accessiblecontextmenu');
 
-  @DomName('AccessibleNode.accessibledecrementEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> accessibleDecrementEvent =
       const EventStreamProvider<Event>('accessibledecrement');
 
-  @DomName('AccessibleNode.accessiblefocusEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> accessibleFocusEvent =
       const EventStreamProvider<Event>('accessiblefocus');
 
-  @DomName('AccessibleNode.accessibleincrementEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> accessibleIncrementEvent =
       const EventStreamProvider<Event>('accessibleincrement');
 
-  @DomName('AccessibleNode.accessiblescrollintoviewEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> accessibleScrollIntoViewEvent =
       const EventStreamProvider<Event>('accessiblescrollintoview');
 
-  @DomName('AccessibleNode.AccessibleNode')
-  @DocsEditable()
   factory AccessibleNode() {
     return AccessibleNode._create_1();
   }
   static AccessibleNode _create_1() =>
       JS('AccessibleNode', 'new AccessibleNode()');
 
-  @DomName('AccessibleNode.activeDescendant')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNode activeDescendant;
 
-  @DomName('AccessibleNode.atomic')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool atomic;
 
-  @DomName('AccessibleNode.autocomplete')
-  @DocsEditable()
-  @Experimental() // untriaged
   String autocomplete;
 
-  @DomName('AccessibleNode.busy')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool busy;
 
-  @DomName('AccessibleNode.checked')
-  @DocsEditable()
-  @Experimental() // untriaged
   String checked;
 
-  @DomName('AccessibleNode.colCount')
-  @DocsEditable()
-  @Experimental() // untriaged
   int colCount;
 
-  @DomName('AccessibleNode.colIndex')
-  @DocsEditable()
-  @Experimental() // untriaged
   int colIndex;
 
-  @DomName('AccessibleNode.colSpan')
-  @DocsEditable()
-  @Experimental() // untriaged
   int colSpan;
 
-  @DomName('AccessibleNode.controls')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNodeList controls;
 
-  @DomName('AccessibleNode.current')
-  @DocsEditable()
-  @Experimental() // untriaged
   String current;
 
-  @DomName('AccessibleNode.describedBy')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNodeList describedBy;
 
-  @DomName('AccessibleNode.details')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNode details;
 
-  @DomName('AccessibleNode.disabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool disabled;
 
-  @DomName('AccessibleNode.errorMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNode errorMessage;
 
-  @DomName('AccessibleNode.expanded')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool expanded;
 
-  @DomName('AccessibleNode.flowTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNodeList flowTo;
 
-  @DomName('AccessibleNode.hasPopUp')
-  @DocsEditable()
-  @Experimental() // untriaged
   String hasPopUp;
 
-  @DomName('AccessibleNode.hidden')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool hidden;
 
-  @DomName('AccessibleNode.invalid')
-  @DocsEditable()
-  @Experimental() // untriaged
   String invalid;
 
-  @DomName('AccessibleNode.keyShortcuts')
-  @DocsEditable()
-  @Experimental() // untriaged
   String keyShortcuts;
 
-  @DomName('AccessibleNode.label')
-  @DocsEditable()
-  @Experimental() // untriaged
   String label;
 
-  @DomName('AccessibleNode.labeledBy')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNodeList labeledBy;
 
-  @DomName('AccessibleNode.level')
-  @DocsEditable()
-  @Experimental() // untriaged
   int level;
 
-  @DomName('AccessibleNode.live')
-  @DocsEditable()
-  @Experimental() // untriaged
   String live;
 
-  @DomName('AccessibleNode.modal')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool modal;
 
-  @DomName('AccessibleNode.multiline')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool multiline;
 
-  @DomName('AccessibleNode.multiselectable')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool multiselectable;
 
-  @DomName('AccessibleNode.orientation')
-  @DocsEditable()
-  @Experimental() // untriaged
   String orientation;
 
-  @DomName('AccessibleNode.owns')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNodeList owns;
 
-  @DomName('AccessibleNode.placeholder')
-  @DocsEditable()
-  @Experimental() // untriaged
   String placeholder;
 
-  @DomName('AccessibleNode.posInSet')
-  @DocsEditable()
-  @Experimental() // untriaged
   int posInSet;
 
-  @DomName('AccessibleNode.pressed')
-  @DocsEditable()
-  @Experimental() // untriaged
   String pressed;
 
-  @DomName('AccessibleNode.readOnly')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool readOnly;
 
-  @DomName('AccessibleNode.relevant')
-  @DocsEditable()
-  @Experimental() // untriaged
   String relevant;
 
-  @DomName('AccessibleNode.required')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool required;
 
-  @DomName('AccessibleNode.role')
-  @DocsEditable()
-  @Experimental() // untriaged
   String role;
 
-  @DomName('AccessibleNode.roleDescription')
-  @DocsEditable()
-  @Experimental() // untriaged
   String roleDescription;
 
-  @DomName('AccessibleNode.rowCount')
-  @DocsEditable()
-  @Experimental() // untriaged
   int rowCount;
 
-  @DomName('AccessibleNode.rowIndex')
-  @DocsEditable()
-  @Experimental() // untriaged
   int rowIndex;
 
-  @DomName('AccessibleNode.rowSpan')
-  @DocsEditable()
-  @Experimental() // untriaged
   int rowSpan;
 
-  @DomName('AccessibleNode.selected')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool selected;
 
-  @DomName('AccessibleNode.setSize')
-  @DocsEditable()
-  @Experimental() // untriaged
   int setSize;
 
-  @DomName('AccessibleNode.sort')
-  @DocsEditable()
-  @Experimental() // untriaged
   String sort;
 
-  @DomName('AccessibleNode.valueMax')
-  @DocsEditable()
-  @Experimental() // untriaged
   num valueMax;
 
-  @DomName('AccessibleNode.valueMin')
-  @DocsEditable()
-  @Experimental() // untriaged
   num valueMin;
 
-  @DomName('AccessibleNode.valueNow')
-  @DocsEditable()
-  @Experimental() // untriaged
   num valueNow;
 
-  @DomName('AccessibleNode.valueText')
-  @DocsEditable()
-  @Experimental() // untriaged
   String valueText;
 
-  @DomName('AccessibleNode.appendChild')
-  @DocsEditable()
-  @Experimental() // untriaged
   void appendChild(AccessibleNode child) native;
 
-  @DomName('AccessibleNode.onaccessibleclick')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAccessibleClick => accessibleClickEvent.forTarget(this);
 
-  @DomName('AccessibleNode.onaccessiblecontextmenu')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAccessibleContextMenu =>
       accessibleContextMenuEvent.forTarget(this);
 
-  @DomName('AccessibleNode.onaccessibledecrement')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAccessibleDecrement =>
       accessibleDecrementEvent.forTarget(this);
 
-  @DomName('AccessibleNode.onaccessiblefocus')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAccessibleFocus => accessibleFocusEvent.forTarget(this);
 
-  @DomName('AccessibleNode.onaccessibleincrement')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAccessibleIncrement =>
       accessibleIncrementEvent.forTarget(this);
 
-  @DomName('AccessibleNode.onaccessiblescrollintoview')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAccessibleScrollIntoView =>
       accessibleScrollIntoViewEvent.forTarget(this);
 }
@@ -622,9 +387,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AccessibleNodeList')
-@Experimental() // untriaged
 @Native("AccessibleNodeList")
 class AccessibleNodeList extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -632,8 +394,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AccessibleNodeList.AccessibleNodeList')
-  @DocsEditable()
   factory AccessibleNodeList([List<AccessibleNode> nodes]) {
     if (nodes != null) {
       return AccessibleNodeList._create_1(nodes);
@@ -645,38 +405,20 @@
   static AccessibleNodeList _create_2() =>
       JS('AccessibleNodeList', 'new AccessibleNodeList()');
 
-  @DomName('AccessibleNodeList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   int length;
 
-  @DomName('AccessibleNodeList.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   void __setter__(int index, AccessibleNode node) native;
 
-  @DomName('AccessibleNodeList.add')
-  @DocsEditable()
-  @Experimental() // untriaged
   void add(AccessibleNode node, AccessibleNode before) native;
 
-  @DomName('AccessibleNodeList.item')
-  @DocsEditable()
-  @Experimental() // untriaged
   AccessibleNode item(int index) native;
 
-  @DomName('AccessibleNodeList.remove')
-  @DocsEditable()
-  @Experimental() // untriaged
   void remove(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AmbientLightSensor')
-@Experimental() // untriaged
 @Native("AmbientLightSensor")
 class AmbientLightSensor extends Sensor {
   // To suppress missing implicit constructor warnings.
@@ -684,8 +426,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AmbientLightSensor.AmbientLightSensor')
-  @DocsEditable()
   factory AmbientLightSensor([Map sensorOptions]) {
     if (sensorOptions != null) {
       var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
@@ -698,17 +438,12 @@
   static AmbientLightSensor _create_2() =>
       JS('AmbientLightSensor', 'new AmbientLightSensor()');
 
-  @DomName('AmbientLightSensor.illuminance')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num illuminance;
 }
 // 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.
 
-@DocsEditable()
-@DomName('HTMLAnchorElement')
 @Native("HTMLAnchorElement")
 class AnchorElement extends HtmlElement implements HtmlHyperlinkElementUtils {
   // To suppress missing implicit constructor warnings.
@@ -716,8 +451,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLAnchorElement.HTMLAnchorElement')
-  @DocsEditable()
   factory AnchorElement({String href}) {
     AnchorElement e = JS('returns:AnchorElement;creates:AnchorElement;new:true',
         '#.createElement(#)', document, "a");
@@ -731,92 +464,48 @@
    */
   AnchorElement.created() : super.created();
 
-  @DomName('HTMLAnchorElement.download')
-  @DocsEditable()
   String download;
 
-  @DomName('HTMLAnchorElement.hreflang')
-  @DocsEditable()
   String hreflang;
 
-  @DomName('HTMLAnchorElement.referrerPolicy')
-  @DocsEditable()
-  @Experimental() // untriaged
   String referrerPolicy;
 
-  @DomName('HTMLAnchorElement.rel')
-  @DocsEditable()
   String rel;
 
-  @DomName('HTMLAnchorElement.target')
-  @DocsEditable()
   String target;
 
-  @DomName('HTMLAnchorElement.type')
-  @DocsEditable()
   String type;
 
   // From HTMLHyperlinkElementUtils
 
-  @DomName('HTMLAnchorElement.hash')
-  @DocsEditable()
   String hash;
 
-  @DomName('HTMLAnchorElement.host')
-  @DocsEditable()
   String host;
 
-  @DomName('HTMLAnchorElement.hostname')
-  @DocsEditable()
   String hostname;
 
-  @DomName('HTMLAnchorElement.href')
-  @DocsEditable()
   String href;
 
-  @DomName('HTMLAnchorElement.origin')
-  @DocsEditable()
-  // WebKit only
-  @Experimental() // non-standard
   final String origin;
 
-  @DomName('HTMLAnchorElement.password')
-  @DocsEditable()
-  @Experimental() // untriaged
   String password;
 
-  @DomName('HTMLAnchorElement.pathname')
-  @DocsEditable()
   String pathname;
 
-  @DomName('HTMLAnchorElement.port')
-  @DocsEditable()
   String port;
 
-  @DomName('HTMLAnchorElement.protocol')
-  @DocsEditable()
   String protocol;
 
-  @DomName('HTMLAnchorElement.search')
-  @DocsEditable()
   String search;
 
-  @DomName('HTMLAnchorElement.username')
-  @DocsEditable()
-  @Experimental() // untriaged
   String username;
 
-  @DomName('HTMLAnchorElement.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Animation')
-@Experimental() // untriaged
 @Native("Animation")
 class Animation extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -824,20 +513,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Animation.cancelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> cancelEvent =
       const EventStreamProvider<Event>('cancel');
 
-  @DomName('Animation.finishEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> finishEvent =
       const EventStreamProvider<Event>('finish');
 
-  @DomName('Animation.Animation')
-  @DocsEditable()
   factory Animation(
       [AnimationEffectReadOnly effect, AnimationTimeline timeline]) {
     if (timeline != null) {
@@ -857,95 +538,44 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(document.body.animate)');
 
-  @DomName('Animation.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   num currentTime;
 
-  @DomName('Animation.effect')
-  @DocsEditable()
-  @Experimental() // untriaged
   AnimationEffectReadOnly effect;
 
-  @DomName('Animation.finished')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Animation> get finished =>
       promiseToFuture<Animation>(JS("", "#.finished", this));
 
-  @DomName('Animation.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   String id;
 
-  @DomName('Animation.playState')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String playState;
 
-  @DomName('Animation.playbackRate')
-  @DocsEditable()
-  @Experimental() // untriaged
   num playbackRate;
 
-  @DomName('Animation.ready')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Animation> get ready =>
       promiseToFuture<Animation>(JS("", "#.ready", this));
 
-  @DomName('Animation.startTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   num startTime;
 
-  @DomName('Animation.timeline')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AnimationTimeline timeline;
 
-  @DomName('Animation.cancel')
-  @DocsEditable()
-  @Experimental() // untriaged
   void cancel() native;
 
-  @DomName('Animation.finish')
-  @DocsEditable()
-  @Experimental() // untriaged
   void finish() native;
 
-  @DomName('Animation.pause')
-  @DocsEditable()
-  @Experimental() // untriaged
   void pause() native;
 
-  @DomName('Animation.play')
-  @DocsEditable()
-  @Experimental() // untriaged
   void play() native;
 
-  @DomName('Animation.reverse')
-  @DocsEditable()
-  @Experimental() // untriaged
   void reverse() native;
 
-  @DomName('Animation.oncancel')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onCancel => cancelEvent.forTarget(this);
 
-  @DomName('Animation.onfinish')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onFinish => finishEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnimationEffectReadOnly')
-@Experimental() // untriaged
 @Native("AnimationEffectReadOnly")
 class AnimationEffectReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -953,31 +583,19 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationEffectReadOnly.timing')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AnimationEffectTimingReadOnly timing;
 
-  @DomName('AnimationEffectReadOnly.getComputedTiming')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getComputedTiming() {
     return convertNativeToDart_Dictionary(_getComputedTiming_1());
   }
 
   @JSName('getComputedTiming')
-  @DomName('AnimationEffectReadOnly.getComputedTiming')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getComputedTiming_1() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnimationEffectTiming')
-@Experimental() // untriaged
 @Native("AnimationEffectTiming")
 class AnimationEffectTiming extends AnimationEffectTimingReadOnly {
   // To suppress missing implicit constructor warnings.
@@ -1045,9 +663,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnimationEffectTimingReadOnly')
-@Experimental() // untriaged
 @Native("AnimationEffectTimingReadOnly")
 class AnimationEffectTimingReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1055,53 +670,26 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationEffectTimingReadOnly.delay')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num delay;
 
-  @DomName('AnimationEffectTimingReadOnly.direction')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String direction;
 
-  @DomName('AnimationEffectTimingReadOnly.duration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object duration;
 
-  @DomName('AnimationEffectTimingReadOnly.easing')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String easing;
 
-  @DomName('AnimationEffectTimingReadOnly.endDelay')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num endDelay;
 
-  @DomName('AnimationEffectTimingReadOnly.fill')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String fill;
 
-  @DomName('AnimationEffectTimingReadOnly.iterationStart')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num iterationStart;
 
-  @DomName('AnimationEffectTimingReadOnly.iterations')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num iterations;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnimationEvent')
-@Experimental() // untriaged
 @Native("AnimationEvent")
 class AnimationEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -1109,8 +697,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationEvent.AnimationEvent')
-  @DocsEditable()
   factory AnimationEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -1123,23 +709,14 @@
   static AnimationEvent _create_2(type) =>
       JS('AnimationEvent', 'new AnimationEvent(#)', type);
 
-  @DomName('AnimationEvent.animationName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String animationName;
 
-  @DomName('AnimationEvent.elapsedTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num elapsedTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnimationPlaybackEvent')
-@Experimental() // untriaged
 @Native("AnimationPlaybackEvent")
 class AnimationPlaybackEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -1147,8 +724,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationPlaybackEvent.AnimationPlaybackEvent')
-  @DocsEditable()
   factory AnimationPlaybackEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -1164,23 +739,14 @@
   static AnimationPlaybackEvent _create_2(type) =>
       JS('AnimationPlaybackEvent', 'new AnimationPlaybackEvent(#)', type);
 
-  @DomName('AnimationPlaybackEvent.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num currentTime;
 
-  @DomName('AnimationPlaybackEvent.timelineTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num timelineTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnimationTimeline')
-@Experimental() // untriaged
 @Native("AnimationTimeline")
 class AnimationTimeline extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1188,18 +754,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationTimeline.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num currentTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnimationWorkletGlobalScope')
-@Experimental() // untriaged
 @Native("AnimationWorkletGlobalScope")
 class AnimationWorkletGlobalScope extends WorkletGlobalScope {
   // To suppress missing implicit constructor warnings.
@@ -1207,20 +767,15 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnimationWorkletGlobalScope.registerAnimator')
-  @DocsEditable()
-  @Experimental() // untriaged
   void registerAnimator(String name, Object animatorConstructor) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * ApplicationCache is accessed via [Window.applicationCache].
  */
-@DomName('ApplicationCache')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1240,8 +795,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.cachedEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> cachedEvent =
       const EventStreamProvider<Event>('cached');
 
@@ -1251,8 +804,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.checkingEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> checkingEvent =
       const EventStreamProvider<Event>('checking');
 
@@ -1262,8 +813,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.downloadingEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> downloadingEvent =
       const EventStreamProvider<Event>('downloading');
 
@@ -1273,8 +822,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -1284,8 +831,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.noupdateEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> noUpdateEvent =
       const EventStreamProvider<Event>('noupdate');
 
@@ -1295,8 +840,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.obsoleteEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> obsoleteEvent =
       const EventStreamProvider<Event>('obsolete');
 
@@ -1306,8 +849,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.progressEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent =
       const EventStreamProvider<ProgressEvent>('progress');
 
@@ -1317,101 +858,60 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ApplicationCache.updatereadyEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent =
       const EventStreamProvider<Event>('updateready');
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.applicationCache)');
 
-  @DomName('ApplicationCache.CHECKING')
-  @DocsEditable()
   static const int CHECKING = 2;
 
-  @DomName('ApplicationCache.DOWNLOADING')
-  @DocsEditable()
   static const int DOWNLOADING = 3;
 
-  @DomName('ApplicationCache.IDLE')
-  @DocsEditable()
   static const int IDLE = 1;
 
-  @DomName('ApplicationCache.OBSOLETE')
-  @DocsEditable()
   static const int OBSOLETE = 5;
 
-  @DomName('ApplicationCache.UNCACHED')
-  @DocsEditable()
   static const int UNCACHED = 0;
 
-  @DomName('ApplicationCache.UPDATEREADY')
-  @DocsEditable()
   static const int UPDATEREADY = 4;
 
-  @DomName('ApplicationCache.status')
-  @DocsEditable()
   final int status;
 
-  @DomName('ApplicationCache.abort')
-  @DocsEditable()
   void abort() native;
 
-  @DomName('ApplicationCache.swapCache')
-  @DocsEditable()
   void swapCache() native;
 
-  @DomName('ApplicationCache.update')
-  @DocsEditable()
   void update() native;
 
   /// Stream of `cached` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.oncached')
-  @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
 
   /// Stream of `checking` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.onchecking')
-  @DocsEditable()
   Stream<Event> get onChecking => checkingEvent.forTarget(this);
 
   /// Stream of `downloading` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.ondownloading')
-  @DocsEditable()
   Stream<Event> get onDownloading => downloadingEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `noupdate` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.onnoupdate')
-  @DocsEditable()
   Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);
 
   /// Stream of `obsolete` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.onobsolete')
-  @DocsEditable()
   Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);
 
   /// Stream of `progress` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.onprogress')
-  @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
   /// Stream of `updateready` events handled by this [ApplicationCache].
-  @DomName('ApplicationCache.onupdateready')
-  @DocsEditable()
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ApplicationCacheErrorEvent')
-@Experimental() // untriaged
 @Native("ApplicationCacheErrorEvent")
 class ApplicationCacheErrorEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -1419,8 +919,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ApplicationCacheErrorEvent.ApplicationCacheErrorEvent')
-  @DocsEditable()
   factory ApplicationCacheErrorEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -1436,31 +934,18 @@
   static ApplicationCacheErrorEvent _create_2(type) => JS(
       'ApplicationCacheErrorEvent', 'new ApplicationCacheErrorEvent(#)', type);
 
-  @DomName('ApplicationCacheErrorEvent.message')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String message;
 
-  @DomName('ApplicationCacheErrorEvent.reason')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String reason;
 
-  @DomName('ApplicationCacheErrorEvent.status')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int status;
 
-  @DomName('ApplicationCacheErrorEvent.url')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String url;
 }
 // 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.
 
-@DocsEditable()
 /**
  * DOM Area Element, which links regions of an image map with a hyperlink.
  *
@@ -1471,7 +956,6 @@
  * * [`<area>`](https://developer.mozilla.org/en-US/docs/HTML/Element/area)
  * on MDN.
  */
-@DomName('HTMLAreaElement')
 @Native("HTMLAreaElement")
 class AreaElement extends HtmlElement implements HtmlHyperlinkElementUtils {
   // To suppress missing implicit constructor warnings.
@@ -1479,8 +963,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLAreaElement.HTMLAreaElement')
-  @DocsEditable()
   factory AreaElement() => JS(
       'returns:AreaElement;creates:AreaElement;new:true',
       '#.createElement(#)',
@@ -1493,100 +975,52 @@
    */
   AreaElement.created() : super.created();
 
-  @DomName('HTMLAreaElement.alt')
-  @DocsEditable()
   String alt;
 
-  @DomName('HTMLAreaElement.coords')
-  @DocsEditable()
   String coords;
 
-  @DomName('HTMLAreaElement.download')
-  @DocsEditable()
-  @Experimental() // untriaged
   String download;
 
-  @DomName('HTMLAreaElement.referrerPolicy')
-  @DocsEditable()
-  @Experimental() // untriaged
   String referrerPolicy;
 
-  @DomName('HTMLAreaElement.rel')
-  @DocsEditable()
-  @Experimental() // untriaged
   String rel;
 
-  @DomName('HTMLAreaElement.shape')
-  @DocsEditable()
   String shape;
 
-  @DomName('HTMLAreaElement.target')
-  @DocsEditable()
   String target;
 
   // From HTMLHyperlinkElementUtils
 
-  @DomName('HTMLAreaElement.hash')
-  @DocsEditable()
   String hash;
 
-  @DomName('HTMLAreaElement.host')
-  @DocsEditable()
   String host;
 
-  @DomName('HTMLAreaElement.hostname')
-  @DocsEditable()
   String hostname;
 
-  @DomName('HTMLAreaElement.href')
-  @DocsEditable()
   String href;
 
-  @DomName('HTMLAreaElement.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
-  @DomName('HTMLAreaElement.password')
-  @DocsEditable()
-  @Experimental() // untriaged
   String password;
 
-  @DomName('HTMLAreaElement.pathname')
-  @DocsEditable()
   String pathname;
 
-  @DomName('HTMLAreaElement.port')
-  @DocsEditable()
   String port;
 
-  @DomName('HTMLAreaElement.protocol')
-  @DocsEditable()
   String protocol;
 
-  @DomName('HTMLAreaElement.search')
-  @DocsEditable()
   String search;
 
-  @DomName('HTMLAreaElement.username')
-  @DocsEditable()
-  @Experimental() // untriaged
   String username;
 
-  @DomName('HTMLAreaElement.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLAudioElement')
 @Native("HTMLAudioElement")
 class AudioElement extends MediaElement {
-  @DomName('HTMLAudioElement.HTMLAudioElement')
-  @DocsEditable()
   factory AudioElement._([String src]) {
     if (src != null) {
       return AudioElement._create_1(src);
@@ -1608,9 +1042,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AuthenticatorAssertionResponse')
-@Experimental() // untriaged
 @Native("AuthenticatorAssertionResponse")
 class AuthenticatorAssertionResponse extends AuthenticatorResponse {
   // To suppress missing implicit constructor warnings.
@@ -1618,23 +1049,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AuthenticatorAssertionResponse.authenticatorData')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteBuffer authenticatorData;
 
-  @DomName('AuthenticatorAssertionResponse.signature')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteBuffer signature;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AuthenticatorAttestationResponse')
-@Experimental() // untriaged
 @Native("AuthenticatorAttestationResponse")
 class AuthenticatorAttestationResponse extends AuthenticatorResponse {
   // To suppress missing implicit constructor warnings.
@@ -1642,18 +1064,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AuthenticatorAttestationResponse.attestationObject')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteBuffer attestationObject;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AuthenticatorResponse')
-@Experimental() // untriaged
 @Native("AuthenticatorResponse")
 class AuthenticatorResponse extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1662,17 +1078,12 @@
   }
 
   @JSName('clientDataJSON')
-  @DomName('AuthenticatorResponse.clientDataJSON')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteBuffer clientDataJson;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLBRElement')
 @Native("HTMLBRElement")
 class BRElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -1680,8 +1091,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLBRElement.HTMLBRElement')
-  @DocsEditable()
   factory BRElement() => JS('returns:BRElement;creates:BRElement;new:true',
       '#.createElement(#)', document, "br");
   /**
@@ -1695,9 +1104,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchClickEvent')
-@Experimental() // untriaged
 @Native("BackgroundFetchClickEvent")
 class BackgroundFetchClickEvent extends BackgroundFetchEvent {
   // To suppress missing implicit constructor warnings.
@@ -1705,8 +1111,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchClickEvent.BackgroundFetchClickEvent')
-  @DocsEditable()
   factory BackgroundFetchClickEvent(String type, Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
     return BackgroundFetchClickEvent._create_1(type, init_1);
@@ -1717,18 +1121,12 @@
       type,
       init);
 
-  @DomName('BackgroundFetchClickEvent.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchEvent')
-@Experimental() // untriaged
 @Native("BackgroundFetchEvent")
 class BackgroundFetchEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -1736,8 +1134,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchEvent.BackgroundFetchEvent')
-  @DocsEditable()
   factory BackgroundFetchEvent(String type, Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
     return BackgroundFetchEvent._create_1(type, init_1);
@@ -1745,18 +1141,12 @@
   static BackgroundFetchEvent _create_1(type, init) =>
       JS('BackgroundFetchEvent', 'new BackgroundFetchEvent(#,#)', type, init);
 
-  @DomName('BackgroundFetchEvent.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchFailEvent')
-@Experimental() // untriaged
 @Native("BackgroundFetchFailEvent")
 class BackgroundFetchFailEvent extends BackgroundFetchEvent {
   // To suppress missing implicit constructor warnings.
@@ -1764,8 +1154,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchFailEvent.BackgroundFetchFailEvent')
-  @DocsEditable()
   factory BackgroundFetchFailEvent(String type, Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
     return BackgroundFetchFailEvent._create_1(type, init_1);
@@ -1776,18 +1164,12 @@
       type,
       init);
 
-  @DomName('BackgroundFetchFailEvent.fetches')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<BackgroundFetchSettledFetch> fetches;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchFetch')
-@Experimental() // untriaged
 @Native("BackgroundFetchFetch")
 class BackgroundFetchFetch extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1795,18 +1177,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchFetch.request')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _Request request;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchManager')
-@Experimental() // untriaged
 @Native("BackgroundFetchManager")
 class BackgroundFetchManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1814,9 +1190,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchManager.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future fetch(String id, Object requests, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1826,26 +1199,14 @@
   }
 
   @JSName('fetch')
-  @DomName('BackgroundFetchManager.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _fetch_1(id, requests, options) native;
   @JSName('fetch')
-  @DomName('BackgroundFetchManager.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _fetch_2(id, requests) native;
 
-  @DomName('BackgroundFetchManager.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<BackgroundFetchRegistration> get(String id) =>
       promiseToFuture<BackgroundFetchRegistration>(
           JS("", "#.get(#)", this, id));
 
-  @DomName('BackgroundFetchManager.getIds')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<String>> getIds() =>
       promiseToFuture<List<String>>(JS("", "#.getIds()", this));
 }
@@ -1853,9 +1214,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchRegistration')
-@Experimental() // untriaged
 @Native("BackgroundFetchRegistration")
 class BackgroundFetchRegistration extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -1863,53 +1221,26 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchRegistration.downloadTotal')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int downloadTotal;
 
-  @DomName('BackgroundFetchRegistration.downloaded')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int downloaded;
 
-  @DomName('BackgroundFetchRegistration.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('BackgroundFetchRegistration.title')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String title;
 
-  @DomName('BackgroundFetchRegistration.totalDownloadSize')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int totalDownloadSize;
 
-  @DomName('BackgroundFetchRegistration.uploadTotal')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int uploadTotal;
 
-  @DomName('BackgroundFetchRegistration.uploaded')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int uploaded;
 
-  @DomName('BackgroundFetchRegistration.abort')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> abort() => promiseToFuture<bool>(JS("", "#.abort()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchSettledFetch')
-@Experimental() // untriaged
 @Native("BackgroundFetchSettledFetch")
 class BackgroundFetchSettledFetch extends BackgroundFetchFetch {
   // To suppress missing implicit constructor warnings.
@@ -1917,8 +1248,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchSettledFetch.BackgroundFetchSettledFetch')
-  @DocsEditable()
   factory BackgroundFetchSettledFetch(_Request request, _Response response) {
     return BackgroundFetchSettledFetch._create_1(request, response);
   }
@@ -1928,18 +1257,12 @@
       request,
       response);
 
-  @DomName('BackgroundFetchSettledFetch.response')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _Response response;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BackgroundFetchedEvent')
-@Experimental() // untriaged
 @Native("BackgroundFetchedEvent")
 class BackgroundFetchedEvent extends BackgroundFetchEvent {
   // To suppress missing implicit constructor warnings.
@@ -1947,8 +1270,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BackgroundFetchedEvent.BackgroundFetchedEvent')
-  @DocsEditable()
   factory BackgroundFetchedEvent(String type, Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
     return BackgroundFetchedEvent._create_1(type, init_1);
@@ -1956,14 +1277,8 @@
   static BackgroundFetchedEvent _create_1(type, init) => JS(
       'BackgroundFetchedEvent', 'new BackgroundFetchedEvent(#,#)', type, init);
 
-  @DomName('BackgroundFetchedEvent.fetches')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<BackgroundFetchSettledFetch> fetches;
 
-  @DomName('BackgroundFetchedEvent.updateUI')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future updateUI(String title) =>
       promiseToFuture(JS("", "#.updateUI(#)", this, title));
 }
@@ -1971,8 +1286,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BarProp')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop
 @deprecated // standard
 @Native("BarProp")
@@ -1982,17 +1295,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BarProp.visible')
-  @DocsEditable()
   final bool visible;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BarcodeDetector')
-@Experimental() // untriaged
 @Native("BarcodeDetector")
 class BarcodeDetector extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2000,17 +1308,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BarcodeDetector.BarcodeDetector')
-  @DocsEditable()
   factory BarcodeDetector() {
     return BarcodeDetector._create_1();
   }
   static BarcodeDetector _create_1() =>
       JS('BarcodeDetector', 'new BarcodeDetector()');
 
-  @DomName('BarcodeDetector.detect')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<DetectedBarcode>> detect(/*ImageBitmapSource*/ image) =>
       promiseToFuture<List<DetectedBarcode>>(
           JS("", "#.detect(#)", this, image));
@@ -2019,8 +1322,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLBaseElement')
 @Native("HTMLBaseElement")
 class BaseElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -2028,8 +1329,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLBaseElement.HTMLBaseElement')
-  @DocsEditable()
   factory BaseElement() => JS(
       'returns:BaseElement;creates:BaseElement;new:true',
       '#.createElement(#)',
@@ -2042,22 +1341,14 @@
    */
   BaseElement.created() : super.created();
 
-  @DomName('HTMLBaseElement.href')
-  @DocsEditable()
   String href;
 
-  @DomName('HTMLBaseElement.target')
-  @DocsEditable()
   String target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BatteryManager')
-// https://dvcs.w3.org/hg/dap/raw-file/default/battery/Overview.html#batterymanager-interface
-@Experimental() // stable
 @Native("BatteryManager")
 class BatteryManager extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -2065,29 +1356,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BatteryManager.charging')
-  @DocsEditable()
   final bool charging;
 
-  @DomName('BatteryManager.chargingTime')
-  @DocsEditable()
   final num chargingTime;
 
-  @DomName('BatteryManager.dischargingTime')
-  @DocsEditable()
   final num dischargingTime;
 
-  @DomName('BatteryManager.level')
-  @DocsEditable()
   final num level;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BeforeInstallPromptEvent')
-@Experimental() // untriaged
 @Native("BeforeInstallPromptEvent")
 class BeforeInstallPromptEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -2095,8 +1375,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BeforeInstallPromptEvent.BeforeInstallPromptEvent')
-  @DocsEditable()
   factory BeforeInstallPromptEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -2112,28 +1390,17 @@
   static BeforeInstallPromptEvent _create_2(type) =>
       JS('BeforeInstallPromptEvent', 'new BeforeInstallPromptEvent(#)', type);
 
-  @DomName('BeforeInstallPromptEvent.platforms')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<String> platforms;
 
-  @DomName('BeforeInstallPromptEvent.userChoice')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Map<String, dynamic>> get userChoice =>
       promiseToFutureAsMap(JS("", "#.userChoice", this));
 
-  @DomName('BeforeInstallPromptEvent.prompt')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BeforeUnloadEvent')
 @Native("BeforeUnloadEvent")
 class BeforeUnloadEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -2152,7 +1419,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('Blob')
 @Native("Blob")
 class Blob extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2160,16 +1426,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Blob.size')
-  @DocsEditable()
   final int size;
 
-  @DomName('Blob.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('Blob.slice')
-  @DocsEditable()
   Blob slice([int start, int end, String contentType]) native;
 
   factory Blob(List blobParts, [String type, String endings]) {
@@ -2199,16 +1459,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('BlobCallback')
-@Experimental() // untriaged
 typedef void BlobCallback(Blob blob);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BlobEvent')
-@Experimental() // untriaged
 @Native("BlobEvent")
 class BlobEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -2216,8 +1471,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BlobEvent.BlobEvent')
-  @DocsEditable()
   factory BlobEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return BlobEvent._create_1(type, eventInitDict_1);
@@ -2225,23 +1478,14 @@
   static BlobEvent _create_1(type, eventInitDict) =>
       JS('BlobEvent', 'new BlobEvent(#,#)', type, eventInitDict);
 
-  @DomName('BlobEvent.data')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Blob data;
 
-  @DomName('BlobEvent.timecode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num timecode;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BluetoothRemoteGATTDescriptor')
-@Experimental() // untriaged
 @Native("BluetoothRemoteGATTDescriptor")
 class BluetoothRemoteGattDescriptor extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2249,29 +1493,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BluetoothRemoteGATTDescriptor.characteristic')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _BluetoothRemoteGATTCharacteristic characteristic;
 
-  @DomName('BluetoothRemoteGATTDescriptor.uuid')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String uuid;
 
-  @DomName('BluetoothRemoteGATTDescriptor.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteData value;
 
-  @DomName('BluetoothRemoteGATTDescriptor.readValue')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future readValue() => promiseToFuture(JS("", "#.readValue()", this));
 
-  @DomName('BluetoothRemoteGATTDescriptor.writeValue')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future writeValue(/*BufferSource*/ value) =>
       promiseToFuture(JS("", "#.writeValue(#)", this, value));
 }
@@ -2279,9 +1508,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Body')
-@Experimental() // untriaged
 @Native("Body")
 class Body extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2289,43 +1515,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Body.bodyUsed')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool bodyUsed;
 
-  @DomName('Body.arrayBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future arrayBuffer() => promiseToFuture(JS("", "#.arrayBuffer()", this));
 
-  @DomName('Body.blob')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Blob> blob() => promiseToFuture<Blob>(JS("", "#.blob()", this));
 
-  @DomName('Body.formData')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<FormData> formData() =>
       promiseToFuture<FormData>(JS("", "#.formData()", this));
 
-  @DomName('Body.json')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future json() => promiseToFuture(JS("", "#.json()", this));
 
-  @DomName('Body.text')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<String> text() => promiseToFuture<String>(JS("", "#.text()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLBodyElement')
 @Native("HTMLBodyElement")
 class BodyElement extends HtmlElement implements WindowEventHandlers {
   // To suppress missing implicit constructor warnings.
@@ -2339,8 +1545,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.blurEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> blurEvent =
       const EventStreamProvider<Event>('blur');
 
@@ -2350,8 +1554,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -2361,8 +1563,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.focusEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> focusEvent =
       const EventStreamProvider<Event>('focus');
 
@@ -2372,8 +1572,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.hashchangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent =
       const EventStreamProvider<Event>('hashchange');
 
@@ -2383,8 +1581,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.loadEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> loadEvent =
       const EventStreamProvider<Event>('load');
 
@@ -2394,8 +1590,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.messageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
@@ -2405,8 +1599,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.offlineEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent =
       const EventStreamProvider<Event>('offline');
 
@@ -2416,8 +1608,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.onlineEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent =
       const EventStreamProvider<Event>('online');
 
@@ -2427,8 +1617,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.popstateEvent')
-  @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent =
       const EventStreamProvider<PopStateEvent>('popstate');
 
@@ -2438,14 +1626,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.resizeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent =
       const EventStreamProvider<Event>('resize');
 
-  @DomName('HTMLBodyElement.scrollEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> scrollEvent =
       const EventStreamProvider<Event>('scroll');
 
@@ -2455,8 +1638,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.storageEvent')
-  @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent =
       const EventStreamProvider<StorageEvent>('storage');
 
@@ -2466,13 +1647,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLBodyElement.unloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent =
       const EventStreamProvider<Event>('unload');
 
-  @DomName('HTMLBodyElement.HTMLBodyElement')
-  @DocsEditable()
   factory BodyElement() => JS(
       'returns:BodyElement;creates:BodyElement;new:true',
       '#.createElement(#)',
@@ -2486,77 +1663,47 @@
   BodyElement.created() : super.created();
 
   /// Stream of `blur` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onblur')
-  @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
   /// Stream of `error` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onerror')
-  @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
   /// Stream of `focus` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onfocus')
-  @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
   /// Stream of `hashchange` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onhashchange')
-  @DocsEditable()
   ElementStream<Event> get onHashChange => hashChangeEvent.forElement(this);
 
   /// Stream of `load` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onload')
-  @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
   /// Stream of `message` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onmessage')
-  @DocsEditable()
   ElementStream<MessageEvent> get onMessage => messageEvent.forElement(this);
 
   /// Stream of `offline` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onoffline')
-  @DocsEditable()
   ElementStream<Event> get onOffline => offlineEvent.forElement(this);
 
   /// Stream of `online` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.ononline')
-  @DocsEditable()
   ElementStream<Event> get onOnline => onlineEvent.forElement(this);
 
   /// Stream of `popstate` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onpopstate')
-  @DocsEditable()
   ElementStream<PopStateEvent> get onPopState => popStateEvent.forElement(this);
 
   /// Stream of `resize` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onresize')
-  @DocsEditable()
   ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
-  @DomName('HTMLBodyElement.onscroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
   /// Stream of `storage` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onstorage')
-  @DocsEditable()
   ElementStream<StorageEvent> get onStorage => storageEvent.forElement(this);
 
   /// Stream of `unload` events handled by this [BodyElement].
-  @DomName('HTMLBodyElement.onunload')
-  @DocsEditable()
   ElementStream<Event> get onUnload => unloadEvent.forElement(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BroadcastChannel')
-@Experimental() // untriaged
 @Native("BroadcastChannel")
 class BroadcastChannel extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -2564,47 +1711,27 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BroadcastChannel.messageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('BroadcastChannel.BroadcastChannel')
-  @DocsEditable()
   factory BroadcastChannel(String name) {
     return BroadcastChannel._create_1(name);
   }
   static BroadcastChannel _create_1(name) =>
       JS('BroadcastChannel', 'new BroadcastChannel(#)', name);
 
-  @DomName('BroadcastChannel.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String name;
 
-  @DomName('BroadcastChannel.close')
-  @DocsEditable()
-  @Experimental() // untriaged
   void close() native;
 
-  @DomName('BroadcastChannel.postMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void postMessage(Object message) native;
 
-  @DomName('BroadcastChannel.onmessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BudgetState')
-@Experimental() // untriaged
 @Native("BudgetState")
 class BudgetState extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2612,22 +1739,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BudgetState.budgetAt')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num budgetAt;
 
-  @DomName('BudgetState.time')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int time;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLButtonElement')
 @Native("HTMLButtonElement")
 class ButtonElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -2635,8 +1754,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLButtonElement.HTMLButtonElement')
-  @DocsEditable()
   factory ButtonElement() => JS(
       'returns:ButtonElement;creates:ButtonElement;new:true',
       '#.createElement(#)',
@@ -2649,88 +1766,49 @@
    */
   ButtonElement.created() : super.created();
 
-  @DomName('HTMLButtonElement.autofocus')
-  @DocsEditable()
   bool autofocus;
 
-  @DomName('HTMLButtonElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLButtonElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLButtonElement.formAction')
-  @DocsEditable()
   String formAction;
 
-  @DomName('HTMLButtonElement.formEnctype')
-  @DocsEditable()
   String formEnctype;
 
-  @DomName('HTMLButtonElement.formMethod')
-  @DocsEditable()
   String formMethod;
 
-  @DomName('HTMLButtonElement.formNoValidate')
-  @DocsEditable()
   bool formNoValidate;
 
-  @DomName('HTMLButtonElement.formTarget')
-  @DocsEditable()
   String formTarget;
 
-  @DomName('HTMLButtonElement.labels')
-  @DocsEditable()
   @Unstable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> labels;
 
-  @DomName('HTMLButtonElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLButtonElement.type')
-  @DocsEditable()
   String type;
 
-  @DomName('HTMLButtonElement.validationMessage')
-  @DocsEditable()
   final String validationMessage;
 
-  @DomName('HTMLButtonElement.validity')
-  @DocsEditable()
   final ValidityState validity;
 
-  @DomName('HTMLButtonElement.value')
-  @DocsEditable()
   String value;
 
-  @DomName('HTMLButtonElement.willValidate')
-  @DocsEditable()
   final bool willValidate;
 
-  @DomName('HTMLButtonElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLButtonElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLButtonElement.setCustomValidity')
-  @DocsEditable()
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CDATASection')
 // http://dom.spec.whatwg.org/#cdatasection
 @deprecated // deprecated
 @Native("CDATASection")
@@ -2744,9 +1822,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CacheStorage')
-@Experimental() // untriaged
 @Native("CacheStorage")
 class CacheStorage extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2754,26 +1829,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CacheStorage.delete')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future delete(String cacheName) =>
       promiseToFuture(JS("", "#.delete(#)", this, cacheName));
 
-  @DomName('CacheStorage.has')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future has(String cacheName) =>
       promiseToFuture(JS("", "#.has(#)", this, cacheName));
 
-  @DomName('CacheStorage.keys')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future keys() => promiseToFuture(JS("", "#.keys()", this));
 
-  @DomName('CacheStorage.match')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future match(/*RequestInfo*/ request, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -2783,19 +1846,10 @@
   }
 
   @JSName('match')
-  @DomName('CacheStorage.match')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _match_1(request, options) native;
   @JSName('match')
-  @DomName('CacheStorage.match')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _match_2(request) native;
 
-  @DomName('CacheStorage.open')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future open(String cacheName) =>
       promiseToFuture(JS("", "#.open(#)", this, cacheName));
 }
@@ -2803,9 +1857,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CanMakePaymentEvent')
-@Experimental() // untriaged
 @Native("CanMakePaymentEvent")
 class CanMakePaymentEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -2813,8 +1864,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CanMakePaymentEvent.CanMakePaymentEvent')
-  @DocsEditable()
   factory CanMakePaymentEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return CanMakePaymentEvent._create_1(type, eventInitDict_1);
@@ -2825,38 +1874,20 @@
       type,
       eventInitDict);
 
-  @DomName('CanMakePaymentEvent.methodData')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List methodData;
 
-  @DomName('CanMakePaymentEvent.modifiers')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List modifiers;
 
-  @DomName('CanMakePaymentEvent.paymentRequestOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String paymentRequestOrigin;
 
-  @DomName('CanMakePaymentEvent.topLevelOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String topLevelOrigin;
 
-  @DomName('CanMakePaymentEvent.respondWith')
-  @DocsEditable()
-  @Experimental() // untriaged
   void respondWith(Future canMakePaymentResponse) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CanvasCaptureMediaStreamTrack')
-@Experimental() // untriaged
 @Native("CanvasCaptureMediaStreamTrack")
 class CanvasCaptureMediaStreamTrack extends MediaStreamTrack {
   // To suppress missing implicit constructor warnings.
@@ -2864,21 +1895,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CanvasCaptureMediaStreamTrack.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CanvasElement canvas;
 
-  @DomName('CanvasCaptureMediaStreamTrack.requestFrame')
-  @DocsEditable()
-  @Experimental() // untriaged
   void requestFrame() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('HTMLCanvasElement')
 @Native("HTMLCanvasElement")
 class CanvasElement extends HtmlElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
@@ -2892,8 +1916,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLCanvasElement.webglcontextlostEvent')
-  @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextLostEvent =
       const EventStreamProvider<gl.ContextEvent>('webglcontextlost');
 
@@ -2903,13 +1925,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('HTMLCanvasElement.webglcontextrestoredEvent')
-  @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextRestoredEvent =
       const EventStreamProvider<gl.ContextEvent>('webglcontextrestored');
 
-  @DomName('HTMLCanvasElement.HTMLCanvasElement')
-  @DocsEditable()
   factory CanvasElement({int width, int height}) {
     CanvasElement e = JS('returns:CanvasElement;creates:CanvasElement;new:true',
         '#.createElement(#)', document, "canvas");
@@ -2925,22 +1943,13 @@
   CanvasElement.created() : super.created();
 
   /// The height of this canvas element in CSS pixels.
-  @DomName('HTMLCanvasElement.height')
-  @DocsEditable()
   int height;
 
   /// The width of this canvas element in CSS pixels.
-  @DomName('HTMLCanvasElement.width')
-  @DocsEditable()
   int width;
 
-  @DomName('HTMLCanvasElement.captureStream')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStream captureStream([num frameRate]) native;
 
-  @DomName('HTMLCanvasElement.getContext')
-  @DocsEditable()
   @Creates('CanvasRenderingContext2D|RenderingContext|RenderingContext2')
   @Returns('CanvasRenderingContext2D|RenderingContext|RenderingContext2|Null')
   Object getContext(String contextId, [Map attributes]) {
@@ -2952,42 +1961,26 @@
   }
 
   @JSName('getContext')
-  @DomName('HTMLCanvasElement.getContext')
-  @DocsEditable()
   @Creates('CanvasRenderingContext2D|RenderingContext|RenderingContext2')
   @Returns('CanvasRenderingContext2D|RenderingContext|RenderingContext2|Null')
   Object _getContext_1(contextId, attributes) native;
   @JSName('getContext')
-  @DomName('HTMLCanvasElement.getContext')
-  @DocsEditable()
   @Creates('CanvasRenderingContext2D|RenderingContext|RenderingContext2')
   @Returns('CanvasRenderingContext2D|RenderingContext|RenderingContext2|Null')
   Object _getContext_2(contextId) native;
 
-  @DomName('HTMLCanvasElement.toBlob')
-  @DocsEditable()
-  @Experimental() // untriaged
   void toBlob(BlobCallback callback, String type, [Object arguments]) native;
 
   @JSName('toDataURL')
-  @DomName('HTMLCanvasElement.toDataURL')
-  @DocsEditable()
   String _toDataUrl(String type, [arguments_OR_quality]) native;
 
-  @DomName('HTMLCanvasElement.transferControlToOffscreen')
-  @DocsEditable()
-  @Experimental() // untriaged
   OffscreenCanvas transferControlToOffscreen() native;
 
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
-  @DomName('HTMLCanvasElement.onwebglcontextlost')
-  @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextLost =>
       webGlContextLostEvent.forElement(this);
 
   /// Stream of `webglcontextrestored` events handled by this [CanvasElement].
-  @DomName('HTMLCanvasElement.onwebglcontextrestored')
-  @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextRestored =>
       webGlContextRestoredEvent.forElement(this);
 
@@ -3006,7 +1999,6 @@
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @Experimental()
   gl.RenderingContext getContext3d(
       {alpha: true,
       depth: true,
@@ -3077,7 +2069,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * An opaque canvas object representing a gradient.
  *
@@ -3108,7 +2099,6 @@
  *   from WHATWG.
  * * [CanvasGradient](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvasgradient) from W3C.
  */
-@DomName('CanvasGradient')
 @Native("CanvasGradient")
 class CanvasGradient extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -3125,15 +2115,12 @@
    *
    * * [Multiple Color Stops](https://developer.mozilla.org/en-US/docs/CSS/linear-gradient#Gradient_with_multiple_color_stops) from MDN.
    */
-  @DomName('CanvasGradient.addColorStop')
-  @DocsEditable()
   void addColorStop(num offset, String color) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * An opaque object representing a pattern of image, canvas, or video.
  *
@@ -3162,7 +2149,6 @@
  *   from WHATWG.
  * * [CanvasPattern](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvaspattern) from W3C.
  */
-@DomName('CanvasPattern')
 @Native("CanvasPattern")
 class CanvasPattern extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -3170,9 +2156,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CanvasPattern.setTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setTransform(Matrix transform) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3183,7 +2166,6 @@
   CanvasElement get canvas;
 }
 
-@DomName('CanvasRenderingContext2D')
 @Native("CanvasRenderingContext2D")
 class CanvasRenderingContext2D extends Interceptor
     implements CanvasRenderingContext {
@@ -3192,42 +2174,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CanvasRenderingContext2D.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CanvasElement canvas;
 
-  @DomName('CanvasRenderingContext2D.currentTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   Matrix currentTransform;
 
-  @DomName('CanvasRenderingContext2D.direction')
-  @DocsEditable()
-  @Experimental() // untriaged
   String direction;
 
-  @DomName('CanvasRenderingContext2D.fillStyle')
-  @DocsEditable()
   @Creates('String|CanvasGradient|CanvasPattern')
   @Returns('String|CanvasGradient|CanvasPattern')
   Object fillStyle;
 
-  @DomName('CanvasRenderingContext2D.filter')
-  @DocsEditable()
-  @Experimental() // untriaged
   String filter;
 
-  @DomName('CanvasRenderingContext2D.font')
-  @DocsEditable()
   String font;
 
-  @DomName('CanvasRenderingContext2D.globalAlpha')
-  @DocsEditable()
   num globalAlpha;
 
-  @DomName('CanvasRenderingContext2D.globalCompositeOperation')
-  @DocsEditable()
   String globalCompositeOperation;
 
   /**
@@ -3240,65 +2202,34 @@
    *   smoothing](https://html.spec.whatwg.org/multipage/scripting.html#image-smoothing)
    *   from WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool imageSmoothingEnabled;
 
-  @DomName('CanvasRenderingContext2D.imageSmoothingQuality')
-  @DocsEditable()
-  @Experimental() // untriaged
   String imageSmoothingQuality;
 
-  @DomName('CanvasRenderingContext2D.lineCap')
-  @DocsEditable()
   String lineCap;
 
-  @DomName('CanvasRenderingContext2D.lineJoin')
-  @DocsEditable()
   String lineJoin;
 
-  @DomName('CanvasRenderingContext2D.lineWidth')
-  @DocsEditable()
   num lineWidth;
 
-  @DomName('CanvasRenderingContext2D.miterLimit')
-  @DocsEditable()
   num miterLimit;
 
-  @DomName('CanvasRenderingContext2D.shadowBlur')
-  @DocsEditable()
   num shadowBlur;
 
-  @DomName('CanvasRenderingContext2D.shadowColor')
-  @DocsEditable()
   String shadowColor;
 
-  @DomName('CanvasRenderingContext2D.shadowOffsetX')
-  @DocsEditable()
   num shadowOffsetX;
 
-  @DomName('CanvasRenderingContext2D.shadowOffsetY')
-  @DocsEditable()
   num shadowOffsetY;
 
-  @DomName('CanvasRenderingContext2D.strokeStyle')
-  @DocsEditable()
   @Creates('String|CanvasGradient|CanvasPattern')
   @Returns('String|CanvasGradient|CanvasPattern')
   Object strokeStyle;
 
-  @DomName('CanvasRenderingContext2D.textAlign')
-  @DocsEditable()
   String textAlign;
 
-  @DomName('CanvasRenderingContext2D.textBaseline')
-  @DocsEditable()
   String textBaseline;
 
-  @DomName('CanvasRenderingContext2D.addHitRegion')
-  @DocsEditable()
-  @Experimental() // untriaged
   void addHitRegion([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -3310,35 +2241,18 @@
   }
 
   @JSName('addHitRegion')
-  @DomName('CanvasRenderingContext2D.addHitRegion')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _addHitRegion_1(options) native;
   @JSName('addHitRegion')
-  @DomName('CanvasRenderingContext2D.addHitRegion')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _addHitRegion_2() native;
 
-  @DomName('CanvasRenderingContext2D.beginPath')
-  @DocsEditable()
   void beginPath() native;
 
-  @DomName('CanvasRenderingContext2D.clearHitRegions')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearHitRegions() native;
 
-  @DomName('CanvasRenderingContext2D.clearRect')
-  @DocsEditable()
   void clearRect(num x, num y, num width, num height) native;
 
-  @DomName('CanvasRenderingContext2D.clip')
-  @DocsEditable()
   void clip([path_OR_winding, String winding]) native;
 
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   ImageData createImageData(data_OR_imagedata_OR_sw,
       [int sh_OR_sw,
@@ -3390,106 +2304,62 @@
   }
 
   @JSName('createImageData')
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   _createImageData_1(imagedata) native;
   @JSName('createImageData')
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   _createImageData_2(int sw, sh) native;
   @JSName('createImageData')
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   _createImageData_3(int sw, sh, imageDataColorSettings) native;
   @JSName('createImageData')
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   _createImageData_4(data, sw, int sh) native;
   @JSName('createImageData')
-  @DomName('CanvasRenderingContext2D.createImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   _createImageData_5(data, sw, int sh, imageDataColorSettings) native;
 
-  @DomName('CanvasRenderingContext2D.createLinearGradient')
-  @DocsEditable()
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
-  @DomName('CanvasRenderingContext2D.createPattern')
-  @DocsEditable()
   CanvasPattern createPattern(Object image, String repetitionType) native;
 
-  @DomName('CanvasRenderingContext2D.createRadialGradient')
-  @DocsEditable()
   CanvasGradient createRadialGradient(
       num x0, num y0, num r0, num x1, num y1, num r1) native;
 
-  @DomName('CanvasRenderingContext2D.drawFocusIfNeeded')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawFocusIfNeeded(element_OR_path, [Element element]) native;
 
-  @DomName('CanvasRenderingContext2D.fillRect')
-  @DocsEditable()
+  void fill([path_OR_winding, String winding]) native;
+
   void fillRect(num x, num y, num width, num height) native;
 
-  @DomName('CanvasRenderingContext2D.getContextAttributes')
-  @DocsEditable()
-  // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
-  @Experimental()
   Map getContextAttributes() {
     return convertNativeToDart_Dictionary(_getContextAttributes_1());
   }
 
   @JSName('getContextAttributes')
-  @DomName('CanvasRenderingContext2D.getContextAttributes')
-  @DocsEditable()
-  // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
-  @Experimental()
   _getContextAttributes_1() native;
 
-  @DomName('CanvasRenderingContext2D.getImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   ImageData getImageData(int sx, int sy, int sw, int sh) {
     return convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
 
   @JSName('getImageData')
-  @DomName('CanvasRenderingContext2D.getImageData')
-  @DocsEditable()
   @Creates('ImageData|=Object')
   _getImageData_1(sx, sy, sw, sh) native;
 
   @JSName('getLineDash')
-  @DomName('CanvasRenderingContext2D.getLineDash')
-  @DocsEditable()
   List<num> _getLineDash() native;
 
-  @DomName('CanvasRenderingContext2D.isContextLost')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isContextLost() native;
 
-  @DomName('CanvasRenderingContext2D.isPointInPath')
-  @DocsEditable()
   bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding])
       native;
 
-  @DomName('CanvasRenderingContext2D.isPointInStroke')
-  @DocsEditable()
   bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native;
 
-  @DomName('CanvasRenderingContext2D.measureText')
-  @DocsEditable()
   TextMetrics measureText(String text) native;
 
-  @DomName('CanvasRenderingContext2D.putImageData')
-  @DocsEditable()
   void putImageData(ImageData imagedata, int dx, int dy,
       [int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight]) {
     if (dirtyX == null &&
@@ -3513,115 +2383,61 @@
   }
 
   @JSName('putImageData')
-  @DomName('CanvasRenderingContext2D.putImageData')
-  @DocsEditable()
   void _putImageData_1(imagedata, dx, dy) native;
   @JSName('putImageData')
-  @DomName('CanvasRenderingContext2D.putImageData')
-  @DocsEditable()
   void _putImageData_2(
       imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
 
-  @DomName('CanvasRenderingContext2D.removeHitRegion')
-  @DocsEditable()
-  @Experimental() // untriaged
   void removeHitRegion(String id) native;
 
-  @DomName('CanvasRenderingContext2D.resetTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void resetTransform() native;
 
-  @DomName('CanvasRenderingContext2D.restore')
-  @DocsEditable()
   void restore() native;
 
-  @DomName('CanvasRenderingContext2D.rotate')
-  @DocsEditable()
   void rotate(num angle) native;
 
-  @DomName('CanvasRenderingContext2D.save')
-  @DocsEditable()
   void save() native;
 
-  @DomName('CanvasRenderingContext2D.scale')
-  @DocsEditable()
   void scale(num x, num y) native;
 
-  @DomName('CanvasRenderingContext2D.scrollPathIntoView')
-  @DocsEditable()
-  @Experimental() // untriaged
   void scrollPathIntoView([Path2D path]) native;
 
-  @DomName('CanvasRenderingContext2D.setTransform')
-  @DocsEditable()
   void setTransform(num a, num b, num c, num d, num e, num f) native;
 
-  @DomName('CanvasRenderingContext2D.stroke')
-  @DocsEditable()
   void stroke([Path2D path]) native;
 
-  @DomName('CanvasRenderingContext2D.strokeRect')
-  @DocsEditable()
   void strokeRect(num x, num y, num width, num height) native;
 
-  @DomName('CanvasRenderingContext2D.strokeText')
-  @DocsEditable()
   void strokeText(String text, num x, num y, [num maxWidth]) native;
 
-  @DomName('CanvasRenderingContext2D.transform')
-  @DocsEditable()
   void transform(num a, num b, num c, num d, num e, num f) native;
 
-  @DomName('CanvasRenderingContext2D.translate')
-  @DocsEditable()
   void translate(num x, num y) native;
 
   // From CanvasPath
 
   @JSName('arc')
-  @DomName('CanvasRenderingContext2D.arc')
-  @DocsEditable()
   void _arc(num x, num y, num radius, num startAngle, num endAngle,
       bool anticlockwise) native;
 
-  @DomName('CanvasRenderingContext2D.arcTo')
-  @DocsEditable()
   void arcTo(num x1, num y1, num x2, num y2, num radius) native;
 
-  @DomName('CanvasRenderingContext2D.bezierCurveTo')
-  @DocsEditable()
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
       native;
 
-  @DomName('CanvasRenderingContext2D.closePath')
-  @DocsEditable()
   void closePath() native;
 
-  @DomName('CanvasRenderingContext2D.ellipse')
-  @DocsEditable()
-  @Experimental() // untriaged
   void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
       num startAngle, num endAngle, bool anticlockwise) native;
 
-  @DomName('CanvasRenderingContext2D.lineTo')
-  @DocsEditable()
   void lineTo(num x, num y) native;
 
-  @DomName('CanvasRenderingContext2D.moveTo')
-  @DocsEditable()
   void moveTo(num x, num y) native;
 
-  @DomName('CanvasRenderingContext2D.quadraticCurveTo')
-  @DocsEditable()
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
 
-  @DomName('CanvasRenderingContext2D.rect')
-  @DocsEditable()
   void rect(num x, num y, num width, num height) native;
 
-  @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
-  @DocsEditable()
   ImageData createImageDataFromImageData(ImageData imagedata) =>
       JS('ImageData', '#.createImageData(#)', this, imagedata);
 
@@ -3661,7 +2477,6 @@
     this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
   }
 
-  @DomName('CanvasRenderingContext2D.arc')
   void arc(num x, num y, num radius, num startAngle, num endAngle,
       [bool anticlockwise = false]) {
     // TODO(terry): This should not be needed: dartbug.com/20939.
@@ -3669,7 +2484,6 @@
         endAngle, anticlockwise);
   }
 
-  @DomName('CanvasRenderingContext2D.createPatternFromImage')
   CanvasPattern createPatternFromImage(
           ImageElement image, String repetitionType) =>
       JS('CanvasPattern', '#.createPattern(#, #)', this, image, repetitionType);
@@ -3714,7 +2528,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   void drawImageToRect(CanvasImageSource source, Rectangle destRect,
       {Rectangle sourceRect}) {
     if (sourceRect == null) {
@@ -3763,7 +2576,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
   void drawImage(CanvasImageSource source, num destX, num destY) native;
 
@@ -3793,7 +2605,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
   void drawImageScaled(CanvasImageSource source, num destX, num destY,
       num destWidth, num destHeight) native;
@@ -3827,7 +2638,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
   void drawImageScaledFromSource(
       CanvasImageSource source,
@@ -3844,7 +2654,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.lineDashOffset')
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
   num get lineDashOffset =>
@@ -3854,7 +2663,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.lineDashOffset')
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
   set lineDashOffset(num value) {
@@ -3873,7 +2681,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.getLineDash')
   List<num> getLineDash() {
     // TODO(14316): Firefox has this functionality with mozDash, but it's a bit
     // different.
@@ -3888,7 +2695,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.setLineDash')
   void setLineDash(List<num> dash) {
     // TODO(14316): Firefox has this functionality with mozDash, but it's a bit
     // different.
@@ -3913,7 +2719,6 @@
    * [CanvasRenderingContext2D.textBaseLine] properties are also applied to the
    * drawn text.
    */
-  @DomName('CanvasRenderingContext2D.fillText')
   void fillText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
       JS('void', '#.fillText(#, #, #, #)', this, text, x, y, maxWidth);
@@ -3922,14 +2727,7 @@
     }
   }
 
-  @DomName('CanvasRenderingContext2D.fill')
-  void fill([String winding = 'nonzero']) {
-    JS('void', '#.fill(#)', this, winding);
-  }
-
   /** Deprecated always returns 1.0 */
-  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRation')
-  @Experimental()
   @deprecated
   double get backingStorePixelRatio => 1.0;
 }
@@ -3937,8 +2735,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CharacterData')
 @Native("CharacterData")
 class CharacterData extends Node
     implements NonDocumentTypeChildNode, ChildNode {
@@ -3947,63 +2743,36 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CharacterData.data')
-  @DocsEditable()
   String data;
 
-  @DomName('CharacterData.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('CharacterData.appendData')
-  @DocsEditable()
   void appendData(String data) native;
 
-  @DomName('CharacterData.deleteData')
-  @DocsEditable()
   void deleteData(int offset, int count) native;
 
-  @DomName('CharacterData.insertData')
-  @DocsEditable()
   void insertData(int offset, String data) native;
 
-  @DomName('CharacterData.replaceData')
-  @DocsEditable()
   void replaceData(int offset, int count, String data) native;
 
-  @DomName('CharacterData.substringData')
-  @DocsEditable()
   String substringData(int offset, int count) native;
 
   // From ChildNode
 
-  @DomName('CharacterData.after')
-  @DocsEditable()
-  @Experimental() // untriaged
   void after(Object nodes) native;
 
-  @DomName('CharacterData.before')
-  @DocsEditable()
-  @Experimental() // untriaged
   void before(Object nodes) native;
 
   // From NonDocumentTypeChildNode
 
-  @DomName('CharacterData.nextElementSibling')
-  @DocsEditable()
   final Element nextElementSibling;
 
-  @DomName('CharacterData.previousElementSibling')
-  @DocsEditable()
   final Element previousElementSibling;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ChildNode')
-@Experimental() // untriaged
 abstract class ChildNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory ChildNode._() {
@@ -4020,9 +2789,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Client')
-@Experimental() // untriaged
 @Native("Client")
 class Client extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4030,38 +2796,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Client.frameType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String frameType;
 
-  @DomName('Client.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('Client.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('Client.url')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String url;
 
-  @DomName('Client.postMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void postMessage(Object message, [List<Object> transfer]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Clients')
-@Experimental() // untriaged
 @Native("Clients")
 class Clients extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4069,19 +2817,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Clients.claim')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future claim() => promiseToFuture(JS("", "#.claim()", this));
 
-  @DomName('Clients.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future get(String id) => promiseToFuture(JS("", "#.get(#)", this, id));
 
-  @DomName('Clients.matchAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future matchAll([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -4091,19 +2830,10 @@
   }
 
   @JSName('matchAll')
-  @DomName('Clients.matchAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _matchAll_1(options) native;
   @JSName('matchAll')
-  @DomName('Clients.matchAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _matchAll_2() native;
 
-  @DomName('Clients.openWindow')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<WindowClient> openWindow(String url) =>
       promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
 }
@@ -4111,9 +2841,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ClipboardEvent')
-@Experimental() // untriaged
 @Native("ClipboardEvent")
 class ClipboardEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -4121,8 +2848,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ClipboardEvent.ClipboardEvent')
-  @DocsEditable()
   factory ClipboardEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -4135,17 +2860,12 @@
   static ClipboardEvent _create_2(type) =>
       JS('ClipboardEvent', 'new ClipboardEvent(#)', type);
 
-  @DomName('ClipboardEvent.clipboardData')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DataTransfer clipboardData;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CloseEvent')
 @Native("CloseEvent")
 class CloseEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -4153,8 +2873,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CloseEvent.CloseEvent')
-  @DocsEditable()
   factory CloseEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -4167,24 +2885,16 @@
   static CloseEvent _create_2(type) =>
       JS('CloseEvent', 'new CloseEvent(#)', type);
 
-  @DomName('CloseEvent.code')
-  @DocsEditable()
   final int code;
 
-  @DomName('CloseEvent.reason')
-  @DocsEditable()
   final String reason;
 
-  @DomName('CloseEvent.wasClean')
-  @DocsEditable()
   final bool wasClean;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Comment')
 @Native("Comment")
 class Comment extends CharacterData {
   factory Comment([String data]) {
@@ -4202,7 +2912,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('CompositionEvent')
 @Native("CompositionEvent")
 class CompositionEvent extends UIEvent {
   factory CompositionEvent(String type,
@@ -4227,8 +2936,6 @@
     return e;
   }
 
-  @DomName('CompositionEvent.CompositionEvent')
-  @DocsEditable()
   factory CompositionEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -4241,13 +2948,9 @@
   static CompositionEvent _create_2(type) =>
       JS('CompositionEvent', 'new CompositionEvent(#)', type);
 
-  @DomName('CompositionEvent.data')
-  @DocsEditable()
   final String data;
 
   @JSName('initCompositionEvent')
-  @DomName('CompositionEvent.initCompositionEvent')
-  @DocsEditable()
   void _initCompositionEvent(String type, bool bubbles, bool cancelable,
       Window view, String data) native;
 }
@@ -4255,11 +2958,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.
 
-@DocsEditable()
-@DomName('HTMLContentElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
-@Experimental()
-// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#content-element
 @Native("HTMLContentElement")
 class ContentElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -4267,8 +2966,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLContentElement.HTMLContentElement')
-  @DocsEditable()
   factory ContentElement() => document.createElement("content");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -4280,12 +2977,8 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('content');
 
-  @DomName('HTMLContentElement.select')
-  @DocsEditable()
   String select;
 
-  @DomName('HTMLContentElement.getDistributedNodes')
-  @DocsEditable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   List<Node> getDistributedNodes() native;
@@ -4294,9 +2987,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CookieStore')
-@Experimental() // untriaged
 @Native("CookieStore")
 class CookieStore extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4304,9 +2994,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CookieStore.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future getAll([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -4316,19 +3003,10 @@
   }
 
   @JSName('getAll')
-  @DomName('CookieStore.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _getAll_1(options) native;
   @JSName('getAll')
-  @DomName('CookieStore.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _getAll_2() native;
 
-  @DomName('CookieStore.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future set(String name, String value, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -4338,22 +3016,14 @@
   }
 
   @JSName('set')
-  @DomName('CookieStore.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _set_1(name, value, options) native;
   @JSName('set')
-  @DomName('CookieStore.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _set_2(name, value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Coordinates')
 @Native("Coordinates")
 class Coordinates extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4361,41 +3031,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Coordinates.accuracy')
-  @DocsEditable()
   final num accuracy;
 
-  @DomName('Coordinates.altitude')
-  @DocsEditable()
   final num altitude;
 
-  @DomName('Coordinates.altitudeAccuracy')
-  @DocsEditable()
   final num altitudeAccuracy;
 
-  @DomName('Coordinates.heading')
-  @DocsEditable()
   final num heading;
 
-  @DomName('Coordinates.latitude')
-  @DocsEditable()
   final num latitude;
 
-  @DomName('Coordinates.longitude')
-  @DocsEditable()
   final num longitude;
 
-  @DomName('Coordinates.speed')
-  @DocsEditable()
   final num speed;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Credential')
-@Experimental() // untriaged
 @Native("Credential")
 class Credential extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4403,23 +3056,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Credential.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('Credential.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CredentialUserData')
-@Experimental() // untriaged
 @Native("CredentialUserData")
 class CredentialUserData extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4428,23 +3072,14 @@
   }
 
   @JSName('iconURL')
-  @DomName('CredentialUserData.iconURL')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String iconUrl;
 
-  @DomName('CredentialUserData.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CredentialsContainer')
-@Experimental() // untriaged
 @Native("CredentialsContainer")
 class CredentialsContainer extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4452,9 +3087,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CredentialsContainer.create')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future create([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -4464,19 +3096,10 @@
   }
 
   @JSName('create')
-  @DomName('CredentialsContainer.create')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _create_1(options) native;
   @JSName('create')
-  @DomName('CredentialsContainer.create')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _create_2() native;
 
-  @DomName('CredentialsContainer.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future get([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -4486,31 +3109,16 @@
   }
 
   @JSName('get')
-  @DomName('CredentialsContainer.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _get_1(options) native;
   @JSName('get')
-  @DomName('CredentialsContainer.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _get_2() native;
 
-  @DomName('CredentialsContainer.preventSilentAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future preventSilentAccess() =>
       promiseToFuture(JS("", "#.preventSilentAccess()", this));
 
-  @DomName('CredentialsContainer.requireUserMediation')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future requireUserMediation() =>
       promiseToFuture(JS("", "#.requireUserMediation()", this));
 
-  @DomName('CredentialsContainer.store')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future store(Credential credential) =>
       promiseToFuture(JS("", "#.store(#)", this, credential));
 }
@@ -4518,11 +3126,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('Crypto')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/WebCryptoAPI/
 @Native("Crypto")
 class Crypto extends Interceptor {
   TypedData getRandomValues(TypedData array) {
@@ -4538,14 +3143,9 @@
   static bool get supported =>
       JS('bool', '!!(window.crypto && window.crypto.getRandomValues)');
 
-  @DomName('Crypto.subtle')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _SubtleCrypto subtle;
 
   @JSName('getRandomValues')
-  @DomName('Crypto.getRandomValues')
-  @DocsEditable()
   @Creates('TypedData')
   @Returns('TypedData|Null')
   TypedData _getRandomValues(TypedData array) native;
@@ -4554,9 +3154,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CryptoKey')
-@Experimental() // untriaged
 @Native("CryptoKey")
 class CryptoKey extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4564,35 +3161,19 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CryptoKey.algorithm')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Null')
   final Object algorithm;
 
-  @DomName('CryptoKey.extractable')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool extractable;
 
-  @DomName('CryptoKey.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('CryptoKey.usages')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object usages;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSS')
-// http://www.w3.org/TR/css3-conditional/#the-css-interface
-@Experimental() // None
 @Native("CSS")
 class Css extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -4600,125 +3181,53 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSS.paintWorklet')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final _Worklet paintWorklet;
+  static final _Worklet paintWorklet;
 
-  @DomName('CSS.Hz')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue Hz(num value) native;
 
-  @DomName('CSS.ch')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue ch(num value) native;
 
-  @DomName('CSS.cm')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue cm(num value) native;
 
-  @DomName('CSS.deg')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue deg(num value) native;
 
-  @DomName('CSS.dpcm')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue dpcm(num value) native;
 
-  @DomName('CSS.dpi')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue dpi(num value) native;
 
-  @DomName('CSS.dppx')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue dppx(num value) native;
 
-  @DomName('CSS.em')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue em(num value) native;
 
-  @DomName('CSS.escape')
-  @DocsEditable()
-  @Experimental() // untriaged
   static String escape(String ident) native;
 
-  @DomName('CSS.ex')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue ex(num value) native;
 
-  @DomName('CSS.fr')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue fr(num value) native;
 
-  @DomName('CSS.grad')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue grad(num value) native;
 
   @JSName('in')
-  @DomName('CSS.in')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue inch(num value) native;
 
-  @DomName('CSS.kHz')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue kHz(num value) native;
 
-  @DomName('CSS.mm')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue mm(num value) native;
 
-  @DomName('CSS.ms')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue ms(num value) native;
 
-  @DomName('CSS.number')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue number(num value) native;
 
-  @DomName('CSS.pc')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue pc(num value) native;
 
-  @DomName('CSS.percent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue percent(num value) native;
 
-  @DomName('CSS.pt')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue pt(num value) native;
 
-  @DomName('CSS.px')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue px(num value) native;
 
-  @DomName('CSS.rad')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue rad(num value) native;
 
-  @DomName('CSS.registerProperty')
-  @DocsEditable()
-  @Experimental() // untriaged
   static void registerProperty(Map descriptor) {
     var descriptor_1 = convertDartToNative_Dictionary(descriptor);
     _registerProperty_1(descriptor_1);
@@ -4726,63 +3235,31 @@
   }
 
   @JSName('registerProperty')
-  @DomName('CSS.registerProperty')
-  @DocsEditable()
-  @Experimental() // untriaged
   static void _registerProperty_1(descriptor) native;
 
-  @DomName('CSS.rem')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue rem(num value) native;
 
-  @DomName('CSS.s')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue s(num value) native;
 
-  @DomName('CSS.supports')
-  @DocsEditable()
   static bool supports(String property, String value) native;
 
   @JSName('supports')
-  @DomName('CSS.supports')
-  @DocsEditable()
   static bool supportsCondition(String conditionText) native;
 
-  @DomName('CSS.turn')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue turn(num value) native;
 
-  @DomName('CSS.vh')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue vh(num value) native;
 
-  @DomName('CSS.vmax')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue vmax(num value) native;
 
-  @DomName('CSS.vmin')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue vmin(num value) native;
 
-  @DomName('CSS.vw')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssUnitValue vw(num value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSCharsetRule')
-// http://dev.w3.org/csswg/cssom/#the-csscharsetrule-interface
-@Experimental()
 @Native("CSSCharsetRule")
 class CssCharsetRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -4790,17 +3267,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSCharsetRule.encoding')
-  @DocsEditable()
   String encoding;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSConditionRule')
-@Experimental() // untriaged
 @Native("CSSConditionRule")
 class CssConditionRule extends CssGroupingRule {
   // To suppress missing implicit constructor warnings.
@@ -4808,17 +3280,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSConditionRule.conditionText')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String conditionText;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSFontFaceRule')
 @Native("CSSFontFaceRule")
 class CssFontFaceRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -4826,17 +3293,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSFontFaceRule.style')
-  @DocsEditable()
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSGroupingRule')
-@Experimental() // untriaged
 @Native("CSSGroupingRule")
 class CssGroupingRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -4844,30 +3306,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSGroupingRule.cssRules')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('_CssRuleList|Null')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
-  @DomName('CSSGroupingRule.deleteRule')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteRule(int index) native;
 
-  @DomName('CSSGroupingRule.insertRule')
-  @DocsEditable()
-  @Experimental() // untriaged
   int insertRule(String rule, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSImageValue')
-@Experimental() // untriaged
 @Native("CSSImageValue")
 class CssImageValue extends CssResourceValue {
   // To suppress missing implicit constructor warnings.
@@ -4875,27 +3325,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSImageValue.intrinsicHeight')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num intrinsicHeight;
 
-  @DomName('CSSImageValue.intrinsicRatio')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num intrinsicRatio;
 
-  @DomName('CSSImageValue.intrinsicWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num intrinsicWidth;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSImportRule')
 @Native("CSSImportRule")
 class CssImportRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -4903,25 +3342,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSImportRule.href')
-  @DocsEditable()
   final String href;
 
-  @DomName('CSSImportRule.media')
-  @DocsEditable()
   final MediaList media;
 
-  @DomName('CSSImportRule.styleSheet')
-  @DocsEditable()
   final CssStyleSheet styleSheet;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSKeyframeRule')
-@Experimental() // untriaged
 @Native("CSSKeyframeRule,MozCSSKeyframeRule,WebKitCSSKeyframeRule")
 class CssKeyframeRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -4929,23 +3359,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSKeyframeRule.keyText')
-  @DocsEditable()
-  @Experimental() // untriaged
   String keyText;
 
-  @DomName('CSSKeyframeRule.style')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSKeyframesRule')
-@Experimental() // untriaged
 @Native("CSSKeyframesRule,MozCSSKeyframesRule,WebKitCSSKeyframesRule")
 class CssKeyframesRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -4953,45 +3374,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSKeyframesRule.cssRules')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('_CssRuleList|Null')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
-  @DomName('CSSKeyframesRule.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   String name;
 
-  @DomName('CSSKeyframesRule.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssKeyframeRule __getter__(int index) native;
 
-  @DomName('CSSKeyframesRule.appendRule')
-  @DocsEditable()
-  @Experimental() // untriaged
   void appendRule(String rule) native;
 
-  @DomName('CSSKeyframesRule.deleteRule')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteRule(String select) native;
 
-  @DomName('CSSKeyframesRule.findRule')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssKeyframeRule findRule(String select) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSKeywordValue')
-@Experimental() // untriaged
 @Native("CSSKeywordValue")
 class CssKeywordValue extends CssStyleValue {
   // To suppress missing implicit constructor warnings.
@@ -4999,26 +3399,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSKeywordValue.CSSKeywordValue')
-  @DocsEditable()
   factory CssKeywordValue(String keyword) {
     return CssKeywordValue._create_1(keyword);
   }
   static CssKeywordValue _create_1(keyword) =>
       JS('CssKeywordValue', 'new CSSKeywordValue(#)', keyword);
 
-  @DomName('CSSKeywordValue.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSMatrixComponent')
-@Experimental() // untriaged
 @Native("CSSMatrixComponent")
 class CssMatrixComponent extends CssTransformComponent {
   // To suppress missing implicit constructor warnings.
@@ -5026,8 +3418,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSMatrixComponent.CSSMatrixComponent')
-  @DocsEditable()
   factory CssMatrixComponent(DomMatrixReadOnly matrix, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -5040,17 +3430,12 @@
   static CssMatrixComponent _create_2(matrix) =>
       JS('CssMatrixComponent', 'new CSSMatrixComponent(#)', matrix);
 
-  @DomName('CSSMatrixComponent.matrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix matrix;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSMediaRule')
 @Native("CSSMediaRule")
 class CssMediaRule extends CssConditionRule {
   // To suppress missing implicit constructor warnings.
@@ -5058,17 +3443,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSMediaRule.media')
-  @DocsEditable()
   final MediaList media;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSNamespaceRule')
-@Experimental() // untriaged
 @Native("CSSNamespaceRule")
 class CssNamespaceRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -5077,23 +3457,14 @@
   }
 
   @JSName('namespaceURI')
-  @DomName('CSSNamespaceRule.namespaceURI')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String namespaceUri;
 
-  @DomName('CSSNamespaceRule.prefix')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String prefix;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSNumericValue')
-@Experimental() // untriaged
 @Native("CSSNumericValue")
 class CssNumericValue extends CssStyleValue {
   // To suppress missing implicit constructor warnings.
@@ -5101,42 +3472,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSNumericValue.add')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue add(CssNumericValue value) native;
 
-  @DomName('CSSNumericValue.div')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue div(num value) native;
 
-  @DomName('CSSNumericValue.mul')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue mul(num value) native;
 
-  @DomName('CSSNumericValue.parse')
-  @DocsEditable()
-  @Experimental() // untriaged
   static CssNumericValue parse(String cssText) native;
 
-  @DomName('CSSNumericValue.sub')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue sub(CssNumericValue value) native;
 
-  @DomName('CSSNumericValue.to')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue to(String unit) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSPageRule')
 @Native("CSSPageRule")
 class CssPageRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -5144,21 +3495,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSPageRule.selectorText')
-  @DocsEditable()
   String selectorText;
 
-  @DomName('CSSPageRule.style')
-  @DocsEditable()
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSPerspective')
-@Experimental() // untriaged
 @Native("CSSPerspective")
 class CssPerspective extends CssTransformComponent {
   // To suppress missing implicit constructor warnings.
@@ -5166,26 +3510,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSPerspective.CSSPerspective')
-  @DocsEditable()
   factory CssPerspective(CssNumericValue length) {
     return CssPerspective._create_1(length);
   }
   static CssPerspective _create_1(length) =>
       JS('CssPerspective', 'new CSSPerspective(#)', length);
 
-  @DomName('CSSPerspective.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue length;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSPositionValue')
-@Experimental() // untriaged
 @Native("CSSPositionValue")
 class CssPositionValue extends CssStyleValue {
   // To suppress missing implicit constructor warnings.
@@ -5193,31 +3529,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSPositionValue.CSSPositionValue')
-  @DocsEditable()
   factory CssPositionValue(CssNumericValue x, CssNumericValue y) {
     return CssPositionValue._create_1(x, y);
   }
   static CssPositionValue _create_1(x, y) =>
       JS('CssPositionValue', 'new CSSPositionValue(#,#)', x, y);
 
-  @DomName('CSSPositionValue.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue x;
 
-  @DomName('CSSPositionValue.y')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSResourceValue')
-@Experimental() // untriaged
 @Native("CSSResourceValue")
 class CssResourceValue extends CssStyleValue {
   // To suppress missing implicit constructor warnings.
@@ -5225,18 +3550,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSResourceValue.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSRotation')
-@Experimental() // untriaged
 @Native("CSSRotation")
 class CssRotation extends CssTransformComponent {
   // To suppress missing implicit constructor warnings.
@@ -5244,8 +3563,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSRotation.CSSRotation')
-  @DocsEditable()
   factory CssRotation(angleValue_OR_x, [num y, num z, CssNumericValue angle]) {
     if ((angleValue_OR_x is CssNumericValue) &&
         y == null &&
@@ -5266,32 +3583,18 @@
   static CssRotation _create_2(angleValue_OR_x, y, z, angle) => JS(
       'CssRotation', 'new CSSRotation(#,#,#,#)', angleValue_OR_x, y, z, angle);
 
-  @DomName('CSSRotation.angle')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue angle;
 
-  @DomName('CSSRotation.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   num x;
 
-  @DomName('CSSRotation.y')
-  @DocsEditable()
-  @Experimental() // untriaged
   num y;
 
-  @DomName('CSSRotation.z')
-  @DocsEditable()
-  @Experimental() // untriaged
   num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSRule')
 @Native("CSSRule")
 class CssRule extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -5299,77 +3602,40 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSRule.CHARSET_RULE')
-  @DocsEditable()
   static const int CHARSET_RULE = 2;
 
-  @DomName('CSSRule.FONT_FACE_RULE')
-  @DocsEditable()
   static const int FONT_FACE_RULE = 5;
 
-  @DomName('CSSRule.IMPORT_RULE')
-  @DocsEditable()
   static const int IMPORT_RULE = 3;
 
-  @DomName('CSSRule.KEYFRAMES_RULE')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int KEYFRAMES_RULE = 7;
 
-  @DomName('CSSRule.KEYFRAME_RULE')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int KEYFRAME_RULE = 8;
 
-  @DomName('CSSRule.MEDIA_RULE')
-  @DocsEditable()
   static const int MEDIA_RULE = 4;
 
-  @DomName('CSSRule.NAMESPACE_RULE')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int NAMESPACE_RULE = 10;
 
-  @DomName('CSSRule.PAGE_RULE')
-  @DocsEditable()
   static const int PAGE_RULE = 6;
 
-  @DomName('CSSRule.STYLE_RULE')
-  @DocsEditable()
   static const int STYLE_RULE = 1;
 
-  @DomName('CSSRule.SUPPORTS_RULE')
-  @DocsEditable()
   static const int SUPPORTS_RULE = 12;
 
-  @DomName('CSSRule.VIEWPORT_RULE')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int VIEWPORT_RULE = 15;
 
-  @DomName('CSSRule.cssText')
-  @DocsEditable()
   String cssText;
 
-  @DomName('CSSRule.parentRule')
-  @DocsEditable()
   final CssRule parentRule;
 
-  @DomName('CSSRule.parentStyleSheet')
-  @DocsEditable()
   final CssStyleSheet parentStyleSheet;
 
-  @DomName('CSSRule.type')
-  @DocsEditable()
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSScale')
-@Experimental() // untriaged
 @Native("CSSScale")
 class CssScale extends CssTransformComponent {
   // To suppress missing implicit constructor warnings.
@@ -5377,8 +3643,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSScale.CSSScale')
-  @DocsEditable()
   factory CssScale(num x, num y, [num z]) {
     if ((y is num) && (x is num) && z == null) {
       return CssScale._create_1(x, y);
@@ -5392,28 +3656,16 @@
   static CssScale _create_2(x, y, z) =>
       JS('CssScale', 'new CSSScale(#,#,#)', x, y, z);
 
-  @DomName('CSSScale.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   num x;
 
-  @DomName('CSSScale.y')
-  @DocsEditable()
-  @Experimental() // untriaged
   num y;
 
-  @DomName('CSSScale.z')
-  @DocsEditable()
-  @Experimental() // untriaged
   num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSSkew')
-@Experimental() // untriaged
 @Native("CSSSkew")
 class CssSkew extends CssTransformComponent {
   // To suppress missing implicit constructor warnings.
@@ -5421,21 +3673,13 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSSkew.CSSSkew')
-  @DocsEditable()
   factory CssSkew(CssNumericValue ax, CssNumericValue ay) {
     return CssSkew._create_1(ax, ay);
   }
   static CssSkew _create_1(ax, ay) => JS('CssSkew', 'new CSSSkew(#,#)', ax, ay);
 
-  @DomName('CSSSkew.ax')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue ax;
 
-  @DomName('CSSSkew.ay')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue ay;
 }
 
@@ -5449,7 +3693,6 @@
 // Source of CSS properties:
 //   CSSPropertyNames.in
 
-@DomName('CSSStyleDeclaration')
 @Native("CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties")
 class CssStyleDeclaration extends Interceptor with CssStyleDeclarationBase {
   factory CssStyleDeclaration() => new CssStyleDeclaration.css('');
@@ -5491,7 +3734,6 @@
     return JS('bool', '# in #', propertyName, this);
   }
 
-  @DomName('CSSStyleDeclaration.setProperty')
   void setProperty(String propertyName, String value, [String priority]) {
     return _setPropertyHelper(
         _browserPropertyName(propertyName), value, priority);
@@ -5552,38 +3794,21 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSStyleDeclaration.cssFloat')
-  @DocsEditable()
-  @Experimental() // untriaged
   String cssFloat;
 
-  @DomName('CSSStyleDeclaration.cssText')
-  @DocsEditable()
   String cssText;
 
-  @DomName('CSSStyleDeclaration.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('CSSStyleDeclaration.parentRule')
-  @DocsEditable()
   final CssRule parentRule;
 
-  @DomName('CSSStyleDeclaration.getPropertyPriority')
-  @DocsEditable()
   String getPropertyPriority(String property) native;
 
   @JSName('getPropertyValue')
-  @DomName('CSSStyleDeclaration.getPropertyValue')
-  @DocsEditable()
   String _getPropertyValue(String property) native;
 
-  @DomName('CSSStyleDeclaration.item')
-  @DocsEditable()
   String item(int index) native;
 
-  @DomName('CSSStyleDeclaration.removeProperty')
-  @DocsEditable()
   String removeProperty(String property) native;
 
   /** Gets the value of "background" */
@@ -9914,8 +8139,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSStyleRule')
 @Native("CSSStyleRule")
 class CssStyleRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -9923,20 +8146,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSStyleRule.selectorText')
-  @DocsEditable()
   String selectorText;
 
-  @DomName('CSSStyleRule.style')
-  @DocsEditable()
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSStyleSheet')
 @Native("CSSStyleSheet")
 class CssStyleSheet extends StyleSheet {
   // To suppress missing implicit constructor warnings.
@@ -9944,48 +8161,28 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSStyleSheet.cssRules')
-  @DocsEditable()
   @Returns('_CssRuleList|Null')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
-  @DomName('CSSStyleSheet.ownerRule')
-  @DocsEditable()
   final CssRule ownerRule;
 
-  @DomName('CSSStyleSheet.rules')
-  @DocsEditable()
-  @Experimental() // non-standard
   @Returns('_CssRuleList|Null')
   @Creates('_CssRuleList')
   final List<CssRule> rules;
 
-  @DomName('CSSStyleSheet.addRule')
-  @DocsEditable()
-  @Experimental() // non-standard
   int addRule(String selector, String style, [int index]) native;
 
-  @DomName('CSSStyleSheet.deleteRule')
-  @DocsEditable()
   void deleteRule(int index) native;
 
-  @DomName('CSSStyleSheet.insertRule')
-  @DocsEditable()
   int insertRule(String rule, [int index]) native;
 
-  @DomName('CSSStyleSheet.removeRule')
-  @DocsEditable()
-  @Experimental() // non-standard
   void removeRule(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSStyleValue')
-@Experimental() // untriaged
 @Native("CSSStyleValue")
 class CssStyleValue extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -9993,17 +8190,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSStyleValue.parse')
-  @DocsEditable()
-  @Experimental() // untriaged
   static Object parse(String property, String cssText) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSSupportsRule')
 @Native("CSSSupportsRule")
 class CssSupportsRule extends CssConditionRule {
   // To suppress missing implicit constructor warnings.
@@ -10015,9 +8207,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSTransformComponent')
-@Experimental() // untriaged
 @Native("CSSTransformComponent")
 class CssTransformComponent extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10025,18 +8214,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSTransformComponent.is2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool is2D;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSTransformValue')
-@Experimental() // untriaged
 @Native("CSSTransformValue")
 class CssTransformValue extends CssStyleValue {
   // To suppress missing implicit constructor warnings.
@@ -10044,8 +8227,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSTransformValue.CSSTransformValue')
-  @DocsEditable()
   factory CssTransformValue([List<CssTransformComponent> transformComponents]) {
     if (transformComponents == null) {
       return CssTransformValue._create_1();
@@ -10060,33 +8241,18 @@
   static CssTransformValue _create_2(transformComponents) =>
       JS('CssTransformValue', 'new CSSTransformValue(#)', transformComponents);
 
-  @DomName('CSSTransformValue.is2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool is2D;
 
-  @DomName('CSSTransformValue.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int length;
 
-  @DomName('CSSTransformValue.componentAtIndex')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssTransformComponent componentAtIndex(int index) native;
 
-  @DomName('CSSTransformValue.toMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix toMatrix() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSTranslation')
-@Experimental() // untriaged
 @Native("CSSTranslation")
 class CssTranslation extends CssTransformComponent {
   // To suppress missing implicit constructor warnings.
@@ -10094,8 +8260,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSTranslation.CSSTranslation')
-  @DocsEditable()
   factory CssTranslation(CssNumericValue x, CssNumericValue y,
       [CssNumericValue z]) {
     if ((y is CssNumericValue) && (x is CssNumericValue) && z == null) {
@@ -10113,28 +8277,16 @@
   static CssTranslation _create_2(x, y, z) =>
       JS('CssTranslation', 'new CSSTranslation(#,#,#)', x, y, z);
 
-  @DomName('CSSTranslation.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue x;
 
-  @DomName('CSSTranslation.y')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue y;
 
-  @DomName('CSSTranslation.z')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssNumericValue z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSUnitValue')
-@Experimental() // untriaged
 @Native("CSSUnitValue")
 class CssUnitValue extends CssNumericValue {
   // To suppress missing implicit constructor warnings.
@@ -10142,36 +8294,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSUnitValue.CSSUnitValue')
-  @DocsEditable()
   factory CssUnitValue(num value, String unit) {
     return CssUnitValue._create_1(value, unit);
   }
   static CssUnitValue _create_1(value, unit) =>
       JS('CssUnitValue', 'new CSSUnitValue(#,#)', value, unit);
 
-  @DomName('CSSUnitValue.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('CSSUnitValue.unit')
-  @DocsEditable()
-  @Experimental() // untriaged
   String unit;
 
-  @DomName('CSSUnitValue.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSUnparsedValue')
-@Experimental() // untriaged
 @Native("CSSUnparsedValue")
 class CssUnparsedValue extends CssStyleValue {
   // To suppress missing implicit constructor warnings.
@@ -10179,23 +8317,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSUnparsedValue.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int length;
 
-  @DomName('CSSUnparsedValue.fragmentAtIndex')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object fragmentAtIndex(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSVariableReferenceValue')
-@Experimental() // untriaged
 @Native("CSSVariableReferenceValue")
 class CssVariableReferenceValue extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10203,23 +8332,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSVariableReferenceValue.fallback')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CssUnparsedValue fallback;
 
-  @DomName('CSSVariableReferenceValue.variable')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String variable;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSViewportRule')
-@Experimental() // untriaged
 @Native("CSSViewportRule")
 class CssViewportRule extends CssRule {
   // To suppress missing implicit constructor warnings.
@@ -10227,18 +8347,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSViewportRule.style')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSURLImageValue')
-@Experimental() // untriaged
 @Native("CSSURLImageValue")
 class CssurlImageValue extends CssImageValue {
   // To suppress missing implicit constructor warnings.
@@ -10246,17 +8360,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSURLImageValue.CSSURLImageValue')
-  @DocsEditable()
   factory CssurlImageValue(String url) {
     return CssurlImageValue._create_1(url);
   }
   static CssurlImageValue _create_1(url) =>
       JS('CssurlImageValue', 'new CSSURLImageValue(#)', url);
 
-  @DomName('CSSURLImageValue.url')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String url;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10265,7 +8374,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('CustomElementConstructor')
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-constructor-generation
 @deprecated // experimental
 typedef void CustomElementConstructor();
@@ -10273,9 +8381,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CustomElementRegistry')
-@Experimental() // untriaged
 @Native("CustomElementRegistry")
 class CustomElementRegistry extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10283,9 +8388,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CustomElementRegistry.define')
-  @DocsEditable()
-  @Experimental() // untriaged
   void define(String name, Object constructor, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -10297,24 +8399,12 @@
   }
 
   @JSName('define')
-  @DomName('CustomElementRegistry.define')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _define_1(name, constructor, options) native;
   @JSName('define')
-  @DomName('CustomElementRegistry.define')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _define_2(name, constructor) native;
 
-  @DomName('CustomElementRegistry.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object get(String name) native;
 
-  @DomName('CustomElementRegistry.whenDefined')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future whenDefined(String name) =>
       promiseToFuture(JS("", "#.whenDefined(#)", this, name));
 }
@@ -10324,7 +8414,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('CustomEvent')
 @Native("CustomEvent")
 class CustomEvent extends Event {
   @Creates('Null') // Set from Dart code; does not instantiate a native type.
@@ -10352,7 +8441,6 @@
     return e;
   }
 
-  @DomName('CustomEvent.detail')
   get detail {
     if (_dartDetail != null) {
       return _dartDetail;
@@ -10360,8 +8448,6 @@
     return _detail;
   }
 
-  @DomName('CustomEvent.CustomEvent')
-  @DocsEditable()
   factory CustomEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -10374,21 +8460,13 @@
   static CustomEvent _create_2(type) =>
       JS('CustomEvent', 'new CustomEvent(#)', type);
 
-  @DomName('CustomEvent._detail')
-  @DocsEditable()
-  @Experimental() // untriaged
   dynamic get _detail =>
       convertNativeToDart_SerializedScriptValue(this._get__detail);
   @JSName('detail')
-  @DomName('CustomEvent._detail')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Null')
   final dynamic _get__detail;
 
   @JSName('initCustomEvent')
-  @DomName('CustomEvent.initCustomEvent')
-  @DocsEditable()
   void _initCustomEvent(String type,
       [bool bubbles, bool cancelable, Object detail]) native;
 }
@@ -10396,8 +8474,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLDListElement')
 @Native("HTMLDListElement")
 class DListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -10405,8 +8481,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLDListElement.HTMLDListElement')
-  @DocsEditable()
   factory DListElement() => JS(
       'returns:DListElement;creates:DListElement;new:true',
       '#.createElement(#)',
@@ -10423,9 +8497,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLDataElement')
-@Experimental() // untriaged
 @Native("HTMLDataElement")
 class DataElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -10439,17 +8510,12 @@
    */
   DataElement.created() : super.created();
 
-  @DomName('HTMLDataElement.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLDataListElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -10461,8 +8527,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLDataListElement.HTMLDataListElement')
-  @DocsEditable()
   factory DataListElement() => document.createElement("datalist");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -10474,8 +8538,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('datalist');
 
-  @DomName('HTMLDataListElement.options')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> options;
@@ -10484,9 +8546,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DataTransfer')
-@Experimental() // untriaged
 @Native("DataTransfer")
 class DataTransfer extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10494,68 +8553,35 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DataTransfer.DataTransfer')
-  @DocsEditable()
   factory DataTransfer() {
     return DataTransfer._create_1();
   }
   static DataTransfer _create_1() => JS('DataTransfer', 'new DataTransfer()');
 
-  @DomName('DataTransfer.dropEffect')
-  @DocsEditable()
-  @Experimental() // untriaged
   String dropEffect;
 
-  @DomName('DataTransfer.effectAllowed')
-  @DocsEditable()
-  @Experimental() // untriaged
   String effectAllowed;
 
-  @DomName('DataTransfer.files')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('FileList|Null')
   @Creates('FileList')
   final List<File> files;
 
-  @DomName('DataTransfer.items')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DataTransferItemList items;
 
-  @DomName('DataTransfer.types')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<String> types;
 
-  @DomName('DataTransfer.clearData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearData([String format]) native;
 
-  @DomName('DataTransfer.getData')
-  @DocsEditable()
-  @Experimental() // untriaged
   String getData(String format) native;
 
-  @DomName('DataTransfer.setData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setData(String format, String data) native;
 
-  @DomName('DataTransfer.setDragImage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setDragImage(Element image, int x, int y) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DataTransferItem')
-// http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
-@Experimental()
 @Native("DataTransferItem")
 class DataTransferItem extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10563,34 +8589,21 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DataTransferItem.kind')
-  @DocsEditable()
   final String kind;
 
-  @DomName('DataTransferItem.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('DataTransferItem.getAsFile')
-  @DocsEditable()
   File getAsFile() native;
 
   @JSName('webkitGetAsEntry')
-  @DomName('DataTransferItem.webkitGetAsEntry')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   Entry getAsEntry() native;
 }
 // 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.
 
-@DocsEditable()
-@DomName('DataTransferItemList')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-datatransferitemlist-interface
-@Experimental()
 @Native("DataTransferItemList")
 class DataTransferItemList extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10598,35 +8611,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DataTransferItemList.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('DataTransferItemList.add')
-  @DocsEditable()
   DataTransferItem add(data_OR_file, [String type]) native;
 
   @JSName('add')
-  @DomName('DataTransferItemList.add')
-  @DocsEditable()
   DataTransferItem addData(String data, String type) native;
 
   @JSName('add')
-  @DomName('DataTransferItemList.add')
-  @DocsEditable()
   DataTransferItem addFile(File file) native;
 
-  @DomName('DataTransferItemList.clear')
-  @DocsEditable()
   void clear() native;
 
-  @DomName('DataTransferItemList.item')
-  @DocsEditable()
   DataTransferItem item(int index) native;
 
-  @DomName('DataTransferItemList.remove')
-  @DocsEditable()
-  @Experimental() // untriaged
   void remove(int index) native;
 
   DataTransferItem operator [](int index) {
@@ -10639,9 +8637,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('DatabaseCallback')
-// http://www.w3.org/TR/webdatabase/#databasecallback
-@Experimental() // deprecated
 typedef void DatabaseCallback(SqlDatabase database);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10649,8 +8644,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('DecodeErrorCallback')
-@Experimental() // untriaged
 typedef void DecodeErrorCallback(DomException error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10658,16 +8651,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('DecodeSuccessCallback')
-@Experimental() // untriaged
 typedef void DecodeSuccessCallback(AudioBuffer decodedData);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DedicatedWorkerGlobalScope')
-@Experimental() // untriaged
 @Native("DedicatedWorkerGlobalScope")
 class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
@@ -10681,30 +8669,15 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('DedicatedWorkerGlobalScope.messageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('DedicatedWorkerGlobalScope.PERSISTENT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int PERSISTENT = 1;
 
-  @DomName('DedicatedWorkerGlobalScope.TEMPORARY')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
-  @DomName('DedicatedWorkerGlobalScope.close')
-  @DocsEditable()
-  @Experimental() // untriaged
   void close() native;
 
-  @DomName('DedicatedWorkerGlobalScope.postMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void postMessage(/*any*/ message, [List<Object> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
@@ -10717,69 +8690,41 @@
   }
 
   @JSName('postMessage')
-  @DomName('DedicatedWorkerGlobalScope.postMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _postMessage_1(message, List<Object> transfer) native;
   @JSName('postMessage')
-  @DomName('DedicatedWorkerGlobalScope.postMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _postMessage_2(message) native;
 
   @JSName('webkitRequestFileSystem')
-  @DomName('DedicatedWorkerGlobalScope.webkitRequestFileSystem')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   void _webkitRequestFileSystem(int type, int size,
       [_FileSystemCallback successCallback,
       _ErrorCallback errorCallback]) native;
 
   @JSName('webkitRequestFileSystemSync')
-  @DomName('DedicatedWorkerGlobalScope.webkitRequestFileSystemSync')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   _DOMFileSystemSync requestFileSystemSync(int type, int size) native;
 
   @JSName('webkitResolveLocalFileSystemSyncURL')
-  @DomName('DedicatedWorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   _EntrySync resolveLocalFileSystemSyncUrl(String url) native;
 
   @JSName('webkitResolveLocalFileSystemURL')
-  @DomName('DedicatedWorkerGlobalScope.webkitResolveLocalFileSystemURL')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   void _webkitResolveLocalFileSystemUrl(
       String url, _EntryCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
   /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
-  @DomName('DedicatedWorkerGlobalScope.onmessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DeprecatedStorageInfo')
-@Experimental() // untriaged
 @Native("DeprecatedStorageInfo")
 class DeprecatedStorageInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10787,26 +8732,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DeprecatedStorageInfo.PERSISTENT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int PERSISTENT = 1;
 
-  @DomName('DeprecatedStorageInfo.TEMPORARY')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
-  @DomName('DeprecatedStorageInfo.queryUsageAndQuota')
-  @DocsEditable()
-  @Experimental() // untriaged
   void queryUsageAndQuota(int storageType,
       [StorageUsageCallback usageCallback,
       StorageErrorCallback errorCallback]) native;
 
-  @DomName('DeprecatedStorageInfo.requestQuota')
-  @DocsEditable()
-  @Experimental() // untriaged
   void requestQuota(int storageType, int newQuotaInBytes,
       [StorageQuotaCallback quotaCallback,
       StorageErrorCallback errorCallback]) native;
@@ -10815,9 +8748,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DeprecatedStorageQuota')
-@Experimental() // untriaged
 @Native("DeprecatedStorageQuota")
 class DeprecatedStorageQuota extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10825,15 +8755,9 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DeprecatedStorageQuota.queryUsageAndQuota')
-  @DocsEditable()
-  @Experimental() // untriaged
   void queryUsageAndQuota(StorageUsageCallback usageCallback,
       [StorageErrorCallback errorCallback]) native;
 
-  @DomName('DeprecatedStorageQuota.requestQuota')
-  @DocsEditable()
-  @Experimental() // untriaged
   void requestQuota(int newQuotaInBytes,
       [StorageQuotaCallback quotaCallback,
       StorageErrorCallback errorCallback]) native;
@@ -10842,9 +8766,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DeprecationReport')
-@Experimental() // untriaged
 @Native("DeprecationReport")
 class DeprecationReport extends ReportBody {
   // To suppress missing implicit constructor warnings.
@@ -10852,30 +8773,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DeprecationReport.lineNumber')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int lineNumber;
 
-  @DomName('DeprecationReport.message')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String message;
 
-  @DomName('DeprecationReport.sourceFile')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String sourceFile;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
 @Native("HTMLDetailsElement")
 class DetailsElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -10883,8 +8792,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLDetailsElement.HTMLDetailsElement')
-  @DocsEditable()
   factory DetailsElement() => document.createElement("details");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -10896,17 +8803,12 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('details');
 
-  @DomName('HTMLDetailsElement.open')
-  @DocsEditable()
   bool open;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DetectedBarcode')
-@Experimental() // untriaged
 @Native("DetectedBarcode")
 class DetectedBarcode extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10914,36 +8816,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DetectedBarcode.DetectedBarcode')
-  @DocsEditable()
   factory DetectedBarcode() {
     return DetectedBarcode._create_1();
   }
   static DetectedBarcode _create_1() =>
       JS('DetectedBarcode', 'new DetectedBarcode()');
 
-  @DomName('DetectedBarcode.boundingBox')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Rectangle boundingBox;
 
-  @DomName('DetectedBarcode.cornerPoints')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List cornerPoints;
 
-  @DomName('DetectedBarcode.rawValue')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String rawValue;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DetectedFace')
-@Experimental() // untriaged
 @Native("DetectedFace")
 class DetectedFace extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10951,30 +8839,19 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DetectedFace.DetectedFace')
-  @DocsEditable()
   factory DetectedFace() {
     return DetectedFace._create_1();
   }
   static DetectedFace _create_1() => JS('DetectedFace', 'new DetectedFace()');
 
-  @DomName('DetectedFace.boundingBox')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Rectangle boundingBox;
 
-  @DomName('DetectedFace.landmarks')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List landmarks;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DetectedText')
-@Experimental() // untriaged
 @Native("DetectedText")
 class DetectedText extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -10982,36 +8859,21 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DetectedText.DetectedText')
-  @DocsEditable()
   factory DetectedText() {
     return DetectedText._create_1();
   }
   static DetectedText _create_1() => JS('DetectedText', 'new DetectedText()');
 
-  @DomName('DetectedText.boundingBox')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Rectangle boundingBox;
 
-  @DomName('DetectedText.cornerPoints')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List cornerPoints;
 
-  @DomName('DetectedText.rawValue')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String rawValue;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DeviceAcceleration')
-// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-@Experimental()
 @Native("DeviceAcceleration")
 class DeviceAcceleration extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -11019,26 +8881,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DeviceAcceleration.x')
-  @DocsEditable()
   final num x;
 
-  @DomName('DeviceAcceleration.y')
-  @DocsEditable()
   final num y;
 
-  @DomName('DeviceAcceleration.z')
-  @DocsEditable()
   final num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DeviceMotionEvent')
-// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-@Experimental()
 @Native("DeviceMotionEvent")
 class DeviceMotionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -11046,8 +8898,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DeviceMotionEvent.DeviceMotionEvent')
-  @DocsEditable()
   factory DeviceMotionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -11060,30 +8910,18 @@
   static DeviceMotionEvent _create_2(type) =>
       JS('DeviceMotionEvent', 'new DeviceMotionEvent(#)', type);
 
-  @DomName('DeviceMotionEvent.acceleration')
-  @DocsEditable()
   final DeviceAcceleration acceleration;
 
-  @DomName('DeviceMotionEvent.accelerationIncludingGravity')
-  @DocsEditable()
   final DeviceAcceleration accelerationIncludingGravity;
 
-  @DomName('DeviceMotionEvent.interval')
-  @DocsEditable()
   final num interval;
 
-  @DomName('DeviceMotionEvent.rotationRate')
-  @DocsEditable()
   final DeviceRotationRate rotationRate;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DeviceOrientationEvent')
-// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-@Experimental()
 @Native("DeviceOrientationEvent")
 class DeviceOrientationEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -11091,8 +8929,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DeviceOrientationEvent.DeviceOrientationEvent')
-  @DocsEditable()
   factory DeviceOrientationEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -11108,30 +8944,18 @@
   static DeviceOrientationEvent _create_2(type) =>
       JS('DeviceOrientationEvent', 'new DeviceOrientationEvent(#)', type);
 
-  @DomName('DeviceOrientationEvent.absolute')
-  @DocsEditable()
   final bool absolute;
 
-  @DomName('DeviceOrientationEvent.alpha')
-  @DocsEditable()
   final num alpha;
 
-  @DomName('DeviceOrientationEvent.beta')
-  @DocsEditable()
   final num beta;
 
-  @DomName('DeviceOrientationEvent.gamma')
-  @DocsEditable()
   final num gamma;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DeviceRotationRate')
-// http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-@Experimental()
 @Native("DeviceRotationRate")
 class DeviceRotationRate extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -11139,24 +8963,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DeviceRotationRate.alpha')
-  @DocsEditable()
   final num alpha;
 
-  @DomName('DeviceRotationRate.beta')
-  @DocsEditable()
   final num beta;
 
-  @DomName('DeviceRotationRate.gamma')
-  @DocsEditable()
   final num gamma;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLDialogElement')
 @Unstable()
 @Native("HTMLDialogElement")
 class DialogElement extends HtmlElement {
@@ -11171,34 +8987,20 @@
    */
   DialogElement.created() : super.created();
 
-  @DomName('HTMLDialogElement.open')
-  @DocsEditable()
   bool open;
 
-  @DomName('HTMLDialogElement.returnValue')
-  @DocsEditable()
-  @Experimental() // untriaged
   String returnValue;
 
-  @DomName('HTMLDialogElement.close')
-  @DocsEditable()
   void close([String returnValue]) native;
 
-  @DomName('HTMLDialogElement.show')
-  @DocsEditable()
   void show() native;
 
-  @DomName('HTMLDialogElement.showModal')
-  @DocsEditable()
   void showModal() native;
 }
 // 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.
 
-@DomName('DirectoryEntry')
-// http://www.w3.org/TR/file-system-api/#the-directoryentry-interface
-@Experimental()
 @Native("DirectoryEntry")
 class DirectoryEntry extends Entry {
   /**
@@ -11250,12 +9052,8 @@
   }
 
   @JSName('createReader')
-  @DomName('DirectoryEntry.createReader')
-  @DocsEditable()
   DirectoryReader _createReader() native;
 
-  @DomName('DirectoryEntry.getDirectory')
-  @DocsEditable()
   void __getDirectory(String path,
       [Map options,
       _EntryCallback successCallback,
@@ -11280,26 +9078,16 @@
   }
 
   @JSName('getDirectory')
-  @DomName('DirectoryEntry.getDirectory')
-  @DocsEditable()
   void __getDirectory_1(path, options, _EntryCallback successCallback,
       _ErrorCallback errorCallback) native;
   @JSName('getDirectory')
-  @DomName('DirectoryEntry.getDirectory')
-  @DocsEditable()
   void __getDirectory_2(path, options, _EntryCallback successCallback) native;
   @JSName('getDirectory')
-  @DomName('DirectoryEntry.getDirectory')
-  @DocsEditable()
   void __getDirectory_3(path, options) native;
   @JSName('getDirectory')
-  @DomName('DirectoryEntry.getDirectory')
-  @DocsEditable()
   void __getDirectory_4(path) native;
 
   @JSName('getDirectory')
-  @DomName('DirectoryEntry.getDirectory')
-  @DocsEditable()
   Future<Entry> _getDirectory(String path, {Map options}) {
     var completer = new Completer<Entry>();
     __getDirectory(path, options, (value) {
@@ -11310,8 +9098,6 @@
     return completer.future;
   }
 
-  @DomName('DirectoryEntry.getFile')
-  @DocsEditable()
   void __getFile(String path,
       [Map options,
       _EntryCallback successCallback,
@@ -11336,26 +9122,16 @@
   }
 
   @JSName('getFile')
-  @DomName('DirectoryEntry.getFile')
-  @DocsEditable()
   void __getFile_1(path, options, _EntryCallback successCallback,
       _ErrorCallback errorCallback) native;
   @JSName('getFile')
-  @DomName('DirectoryEntry.getFile')
-  @DocsEditable()
   void __getFile_2(path, options, _EntryCallback successCallback) native;
   @JSName('getFile')
-  @DomName('DirectoryEntry.getFile')
-  @DocsEditable()
   void __getFile_3(path, options) native;
   @JSName('getFile')
-  @DomName('DirectoryEntry.getFile')
-  @DocsEditable()
   void __getFile_4(path) native;
 
   @JSName('getFile')
-  @DomName('DirectoryEntry.getFile')
-  @DocsEditable()
   Future<Entry> _getFile(String path, {Map options}) {
     var completer = new Completer<Entry>();
     __getFile(path, options, (value) {
@@ -11368,14 +9144,10 @@
   }
 
   @JSName('removeRecursively')
-  @DomName('DirectoryEntry.removeRecursively')
-  @DocsEditable()
   void _removeRecursively(VoidCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
   @JSName('removeRecursively')
-  @DomName('DirectoryEntry.removeRecursively')
-  @DocsEditable()
   Future removeRecursively() {
     var completer = new Completer();
     _removeRecursively(() {
@@ -11390,9 +9162,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('DirectoryReader')
-// http://www.w3.org/TR/file-system-api/#the-directoryreader-interface
-@Experimental()
 @Native("DirectoryReader")
 class DirectoryReader extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -11401,13 +9170,9 @@
   }
 
   @JSName('readEntries')
-  @DomName('DirectoryReader.readEntries')
-  @DocsEditable()
   void _readEntries(_EntriesCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
-  @DomName('DirectoryReader.readEntries')
-  @DocsEditable()
   Future<List<Entry>> readEntries() {
     var completer = new Completer<List<Entry>>();
     _readEntries((value) {
@@ -11423,7 +9188,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * A generic container for content on an HTML page;
  * corresponds to the &lt;div&gt; tag.
@@ -11446,7 +9210,6 @@
  * * [Block-level element](http://www.w3.org/TR/CSS2/visuren.html#block-boxes) from W3C.
  * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
  */
-@DomName('HTMLDivElement')
 @Native("HTMLDivElement")
 class DivElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -11454,8 +9217,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLDivElement.HTMLDivElement')
-  @DocsEditable()
   factory DivElement() => JS('returns:DivElement;creates:DivElement;new:true',
       '#.createElement(#)', document, "div");
   /**
@@ -11469,7 +9230,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * The base class for all documents.
  *
@@ -11479,7 +9239,6 @@
  * If you aren't comfortable with DOM concepts, see the Dart tutorial
  * [Target 2: Connect Dart & HTML](http://www.dartlang.org/docs/tutorials/connect-dart-html/).
  */
-@DomName('Document')
 @Native("Document")
 class Document extends Node {
   // To suppress missing implicit constructor warnings.
@@ -11487,15 +9246,9 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Document.pointerlockchangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> pointerLockChangeEvent =
       const EventStreamProvider<Event>('pointerlockchange');
 
-  @DomName('Document.pointerlockerrorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> pointerLockErrorEvent =
       const EventStreamProvider<Event>('pointerlockerror');
 
@@ -11505,8 +9258,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Document.readystatechangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> readyStateChangeEvent =
       const EventStreamProvider<Event>('readystatechange');
 
@@ -11516,10 +9267,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Document.securitypolicyviolationEvent')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
-  @Experimental()
   static const EventStreamProvider<SecurityPolicyViolationEvent>
       securityPolicyViolationEvent =
       const EventStreamProvider<SecurityPolicyViolationEvent>(
@@ -11531,229 +9278,121 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Document.selectionchangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> selectionChangeEvent =
       const EventStreamProvider<Event>('selectionchange');
 
-  @DomName('Document.Document')
-  @DocsEditable()
   factory Document() {
     return Document._create_1();
   }
   static Document _create_1() => JS('Document', 'new Document()');
 
-  @DomName('Document.addressSpace')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String addressSpace;
 
   @JSName('body')
-  @DomName('Document.body')
-  @DocsEditable()
   HtmlElement _body;
 
-  @DomName('Document.contentType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String contentType;
 
-  @DomName('Document.cookie')
-  @DocsEditable()
   String cookie;
 
-  @DomName('Document.currentScript')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ScriptElement currentScript;
 
-  @DomName('Document.window')
-  @DocsEditable()
-  @Experimental() // untriaged
   WindowBase get window => _convertNativeToDart_Window(this._get_window);
   @JSName('defaultView')
-  @DomName('Document.window')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   @Creates('Window|=Object|Null')
   @Returns('Window|=Object|Null')
   final dynamic _get_window;
 
-  @DomName('Document.documentElement')
-  @DocsEditable()
   final Element documentElement;
 
-  @DomName('Document.domain')
-  @DocsEditable()
   final String domain;
 
-  @DomName('Document.fullscreenEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool fullscreenEnabled;
 
   @JSName('head')
-  @DomName('Document.head')
-  @DocsEditable()
   final HeadElement _head;
 
-  @DomName('Document.hidden')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool hidden;
 
-  @DomName('Document.implementation')
-  @DocsEditable()
   final DomImplementation implementation;
 
   @JSName('lastModified')
-  @DomName('Document.lastModified')
-  @DocsEditable()
   final String _lastModified;
 
-  @DomName('Document.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
   @JSName('preferredStylesheetSet')
-  @DomName('Document.preferredStylesheetSet')
-  @DocsEditable()
   final String _preferredStylesheetSet;
 
-  @DomName('Document.readyState')
-  @DocsEditable()
   final String readyState;
 
   @JSName('referrer')
-  @DomName('Document.referrer')
-  @DocsEditable()
   final String _referrer;
 
-  @DomName('Document.rootElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SvgSvgElement rootElement;
 
-  @DomName('Document.rootScroller')
-  @DocsEditable()
-  @Experimental() // untriaged
   Element rootScroller;
 
-  @DomName('Document.scrollingElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element scrollingElement;
 
   @JSName('selectedStylesheetSet')
-  @DomName('Document.selectedStylesheetSet')
-  @DocsEditable()
   String _selectedStylesheetSet;
 
-  @DomName('Document.suborigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String suborigin;
 
-  @DomName('Document.timeline')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DocumentTimeline timeline;
 
   @JSName('title')
-  @DomName('Document.title')
-  @DocsEditable()
   String _title;
 
   @JSName('visibilityState')
-  @DomName('Document.visibilityState')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String _visibilityState;
 
   @JSName('webkitFullscreenElement')
-  @DomName('Document.webkitFullscreenElement')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
   final Element _webkitFullscreenElement;
 
   @JSName('webkitFullscreenEnabled')
-  @DomName('Document.webkitFullscreenEnabled')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
   final bool _webkitFullscreenEnabled;
 
   @JSName('webkitHidden')
-  @DomName('Document.webkitHidden')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
   final bool _webkitHidden;
 
   @JSName('webkitVisibilityState')
-  @DomName('Document.webkitVisibilityState')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
   final String _webkitVisibilityState;
 
-  @DomName('Document.adoptNode')
-  @DocsEditable()
   Node adoptNode(Node node) native;
 
   @JSName('caretRangeFromPoint')
-  @DomName('Document.caretRangeFromPoint')
-  @DocsEditable()
-  // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
-  @Experimental()
   Range _caretRangeFromPoint(int x, int y) native;
 
-  @DomName('Document.createDocumentFragment')
-  @DocsEditable()
   DocumentFragment createDocumentFragment() native;
 
   @JSName('createElement')
-  @DomName('Document.createElement')
-  @DocsEditable()
   Element _createElement(String localName_OR_tagName,
       [options_OR_typeExtension]) native;
 
   @JSName('createElementNS')
-  @DomName('Document.createElementNS')
-  @DocsEditable()
   Element _createElementNS(String namespaceURI, String qualifiedName,
       [options_OR_typeExtension]) native;
 
   @JSName('createEvent')
-  @DomName('Document.createEvent')
-  @DocsEditable()
   Event _createEvent(String eventType) native;
 
-  @DomName('Document.createRange')
-  @DocsEditable()
   Range createRange() native;
 
   @JSName('createTextNode')
-  @DomName('Document.createTextNode')
-  @DocsEditable()
   Text _createTextNode(String data) native;
 
-  @DomName('Document.createTouch')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Touch _createTouch(Window view, EventTarget target, int identifier, num pageX,
       num pageY, num screenX, num screenY,
       [num radiusX, num radiusY, num rotationAngle, num force]) {
@@ -11783,112 +9422,56 @@
   }
 
   @JSName('createTouch')
-  @DomName('Document.createTouch')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Touch _createTouch_1(Window view, target, identifier, pageX, pageY, screenX,
       screenY, radiusX, radiusY, rotationAngle, force) native;
   @JSName('createTouch')
-  @DomName('Document.createTouch')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Touch _createTouch_2(Window view, target, identifier, pageX, pageY, screenX,
       screenY, radiusX, radiusY, rotationAngle) native;
   @JSName('createTouch')
-  @DomName('Document.createTouch')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Touch _createTouch_3(Window view, target, identifier, pageX, pageY, screenX,
       screenY, radiusX, radiusY) native;
   @JSName('createTouch')
-  @DomName('Document.createTouch')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Touch _createTouch_4(Window view, target, identifier, pageX, pageY, screenX,
       screenY, radiusX) native;
   @JSName('createTouch')
-  @DomName('Document.createTouch')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Touch _createTouch_5(
       Window view, target, identifier, pageX, pageY, screenX, screenY) native;
 
   @JSName('createTouchList')
-  @DomName('Document.createTouchList')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   TouchList _createTouchList(Touch touches) native;
 
-  @DomName('Document.execCommand')
-  @DocsEditable()
   bool execCommand(String commandId, [bool showUI, String value]) native;
 
-  @DomName('Document.exitFullscreen')
-  @DocsEditable()
-  @Experimental() // untriaged
   void exitFullscreen() native;
 
-  @DomName('Document.exitPointerLock')
-  @DocsEditable()
-  @Experimental() // untriaged
   void exitPointerLock() native;
 
-  @DomName('Document.getAnimations')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Animation> getAnimations() native;
 
-  @DomName('Document.getElementsByClassName')
-  @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
   List<Node> getElementsByClassName(String classNames) native;
 
-  @DomName('Document.getElementsByName')
-  @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
   List<Node> getElementsByName(String elementName) native;
 
-  @DomName('Document.getElementsByTagName')
-  @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
   List<Node> getElementsByTagName(String localName) native;
 
-  @DomName('Document.importNode')
-  @DocsEditable()
   Node importNode(Node node, [bool deep]) native;
 
-  @DomName('Document.queryCommandEnabled')
-  @DocsEditable()
   bool queryCommandEnabled(String commandId) native;
 
-  @DomName('Document.queryCommandIndeterm')
-  @DocsEditable()
   bool queryCommandIndeterm(String commandId) native;
 
-  @DomName('Document.queryCommandState')
-  @DocsEditable()
   bool queryCommandState(String commandId) native;
 
-  @DomName('Document.queryCommandSupported')
-  @DocsEditable()
   bool queryCommandSupported(String commandId) native;
 
-  @DomName('Document.queryCommandValue')
-  @DocsEditable()
   String queryCommandValue(String commandId) native;
 
-  @DomName('Document.registerElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   Function registerElement2(String type, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -11898,94 +9481,55 @@
   }
 
   @JSName('registerElement')
-  @DomName('Document.registerElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   Function _registerElement2_1(type, options) native;
   @JSName('registerElement')
-  @DomName('Document.registerElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   Function _registerElement2_2(type) native;
 
   @JSName('webkitExitFullscreen')
-  @DomName('Document.webkitExitFullscreen')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void _webkitExitFullscreen() native;
 
   // From NonElementParentNode
 
-  @DomName('Document.getElementById')
-  @DocsEditable()
   Element getElementById(String elementId) native;
 
   // From DocumentOrShadowRoot
 
-  @DomName('Document.activeElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element activeElement;
 
-  @DomName('Document.fullscreenElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element fullscreenElement;
 
-  @DomName('Document.pointerLockElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element pointerLockElement;
 
   @JSName('styleSheets')
-  @DomName('Document.styleSheets')
-  @DocsEditable()
   @Returns('_StyleSheetList|Null')
   @Creates('_StyleSheetList')
   final List<StyleSheet> _styleSheets;
 
   @JSName('elementFromPoint')
-  @DomName('Document.elementFromPoint')
-  @DocsEditable()
   Element _elementFromPoint(int x, int y) native;
 
-  @DomName('Document.elementsFromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Element> elementsFromPoint(int x, int y) native;
 
   // From FontFaceSource
 
-  @DomName('Document.fonts')
-  @DocsEditable()
-  @Experimental() // untriaged
   final FontFaceSet fonts;
 
   // From ParentNode
 
   @JSName('childElementCount')
-  @DomName('Document.childElementCount')
-  @DocsEditable()
   final int _childElementCount;
 
   @JSName('children')
-  @DomName('Document.children')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> _children;
 
   @JSName('firstElementChild')
-  @DomName('Document.firstElementChild')
-  @DocsEditable()
   final Element _firstElementChild;
 
   @JSName('lastElementChild')
-  @DomName('Document.lastElementChild')
-  @DocsEditable()
   final Element _lastElementChild;
 
   /**
@@ -12005,400 +9549,215 @@
    * For details about CSS selector syntax, see the
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
-  @DomName('Document.querySelector')
-  @DocsEditable()
   Element querySelector(String selectors) native;
 
   @JSName('querySelectorAll')
-  @DomName('Document.querySelectorAll')
-  @DocsEditable()
   @Creates('NodeList')
   @Returns('NodeList')
   List<Node> _querySelectorAll(String selectors) native;
 
   /// Stream of `abort` events handled by this [Document].
-  @DomName('Document.onabort')
-  @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
   /// Stream of `beforecopy` events handled by this [Document].
-  @DomName('Document.onbeforecopy')
-  @DocsEditable()
   Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
 
   /// Stream of `beforecut` events handled by this [Document].
-  @DomName('Document.onbeforecut')
-  @DocsEditable()
   Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
 
   /// Stream of `beforepaste` events handled by this [Document].
-  @DomName('Document.onbeforepaste')
-  @DocsEditable()
   Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
 
   /// Stream of `blur` events handled by this [Document].
-  @DomName('Document.onblur')
-  @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
-  @DomName('Document.oncanplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onCanPlay => Element.canPlayEvent.forTarget(this);
 
-  @DomName('Document.oncanplaythrough')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onCanPlayThrough =>
       Element.canPlayThroughEvent.forTarget(this);
 
   /// Stream of `change` events handled by this [Document].
-  @DomName('Document.onchange')
-  @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
   /// Stream of `click` events handled by this [Document].
-  @DomName('Document.onclick')
-  @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
   /// Stream of `contextmenu` events handled by this [Document].
-  @DomName('Document.oncontextmenu')
-  @DocsEditable()
   Stream<MouseEvent> get onContextMenu =>
       Element.contextMenuEvent.forTarget(this);
 
   /// Stream of `copy` events handled by this [Document].
-  @DomName('Document.oncopy')
-  @DocsEditable()
   Stream<ClipboardEvent> get onCopy => Element.copyEvent.forTarget(this);
 
   /// Stream of `cut` events handled by this [Document].
-  @DomName('Document.oncut')
-  @DocsEditable()
   Stream<ClipboardEvent> get onCut => Element.cutEvent.forTarget(this);
 
   /// Stream of `doubleclick` events handled by this [Document].
-  @DomName('Document.ondblclick')
-  @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
   /// Stream of `drag` events handled by this [Document].
-  @DomName('Document.ondrag')
-  @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
   /// Stream of `dragend` events handled by this [Document].
-  @DomName('Document.ondragend')
-  @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
   /// Stream of `dragenter` events handled by this [Document].
-  @DomName('Document.ondragenter')
-  @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
   /// Stream of `dragleave` events handled by this [Document].
-  @DomName('Document.ondragleave')
-  @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
   /// Stream of `dragover` events handled by this [Document].
-  @DomName('Document.ondragover')
-  @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
   /// Stream of `dragstart` events handled by this [Document].
-  @DomName('Document.ondragstart')
-  @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
   /// Stream of `drop` events handled by this [Document].
-  @DomName('Document.ondrop')
-  @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
-  @DomName('Document.ondurationchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onDurationChange =>
       Element.durationChangeEvent.forTarget(this);
 
-  @DomName('Document.onemptied')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onEmptied => Element.emptiedEvent.forTarget(this);
 
-  @DomName('Document.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onEnded => Element.endedEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [Document].
-  @DomName('Document.onerror')
-  @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
   /// Stream of `focus` events handled by this [Document].
-  @DomName('Document.onfocus')
-  @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
   /// Stream of `input` events handled by this [Document].
-  @DomName('Document.oninput')
-  @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
   /// Stream of `invalid` events handled by this [Document].
-  @DomName('Document.oninvalid')
-  @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
   /// Stream of `keydown` events handled by this [Document].
-  @DomName('Document.onkeydown')
-  @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
   /// Stream of `keypress` events handled by this [Document].
-  @DomName('Document.onkeypress')
-  @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
   /// Stream of `keyup` events handled by this [Document].
-  @DomName('Document.onkeyup')
-  @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
   /// Stream of `load` events handled by this [Document].
-  @DomName('Document.onload')
-  @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
-  @DomName('Document.onloadeddata')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onLoadedData => Element.loadedDataEvent.forTarget(this);
 
-  @DomName('Document.onloadedmetadata')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onLoadedMetadata =>
       Element.loadedMetadataEvent.forTarget(this);
 
   /// Stream of `mousedown` events handled by this [Document].
-  @DomName('Document.onmousedown')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
   /// Stream of `mouseenter` events handled by this [Document].
-  @DomName('Document.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter =>
       Element.mouseEnterEvent.forTarget(this);
 
   /// Stream of `mouseleave` events handled by this [Document].
-  @DomName('Document.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave =>
       Element.mouseLeaveEvent.forTarget(this);
 
   /// Stream of `mousemove` events handled by this [Document].
-  @DomName('Document.onmousemove')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
   /// Stream of `mouseout` events handled by this [Document].
-  @DomName('Document.onmouseout')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
   /// Stream of `mouseover` events handled by this [Document].
-  @DomName('Document.onmouseover')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
   /// Stream of `mouseup` events handled by this [Document].
-  @DomName('Document.onmouseup')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
   /// Stream of `mousewheel` events handled by this [Document].
-  @DomName('Document.onmousewheel')
-  @DocsEditable()
   Stream<WheelEvent> get onMouseWheel =>
       Element.mouseWheelEvent.forTarget(this);
 
   /// Stream of `paste` events handled by this [Document].
-  @DomName('Document.onpaste')
-  @DocsEditable()
   Stream<ClipboardEvent> get onPaste => Element.pasteEvent.forTarget(this);
 
-  @DomName('Document.onpause')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPause => Element.pauseEvent.forTarget(this);
 
-  @DomName('Document.onplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPlay => Element.playEvent.forTarget(this);
 
-  @DomName('Document.onplaying')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
 
-  @DomName('Document.onpointerlockchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPointerLockChange =>
       pointerLockChangeEvent.forTarget(this);
 
-  @DomName('Document.onpointerlockerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPointerLockError => pointerLockErrorEvent.forTarget(this);
 
-  @DomName('Document.onratechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onRateChange => Element.rateChangeEvent.forTarget(this);
 
   /// Stream of `readystatechange` events handled by this [Document].
-  @DomName('Document.onreadystatechange')
-  @DocsEditable()
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 
   /// Stream of `reset` events handled by this [Document].
-  @DomName('Document.onreset')
-  @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
-  @DomName('Document.onresize')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onResize => Element.resizeEvent.forTarget(this);
 
   /// Stream of `scroll` events handled by this [Document].
-  @DomName('Document.onscroll')
-  @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
   /// Stream of `search` events handled by this [Document].
-  @DomName('Document.onsearch')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
   /// Stream of `securitypolicyviolation` events handled by this [Document].
-  @DomName('Document.onsecuritypolicyviolation')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
-  @Experimental()
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation =>
       securityPolicyViolationEvent.forTarget(this);
 
-  @DomName('Document.onseeked')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSeeked => Element.seekedEvent.forTarget(this);
 
-  @DomName('Document.onseeking')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSeeking => Element.seekingEvent.forTarget(this);
 
   /// Stream of `select` events handled by this [Document].
-  @DomName('Document.onselect')
-  @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
   /// Stream of `selectionchange` events handled by this [Document].
-  @DomName('Document.onselectionchange')
-  @DocsEditable()
   Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
 
   /// Stream of `selectstart` events handled by this [Document].
-  @DomName('Document.onselectstart')
-  @DocsEditable()
   Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
-  @DomName('Document.onstalled')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onStalled => Element.stalledEvent.forTarget(this);
 
   /// Stream of `submit` events handled by this [Document].
-  @DomName('Document.onsubmit')
-  @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
-  @DomName('Document.onsuspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSuspend => Element.suspendEvent.forTarget(this);
 
-  @DomName('Document.ontimeupdate')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onTimeUpdate => Element.timeUpdateEvent.forTarget(this);
 
   /// Stream of `touchcancel` events handled by this [Document].
-  @DomName('Document.ontouchcancel')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchCancel =>
       Element.touchCancelEvent.forTarget(this);
 
   /// Stream of `touchend` events handled by this [Document].
-  @DomName('Document.ontouchend')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
   /// Stream of `touchmove` events handled by this [Document].
-  @DomName('Document.ontouchmove')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
   /// Stream of `touchstart` events handled by this [Document].
-  @DomName('Document.ontouchstart')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchStart =>
       Element.touchStartEvent.forTarget(this);
 
-  @DomName('Document.onvolumechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onVolumeChange => Element.volumeChangeEvent.forTarget(this);
 
-  @DomName('Document.onwaiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onWaiting => Element.waitingEvent.forTarget(this);
 
   /// Stream of `fullscreenchange` events handled by this [Document].
-  @DomName('Document.onwebkitfullscreenchange')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   Stream<Event> get onFullscreenChange =>
       Element.fullscreenChangeEvent.forTarget(this);
 
   /// Stream of `fullscreenerror` events handled by this [Document].
-  @DomName('Document.onwebkitfullscreenerror')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   Stream<Event> get onFullscreenError =>
       Element.fullscreenErrorEvent.forTarget(this);
 
@@ -12436,7 +9795,6 @@
         tag, {'prototype': customElementClass, 'extends': extendsTag});
   }
 
-  @DomName('Document.createElement')
   @ForceInline() // Almost all call sites have one argument.
   Element createElement(String tagName, [String typeExtension]) {
     return (typeExtension == null)
@@ -12446,18 +9804,14 @@
 
   // The two-argument version of this is automatically generated, but we need to
   // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
-  @DomName('Document.createElement')
   _createElement_2(String tagName) =>
       JS('Element', '#.createElement(#)', this, tagName);
 
   // The three-argument version of this is automatically generated, but we need to
   // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
-  @DomName('Document.createElementNS')
   _createElementNS_2(String namespaceURI, String qualifiedName) => JS(
       'Element', '#.createElementNS(#, #)', this, namespaceURI, qualifiedName);
 
-  @DomName('Document.createElementNS')
-  @DocsEditable()
   Element createElementNS(String namespaceURI, String qualifiedName,
       [String typeExtension]) {
     return (typeExtension == null)
@@ -12465,23 +9819,19 @@
         : _createElementNS(namespaceURI, qualifiedName, typeExtension);
   }
 
-  @DomName('Document.createNodeIterator')
   NodeIterator _createNodeIterator(Node root,
           [int whatToShow, NodeFilter filter]) =>
       JS('NodeIterator', '#.createNodeIterator(#, #, #, false)', this, root,
           whatToShow, filter);
 
-  @DomName('Document.createTreeWalker')
   TreeWalker _createTreeWalker(Node root,
           [int whatToShow, NodeFilter filter]) =>
       JS('TreeWalker', '#.createTreeWalker(#, #, #, false)', this, root,
           whatToShow, filter);
 
-  @DomName('Document.visibilityState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
-  @Experimental()
   String get visibilityState => JS(
       'String',
       '(#.visibilityState || #.mozVisibilityState || #.msVisibilityState ||'
@@ -12495,7 +9845,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('DocumentFragment')
 @Native("DocumentFragment")
 class DocumentFragment extends Node
     implements NonElementParentNode, ParentNode {
@@ -12592,26 +9941,17 @@
 
   // From NonElementParentNode
 
-  @DomName('DocumentFragment.getElementById')
-  @DocsEditable()
-  @Experimental() // untriaged
   Element getElementById(String elementId) native;
 
   // From ParentNode
 
   @JSName('childElementCount')
-  @DomName('DocumentFragment.childElementCount')
-  @DocsEditable()
   final int _childElementCount;
 
   @JSName('firstElementChild')
-  @DomName('DocumentFragment.firstElementChild')
-  @DocsEditable()
   final Element _firstElementChild;
 
   @JSName('lastElementChild')
-  @DomName('DocumentFragment.lastElementChild')
-  @DocsEditable()
   final Element _lastElementChild;
 
   /**
@@ -12626,13 +9966,9 @@
    * For details about CSS selector syntax, see the
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
-  @DomName('DocumentFragment.querySelector')
-  @DocsEditable()
   Element querySelector(String selectors) native;
 
   @JSName('querySelectorAll')
-  @DomName('DocumentFragment.querySelectorAll')
-  @DocsEditable()
   @Creates('NodeList')
   @Returns('NodeList')
   List<Node> _querySelectorAll(String selectors) native;
@@ -12641,9 +9977,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DocumentOrShadowRoot')
-@Experimental() // untriaged
 @Native("DocumentOrShadowRoot")
 class DocumentOrShadowRoot extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -12651,50 +9984,26 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DocumentOrShadowRoot.activeElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element activeElement;
 
-  @DomName('DocumentOrShadowRoot.fullscreenElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element fullscreenElement;
 
-  @DomName('DocumentOrShadowRoot.pointerLockElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element pointerLockElement;
 
-  @DomName('DocumentOrShadowRoot.styleSheets')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('_StyleSheetList|Null')
   @Creates('_StyleSheetList')
   final List<StyleSheet> styleSheets;
 
-  @DomName('DocumentOrShadowRoot.elementFromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   Element elementFromPoint(int x, int y) native;
 
-  @DomName('DocumentOrShadowRoot.elementsFromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Element> elementsFromPoint(int x, int y) native;
 
-  @DomName('DocumentOrShadowRoot.getSelection')
-  @DocsEditable()
-  @Experimental() // untriaged
   Selection getSelection() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DocumentTimeline')
-@Experimental() // untriaged
 @Native("DocumentTimeline")
 class DocumentTimeline extends AnimationTimeline {
   // To suppress missing implicit constructor warnings.
@@ -12702,8 +10011,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DocumentTimeline.DocumentTimeline')
-  @DocsEditable()
   factory DocumentTimeline([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -12720,8 +10027,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMError')
 @Native("DOMError")
 class DomError extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -12729,8 +10034,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMError.DOMError')
-  @DocsEditable()
   factory DomError(String name, [String message]) {
     if (message != null) {
       return DomError._create_1(name, message);
@@ -12741,20 +10044,14 @@
       JS('DomError', 'new DOMError(#,#)', name, message);
   static DomError _create_2(name) => JS('DomError', 'new DOMError(#)', name);
 
-  @DomName('DOMError.message')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String message;
 
-  @DomName('DOMError.name')
-  @DocsEditable()
   final String name;
 }
 // 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.
 
-@DomName('DOMException')
 @Unstable()
 @Native("DOMException")
 class DomException extends Interceptor {
@@ -12798,20 +10095,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMException.message')
-  @DocsEditable()
   final String message;
 
-  @DomName('DOMException.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMImplementation')
 @Native("DOMImplementation")
 class DomImplementation extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -12819,32 +10110,21 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMImplementation.createDocument')
-  @DocsEditable()
   XmlDocument createDocument(
       String namespaceURI, String qualifiedName, _DocumentType doctype) native;
 
-  @DomName('DOMImplementation.createDocumentType')
-  @DocsEditable()
   _DocumentType createDocumentType(
       String qualifiedName, String publicId, String systemId) native;
 
   @JSName('createHTMLDocument')
-  @DomName('DOMImplementation.createHTMLDocument')
-  @DocsEditable()
   HtmlDocument createHtmlDocument([String title]) native;
 
-  @DomName('DOMImplementation.hasFeature')
-  @DocsEditable()
   bool hasFeature() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Iterator')
-@Experimental() // untriaged
 @Native("Iterator")
 class DomIterator extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -12852,18 +10132,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Iterator.next')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object next([Object value]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMMatrix')
-@Experimental() // untriaged
 @Native("DOMMatrix")
 class DomMatrix extends DomMatrixReadOnly {
   // To suppress missing implicit constructor warnings.
@@ -12871,8 +10145,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMMatrix.DOMMatrix')
-  @DocsEditable()
   factory DomMatrix([Object init]) {
     if (init != null) {
       return DomMatrix._create_1(init);
@@ -13036,19 +10308,10 @@
     JS("void", "#.m44 = #", this, value);
   }
 
-  @DomName('DOMMatrix.fromFloat32Array')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrix fromFloat32Array(Float32List array32) native;
 
-  @DomName('DOMMatrix.fromFloat64Array')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrix fromFloat64Array(Float64List array64) native;
 
-  @DomName('DOMMatrix.fromMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrix fromMatrix([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13058,24 +10321,12 @@
   }
 
   @JSName('fromMatrix')
-  @DomName('DOMMatrix.fromMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrix _fromMatrix_1(other) native;
   @JSName('fromMatrix')
-  @DomName('DOMMatrix.fromMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrix _fromMatrix_2() native;
 
-  @DomName('DOMMatrix.invertSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix invertSelf() native;
 
-  @DomName('DOMMatrix.multiplySelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix multiplySelf([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13085,19 +10336,10 @@
   }
 
   @JSName('multiplySelf')
-  @DomName('DOMMatrix.multiplySelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix _multiplySelf_1(other) native;
   @JSName('multiplySelf')
-  @DomName('DOMMatrix.multiplySelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix _multiplySelf_2() native;
 
-  @DomName('DOMMatrix.preMultiplySelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix preMultiplySelf([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13107,40 +10349,19 @@
   }
 
   @JSName('preMultiplySelf')
-  @DomName('DOMMatrix.preMultiplySelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix _preMultiplySelf_1(other) native;
   @JSName('preMultiplySelf')
-  @DomName('DOMMatrix.preMultiplySelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix _preMultiplySelf_2() native;
 
-  @DomName('DOMMatrix.rotateAxisAngleSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix rotateAxisAngleSelf([num x, num y, num z, num angle]) native;
 
-  @DomName('DOMMatrix.rotateFromVectorSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix rotateFromVectorSelf([num x, num y]) native;
 
-  @DomName('DOMMatrix.rotateSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix rotateSelf([num rotX, num rotY, num rotZ]) native;
 
-  @DomName('DOMMatrix.scale3dSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix scale3dSelf([num scale, num originX, num originY, num originZ])
       native;
 
-  @DomName('DOMMatrix.scaleSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix scaleSelf(
       [num scaleX,
       num scaleY,
@@ -13149,33 +10370,18 @@
       num originY,
       num originZ]) native;
 
-  @DomName('DOMMatrix.setMatrixValue')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix setMatrixValue(String transformList) native;
 
-  @DomName('DOMMatrix.skewXSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix skewXSelf([num sx]) native;
 
-  @DomName('DOMMatrix.skewYSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix skewYSelf([num sy]) native;
 
-  @DomName('DOMMatrix.translateSelf')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix translateSelf([num tx, num ty, num tz]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMMatrixReadOnly')
-@Experimental() // untriaged
 @Native("DOMMatrixReadOnly")
 class DomMatrixReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -13183,8 +10389,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMMatrixReadOnly.DOMMatrixReadOnly')
-  @DocsEditable()
   factory DomMatrixReadOnly([Object init]) {
     if (init != null) {
       return DomMatrixReadOnly._create_1(init);
@@ -13244,29 +10448,14 @@
 
   num get m44 => JS("num", "#.m44", this);
 
-  @DomName('DOMMatrixReadOnly.flipX')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix flipX() native;
 
-  @DomName('DOMMatrixReadOnly.flipY')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix flipY() native;
 
-  @DomName('DOMMatrixReadOnly.fromFloat32Array')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrixReadOnly fromFloat32Array(Float32List array32) native;
 
-  @DomName('DOMMatrixReadOnly.fromFloat64Array')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrixReadOnly fromFloat64Array(Float64List array64) native;
 
-  @DomName('DOMMatrixReadOnly.fromMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrixReadOnly fromMatrix([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13276,24 +10465,12 @@
   }
 
   @JSName('fromMatrix')
-  @DomName('DOMMatrixReadOnly.fromMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrixReadOnly _fromMatrix_1(other) native;
   @JSName('fromMatrix')
-  @DomName('DOMMatrixReadOnly.fromMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomMatrixReadOnly _fromMatrix_2() native;
 
-  @DomName('DOMMatrixReadOnly.inverse')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix inverse() native;
 
-  @DomName('DOMMatrixReadOnly.multiply')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix multiply([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13303,34 +10480,16 @@
   }
 
   @JSName('multiply')
-  @DomName('DOMMatrixReadOnly.multiply')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix _multiply_1(other) native;
   @JSName('multiply')
-  @DomName('DOMMatrixReadOnly.multiply')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix _multiply_2() native;
 
-  @DomName('DOMMatrixReadOnly.rotate')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix rotate([num rotX, num rotY, num rotZ]) native;
 
-  @DomName('DOMMatrixReadOnly.rotateAxisAngle')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix rotateAxisAngle([num x, num y, num z, num angle]) native;
 
-  @DomName('DOMMatrixReadOnly.rotateFromVector')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix rotateFromVector([num x, num y]) native;
 
-  @DomName('DOMMatrixReadOnly.scale')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix scale(
       [num scaleX,
       num scaleY,
@@ -13339,34 +10498,16 @@
       num originY,
       num originZ]) native;
 
-  @DomName('DOMMatrixReadOnly.scale3d')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix scale3d([num scale, num originX, num originY, num originZ]) native;
 
-  @DomName('DOMMatrixReadOnly.skewX')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix skewX([num sx]) native;
 
-  @DomName('DOMMatrixReadOnly.skewY')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix skewY([num sy]) native;
 
-  @DomName('DOMMatrixReadOnly.toFloat32Array')
-  @DocsEditable()
-  @Experimental() // untriaged
   Float32List toFloat32Array() native;
 
-  @DomName('DOMMatrixReadOnly.toFloat64Array')
-  @DocsEditable()
-  @Experimental() // untriaged
   Float64List toFloat64Array() native;
 
-  @DomName('DOMMatrixReadOnly.transformPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomPoint transformPoint([Map point]) {
     if (point != null) {
       var point_1 = convertDartToNative_Dictionary(point);
@@ -13376,27 +10517,16 @@
   }
 
   @JSName('transformPoint')
-  @DomName('DOMMatrixReadOnly.transformPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomPoint _transformPoint_1(point) native;
   @JSName('transformPoint')
-  @DomName('DOMMatrixReadOnly.transformPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomPoint _transformPoint_2() native;
 
-  @DomName('DOMMatrixReadOnly.translate')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomMatrix translate([num tx, num ty, num tz]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMParser')
 @Native("DOMParser")
 class DomParser extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -13404,24 +10534,17 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMParser.DOMParser')
-  @DocsEditable()
   factory DomParser() {
     return DomParser._create_1();
   }
   static DomParser _create_1() => JS('DomParser', 'new DOMParser()');
 
-  @DomName('DOMParser.parseFromString')
-  @DocsEditable()
   Document parseFromString(String str, String type) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMPoint')
-@Experimental() // untriaged
 @Native("DOMPoint")
 class DomPoint extends DomPointReadOnly {
   // To suppress missing implicit constructor warnings.
@@ -13429,8 +10552,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMPoint.DOMPoint')
-  @DocsEditable()
   factory DomPoint([num x, num y, num z, num w]) {
     if (w != null) {
       return DomPoint._create_1(x, y, z, w);
@@ -13486,9 +10607,6 @@
     JS("void", "#.z = #", this, value);
   }
 
-  @DomName('DOMPoint.fromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomPoint fromPoint([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13498,23 +10616,14 @@
   }
 
   @JSName('fromPoint')
-  @DomName('DOMPoint.fromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomPoint _fromPoint_1(other) native;
   @JSName('fromPoint')
-  @DomName('DOMPoint.fromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomPoint _fromPoint_2() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMPointReadOnly')
-@Experimental() // untriaged
 @Native("DOMPointReadOnly")
 class DomPointReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -13522,8 +10631,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMPointReadOnly.DOMPointReadOnly')
-  @DocsEditable()
   factory DomPointReadOnly([num x, num y, num z, num w]) {
     if (w != null) {
       return DomPointReadOnly._create_1(x, y, z, w);
@@ -13558,9 +10665,6 @@
 
   num get z => JS("num", "#.z", this);
 
-  @DomName('DOMPointReadOnly.fromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomPointReadOnly fromPoint([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13570,19 +10674,10 @@
   }
 
   @JSName('fromPoint')
-  @DomName('DOMPointReadOnly.fromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomPointReadOnly _fromPoint_1(other) native;
   @JSName('fromPoint')
-  @DomName('DOMPointReadOnly.fromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomPointReadOnly _fromPoint_2() native;
 
-  @DomName('DOMPointReadOnly.matrixTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomPoint matrixTransform([Map matrix]) {
     if (matrix != null) {
       var matrix_1 = convertDartToNative_Dictionary(matrix);
@@ -13592,23 +10687,14 @@
   }
 
   @JSName('matrixTransform')
-  @DomName('DOMPointReadOnly.matrixTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomPoint _matrixTransform_1(matrix) native;
   @JSName('matrixTransform')
-  @DomName('DOMPointReadOnly.matrixTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   DomPoint _matrixTransform_2() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMQuad')
-@Experimental() // untriaged
 @Native("DOMQuad")
 class DomQuad extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -13616,8 +10702,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMQuad.DOMQuad')
-  @DocsEditable()
   factory DomQuad([Map p1, Map p2, Map p3, Map p4]) {
     if (p4 != null) {
       var p1_1 = convertDartToNative_Dictionary(p1);
@@ -13651,29 +10735,14 @@
   static DomQuad _create_4(p1) => JS('DomQuad', 'new DOMQuad(#)', p1);
   static DomQuad _create_5() => JS('DomQuad', 'new DOMQuad()');
 
-  @DomName('DOMQuad.p1')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomPoint p1;
 
-  @DomName('DOMQuad.p2')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomPoint p2;
 
-  @DomName('DOMQuad.p3')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomPoint p3;
 
-  @DomName('DOMQuad.p4')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomPoint p4;
 
-  @DomName('DOMQuad.fromQuad')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomQuad fromQuad([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13683,19 +10752,10 @@
   }
 
   @JSName('fromQuad')
-  @DomName('DOMQuad.fromQuad')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomQuad _fromQuad_1(other) native;
   @JSName('fromQuad')
-  @DomName('DOMQuad.fromQuad')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomQuad _fromQuad_2() native;
 
-  @DomName('DOMQuad.fromRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomQuad fromRect([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13705,28 +10765,16 @@
   }
 
   @JSName('fromRect')
-  @DomName('DOMQuad.fromRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomQuad _fromRect_1(other) native;
   @JSName('fromRect')
-  @DomName('DOMQuad.fromRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomQuad _fromRect_2() native;
 
-  @DomName('DOMQuad.getBounds')
-  @DocsEditable()
-  @Experimental() // untriaged
   Rectangle getBounds() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMRectList')
-@Experimental() // untriaged
 @Native("ClientRectList,DOMRectList")
 class DomRectList extends Interceptor
     with ListMixin<Rectangle>, ImmutableListMixin<Rectangle>
@@ -13736,9 +10784,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMRectList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   int get length => JS("int", "#.length", this);
 
   Rectangle operator [](int index) {
@@ -13784,18 +10829,12 @@
   Rectangle elementAt(int index) => this[index];
   // -- end List<Rectangle> mixins.
 
-  @DomName('DOMRectList.item')
-  @DocsEditable()
-  @Experimental() // untriaged
   Rectangle item(int index) native;
 }
 // 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.
 
-@DocsEditable()
-@DomName('DOMRectReadOnly')
-@Experimental() // untriaged
 @Native("DOMRectReadOnly")
 class DomRectReadOnly extends Interceptor implements Rectangle {
   // NOTE! All code below should be common with RectangleBase.
@@ -13892,8 +10931,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMRectReadOnly.DOMRectReadOnly')
-  @DocsEditable()
   factory DomRectReadOnly([num x, num y, num width, num height]) {
     if (height != null) {
       return DomRectReadOnly._create_1(x, y, width, height);
@@ -13936,9 +10973,6 @@
 
   num get y => JS("num", "#.y", this);
 
-  @DomName('DOMRectReadOnly.fromRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomRectReadOnly fromRect([Map other]) {
     if (other != null) {
       var other_1 = convertDartToNative_Dictionary(other);
@@ -13948,14 +10982,8 @@
   }
 
   @JSName('fromRect')
-  @DomName('DOMRectReadOnly.fromRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomRectReadOnly _fromRect_1(other) native;
   @JSName('fromRect')
-  @DomName('DOMRectReadOnly.fromRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   static DomRectReadOnly _fromRect_2() native;
 }
 
@@ -13963,8 +10991,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMStringList')
 @Native("DOMStringList")
 class DomStringList extends Interceptor
     with ListMixin<String>, ImmutableListMixin<String>
@@ -13974,8 +11000,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMStringList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   String operator [](int index) {
@@ -14021,16 +11045,12 @@
   String elementAt(int index) => this[index];
   // -- end List<String> mixins.
 
-  @DomName('DOMStringList.item')
-  @DocsEditable()
   String item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMStringMap')
 @Native("DOMStringMap")
 class DomStringMap extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -14038,25 +11058,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMStringMap.__delete__')
-  @DocsEditable()
   void __delete__(String name) native;
 
-  @DomName('DOMStringMap.__setter__')
-  @DocsEditable()
   void __setter__(String name, String value) native;
 
-  @DomName('DOMStringMap.item')
-  @DocsEditable()
-  @Experimental() // untriaged
   String item(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMTokenList')
 @Native("DOMTokenList")
 class DomTokenList extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -14064,45 +11075,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMTokenList.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('DOMTokenList.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   String value;
 
-  @DomName('DOMTokenList.add')
-  @DocsEditable()
-  @Experimental() // untriaged
   void add(String tokens) native;
 
-  @DomName('DOMTokenList.contains')
-  @DocsEditable()
   bool contains(String token) native;
 
-  @DomName('DOMTokenList.item')
-  @DocsEditable()
   String item(int index) native;
 
-  @DomName('DOMTokenList.remove')
-  @DocsEditable()
-  @Experimental() // untriaged
   void remove(String tokens) native;
 
-  @DomName('DOMTokenList.replace')
-  @DocsEditable()
-  @Experimental() // untriaged
   void replace(String token, String newToken) native;
 
-  @DomName('DOMTokenList.supports')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool supports(String token) native;
 
-  @DomName('DOMTokenList.toggle')
-  @DocsEditable()
   bool toggle(String token, [bool force]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14314,7 +11302,6 @@
    * Unlike [getBoundingClientRect], the dimensions of this rectangle
    * will return the same numerical height if the element is hidden or not.
    */
-  @Experimental()
   CssRect get contentEdge;
 
   /**
@@ -14329,7 +11316,6 @@
    * is also a rectangle equalling the dimensions of clientHeight and
    * clientWidth.
    */
-  @Experimental()
   CssRect get paddingEdge;
 
   /**
@@ -14342,7 +11328,6 @@
    * will return the same numerical height if the element is hidden or not. This
    * can be used to retrieve jQuery's `outerHeight` value for an element.
    */
-  @Experimental()
   CssRect get borderEdge;
 
   /**
@@ -14355,72 +11340,43 @@
    * will return the same numerical height if the element is hidden or not. This
    * can be used to retrieve jQuery's `outerHeight` value for an element.
    */
-  @Experimental()
   CssRect get marginEdge;
 
   /// Stream of `abort` events handled by this [Element].
-  @DomName('Element.onabort')
-  @DocsEditable()
   ElementStream<Event> get onAbort;
 
   /// Stream of `beforecopy` events handled by this [Element].
-  @DomName('Element.onbeforecopy')
-  @DocsEditable()
   ElementStream<Event> get onBeforeCopy;
 
   /// Stream of `beforecut` events handled by this [Element].
-  @DomName('Element.onbeforecut')
-  @DocsEditable()
   ElementStream<Event> get onBeforeCut;
 
   /// Stream of `beforepaste` events handled by this [Element].
-  @DomName('Element.onbeforepaste')
-  @DocsEditable()
   ElementStream<Event> get onBeforePaste;
 
   /// Stream of `blur` events handled by this [Element].
-  @DomName('Element.onblur')
-  @DocsEditable()
   ElementStream<Event> get onBlur;
 
-  @DomName('Element.oncanplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlay;
 
-  @DomName('Element.oncanplaythrough')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlayThrough;
 
   /// Stream of `change` events handled by this [Element].
-  @DomName('Element.onchange')
-  @DocsEditable()
   ElementStream<Event> get onChange;
 
   /// Stream of `click` events handled by this [Element].
-  @DomName('Element.onclick')
-  @DocsEditable()
   ElementStream<MouseEvent> get onClick;
 
   /// Stream of `contextmenu` events handled by this [Element].
-  @DomName('Element.oncontextmenu')
-  @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu;
 
   /// Stream of `copy` events handled by this [Element].
-  @DomName('Element.oncopy')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onCopy;
 
   /// Stream of `cut` events handled by this [Element].
-  @DomName('Element.oncut')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onCut;
 
   /// Stream of `doubleclick` events handled by this [Element].
-  @DomName('Element.ondblclick')
-  @DocsEditable()
   ElementStream<Event> get onDoubleClick;
 
   /**
@@ -14440,8 +11396,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondrag')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDrag;
 
   /**
@@ -14458,8 +11412,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragend')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd;
 
   /**
@@ -14476,8 +11428,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragenter')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter;
 
   /**
@@ -14494,8 +11444,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragleave')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave;
 
   /**
@@ -14512,8 +11460,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragover')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragOver;
 
   /**
@@ -14530,8 +11476,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragstart')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragStart;
 
   /**
@@ -14548,285 +11492,142 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondrop')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDrop;
 
-  @DomName('Element.ondurationchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onDurationChange;
 
-  @DomName('Element.onemptied')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEmptied;
 
-  @DomName('Element.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEnded;
 
   /// Stream of `error` events handled by this [Element].
-  @DomName('Element.onerror')
-  @DocsEditable()
   ElementStream<Event> get onError;
 
   /// Stream of `focus` events handled by this [Element].
-  @DomName('Element.onfocus')
-  @DocsEditable()
   ElementStream<Event> get onFocus;
 
   /// Stream of `input` events handled by this [Element].
-  @DomName('Element.oninput')
-  @DocsEditable()
   ElementStream<Event> get onInput;
 
   /// Stream of `invalid` events handled by this [Element].
-  @DomName('Element.oninvalid')
-  @DocsEditable()
   ElementStream<Event> get onInvalid;
 
   /// Stream of `keydown` events handled by this [Element].
-  @DomName('Element.onkeydown')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown;
 
   /// Stream of `keypress` events handled by this [Element].
-  @DomName('Element.onkeypress')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress;
 
   /// Stream of `keyup` events handled by this [Element].
-  @DomName('Element.onkeyup')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp;
 
   /// Stream of `load` events handled by this [Element].
-  @DomName('Element.onload')
-  @DocsEditable()
   ElementStream<Event> get onLoad;
 
-  @DomName('Element.onloadeddata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedData;
 
-  @DomName('Element.onloadedmetadata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedMetadata;
 
   /// Stream of `mousedown` events handled by this [Element].
-  @DomName('Element.onmousedown')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown;
 
   /// Stream of `mouseenter` events handled by this [Element].
-  @DomName('Element.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter;
 
   /// Stream of `mouseleave` events handled by this [Element].
-  @DomName('Element.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave;
 
   /// Stream of `mousemove` events handled by this [Element].
-  @DomName('Element.onmousemove')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove;
 
   /// Stream of `mouseout` events handled by this [Element].
-  @DomName('Element.onmouseout')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut;
 
   /// Stream of `mouseover` events handled by this [Element].
-  @DomName('Element.onmouseover')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver;
 
   /// Stream of `mouseup` events handled by this [Element].
-  @DomName('Element.onmouseup')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp;
 
   /// Stream of `mousewheel` events handled by this [Element].
-  @DomName('Element.onmousewheel')
-  @DocsEditable()
-  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
-  @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel;
 
   /// Stream of `paste` events handled by this [Element].
-  @DomName('Element.onpaste')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onPaste;
 
-  @DomName('Element.onpause')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPause;
 
-  @DomName('Element.onplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlay;
 
-  @DomName('Element.onplaying')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlaying;
 
-  @DomName('Element.onratechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onRateChange;
 
   /// Stream of `reset` events handled by this [Element].
-  @DomName('Element.onreset')
-  @DocsEditable()
   ElementStream<Event> get onReset;
 
-  @DomName('Element.onresize')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onResize;
 
   /// Stream of `scroll` events handled by this [Element].
-  @DomName('Element.onscroll')
-  @DocsEditable()
   ElementStream<Event> get onScroll;
 
   /// Stream of `search` events handled by this [Element].
-  @DomName('Element.onsearch')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
   ElementStream<Event> get onSearch;
 
-  @DomName('Element.onseeked')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeked;
 
-  @DomName('Element.onseeking')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeking;
 
   /// Stream of `select` events handled by this [Element].
-  @DomName('Element.onselect')
-  @DocsEditable()
   ElementStream<Event> get onSelect;
 
   /// Stream of `selectstart` events handled by this [Element].
-  @DomName('Element.onselectstart')
-  @DocsEditable()
-  @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart;
 
-  @DomName('Element.onstalled')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onStalled;
 
   /// Stream of `submit` events handled by this [Element].
-  @DomName('Element.onsubmit')
-  @DocsEditable()
   ElementStream<Event> get onSubmit;
 
-  @DomName('Element.onsuspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSuspend;
 
-  @DomName('Element.ontimeupdate')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onTimeUpdate;
 
   /// Stream of `touchcancel` events handled by this [Element].
-  @DomName('Element.ontouchcancel')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchCancel;
 
   /// Stream of `touchend` events handled by this [Element].
-  @DomName('Element.ontouchend')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchEnd;
 
   /// Stream of `touchenter` events handled by this [Element].
-  @DomName('Element.ontouchenter')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchEnter;
 
   /// Stream of `touchleave` events handled by this [Element].
-  @DomName('Element.ontouchleave')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchLeave;
 
   /// Stream of `touchmove` events handled by this [Element].
-  @DomName('Element.ontouchmove')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchMove;
 
   /// Stream of `touchstart` events handled by this [Element].
-  @DomName('Element.ontouchstart')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchStart;
 
   /// Stream of `transitionend` events handled by this [Element].
-  @DomName('Element.ontransitionend')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd;
 
-  @DomName('Element.onvolumechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onVolumeChange;
 
-  @DomName('Element.onwaiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onWaiting;
 
   /// Stream of `fullscreenchange` events handled by this [Element].
-  @DomName('Element.onwebkitfullscreenchange')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   ElementStream<Event> get onFullscreenChange;
 
   /// Stream of `fullscreenerror` events handled by this [Element].
-  @DomName('Element.onwebkitfullscreenerror')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   ElementStream<Event> get onFullscreenError;
 
-  @DomName('Element.onwheel')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<WheelEvent> get onWheel;
 }
 
@@ -14893,78 +11694,50 @@
   List<Node> get rawList => _nodeList;
 
   /// Stream of `abort` events handled by this [Element].
-  @DomName('Element.onabort')
-  @DocsEditable()
   ElementStream<Event> get onAbort => Element.abortEvent._forElementList(this);
 
   /// Stream of `beforecopy` events handled by this [Element].
-  @DomName('Element.onbeforecopy')
-  @DocsEditable()
   ElementStream<Event> get onBeforeCopy =>
       Element.beforeCopyEvent._forElementList(this);
 
   /// Stream of `beforecut` events handled by this [Element].
-  @DomName('Element.onbeforecut')
-  @DocsEditable()
   ElementStream<Event> get onBeforeCut =>
       Element.beforeCutEvent._forElementList(this);
 
   /// Stream of `beforepaste` events handled by this [Element].
-  @DomName('Element.onbeforepaste')
-  @DocsEditable()
   ElementStream<Event> get onBeforePaste =>
       Element.beforePasteEvent._forElementList(this);
 
   /// Stream of `blur` events handled by this [Element].
-  @DomName('Element.onblur')
-  @DocsEditable()
   ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
 
-  @DomName('Element.oncanplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlay =>
       Element.canPlayEvent._forElementList(this);
 
-  @DomName('Element.oncanplaythrough')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlayThrough =>
       Element.canPlayThroughEvent._forElementList(this);
 
   /// Stream of `change` events handled by this [Element].
-  @DomName('Element.onchange')
-  @DocsEditable()
   ElementStream<Event> get onChange =>
       Element.changeEvent._forElementList(this);
 
   /// Stream of `click` events handled by this [Element].
-  @DomName('Element.onclick')
-  @DocsEditable()
   ElementStream<MouseEvent> get onClick =>
       Element.clickEvent._forElementList(this);
 
   /// Stream of `contextmenu` events handled by this [Element].
-  @DomName('Element.oncontextmenu')
-  @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu =>
       Element.contextMenuEvent._forElementList(this);
 
   /// Stream of `copy` events handled by this [Element].
-  @DomName('Element.oncopy')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onCopy =>
       Element.copyEvent._forElementList(this);
 
   /// Stream of `cut` events handled by this [Element].
-  @DomName('Element.oncut')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onCut =>
       Element.cutEvent._forElementList(this);
 
   /// Stream of `doubleclick` events handled by this [Element].
-  @DomName('Element.ondblclick')
-  @DocsEditable()
   ElementStream<Event> get onDoubleClick =>
       Element.doubleClickEvent._forElementList(this);
 
@@ -14985,8 +11758,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondrag')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDrag =>
       Element.dragEvent._forElementList(this);
 
@@ -15004,8 +11775,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragend')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd =>
       Element.dragEndEvent._forElementList(this);
 
@@ -15023,8 +11792,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragenter')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter =>
       Element.dragEnterEvent._forElementList(this);
 
@@ -15042,8 +11809,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragleave')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave =>
       Element.dragLeaveEvent._forElementList(this);
 
@@ -15061,8 +11826,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragover')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragOver =>
       Element.dragOverEvent._forElementList(this);
 
@@ -15080,8 +11843,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragstart')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragStart =>
       Element.dragStartEvent._forElementList(this);
 
@@ -15099,289 +11860,163 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondrop')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDrop =>
       Element.dropEvent._forElementList(this);
 
-  @DomName('Element.ondurationchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onDurationChange =>
       Element.durationChangeEvent._forElementList(this);
 
-  @DomName('Element.onemptied')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEmptied =>
       Element.emptiedEvent._forElementList(this);
 
-  @DomName('Element.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEnded => Element.endedEvent._forElementList(this);
 
   /// Stream of `error` events handled by this [Element].
-  @DomName('Element.onerror')
-  @DocsEditable()
   ElementStream<Event> get onError => Element.errorEvent._forElementList(this);
 
   /// Stream of `focus` events handled by this [Element].
-  @DomName('Element.onfocus')
-  @DocsEditable()
   ElementStream<Event> get onFocus => Element.focusEvent._forElementList(this);
 
   /// Stream of `input` events handled by this [Element].
-  @DomName('Element.oninput')
-  @DocsEditable()
   ElementStream<Event> get onInput => Element.inputEvent._forElementList(this);
 
   /// Stream of `invalid` events handled by this [Element].
-  @DomName('Element.oninvalid')
-  @DocsEditable()
   ElementStream<Event> get onInvalid =>
       Element.invalidEvent._forElementList(this);
 
   /// Stream of `keydown` events handled by this [Element].
-  @DomName('Element.onkeydown')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown =>
       Element.keyDownEvent._forElementList(this);
 
   /// Stream of `keypress` events handled by this [Element].
-  @DomName('Element.onkeypress')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress =>
       Element.keyPressEvent._forElementList(this);
 
   /// Stream of `keyup` events handled by this [Element].
-  @DomName('Element.onkeyup')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp =>
       Element.keyUpEvent._forElementList(this);
 
   /// Stream of `load` events handled by this [Element].
-  @DomName('Element.onload')
-  @DocsEditable()
   ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
 
-  @DomName('Element.onloadeddata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedData =>
       Element.loadedDataEvent._forElementList(this);
 
-  @DomName('Element.onloadedmetadata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedMetadata =>
       Element.loadedMetadataEvent._forElementList(this);
 
   /// Stream of `mousedown` events handled by this [Element].
-  @DomName('Element.onmousedown')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown =>
       Element.mouseDownEvent._forElementList(this);
 
   /// Stream of `mouseenter` events handled by this [Element].
-  @DomName('Element.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter =>
       Element.mouseEnterEvent._forElementList(this);
 
   /// Stream of `mouseleave` events handled by this [Element].
-  @DomName('Element.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave =>
       Element.mouseLeaveEvent._forElementList(this);
 
   /// Stream of `mousemove` events handled by this [Element].
-  @DomName('Element.onmousemove')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove =>
       Element.mouseMoveEvent._forElementList(this);
 
   /// Stream of `mouseout` events handled by this [Element].
-  @DomName('Element.onmouseout')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut =>
       Element.mouseOutEvent._forElementList(this);
 
   /// Stream of `mouseover` events handled by this [Element].
-  @DomName('Element.onmouseover')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver =>
       Element.mouseOverEvent._forElementList(this);
 
   /// Stream of `mouseup` events handled by this [Element].
-  @DomName('Element.onmouseup')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp =>
       Element.mouseUpEvent._forElementList(this);
 
   /// Stream of `mousewheel` events handled by this [Element].
-  @DomName('Element.onmousewheel')
-  @DocsEditable()
-  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
-  @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel =>
       Element.mouseWheelEvent._forElementList(this);
 
   /// Stream of `paste` events handled by this [Element].
-  @DomName('Element.onpaste')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onPaste =>
       Element.pasteEvent._forElementList(this);
 
-  @DomName('Element.onpause')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPause => Element.pauseEvent._forElementList(this);
 
-  @DomName('Element.onplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlay => Element.playEvent._forElementList(this);
 
-  @DomName('Element.onplaying')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlaying =>
       Element.playingEvent._forElementList(this);
 
-  @DomName('Element.onratechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onRateChange =>
       Element.rateChangeEvent._forElementList(this);
 
   /// Stream of `reset` events handled by this [Element].
-  @DomName('Element.onreset')
-  @DocsEditable()
   ElementStream<Event> get onReset => Element.resetEvent._forElementList(this);
 
-  @DomName('Element.onresize')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onResize =>
       Element.resizeEvent._forElementList(this);
 
   /// Stream of `scroll` events handled by this [Element].
-  @DomName('Element.onscroll')
-  @DocsEditable()
   ElementStream<Event> get onScroll =>
       Element.scrollEvent._forElementList(this);
 
   /// Stream of `search` events handled by this [Element].
-  @DomName('Element.onsearch')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
   ElementStream<Event> get onSearch =>
       Element.searchEvent._forElementList(this);
 
-  @DomName('Element.onseeked')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeked =>
       Element.seekedEvent._forElementList(this);
 
-  @DomName('Element.onseeking')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeking =>
       Element.seekingEvent._forElementList(this);
 
   /// Stream of `select` events handled by this [Element].
-  @DomName('Element.onselect')
-  @DocsEditable()
   ElementStream<Event> get onSelect =>
       Element.selectEvent._forElementList(this);
 
   /// Stream of `selectstart` events handled by this [Element].
-  @DomName('Element.onselectstart')
-  @DocsEditable()
-  @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart =>
       Element.selectStartEvent._forElementList(this);
 
-  @DomName('Element.onstalled')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onStalled =>
       Element.stalledEvent._forElementList(this);
 
   /// Stream of `submit` events handled by this [Element].
-  @DomName('Element.onsubmit')
-  @DocsEditable()
   ElementStream<Event> get onSubmit =>
       Element.submitEvent._forElementList(this);
 
-  @DomName('Element.onsuspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSuspend =>
       Element.suspendEvent._forElementList(this);
 
-  @DomName('Element.ontimeupdate')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onTimeUpdate =>
       Element.timeUpdateEvent._forElementList(this);
 
   /// Stream of `touchcancel` events handled by this [Element].
-  @DomName('Element.ontouchcancel')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchCancel =>
       Element.touchCancelEvent._forElementList(this);
 
   /// Stream of `touchend` events handled by this [Element].
-  @DomName('Element.ontouchend')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchEnd =>
       Element.touchEndEvent._forElementList(this);
 
   /// Stream of `touchenter` events handled by this [Element].
-  @DomName('Element.ontouchenter')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchEnter =>
       Element.touchEnterEvent._forElementList(this);
 
   /// Stream of `touchleave` events handled by this [Element].
-  @DomName('Element.ontouchleave')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchLeave =>
       Element.touchLeaveEvent._forElementList(this);
 
   /// Stream of `touchmove` events handled by this [Element].
-  @DomName('Element.ontouchmove')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchMove =>
       Element.touchMoveEvent._forElementList(this);
 
   /// Stream of `touchstart` events handled by this [Element].
-  @DomName('Element.ontouchstart')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchStart =>
       Element.touchStartEvent._forElementList(this);
 
   /// Stream of `transitionend` events handled by this [Element].
-  @DomName('Element.ontransitionend')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -15389,46 +12024,27 @@
   ElementStream<TransitionEvent> get onTransitionEnd =>
       Element.transitionEndEvent._forElementList(this);
 
-  @DomName('Element.onvolumechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onVolumeChange =>
       Element.volumeChangeEvent._forElementList(this);
 
-  @DomName('Element.onwaiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onWaiting =>
       Element.waitingEvent._forElementList(this);
 
   /// Stream of `fullscreenchange` events handled by this [Element].
-  @DomName('Element.onwebkitfullscreenchange')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   ElementStream<Event> get onFullscreenChange =>
       Element.fullscreenChangeEvent._forElementList(this);
 
   /// Stream of `fullscreenerror` events handled by this [Element].
-  @DomName('Element.onwebkitfullscreenerror')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   ElementStream<Event> get onFullscreenError =>
       Element.fullscreenErrorEvent._forElementList(this);
 
-  @DomName('Element.onwheel')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<WheelEvent> get onWheel =>
       Element.wheelEvent._forElementList(this);
 }
 
-@DocsEditable()
 /**
  * An abstract class, which all HTML elements extend.
  */
-@DomName('Element')
 @Native("Element")
 class Element extends Node
     implements
@@ -15708,7 +12324,6 @@
    * For details about CSS selector syntax, see the
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
-  @DomName('Element.querySelectorAll')
   ElementList<T> querySelectorAll<T extends Element>(String selectors) =>
       new _FrozenElementList<T>._wrap(_querySelectorAll(selectors));
 
@@ -15847,7 +12462,6 @@
    * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
    * draft specification.
    */
-  @Experimental()
   void attached() {
     // For the deprecation period, call the old callback.
     enteredView();
@@ -15861,19 +12475,15 @@
    * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
    * draft specification.
    */
-  @Experimental()
   void detached() {
     // For the deprecation period, call the old callback.
     leftView();
   }
 
   /** *Deprecated*: override [attached] instead. */
-  @Experimental()
   @deprecated
   void enteredView() {}
 
-  @DomName('Element.getClientRects')
-  @DocsEditable()
   List<Rectangle> getClientRects() {
     var value = _getClientRects();
 
@@ -15889,7 +12499,6 @@
   }
 
   /** *Deprecated*: override [detached] instead. */
-  @Experimental()
   @deprecated
   void leftView() {}
 
@@ -15915,7 +12524,6 @@
    * for the transition, or a Map with fields corresponding to those
    * of the [Timing] object.
   **/
-  @Experimental()
   @SupportedBrowser(SupportedBrowser.CHROME, '36')
   Animation animate(Iterable<Map<String, dynamic>> frames, [timing]) {
     if (frames is! Iterable || !(frames.every((x) => x is Map))) {
@@ -15935,17 +12543,13 @@
         : _animate(convertedFrames, convertedTiming);
   }
 
-  @DomName('Element.animate')
   @JSName('animate')
-  @Experimental() // untriaged
   Animation _animate(Object effect, [timing]) native;
   /**
    * Called by the DOM whenever an attribute on this has been changed.
    */
   void attributeChanged(String name, String oldValue, String newValue) {}
 
-  @DomName('Element.localName')
-  @DocsEditable()
   @Returns('String')
   // Non-null for Elements.
   String get localName => JS('String', '#', _localName);
@@ -15960,7 +12564,6 @@
    * * [Node.namespaceURI](http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname)
    *   from W3C.
    */
-  @DomName('Element.namespaceUri')
   String get namespaceUri => _namespaceUri;
 
   /**
@@ -16012,7 +12615,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mouseWheelEvent')
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const _CustomEventStreamProvider<WheelEvent>(
           Element._determineMouseWheelEventType);
@@ -16025,7 +12627,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.transitionEndEvent')
   static const EventStreamProvider<TransitionEvent> transitionEndEvent =
       const _CustomEventStreamProvider<TransitionEvent>(
           Element._determineTransitionEventType);
@@ -16143,7 +12744,6 @@
   /**
    * Checks if this element matches the CSS selectors.
    */
-  @Experimental()
   bool matches(String selectors) {
     if (JS('bool', '!!#.matches', this)) {
       return JS('bool', '#.matches(#)', this, selectors);
@@ -16161,7 +12761,6 @@
   }
 
   /** Checks if this element or any of its parents match the CSS selectors. */
-  @Experimental()
   bool matchesWithAncestors(String selectors) {
     var elem = this;
     do {
@@ -16180,9 +12779,7 @@
    *   from HTML5Rocks.
    * * [Shadow DOM specification](http://www.w3.org/TR/shadow-dom/) from W3C.
    */
-  @DomName('Element.createShadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
-  @Experimental()
   ShadowRoot createShadowRoot() {
     return JS(
         'ShadowRoot',
@@ -16202,9 +12799,7 @@
    * * [Shadow DOM specification](http://www.w3.org/TR/shadow-dom/)
    *   from W3C.
    */
-  @DomName('Element.shadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
-  @Experimental()
   ShadowRoot get shadowRoot =>
       JS('ShadowRoot|Null', '#.shadowRoot || #.webkitShadowRoot', this, this);
 
@@ -16221,7 +12816,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get contentEdge => new _ContentCssRect(this);
 
   /**
@@ -16241,7 +12835,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get paddingEdge => new _PaddingCssRect(this);
 
   /**
@@ -16260,7 +12853,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get borderEdge => new _BorderCssRect(this);
 
   /**
@@ -16279,7 +12871,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get marginEdge => new _MarginCssRect(this);
 
   /**
@@ -16289,7 +12880,6 @@
    * This method is the Dart equivalent to jQuery's
    * [offset](http://api.jquery.com/offset/) method.
    */
-  @Experimental()
   Point get documentOffset => offsetTo(document.documentElement);
 
   /**
@@ -16303,7 +12893,6 @@
    * element is _not_ an offset parent or transitive offset parent to this
    * element, an [ArgumentError] is thrown.
    */
-  @Experimental()
   Point offsetTo(Element parent) {
     return Element._offsetToHelper(this, parent);
   }
@@ -16567,52 +13156,29 @@
     return result;
   }
 
-  @DomName('Element.offsetParent')
-  @DocsEditable()
   final Element offsetParent;
 
-  @DomName('Element.offsetHeight')
-  @DocsEditable()
   int get offsetHeight => JS('num', '#.offsetHeight', this).round();
 
-  @DomName('Element.offsetLeft')
-  @DocsEditable()
   int get offsetLeft => JS('num', '#.offsetLeft', this).round();
 
-  @DomName('Element.offsetTop')
-  @DocsEditable()
   int get offsetTop => JS('num', '#.offsetTop', this).round();
 
-  @DomName('Element.offsetWidth')
-  @DocsEditable()
   int get offsetWidth => JS('num', '#.offsetWidth', this).round();
 
-  @DomName('Element.scrollHeight')
-  @DocsEditable()
   int get scrollHeight => JS('num', '#.scrollHeight', this).round();
-
-  @DomName('Element.scrollLeft')
-  @DocsEditable()
   int get scrollLeft => JS('num', '#.scrollLeft', this).round();
 
-  @DomName('Element.scrollLeft')
-  @DocsEditable()
   set scrollLeft(int value) {
     JS("void", "#.scrollLeft = #", this, value.round());
   }
 
-  @DomName('Element.scrollTop')
-  @DocsEditable()
   int get scrollTop => JS('num', '#.scrollTop', this).round();
 
-  @DomName('Element.scrollTop')
-  @DocsEditable()
   set scrollTop(int value) {
     JS("void", "#.scrollTop = #", this, value.round());
   }
 
-  @DomName('Element.scrollWidth')
-  @DocsEditable()
   int get scrollWidth => JS('num', '#.scrollWidth', this).round();
 
   // To suppress missing implicit constructor warnings.
@@ -16626,8 +13192,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.abortEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> abortEvent =
       const EventStreamProvider<Event>('abort');
 
@@ -16637,8 +13201,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.beforecopyEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent =
       const EventStreamProvider<Event>('beforecopy');
 
@@ -16648,8 +13210,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.beforecutEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent =
       const EventStreamProvider<Event>('beforecut');
 
@@ -16659,8 +13219,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.beforepasteEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent =
       const EventStreamProvider<Event>('beforepaste');
 
@@ -16670,20 +13228,12 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.blurEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> blurEvent =
       const EventStreamProvider<Event>('blur');
 
-  @DomName('Element.canplayEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> canPlayEvent =
       const EventStreamProvider<Event>('canplay');
 
-  @DomName('Element.canplaythroughEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> canPlayThroughEvent =
       const EventStreamProvider<Event>('canplaythrough');
 
@@ -16693,8 +13243,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.changeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
@@ -16704,8 +13252,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.clickEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent =
       const EventStreamProvider<MouseEvent>('click');
 
@@ -16715,8 +13261,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.contextmenuEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent =
       const EventStreamProvider<MouseEvent>('contextmenu');
 
@@ -16726,8 +13270,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.copyEvent')
-  @DocsEditable()
   static const EventStreamProvider<ClipboardEvent> copyEvent =
       const EventStreamProvider<ClipboardEvent>('copy');
 
@@ -16737,8 +13279,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.cutEvent')
-  @DocsEditable()
   static const EventStreamProvider<ClipboardEvent> cutEvent =
       const EventStreamProvider<ClipboardEvent>('cut');
 
@@ -16748,8 +13288,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.dblclickEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent =
       const EventStreamProvider<Event>('dblclick');
 
@@ -16770,8 +13308,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.dragEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent =
       const EventStreamProvider<MouseEvent>('drag');
 
@@ -16789,8 +13325,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.dragendEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent =
       const EventStreamProvider<MouseEvent>('dragend');
 
@@ -16808,8 +13342,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.dragenterEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent =
       const EventStreamProvider<MouseEvent>('dragenter');
 
@@ -16827,8 +13359,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.dragleaveEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent =
       const EventStreamProvider<MouseEvent>('dragleave');
 
@@ -16846,8 +13376,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.dragoverEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent =
       const EventStreamProvider<MouseEvent>('dragover');
 
@@ -16864,8 +13392,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.dragstartEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent =
       const EventStreamProvider<MouseEvent>('dragstart');
 
@@ -16883,26 +13409,15 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.dropEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent =
       const EventStreamProvider<MouseEvent>('drop');
 
-  @DomName('Element.durationchangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> durationChangeEvent =
       const EventStreamProvider<Event>('durationchange');
 
-  @DomName('Element.emptiedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> emptiedEvent =
       const EventStreamProvider<Event>('emptied');
 
-  @DomName('Element.endedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent =
       const EventStreamProvider<Event>('ended');
 
@@ -16912,8 +13427,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -16923,8 +13436,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.focusEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> focusEvent =
       const EventStreamProvider<Event>('focus');
 
@@ -16934,8 +13445,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.inputEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> inputEvent =
       const EventStreamProvider<Event>('input');
 
@@ -16945,8 +13454,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.invalidEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> invalidEvent =
       const EventStreamProvider<Event>('invalid');
 
@@ -16956,8 +13463,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.keydownEvent')
-  @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent =
       const EventStreamProvider<KeyboardEvent>('keydown');
 
@@ -16967,8 +13472,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.keypressEvent')
-  @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent =
       const EventStreamProvider<KeyboardEvent>('keypress');
 
@@ -16978,8 +13481,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.keyupEvent')
-  @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent =
       const EventStreamProvider<KeyboardEvent>('keyup');
 
@@ -16989,20 +13490,12 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.loadEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> loadEvent =
       const EventStreamProvider<Event>('load');
 
-  @DomName('Element.loadeddataEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadedDataEvent =
       const EventStreamProvider<Event>('loadeddata');
 
-  @DomName('Element.loadedmetadataEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadedMetadataEvent =
       const EventStreamProvider<Event>('loadedmetadata');
 
@@ -17012,8 +13505,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mousedownEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent =
       const EventStreamProvider<MouseEvent>('mousedown');
 
@@ -17023,9 +13514,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mouseenterEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent =
       const EventStreamProvider<MouseEvent>('mouseenter');
 
@@ -17035,9 +13523,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mouseleaveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent =
       const EventStreamProvider<MouseEvent>('mouseleave');
 
@@ -17047,8 +13532,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mousemoveEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent =
       const EventStreamProvider<MouseEvent>('mousemove');
 
@@ -17058,8 +13541,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mouseoutEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent =
       const EventStreamProvider<MouseEvent>('mouseout');
 
@@ -17069,8 +13550,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mouseoverEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent =
       const EventStreamProvider<MouseEvent>('mouseover');
 
@@ -17080,8 +13559,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mouseupEvent')
-  @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent =
       const EventStreamProvider<MouseEvent>('mouseup');
 
@@ -17091,32 +13568,18 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.pasteEvent')
-  @DocsEditable()
   static const EventStreamProvider<ClipboardEvent> pasteEvent =
       const EventStreamProvider<ClipboardEvent>('paste');
 
-  @DomName('Element.pauseEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> pauseEvent =
       const EventStreamProvider<Event>('pause');
 
-  @DomName('Element.playEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> playEvent =
       const EventStreamProvider<Event>('play');
 
-  @DomName('Element.playingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> playingEvent =
       const EventStreamProvider<Event>('playing');
 
-  @DomName('Element.ratechangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> rateChangeEvent =
       const EventStreamProvider<Event>('ratechange');
 
@@ -17126,14 +13589,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.resetEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> resetEvent =
       const EventStreamProvider<Event>('reset');
 
-  @DomName('Element.resizeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> resizeEvent =
       const EventStreamProvider<Event>('resize');
 
@@ -17143,8 +13601,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.scrollEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent =
       const EventStreamProvider<Event>('scroll');
 
@@ -17154,22 +13610,12 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.searchEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
   static const EventStreamProvider<Event> searchEvent =
       const EventStreamProvider<Event>('search');
 
-  @DomName('Element.seekedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> seekedEvent =
       const EventStreamProvider<Event>('seeked');
 
-  @DomName('Element.seekingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> seekingEvent =
       const EventStreamProvider<Event>('seeking');
 
@@ -17179,8 +13625,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.selectEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> selectEvent =
       const EventStreamProvider<Event>('select');
 
@@ -17190,15 +13634,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.selectstartEvent')
-  @DocsEditable()
-  @Experimental() // nonstandard
   static const EventStreamProvider<Event> selectStartEvent =
       const EventStreamProvider<Event>('selectstart');
 
-  @DomName('Element.stalledEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> stalledEvent =
       const EventStreamProvider<Event>('stalled');
 
@@ -17208,20 +13646,12 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.submitEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> submitEvent =
       const EventStreamProvider<Event>('submit');
 
-  @DomName('Element.suspendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> suspendEvent =
       const EventStreamProvider<Event>('suspend');
 
-  @DomName('Element.timeupdateEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> timeUpdateEvent =
       const EventStreamProvider<Event>('timeupdate');
 
@@ -17231,10 +13661,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.touchcancelEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   static const EventStreamProvider<TouchEvent> touchCancelEvent =
       const EventStreamProvider<TouchEvent>('touchcancel');
 
@@ -17244,10 +13670,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.touchendEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   static const EventStreamProvider<TouchEvent> touchEndEvent =
       const EventStreamProvider<TouchEvent>('touchend');
 
@@ -17257,10 +13679,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.touchenterEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   static const EventStreamProvider<TouchEvent> touchEnterEvent =
       const EventStreamProvider<TouchEvent>('touchenter');
 
@@ -17270,10 +13688,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.touchleaveEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   static const EventStreamProvider<TouchEvent> touchLeaveEvent =
       const EventStreamProvider<TouchEvent>('touchleave');
 
@@ -17283,10 +13697,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.touchmoveEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   static const EventStreamProvider<TouchEvent> touchMoveEvent =
       const EventStreamProvider<TouchEvent>('touchmove');
 
@@ -17296,22 +13706,12 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.touchstartEvent')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   static const EventStreamProvider<TouchEvent> touchStartEvent =
       const EventStreamProvider<TouchEvent>('touchstart');
 
-  @DomName('Element.volumechangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> volumeChangeEvent =
       const EventStreamProvider<Event>('volumechange');
 
-  @DomName('Element.waitingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> waitingEvent =
       const EventStreamProvider<Event>('waiting');
 
@@ -17321,12 +13721,8 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.webkitfullscreenchangeEvent')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenChangeEvent =
       const EventStreamProvider<Event>('webkitfullscreenchange');
 
@@ -17336,27 +13732,16 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.webkitfullscreenerrorEvent')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenErrorEvent =
       const EventStreamProvider<Event>('webkitfullscreenerror');
 
-  @DomName('Element.wheelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<WheelEvent> wheelEvent =
       const EventStreamProvider<WheelEvent>('wheel');
 
-  @DomName('Element.contentEditable')
-  @DocsEditable()
   String contentEditable;
 
-  @DomName('Element.dir')
-  @DocsEditable()
   String dir;
 
   /**
@@ -17372,8 +13757,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.draggable')
-  @DocsEditable()
   bool draggable;
 
   /**
@@ -17385,43 +13768,23 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#the-hidden-attribute)
    *   from WHATWG.
    */
-  @DomName('Element.hidden')
-  @DocsEditable()
   bool hidden;
 
-  @DomName('Element.inert')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool inert;
 
-  @DomName('Element.inputMode')
-  @DocsEditable()
-  @Experimental() // untriaged
   String inputMode;
 
   // Using property as subclass shadows.
   bool get isContentEditable => JS("bool", "#.isContentEditable", this);
 
-  @DomName('Element.lang')
-  @DocsEditable()
   String lang;
 
-  @DomName('Element.spellcheck')
-  @DocsEditable()
-  // http://blog.whatwg.org/the-road-to-html-5-spellchecking
-  @Experimental() // nonstandard
   bool spellcheck;
 
-  @DomName('Element.style')
-  @DocsEditable()
   final CssStyleDeclaration style;
 
-  @DomName('Element.tabIndex')
-  @DocsEditable()
   int tabIndex;
 
-  @DomName('Element.title')
-  @DocsEditable()
   String title;
 
   /**
@@ -17434,130 +13797,67 @@
    *   attribute](https://html.spec.whatwg.org/multipage/dom.html#the-translate-attribute)
    *   from WHATWG.
    */
-  @DomName('Element.translate')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute
-  @Experimental()
   bool translate;
 
-  @DomName('Element.blur')
-  @DocsEditable()
   void blur() native;
 
-  @DomName('Element.click')
-  @DocsEditable()
   void click() native;
 
-  @DomName('Element.focus')
-  @DocsEditable()
   void focus() native;
 
-  @DomName('Element.accessibleNode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AccessibleNode accessibleNode;
 
-  @DomName('Element.assignedSlot')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SlotElement assignedSlot;
 
   @JSName('attributes')
-  @DomName('Element.attributes')
-  @DocsEditable()
   final _NamedNodeMap _attributes;
 
-  @DomName('Element.className')
-  @DocsEditable()
   String className;
 
-  @DomName('Element.clientHeight')
-  @DocsEditable()
   final int clientHeight;
 
-  @DomName('Element.clientLeft')
-  @DocsEditable()
   final int clientLeft;
 
-  @DomName('Element.clientTop')
-  @DocsEditable()
   final int clientTop;
 
-  @DomName('Element.clientWidth')
-  @DocsEditable()
   final int clientWidth;
 
-  @DomName('Element.computedName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String computedName;
 
-  @DomName('Element.computedRole')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String computedRole;
 
-  @DomName('Element.id')
-  @DocsEditable()
   String id;
 
   @JSName('innerHTML')
-  @DomName('Element.innerHTML')
-  @DocsEditable()
   String _innerHtml;
 
   @JSName('localName')
-  @DomName('Element.localName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String _localName;
 
   @JSName('namespaceURI')
-  @DomName('Element.namespaceURI')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String _namespaceUri;
 
   // Using property as subclass shadows.
   String get outerHtml => JS("String", "#.outerHTML", this);
 
   @JSName('scrollHeight')
-  @DomName('Element.scrollHeight')
-  @DocsEditable()
   final int _scrollHeight;
 
   @JSName('scrollLeft')
-  @DomName('Element.scrollLeft')
-  @DocsEditable()
   num _scrollLeft;
 
   @JSName('scrollTop')
-  @DomName('Element.scrollTop')
-  @DocsEditable()
   num _scrollTop;
 
   @JSName('scrollWidth')
-  @DomName('Element.scrollWidth')
-  @DocsEditable()
   final int _scrollWidth;
 
-  @DomName('Element.slot')
-  @DocsEditable()
-  @Experimental() // untriaged
   String slot;
 
-  @DomName('Element.styleMap')
-  @DocsEditable()
-  @Experimental() // untriaged
   final StylePropertyMap styleMap;
 
-  @DomName('Element.tagName')
-  @DocsEditable()
   final String tagName;
 
-  @DomName('Element.attachShadow')
-  @DocsEditable()
-  @Experimental() // untriaged
   ShadowRoot attachShadow(Map shadowRootInitDict) {
     var shadowRootInitDict_1 =
         convertDartToNative_Dictionary(shadowRootInitDict);
@@ -17565,34 +13865,16 @@
   }
 
   @JSName('attachShadow')
-  @DomName('Element.attachShadow')
-  @DocsEditable()
-  @Experimental() // untriaged
   ShadowRoot _attachShadow_1(shadowRootInitDict) native;
 
-  @DomName('Element.closest')
-  @DocsEditable()
-  @Experimental() // untriaged
   Element closest(String selectors) native;
 
-  @DomName('Element.getAnimations')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Animation> getAnimations() native;
 
-  @DomName('Element.getAttribute')
-  @DocsEditable()
-  @Experimental() // untriaged
   String getAttribute(String name) native;
 
-  @DomName('Element.getAttributeNS')
-  @DocsEditable()
-  @Experimental() // untriaged
   String getAttributeNS(String namespaceURI, String localName) native;
 
-  @DomName('Element.getAttributeNames')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<String> getAttributeNames() native;
 
   /**
@@ -17607,8 +13889,6 @@
    *   method](http://www.w3.org/TR/cssom-view/#the-getclientrects()-and-getboundingclientrect()-methods)
    *   from W3C.
    */
-  @DomName('Element.getBoundingClientRect')
-  @DocsEditable()
   @Creates('_DomRect')
   @Returns('_DomRect|Null')
   Rectangle getBoundingClientRect() native;
@@ -17626,8 +13906,6 @@
    *   method](http://www.w3.org/TR/cssom-view/#the-getclientrects()-and-getboundingclientrect()-methods)
    *   from W3C.
    */
-  @DomName('Element.getClientRects')
-  @DocsEditable()
   @Creates('DomRectList')
   @Returns('DomRectList|Null')
   List<Rectangle> _getClientRects() native;
@@ -17642,9 +13920,6 @@
    *   specification](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)
    *   from W3C.
    */
-  @DomName('Element.getDestinationInsertionPoints')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('NodeList|Null')
   @Creates('NodeList')
   List<Node> getDestinationInsertionPoints() native;
@@ -17658,62 +13933,35 @@
    *   from MDN.
    * * [DOM specification](http://www.w3.org/TR/domcore/) from W3C.
    */
-  @DomName('Element.getElementsByClassName')
-  @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
   List<Node> getElementsByClassName(String classNames) native;
 
   @JSName('getElementsByTagName')
-  @DomName('Element.getElementsByTagName')
-  @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
   List<Node> _getElementsByTagName(String localName) native;
 
   @JSName('hasAttribute')
-  @DomName('Element.hasAttribute')
-  @DocsEditable()
   bool _hasAttribute(String name) native;
 
   @JSName('hasAttributeNS')
-  @DomName('Element.hasAttributeNS')
-  @DocsEditable()
   bool _hasAttributeNS(String namespaceURI, String localName) native;
 
-  @DomName('Element.hasPointerCapture')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool hasPointerCapture(int pointerId) native;
 
-  @DomName('Element.releasePointerCapture')
-  @DocsEditable()
-  @Experimental() // untriaged
   void releasePointerCapture(int pointerId) native;
 
   @JSName('removeAttribute')
-  @DomName('Element.removeAttribute')
-  @DocsEditable()
   void _removeAttribute(String name) native;
 
   @JSName('removeAttributeNS')
-  @DomName('Element.removeAttributeNS')
-  @DocsEditable()
   void _removeAttributeNS(String namespaceURI, String localName) native;
 
-  @DomName('Element.requestFullscreen')
-  @DocsEditable()
-  @Experimental() // untriaged
   void requestFullscreen() native;
 
-  @DomName('Element.requestPointerLock')
-  @DocsEditable()
-  @Experimental() // untriaged
   void requestPointerLock() native;
 
-  @DomName('Element.scroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   void scroll([options_OR_x, num y]) {
     if (options_OR_x == null && y == null) {
       _scroll_1();
@@ -17732,24 +13980,12 @@
   }
 
   @JSName('scroll')
-  @DomName('Element.scroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scroll_1() native;
   @JSName('scroll')
-  @DomName('Element.scroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scroll_2(options) native;
   @JSName('scroll')
-  @DomName('Element.scroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scroll_3(num x, y) native;
 
-  @DomName('Element.scrollBy')
-  @DocsEditable()
-  @Experimental() // untriaged
   void scrollBy([options_OR_x, num y]) {
     if (options_OR_x == null && y == null) {
       _scrollBy_1();
@@ -17768,36 +14004,18 @@
   }
 
   @JSName('scrollBy')
-  @DomName('Element.scrollBy')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scrollBy_1() native;
   @JSName('scrollBy')
-  @DomName('Element.scrollBy')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scrollBy_2(options) native;
   @JSName('scrollBy')
-  @DomName('Element.scrollBy')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scrollBy_3(num x, y) native;
 
   @JSName('scrollIntoView')
-  @DomName('Element.scrollIntoView')
-  @DocsEditable()
   void _scrollIntoView([Object arg]) native;
 
   @JSName('scrollIntoViewIfNeeded')
-  @DomName('Element.scrollIntoViewIfNeeded')
-  @DocsEditable()
-  // http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded
-  @Experimental() // non-standard
   void _scrollIntoViewIfNeeded([bool centerIfNeeded]) native;
 
-  @DomName('Element.scrollTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void scrollTo([options_OR_x, num y]) {
     if (options_OR_x == null && y == null) {
       _scrollTo_1();
@@ -17816,90 +14034,50 @@
   }
 
   @JSName('scrollTo')
-  @DomName('Element.scrollTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scrollTo_1() native;
   @JSName('scrollTo')
-  @DomName('Element.scrollTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scrollTo_2(options) native;
   @JSName('scrollTo')
-  @DomName('Element.scrollTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _scrollTo_3(num x, y) native;
 
-  @DomName('Element.setApplyScroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setApplyScroll(ScrollStateCallback scrollStateCallback,
       String nativeScrollBehavior) native;
 
-  @DomName('Element.setAttribute')
-  @DocsEditable()
   void setAttribute(String name, String value) native;
 
-  @DomName('Element.setAttributeNS')
-  @DocsEditable()
   void setAttributeNS(String namespaceURI, String name, String value) native;
 
-  @DomName('Element.setDistributeScroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setDistributeScroll(ScrollStateCallback scrollStateCallback,
       String nativeScrollBehavior) native;
 
-  @DomName('Element.setPointerCapture')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setPointerCapture(int pointerId) native;
 
   // From ChildNode
 
-  @DomName('Element.after')
-  @DocsEditable()
-  @Experimental() // untriaged
   void after(Object nodes) native;
 
-  @DomName('Element.before')
-  @DocsEditable()
-  @Experimental() // untriaged
   void before(Object nodes) native;
 
   // From NonDocumentTypeChildNode
 
-  @DomName('Element.nextElementSibling')
-  @DocsEditable()
   final Element nextElementSibling;
 
-  @DomName('Element.previousElementSibling')
-  @DocsEditable()
   final Element previousElementSibling;
 
   // From ParentNode
 
   @JSName('childElementCount')
-  @DomName('Element.childElementCount')
-  @DocsEditable()
   final int _childElementCount;
 
   @JSName('children')
-  @DomName('Element.children')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> _children;
 
   @JSName('firstElementChild')
-  @DomName('Element.firstElementChild')
-  @DocsEditable()
   final Element _firstElementChild;
 
   @JSName('lastElementChild')
-  @DomName('Element.lastElementChild')
-  @DocsEditable()
   final Element _lastElementChild;
 
   /**
@@ -17918,82 +14096,50 @@
    * For details about CSS selector syntax, see the
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
-  @DomName('Element.querySelector')
-  @DocsEditable()
   Element querySelector(String selectors) native;
 
   @JSName('querySelectorAll')
-  @DomName('Element.querySelectorAll')
-  @DocsEditable()
   @Creates('NodeList')
   @Returns('NodeList')
   List<Node> _querySelectorAll(String selectors) native;
 
   /// Stream of `abort` events handled by this [Element].
-  @DomName('Element.onabort')
-  @DocsEditable()
   ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
   /// Stream of `beforecopy` events handled by this [Element].
-  @DomName('Element.onbeforecopy')
-  @DocsEditable()
   ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
 
   /// Stream of `beforecut` events handled by this [Element].
-  @DomName('Element.onbeforecut')
-  @DocsEditable()
   ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
 
   /// Stream of `beforepaste` events handled by this [Element].
-  @DomName('Element.onbeforepaste')
-  @DocsEditable()
   ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
 
   /// Stream of `blur` events handled by this [Element].
-  @DomName('Element.onblur')
-  @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
-  @DomName('Element.oncanplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
-  @DomName('Element.oncanplaythrough')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlayThrough =>
       canPlayThroughEvent.forElement(this);
 
   /// Stream of `change` events handled by this [Element].
-  @DomName('Element.onchange')
-  @DocsEditable()
   ElementStream<Event> get onChange => changeEvent.forElement(this);
 
   /// Stream of `click` events handled by this [Element].
-  @DomName('Element.onclick')
-  @DocsEditable()
   ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
   /// Stream of `contextmenu` events handled by this [Element].
-  @DomName('Element.oncontextmenu')
-  @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu =>
       contextMenuEvent.forElement(this);
 
   /// Stream of `copy` events handled by this [Element].
-  @DomName('Element.oncopy')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onCopy => copyEvent.forElement(this);
 
   /// Stream of `cut` events handled by this [Element].
-  @DomName('Element.oncut')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onCut => cutEvent.forElement(this);
 
   /// Stream of `doubleclick` events handled by this [Element].
-  @DomName('Element.ondblclick')
-  @DocsEditable()
   ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
   /**
@@ -18013,8 +14159,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondrag')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
   /**
@@ -18031,8 +14175,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragend')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
   /**
@@ -18049,8 +14191,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragenter')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
   /**
@@ -18067,8 +14207,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragleave')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
   /**
@@ -18085,8 +14223,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragover')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
   /**
@@ -18103,8 +14239,6 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondragstart')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
   /**
@@ -18121,261 +14255,135 @@
    *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)
    *   from WHATWG.
    */
-  @DomName('Element.ondrop')
-  @DocsEditable()
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
-  @DomName('Element.ondurationchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onDurationChange =>
       durationChangeEvent.forElement(this);
 
-  @DomName('Element.onemptied')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
-  @DomName('Element.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
   /// Stream of `error` events handled by this [Element].
-  @DomName('Element.onerror')
-  @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
   /// Stream of `focus` events handled by this [Element].
-  @DomName('Element.onfocus')
-  @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
   /// Stream of `input` events handled by this [Element].
-  @DomName('Element.oninput')
-  @DocsEditable()
   ElementStream<Event> get onInput => inputEvent.forElement(this);
 
   /// Stream of `invalid` events handled by this [Element].
-  @DomName('Element.oninvalid')
-  @DocsEditable()
   ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
   /// Stream of `keydown` events handled by this [Element].
-  @DomName('Element.onkeydown')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
   /// Stream of `keypress` events handled by this [Element].
-  @DomName('Element.onkeypress')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
   /// Stream of `keyup` events handled by this [Element].
-  @DomName('Element.onkeyup')
-  @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
   /// Stream of `load` events handled by this [Element].
-  @DomName('Element.onload')
-  @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
-  @DomName('Element.onloadeddata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
-  @DomName('Element.onloadedmetadata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedMetadata =>
       loadedMetadataEvent.forElement(this);
 
   /// Stream of `mousedown` events handled by this [Element].
-  @DomName('Element.onmousedown')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
 
   /// Stream of `mouseenter` events handled by this [Element].
-  @DomName('Element.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter =>
       mouseEnterEvent.forElement(this);
 
   /// Stream of `mouseleave` events handled by this [Element].
-  @DomName('Element.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave =>
       mouseLeaveEvent.forElement(this);
 
   /// Stream of `mousemove` events handled by this [Element].
-  @DomName('Element.onmousemove')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
   /// Stream of `mouseout` events handled by this [Element].
-  @DomName('Element.onmouseout')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
   /// Stream of `mouseover` events handled by this [Element].
-  @DomName('Element.onmouseover')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
   /// Stream of `mouseup` events handled by this [Element].
-  @DomName('Element.onmouseup')
-  @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
   /// Stream of `mousewheel` events handled by this [Element].
-  @DomName('Element.onmousewheel')
-  @DocsEditable()
-  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
-  @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel =>
       mouseWheelEvent.forElement(this);
 
   /// Stream of `paste` events handled by this [Element].
-  @DomName('Element.onpaste')
-  @DocsEditable()
   ElementStream<ClipboardEvent> get onPaste => pasteEvent.forElement(this);
 
-  @DomName('Element.onpause')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
-  @DomName('Element.onplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlay => playEvent.forElement(this);
 
-  @DomName('Element.onplaying')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
-  @DomName('Element.onratechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
   /// Stream of `reset` events handled by this [Element].
-  @DomName('Element.onreset')
-  @DocsEditable()
   ElementStream<Event> get onReset => resetEvent.forElement(this);
 
-  @DomName('Element.onresize')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
   /// Stream of `scroll` events handled by this [Element].
-  @DomName('Element.onscroll')
-  @DocsEditable()
   ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
   /// Stream of `search` events handled by this [Element].
-  @DomName('Element.onsearch')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
   ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
-  @DomName('Element.onseeked')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
-  @DomName('Element.onseeking')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
   /// Stream of `select` events handled by this [Element].
-  @DomName('Element.onselect')
-  @DocsEditable()
   ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
   /// Stream of `selectstart` events handled by this [Element].
-  @DomName('Element.onselectstart')
-  @DocsEditable()
-  @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
-  @DomName('Element.onstalled')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
   /// Stream of `submit` events handled by this [Element].
-  @DomName('Element.onsubmit')
-  @DocsEditable()
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
-  @DomName('Element.onsuspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
-  @DomName('Element.ontimeupdate')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
   /// Stream of `touchcancel` events handled by this [Element].
-  @DomName('Element.ontouchcancel')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchCancel =>
       touchCancelEvent.forElement(this);
 
   /// Stream of `touchend` events handled by this [Element].
-  @DomName('Element.ontouchend')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
   /// Stream of `touchenter` events handled by this [Element].
-  @DomName('Element.ontouchenter')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchEnter =>
       touchEnterEvent.forElement(this);
 
   /// Stream of `touchleave` events handled by this [Element].
-  @DomName('Element.ontouchleave')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchLeave =>
       touchLeaveEvent.forElement(this);
 
   /// Stream of `touchmove` events handled by this [Element].
-  @DomName('Element.ontouchmove')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
   /// Stream of `touchstart` events handled by this [Element].
-  @DomName('Element.ontouchstart')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   ElementStream<TouchEvent> get onTouchStart =>
       touchStartEvent.forElement(this);
 
   /// Stream of `transitionend` events handled by this [Element].
-  @DomName('Element.ontransitionend')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -18383,40 +14391,22 @@
   ElementStream<TransitionEvent> get onTransitionEnd =>
       transitionEndEvent.forElement(this);
 
-  @DomName('Element.onvolumechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
-  @DomName('Element.onwaiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
   /// Stream of `fullscreenchange` events handled by this [Element].
-  @DomName('Element.onwebkitfullscreenchange')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   ElementStream<Event> get onFullscreenChange =>
       fullscreenChangeEvent.forElement(this);
 
   /// Stream of `fullscreenerror` events handled by this [Element].
-  @DomName('Element.onwebkitfullscreenerror')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  @Experimental()
   ElementStream<Event> get onFullscreenError =>
       fullscreenErrorEvent.forElement(this);
 
-  @DomName('Element.onwheel')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<WheelEvent> get onWheel => wheelEvent.forElement(this);
 }
 
 class _ElementFactoryProvider {
-  @DomName('Document.createElement')
   // Optimization to improve performance until the dart2js compiler inlines this
   // method.
   static dynamic createElement_tag(String tag, String typeExtension) {
@@ -18454,8 +14444,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLEmbedElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -18467,8 +14455,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLEmbedElement.HTMLEmbedElement')
-  @DocsEditable()
   factory EmbedElement() => document.createElement("embed");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -18480,32 +14466,18 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('embed');
 
-  @DomName('HTMLEmbedElement.height')
-  @DocsEditable()
   String height;
 
-  @DomName('HTMLEmbedElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLEmbedElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLEmbedElement.type')
-  @DocsEditable()
   String type;
 
-  @DomName('HTMLEmbedElement.width')
-  @DocsEditable()
   String width;
 
-  @DomName('HTMLEmbedElement.__getter__')
-  @DocsEditable()
   Node __getter__(String name) native;
 
-  @DomName('HTMLEmbedElement.__setter__')
-  @DocsEditable()
   void __setter__(String name, Node value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18514,18 +14486,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('EntriesCallback')
-// http://www.w3.org/TR/file-system-api/#the-entriescallback-interface
-@Experimental()
 typedef void _EntriesCallback(List<Entry> entries);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Entry')
-// http://www.w3.org/TR/file-system-api/#the-entry-interface
-@Experimental()
 @Native("Entry")
 class Entry extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -18533,37 +14498,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Entry.filesystem')
-  @DocsEditable()
   final FileSystem filesystem;
 
-  @DomName('Entry.fullPath')
-  @DocsEditable()
   final String fullPath;
 
-  @DomName('Entry.isDirectory')
-  @DocsEditable()
   final bool isDirectory;
 
-  @DomName('Entry.isFile')
-  @DocsEditable()
   final bool isFile;
 
-  @DomName('Entry.name')
-  @DocsEditable()
   final String name;
 
   @JSName('copyTo')
-  @DomName('Entry.copyTo')
-  @DocsEditable()
   void _copyTo(DirectoryEntry parent,
       [String name,
       _EntryCallback successCallback,
       _ErrorCallback errorCallback]) native;
 
   @JSName('copyTo')
-  @DomName('Entry.copyTo')
-  @DocsEditable()
   Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
     _copyTo(parent, name, (value) {
@@ -18575,14 +14526,10 @@
   }
 
   @JSName('getMetadata')
-  @DomName('Entry.getMetadata')
-  @DocsEditable()
   void _getMetadata(MetadataCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
   @JSName('getMetadata')
-  @DomName('Entry.getMetadata')
-  @DocsEditable()
   Future<Metadata> getMetadata() {
     var completer = new Completer<Metadata>();
     _getMetadata((value) {
@@ -18595,14 +14542,10 @@
   }
 
   @JSName('getParent')
-  @DomName('Entry.getParent')
-  @DocsEditable()
   void _getParent(
       [_EntryCallback successCallback, _ErrorCallback errorCallback]) native;
 
   @JSName('getParent')
-  @DomName('Entry.getParent')
-  @DocsEditable()
   Future<Entry> getParent() {
     var completer = new Completer<Entry>();
     _getParent((value) {
@@ -18614,16 +14557,12 @@
   }
 
   @JSName('moveTo')
-  @DomName('Entry.moveTo')
-  @DocsEditable()
   void _moveTo(DirectoryEntry parent,
       [String name,
       _EntryCallback successCallback,
       _ErrorCallback errorCallback]) native;
 
   @JSName('moveTo')
-  @DomName('Entry.moveTo')
-  @DocsEditable()
   Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
     _moveTo(parent, name, (value) {
@@ -18635,14 +14574,10 @@
   }
 
   @JSName('remove')
-  @DomName('Entry.remove')
-  @DocsEditable()
   void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback])
       native;
 
   @JSName('remove')
-  @DomName('Entry.remove')
-  @DocsEditable()
   Future remove() {
     var completer = new Completer();
     _remove(() {
@@ -18654,8 +14589,6 @@
   }
 
   @JSName('toURL')
-  @DomName('Entry.toURL')
-  @DocsEditable()
   String toUrl() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18664,9 +14597,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('EntryCallback')
-// http://www.w3.org/TR/file-system-api/#the-entrycallback-interface
-@Experimental()
 typedef void _EntryCallback(Entry entry);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18674,16 +14604,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('ErrorCallback')
-// http://www.w3.org/TR/file-system-api/#the-errorcallback-interface
-@Experimental()
 typedef void _ErrorCallback(DomException error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ErrorEvent')
 @Unstable()
 @Native("ErrorEvent")
 class ErrorEvent extends Event {
@@ -18692,8 +14617,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ErrorEvent.ErrorEvent')
-  @DocsEditable()
   factory ErrorEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -18706,27 +14629,15 @@
   static ErrorEvent _create_2(type) =>
       JS('ErrorEvent', 'new ErrorEvent(#)', type);
 
-  @DomName('ErrorEvent.colno')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int colno;
 
-  @DomName('ErrorEvent.error')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Null')
   final Object error;
 
-  @DomName('ErrorEvent.filename')
-  @DocsEditable()
   final String filename;
 
-  @DomName('ErrorEvent.lineno')
-  @DocsEditable()
   final int lineno;
 
-  @DomName('ErrorEvent.message')
-  @DocsEditable()
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18735,7 +14646,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('Event')
 @Native("Event,InputEvent")
 class Event extends Interceptor {
   // In JS, canBubble and cancelable are technically required parameters to
@@ -18787,14 +14697,9 @@
     throw new StateError('No selector matched for populating matchedTarget.');
   }
 
-  @DomName('Event.path')
-  @DocsEditable()
-  @Experimental()
   List<EventTarget> get path =>
       JS('bool', '!!#.composedPath', this) ? composedPath() : [];
 
-  @DomName('Event.Event')
-  @DocsEditable()
   factory Event._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -18814,8 +14719,6 @@
    * * [Target phase](http://www.w3.org/TR/DOM-Level-3-Events/#target-phase)
    *   from W3C.
    */
-  @DomName('Event.AT_TARGET')
-  @DocsEditable()
   static const int AT_TARGET = 2;
 
   /**
@@ -18826,8 +14729,6 @@
    * * [Bubble phase](http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
    *   from W3C.
    */
-  @DomName('Event.BUBBLING_PHASE')
-  @DocsEditable()
   static const int BUBBLING_PHASE = 3;
 
   /**
@@ -18839,94 +14740,52 @@
    * * [Bubble phase](http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
    *   from W3C.
    */
-  @DomName('Event.CAPTURING_PHASE')
-  @DocsEditable()
   static const int CAPTURING_PHASE = 1;
 
-  @DomName('Event.bubbles')
-  @DocsEditable()
   final bool bubbles;
 
-  @DomName('Event.cancelable')
-  @DocsEditable()
   final bool cancelable;
 
-  @DomName('Event.composed')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool composed;
 
-  @DomName('Event.currentTarget')
-  @DocsEditable()
   EventTarget get currentTarget =>
       _convertNativeToDart_EventTarget(this._get_currentTarget);
   @JSName('currentTarget')
-  @DomName('Event.currentTarget')
-  @DocsEditable()
   @Creates('Null')
   @Returns('EventTarget|=Object')
   final dynamic _get_currentTarget;
 
-  @DomName('Event.defaultPrevented')
-  @DocsEditable()
   final bool defaultPrevented;
 
-  @DomName('Event.eventPhase')
-  @DocsEditable()
   final int eventPhase;
 
-  @DomName('Event.isTrusted')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isTrusted;
 
-  @DomName('Event.target')
-  @DocsEditable()
   EventTarget get target => _convertNativeToDart_EventTarget(this._get_target);
   @JSName('target')
-  @DomName('Event.target')
-  @DocsEditable()
   @Creates('Node')
   @Returns('EventTarget|=Object')
   final dynamic _get_target;
 
-  @DomName('Event.timeStamp')
-  @DocsEditable()
   final num timeStamp;
 
-  @DomName('Event.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('Event.composedPath')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<EventTarget> composedPath() native;
 
   @JSName('initEvent')
-  @DomName('Event.initEvent')
-  @DocsEditable()
   void _initEvent(String type, [bool bubbles, bool cancelable]) native;
 
-  @DomName('Event.preventDefault')
-  @DocsEditable()
   void preventDefault() native;
 
-  @DomName('Event.stopImmediatePropagation')
-  @DocsEditable()
   void stopImmediatePropagation() native;
 
-  @DomName('Event.stopPropagation')
-  @DocsEditable()
   void stopPropagation() native;
 }
 // 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.
 
-@DomName('EventSource')
-// http://www.w3.org/TR/eventsource/#the-eventsource-interface
-@Experimental() // stable
 @Native("EventSource")
 class EventSource extends EventTarget {
   factory EventSource(String url, {withCredentials: false}) {
@@ -18946,8 +14805,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('EventSource.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -18957,8 +14814,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('EventSource.messageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
@@ -18968,13 +14823,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('EventSource.openEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> openEvent =
       const EventStreamProvider<Event>('open');
 
-  @DomName('EventSource.EventSource')
-  @DocsEditable()
   static EventSource _factoryEventSource(String url,
       [Map eventSourceInitDict]) {
     if (eventSourceInitDict != null) {
@@ -18990,47 +14841,27 @@
   static EventSource _create_2(url) =>
       JS('EventSource', 'new EventSource(#)', url);
 
-  @DomName('EventSource.CLOSED')
-  @DocsEditable()
   static const int CLOSED = 2;
 
-  @DomName('EventSource.CONNECTING')
-  @DocsEditable()
   static const int CONNECTING = 0;
 
-  @DomName('EventSource.OPEN')
-  @DocsEditable()
   static const int OPEN = 1;
 
-  @DomName('EventSource.readyState')
-  @DocsEditable()
   final int readyState;
 
-  @DomName('EventSource.url')
-  @DocsEditable()
   final String url;
 
-  @DomName('EventSource.withCredentials')
-  @DocsEditable()
   final bool withCredentials;
 
-  @DomName('EventSource.close')
-  @DocsEditable()
   void close() native;
 
   /// Stream of `error` events handled by this [EventSource].
-  @DomName('EventSource.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `message` events handled by this [EventSource].
-  @DomName('EventSource.onmessage')
-  @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
   /// Stream of `open` events handled by this [EventSource].
-  @DomName('EventSource.onopen')
-  @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19121,7 +14952,6 @@
  * Use the [on] property to add, and remove events
  * for compile-time type checks and a more concise API.
  */
-@DomName('EventTarget')
 @Native("EventTarget")
 class EventTarget extends Interceptor {
   // Custom element created callback.
@@ -19159,18 +14989,12 @@
   }
 
   @JSName('addEventListener')
-  @DomName('EventTarget.addEventListener')
-  @DocsEditable()
   void _addEventListener(String type, EventListener listener, [bool options])
       native;
 
-  @DomName('EventTarget.dispatchEvent')
-  @DocsEditable()
   bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
-  @DomName('EventTarget.removeEventListener')
-  @DocsEditable()
   void _removeEventListener(String type, EventListener listener, [bool options])
       native;
 }
@@ -19178,9 +15002,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ExtendableEvent')
-@Experimental() // untriaged
 @Native("ExtendableEvent")
 class ExtendableEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -19188,8 +15009,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ExtendableEvent.ExtendableEvent')
-  @DocsEditable()
   factory ExtendableEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -19202,18 +15021,12 @@
   static ExtendableEvent _create_2(type) =>
       JS('ExtendableEvent', 'new ExtendableEvent(#)', type);
 
-  @DomName('ExtendableEvent.waitUntil')
-  @DocsEditable()
-  @Experimental() // untriaged
   void waitUntil(Future f) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ExtendableMessageEvent')
-@Experimental() // untriaged
 @Native("ExtendableMessageEvent")
 class ExtendableMessageEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -19221,31 +15034,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ExtendableMessageEvent.data')
-  @DocsEditable()
-  @Experimental() // untriaged
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final Object data;
 
-  @DomName('ExtendableMessageEvent.lastEventId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String lastEventId;
 
-  @DomName('ExtendableMessageEvent.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
-  @DomName('ExtendableMessageEvent.ports')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<MessagePort> ports;
 
-  @DomName('ExtendableMessageEvent.source')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Client|ServiceWorker|MessagePort')
   @Returns('Client|ServiceWorker|MessagePort|Null')
   final Object source;
@@ -19254,9 +15052,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('External')
-@Experimental() // untriaged
 @Native("External")
 class External extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -19264,23 +15059,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('External.AddSearchProvider')
-  @DocsEditable()
-  @Experimental() // untriaged
   void AddSearchProvider() native;
 
-  @DomName('External.IsSearchProviderInstalled')
-  @DocsEditable()
-  @Experimental() // untriaged
   void IsSearchProviderInstalled() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FaceDetector')
-@Experimental() // untriaged
 @Native("FaceDetector")
 class FaceDetector extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -19288,8 +15074,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FaceDetector.FaceDetector')
-  @DocsEditable()
   factory FaceDetector([Map faceDetectorOptions]) {
     if (faceDetectorOptions != null) {
       var faceDetectorOptions_1 =
@@ -19302,9 +15086,6 @@
       JS('FaceDetector', 'new FaceDetector(#)', faceDetectorOptions);
   static FaceDetector _create_2() => JS('FaceDetector', 'new FaceDetector()');
 
-  @DomName('FaceDetector.detect')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<DetectedFace>> detect(/*ImageBitmapSource*/ image) =>
       promiseToFuture<List<DetectedFace>>(JS("", "#.detect(#)", this, image));
 }
@@ -19312,9 +15093,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FederatedCredential')
-@Experimental() // untriaged
 @Native("FederatedCredential")
 class FederatedCredential extends Credential implements CredentialUserData {
   // To suppress missing implicit constructor warnings.
@@ -19322,8 +15100,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FederatedCredential.FederatedCredential')
-  @DocsEditable()
   factory FederatedCredential(Map data) {
     var data_1 = convertDartToNative_Dictionary(data);
     return FederatedCredential._create_1(data_1);
@@ -19331,36 +15107,21 @@
   static FederatedCredential _create_1(data) =>
       JS('FederatedCredential', 'new FederatedCredential(#)', data);
 
-  @DomName('FederatedCredential.protocol')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String protocol;
 
-  @DomName('FederatedCredential.provider')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String provider;
 
   // From CredentialUserData
 
   @JSName('iconURL')
-  @DomName('FederatedCredential.iconURL')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String iconUrl;
 
-  @DomName('FederatedCredential.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FetchEvent')
-@Experimental() // untriaged
 @Native("FetchEvent")
 class FetchEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -19368,8 +15129,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FetchEvent.FetchEvent')
-  @DocsEditable()
   factory FetchEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return FetchEvent._create_1(type, eventInitDict_1);
@@ -19377,38 +15136,21 @@
   static FetchEvent _create_1(type, eventInitDict) =>
       JS('FetchEvent', 'new FetchEvent(#,#)', type, eventInitDict);
 
-  @DomName('FetchEvent.clientId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String clientId;
 
-  @DomName('FetchEvent.isReload')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isReload;
 
-  @DomName('FetchEvent.preloadResponse')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future get preloadResponse =>
       promiseToFuture(JS("", "#.preloadResponse", this));
 
-  @DomName('FetchEvent.request')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _Request request;
 
-  @DomName('FetchEvent.respondWith')
-  @DocsEditable()
-  @Experimental() // untriaged
   void respondWith(Future r) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLFieldSetElement')
 @Unstable()
 @Native("HTMLFieldSetElement")
 class FieldSetElement extends HtmlElement {
@@ -19417,8 +15159,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLFieldSetElement.HTMLFieldSetElement')
-  @DocsEditable()
   factory FieldSetElement() => JS(
       'returns:FieldSetElement;creates:FieldSetElement;new:true',
       '#.createElement(#)',
@@ -19431,59 +15171,34 @@
    */
   FieldSetElement.created() : super.created();
 
-  @DomName('HTMLFieldSetElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLFieldSetElement.elements')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> elements;
 
-  @DomName('HTMLFieldSetElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLFieldSetElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLFieldSetElement.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('HTMLFieldSetElement.validationMessage')
-  @DocsEditable()
   final String validationMessage;
 
-  @DomName('HTMLFieldSetElement.validity')
-  @DocsEditable()
   final ValidityState validity;
 
-  @DomName('HTMLFieldSetElement.willValidate')
-  @DocsEditable()
   final bool willValidate;
 
-  @DomName('HTMLFieldSetElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLFieldSetElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLFieldSetElement.setCustomValidity')
-  @DocsEditable()
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('File')
 @Native("File")
 class File extends Blob {
   // To suppress missing implicit constructor warnings.
@@ -19491,8 +15206,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('File.File')
-  @DocsEditable()
   factory File(List<Object> fileBits, String fileName, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -19505,32 +15218,19 @@
   static File _create_2(fileBits, fileName) =>
       JS('File', 'new File(#,#)', fileBits, fileName);
 
-  @DomName('File.lastModified')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int lastModified;
 
-  @DomName('File.lastModifiedDate')
-  @DocsEditable()
   DateTime get lastModifiedDate =>
       convertNativeToDart_DateTime(this._get_lastModifiedDate);
   @JSName('lastModifiedDate')
-  @DomName('File.lastModifiedDate')
-  @DocsEditable()
   @Creates('Null')
   final dynamic _get_lastModifiedDate;
 
-  @DomName('File.name')
-  @DocsEditable()
   final String name;
 
   @JSName('webkitRelativePath')
-  @DomName('File.webkitRelativePath')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
   final String relativePath;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19539,18 +15239,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('FileCallback')
-// http://www.w3.org/TR/file-system-api/#the-filecallback-interface
-@Experimental()
 typedef void _FileCallback(File file);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FileEntry')
-// http://www.w3.org/TR/file-system-api/#the-fileentry-interface
-@Experimental()
 @Native("FileEntry")
 class FileEntry extends Entry {
   // To suppress missing implicit constructor warnings.
@@ -19559,14 +15252,10 @@
   }
 
   @JSName('createWriter')
-  @DomName('FileEntry.createWriter')
-  @DocsEditable()
   void _createWriter(_FileWriterCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
   @JSName('createWriter')
-  @DomName('FileEntry.createWriter')
-  @DocsEditable()
   Future<FileWriter> createWriter() {
     var completer = new Completer<FileWriter>();
     _createWriter((value) {
@@ -19579,14 +15268,10 @@
   }
 
   @JSName('file')
-  @DomName('FileEntry.file')
-  @DocsEditable()
   void _file(_FileCallback successCallback, [_ErrorCallback errorCallback])
       native;
 
   @JSName('file')
-  @DomName('FileEntry.file')
-  @DocsEditable()
   Future<File> file() {
     var completer = new Completer<File>();
     _file((value) {
@@ -19602,8 +15287,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FileList')
 @Native("FileList")
 class FileList extends Interceptor
     with ListMixin<File>, ImmutableListMixin<File>
@@ -19613,8 +15296,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FileList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   File operator [](int index) {
@@ -19660,20 +15341,14 @@
   File elementAt(int index) => this[index];
   // -- end List<File> mixins.
 
-  @DomName('FileList.item')
-  @DocsEditable()
   File item(int index) native;
 }
 // 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.
 
-@DocsEditable()
-@DomName('FileReader')
 @Native("FileReader")
 class FileReader extends EventTarget {
-  @DomName('FileReader.result')
-  @DocsEditable()
   Object get result {
     var res = JS('Null|String|NativeByteBuffer', '#.result', this);
     if (res is ByteBuffer) {
@@ -19693,8 +15368,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileReader.abortEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent =
       const EventStreamProvider<ProgressEvent>('abort');
 
@@ -19704,8 +15377,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileReader.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> errorEvent =
       const EventStreamProvider<ProgressEvent>('error');
 
@@ -19715,8 +15386,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileReader.loadEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEvent =
       const EventStreamProvider<ProgressEvent>('load');
 
@@ -19726,8 +15395,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileReader.loadendEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEndEvent =
       const EventStreamProvider<ProgressEvent>('loadend');
 
@@ -19737,8 +15404,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileReader.loadstartEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadStartEvent =
       const EventStreamProvider<ProgressEvent>('loadstart');
 
@@ -19748,94 +15413,56 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileReader.progressEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent =
       const EventStreamProvider<ProgressEvent>('progress');
 
-  @DomName('FileReader.FileReader')
-  @DocsEditable()
   factory FileReader() {
     return FileReader._create_1();
   }
   static FileReader _create_1() => JS('FileReader', 'new FileReader()');
 
-  @DomName('FileReader.DONE')
-  @DocsEditable()
   static const int DONE = 2;
 
-  @DomName('FileReader.EMPTY')
-  @DocsEditable()
   static const int EMPTY = 0;
 
-  @DomName('FileReader.LOADING')
-  @DocsEditable()
   static const int LOADING = 1;
 
-  @DomName('FileReader.error')
-  @DocsEditable()
   final DomException error;
 
-  @DomName('FileReader.readyState')
-  @DocsEditable()
   final int readyState;
 
-  @DomName('FileReader.abort')
-  @DocsEditable()
   void abort() native;
 
-  @DomName('FileReader.readAsArrayBuffer')
-  @DocsEditable()
   void readAsArrayBuffer(Blob blob) native;
 
   @JSName('readAsDataURL')
-  @DomName('FileReader.readAsDataURL')
-  @DocsEditable()
   void readAsDataUrl(Blob blob) native;
 
-  @DomName('FileReader.readAsText')
-  @DocsEditable()
   void readAsText(Blob blob, [String label]) native;
 
   /// Stream of `abort` events handled by this [FileReader].
-  @DomName('FileReader.onabort')
-  @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [FileReader].
-  @DomName('FileReader.onerror')
-  @DocsEditable()
   Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
 
   /// Stream of `load` events handled by this [FileReader].
-  @DomName('FileReader.onload')
-  @DocsEditable()
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
   /// Stream of `loadend` events handled by this [FileReader].
-  @DomName('FileReader.onloadend')
-  @DocsEditable()
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
   /// Stream of `loadstart` events handled by this [FileReader].
-  @DomName('FileReader.onloadstart')
-  @DocsEditable()
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
   /// Stream of `progress` events handled by this [FileReader].
-  @DomName('FileReader.onprogress')
-  @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMFileSystem')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://www.w3.org/TR/file-system-api/
 @Native("DOMFileSystem")
 class FileSystem extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -19846,12 +15473,8 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.webkitRequestFileSystem)');
 
-  @DomName('DOMFileSystem.name')
-  @DocsEditable()
   final String name;
 
-  @DomName('DOMFileSystem.root')
-  @DocsEditable()
   final DirectoryEntry root;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19860,18 +15483,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('FileSystemCallback')
-// http://www.w3.org/TR/file-system-api/#the-filesystemcallback-interface
-@Experimental()
 typedef void _FileSystemCallback(FileSystem fileSystem);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FileWriter')
-// http://www.w3.org/TR/file-writer-api/#the-filewriter-interface
-@Experimental()
 @Native("FileWriter")
 class FileWriter extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -19885,8 +15501,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileWriter.abortEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent =
       const EventStreamProvider<ProgressEvent>('abort');
 
@@ -19896,8 +15510,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileWriter.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -19907,8 +15519,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileWriter.progressEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent =
       const EventStreamProvider<ProgressEvent>('progress');
 
@@ -19918,8 +15528,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileWriter.writeEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEvent =
       const EventStreamProvider<ProgressEvent>('write');
 
@@ -19929,8 +15537,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileWriter.writeendEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEndEvent =
       const EventStreamProvider<ProgressEvent>('writeend');
 
@@ -19940,83 +15546,47 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('FileWriter.writestartEvent')
-  @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeStartEvent =
       const EventStreamProvider<ProgressEvent>('writestart');
 
-  @DomName('FileWriter.DONE')
-  @DocsEditable()
   static const int DONE = 2;
 
-  @DomName('FileWriter.INIT')
-  @DocsEditable()
   static const int INIT = 0;
 
-  @DomName('FileWriter.WRITING')
-  @DocsEditable()
   static const int WRITING = 1;
 
-  @DomName('FileWriter.error')
-  @DocsEditable()
   final DomException error;
 
-  @DomName('FileWriter.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('FileWriter.position')
-  @DocsEditable()
   final int position;
 
-  @DomName('FileWriter.readyState')
-  @DocsEditable()
   final int readyState;
 
-  @DomName('FileWriter.abort')
-  @DocsEditable()
   void abort() native;
 
-  @DomName('FileWriter.seek')
-  @DocsEditable()
   void seek(int position) native;
 
-  @DomName('FileWriter.truncate')
-  @DocsEditable()
   void truncate(int size) native;
 
-  @DomName('FileWriter.write')
-  @DocsEditable()
   void write(Blob data) native;
 
   /// Stream of `abort` events handled by this [FileWriter].
-  @DomName('FileWriter.onabort')
-  @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [FileWriter].
-  @DomName('FileWriter.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `progress` events handled by this [FileWriter].
-  @DomName('FileWriter.onprogress')
-  @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
   /// Stream of `write` events handled by this [FileWriter].
-  @DomName('FileWriter.onwrite')
-  @DocsEditable()
   Stream<ProgressEvent> get onWrite => writeEvent.forTarget(this);
 
   /// Stream of `writeend` events handled by this [FileWriter].
-  @DomName('FileWriter.onwriteend')
-  @DocsEditable()
   Stream<ProgressEvent> get onWriteEnd => writeEndEvent.forTarget(this);
 
   /// Stream of `writestart` events handled by this [FileWriter].
-  @DomName('FileWriter.onwritestart')
-  @DocsEditable()
   Stream<ProgressEvent> get onWriteStart => writeStartEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20025,16 +15595,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('FileWriterCallback')
-// http://www.w3.org/TR/file-writer-api/#idl-def-FileWriter
-@Experimental()
 typedef void _FileWriterCallback(FileWriter fileWriter);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FocusEvent')
 @Native("FocusEvent")
 class FocusEvent extends UIEvent {
   // To suppress missing implicit constructor warnings.
@@ -20042,8 +15607,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FocusEvent.FocusEvent')
-  @DocsEditable()
   factory FocusEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -20056,13 +15619,9 @@
   static FocusEvent _create_2(type) =>
       JS('FocusEvent', 'new FocusEvent(#)', type);
 
-  @DomName('FocusEvent.relatedTarget')
-  @DocsEditable()
   EventTarget get relatedTarget =>
       _convertNativeToDart_EventTarget(this._get_relatedTarget);
   @JSName('relatedTarget')
-  @DomName('FocusEvent.relatedTarget')
-  @DocsEditable()
   @Creates('Null')
   final dynamic _get_relatedTarget;
 }
@@ -20070,9 +15629,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FontFace')
-@Experimental() // untriaged
 @Native("FontFace")
 class FontFace extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -20080,8 +15636,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FontFace.FontFace')
-  @DocsEditable()
   factory FontFace(String family, Object source, [Map descriptors]) {
     if (descriptors != null) {
       var descriptors_1 = convertDartToNative_Dictionary(descriptors);
@@ -20094,60 +15648,27 @@
   static FontFace _create_2(family, source) =>
       JS('FontFace', 'new FontFace(#,#)', family, source);
 
-  @DomName('FontFace.display')
-  @DocsEditable()
-  @Experimental() // untriaged
   String display;
 
-  @DomName('FontFace.family')
-  @DocsEditable()
-  @Experimental() // untriaged
   String family;
 
-  @DomName('FontFace.featureSettings')
-  @DocsEditable()
-  @Experimental() // untriaged
   String featureSettings;
 
-  @DomName('FontFace.loaded')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<FontFace> get loaded =>
       promiseToFuture<FontFace>(JS("", "#.loaded", this));
 
-  @DomName('FontFace.status')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String status;
 
-  @DomName('FontFace.stretch')
-  @DocsEditable()
-  @Experimental() // untriaged
   String stretch;
 
-  @DomName('FontFace.style')
-  @DocsEditable()
-  @Experimental() // untriaged
   String style;
 
-  @DomName('FontFace.unicodeRange')
-  @DocsEditable()
-  @Experimental() // untriaged
   String unicodeRange;
 
-  @DomName('FontFace.variant')
-  @DocsEditable()
-  @Experimental() // untriaged
   String variant;
 
-  @DomName('FontFace.weight')
-  @DocsEditable()
-  @Experimental() // untriaged
   String weight;
 
-  @DomName('FontFace.load')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<FontFace> load() =>
       promiseToFuture<FontFace>(JS("", "#.load()", this));
 }
@@ -20155,9 +15676,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FontFaceSet')
-@Experimental() // untriaged
 @Native("FontFaceSet")
 class FontFaceSet extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -20165,73 +15683,34 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FontFaceSet.loadingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<FontFaceSetLoadEvent> loadingEvent =
       const EventStreamProvider<FontFaceSetLoadEvent>('loading');
 
-  @DomName('FontFaceSet.loadingdoneEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<FontFaceSetLoadEvent> loadingDoneEvent =
       const EventStreamProvider<FontFaceSetLoadEvent>('loadingdone');
 
-  @DomName('FontFaceSet.loadingerrorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<FontFaceSetLoadEvent> loadingErrorEvent =
       const EventStreamProvider<FontFaceSetLoadEvent>('loadingerror');
 
-  @DomName('FontFaceSet.status')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String status;
 
-  @DomName('FontFaceSet.add')
-  @DocsEditable()
-  @Experimental() // untriaged
   FontFaceSet add(FontFace arg) native;
 
-  @DomName('FontFaceSet.check')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool check(String font, [String text]) native;
 
-  @DomName('FontFaceSet.clear')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clear() native;
 
-  @DomName('FontFaceSet.delete')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool delete(FontFace arg) native;
 
-  @DomName('FontFaceSet.forEach')
-  @DocsEditable()
-  @Experimental() // untriaged
   void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) native;
 
-  @DomName('FontFaceSet.has')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool has(FontFace arg) native;
 
-  @DomName('FontFaceSet.onloading')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<FontFaceSetLoadEvent> get onLoading => loadingEvent.forTarget(this);
 
-  @DomName('FontFaceSet.onloadingdone')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<FontFaceSetLoadEvent> get onLoadingDone =>
       loadingDoneEvent.forTarget(this);
 
-  @DomName('FontFaceSet.onloadingerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<FontFaceSetLoadEvent> get onLoadingError =>
       loadingErrorEvent.forTarget(this);
 }
@@ -20239,9 +15718,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FontFaceSetLoadEvent')
-@Experimental() // untriaged
 @Native("FontFaceSetLoadEvent")
 class FontFaceSetLoadEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -20249,8 +15725,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FontFaceSetLoadEvent.FontFaceSetLoadEvent')
-  @DocsEditable()
   factory FontFaceSetLoadEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -20266,18 +15740,12 @@
   static FontFaceSetLoadEvent _create_2(type) =>
       JS('FontFaceSetLoadEvent', 'new FontFaceSetLoadEvent(#)', type);
 
-  @DomName('FontFaceSetLoadEvent.fontfaces')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<FontFace> fontfaces;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FontFaceSource')
-@Experimental() // untriaged
 @Native("FontFaceSource")
 class FontFaceSource extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -20285,18 +15753,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FontFaceSource.fonts')
-  @DocsEditable()
-  @Experimental() // untriaged
   final FontFaceSet fonts;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ForeignFetchEvent')
-@Experimental() // untriaged
 @Native("ForeignFetchEvent")
 class ForeignFetchEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -20304,8 +15766,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ForeignFetchEvent.ForeignFetchEvent')
-  @DocsEditable()
   factory ForeignFetchEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return ForeignFetchEvent._create_1(type, eventInitDict_1);
@@ -20313,27 +15773,16 @@
   static ForeignFetchEvent _create_1(type, eventInitDict) => JS(
       'ForeignFetchEvent', 'new ForeignFetchEvent(#,#)', type, eventInitDict);
 
-  @DomName('ForeignFetchEvent.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
-  @DomName('ForeignFetchEvent.request')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _Request request;
 
-  @DomName('ForeignFetchEvent.respondWith')
-  @DocsEditable()
-  @Experimental() // untriaged
   void respondWith(Future r) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FormData')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -20345,8 +15794,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FormData.FormData')
-  @DocsEditable()
   factory FormData([FormElement form]) {
     if (form != null) {
       return FormData._create_1(form);
@@ -20359,46 +15806,25 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.FormData)');
 
-  @DomName('FormData.append')
-  @DocsEditable()
   void append(String name, String value) native;
 
   @JSName('append')
-  @DomName('FormData.append')
-  @DocsEditable()
   void appendBlob(String name, Blob value, [String filename]) native;
 
-  @DomName('FormData.delete')
-  @DocsEditable()
-  @Experimental() // untriaged
   void delete(String name) native;
 
-  @DomName('FormData.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object get(String name) native;
 
-  @DomName('FormData.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Object> getAll(String name) native;
 
-  @DomName('FormData.has')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool has(String name) native;
 
-  @DomName('FormData.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   void set(String name, value, [String filename]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLFormElement')
 @Native("HTMLFormElement")
 class FormElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -20406,8 +15832,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLFormElement.HTMLFormElement')
-  @DocsEditable()
   factory FormElement() => JS(
       'returns:FormElement;creates:FormElement;new:true',
       '#.createElement(#)',
@@ -20420,70 +15844,34 @@
    */
   FormElement.created() : super.created();
 
-  @DomName('HTMLFormElement.acceptCharset')
-  @DocsEditable()
   String acceptCharset;
 
-  @DomName('HTMLFormElement.action')
-  @DocsEditable()
   String action;
 
-  @DomName('HTMLFormElement.autocomplete')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
-  @Experimental()
   String autocomplete;
 
-  @DomName('HTMLFormElement.encoding')
-  @DocsEditable()
   String encoding;
 
-  @DomName('HTMLFormElement.enctype')
-  @DocsEditable()
   String enctype;
 
-  @DomName('HTMLFormElement.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('HTMLFormElement.method')
-  @DocsEditable()
   String method;
 
-  @DomName('HTMLFormElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLFormElement.noValidate')
-  @DocsEditable()
   bool noValidate;
 
-  @DomName('HTMLFormElement.target')
-  @DocsEditable()
   String target;
 
-  @DomName('HTMLFormElement.__getter__')
-  @DocsEditable()
   Object __getter__(String name) native;
 
-  @DomName('HTMLFormElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLFormElement.item')
-  @DocsEditable()
-  @Experimental() // untriaged
   Element item(int index) native;
 
-  @DomName('HTMLFormElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLFormElement.requestAutocomplete')
-  @DocsEditable()
-  // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
-  @Experimental()
   void requestAutocomplete(Map details) {
     var details_1 = convertDartToNative_Dictionary(details);
     _requestAutocomplete_1(details_1);
@@ -20491,18 +15879,10 @@
   }
 
   @JSName('requestAutocomplete')
-  @DomName('HTMLFormElement.requestAutocomplete')
-  @DocsEditable()
-  // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
-  @Experimental()
   void _requestAutocomplete_1(details) native;
 
-  @DomName('HTMLFormElement.reset')
-  @DocsEditable()
   void reset() native;
 
-  @DomName('HTMLFormElement.submit')
-  @DocsEditable()
   void submit() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20511,8 +15891,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('FrameRequestCallback')
-@Experimental() // untriaged
 typedef void FrameRequestCallback(num highResTime);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -20520,17 +15898,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('FunctionStringCallback')
-@Experimental() // untriaged
 typedef void FunctionStringCallback(String data);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Gamepad')
-// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface
-@Experimental()
 @Native("Gamepad")
 class Gamepad extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -20538,60 +15910,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Gamepad.axes')
-  @DocsEditable()
   final List<num> axes;
 
-  @DomName('Gamepad.buttons')
-  @DocsEditable()
   @Creates('JSExtendableArray|GamepadButton')
   @Returns('JSExtendableArray')
   final List<GamepadButton> buttons;
 
-  @DomName('Gamepad.connected')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool connected;
 
-  @DomName('Gamepad.displayId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int displayId;
 
-  @DomName('Gamepad.hand')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String hand;
 
-  @DomName('Gamepad.id')
-  @DocsEditable()
   final String id;
 
-  @DomName('Gamepad.index')
-  @DocsEditable()
   final int index;
 
-  @DomName('Gamepad.mapping')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String mapping;
 
-  @DomName('Gamepad.pose')
-  @DocsEditable()
-  @Experimental() // untriaged
   final GamepadPose pose;
 
-  @DomName('Gamepad.timestamp')
-  @DocsEditable()
   final int timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('GamepadButton')
-@Experimental() // untriaged
 @Native("GamepadButton")
 class GamepadButton extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -20599,28 +15943,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('GamepadButton.pressed')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool pressed;
 
-  @DomName('GamepadButton.touched')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool touched;
 
-  @DomName('GamepadButton.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('GamepadEvent')
-@Experimental() // untriaged
 @Native("GamepadEvent")
 class GamepadEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -20628,8 +15960,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('GamepadEvent.GamepadEvent')
-  @DocsEditable()
   factory GamepadEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -20642,18 +15972,12 @@
   static GamepadEvent _create_2(type) =>
       JS('GamepadEvent', 'new GamepadEvent(#)', type);
 
-  @DomName('GamepadEvent.gamepad')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Gamepad gamepad;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('GamepadPose')
-@Experimental() // untriaged
 @Native("GamepadPose")
 class GamepadPose extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -20661,56 +15985,29 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('GamepadPose.angularAcceleration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List angularAcceleration;
 
-  @DomName('GamepadPose.angularVelocity')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List angularVelocity;
 
-  @DomName('GamepadPose.hasOrientation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool hasOrientation;
 
-  @DomName('GamepadPose.hasPosition')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool hasPosition;
 
-  @DomName('GamepadPose.linearAcceleration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List linearAcceleration;
 
-  @DomName('GamepadPose.linearVelocity')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List linearVelocity;
 
-  @DomName('GamepadPose.orientation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List orientation;
 
-  @DomName('GamepadPose.position')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List position;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Geolocation')
 @Unstable()
 @Native("Geolocation")
 class Geolocation extends Interceptor {
-  @DomName('Geolocation.getCurrentPosition')
   Future<Geoposition> getCurrentPosition(
       {bool enableHighAccuracy, Duration timeout, Duration maximumAge}) {
     var options = {};
@@ -20736,7 +16033,6 @@
     return completer.future;
   }
 
-  @DomName('Geolocation.watchPosition')
   Stream<Geoposition> watchPosition(
       {bool enableHighAccuracy, Duration timeout, Duration maximumAge}) {
     var options = {};
@@ -20789,12 +16085,8 @@
   }
 
   @JSName('clearWatch')
-  @DomName('Geolocation.clearWatch')
-  @DocsEditable()
   void _clearWatch(int watchID) native;
 
-  @DomName('Geolocation.getCurrentPosition')
-  @DocsEditable()
   void _getCurrentPosition(_PositionCallback successCallback,
       [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
@@ -20811,22 +16103,14 @@
   }
 
   @JSName('getCurrentPosition')
-  @DomName('Geolocation.getCurrentPosition')
-  @DocsEditable()
   void _getCurrentPosition_1(_PositionCallback successCallback,
       _PositionErrorCallback errorCallback, options) native;
   @JSName('getCurrentPosition')
-  @DomName('Geolocation.getCurrentPosition')
-  @DocsEditable()
   void _getCurrentPosition_2(_PositionCallback successCallback,
       _PositionErrorCallback errorCallback) native;
   @JSName('getCurrentPosition')
-  @DomName('Geolocation.getCurrentPosition')
-  @DocsEditable()
   void _getCurrentPosition_3(_PositionCallback successCallback) native;
 
-  @DomName('Geolocation.watchPosition')
-  @DocsEditable()
   int _watchPosition(_PositionCallback successCallback,
       [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
@@ -20840,18 +16124,12 @@
   }
 
   @JSName('watchPosition')
-  @DomName('Geolocation.watchPosition')
-  @DocsEditable()
   int _watchPosition_1(_PositionCallback successCallback,
       _PositionErrorCallback errorCallback, options) native;
   @JSName('watchPosition')
-  @DomName('Geolocation.watchPosition')
-  @DocsEditable()
   int _watchPosition_2(_PositionCallback successCallback,
       _PositionErrorCallback errorCallback) native;
   @JSName('watchPosition')
-  @DomName('Geolocation.watchPosition')
-  @DocsEditable()
   int _watchPosition_3(_PositionCallback successCallback) native;
 }
 
@@ -20871,9 +16149,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Position')
-@Experimental() // untriaged
 @Native("Position")
 class Geoposition extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -20881,14 +16156,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Position.coords')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Coordinates coords;
 
-  @DomName('Position.timestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20898,9 +16167,6 @@
 // We implement EventTarget and have stubs for its methods because it's tricky to
 // convince the scripts to make our instance methods abstract, and the bodies that
 // get generated require `this` to be an EventTarget.
-@DocsEditable()
-@DomName('GlobalEventHandlers')
-@Experimental() // untriaged
 abstract class GlobalEventHandlers implements EventTarget {
   void addEventListener(String type, dynamic listener(Event event),
       [bool useCapture]);
@@ -20914,640 +16180,295 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('GlobalEventHandlers.abortEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> abortEvent =
       const EventStreamProvider<Event>('abort');
 
-  @DomName('GlobalEventHandlers.blurEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> blurEvent =
       const EventStreamProvider<Event>('blur');
 
-  @DomName('GlobalEventHandlers.canplayEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> canPlayEvent =
       const EventStreamProvider<Event>('canplay');
 
-  @DomName('GlobalEventHandlers.canplaythroughEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> canPlayThroughEvent =
       const EventStreamProvider<Event>('canplaythrough');
 
-  @DomName('GlobalEventHandlers.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('GlobalEventHandlers.clickEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> clickEvent =
       const EventStreamProvider<MouseEvent>('click');
 
-  @DomName('GlobalEventHandlers.contextmenuEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> contextMenuEvent =
       const EventStreamProvider<MouseEvent>('contextmenu');
 
-  @DomName('GlobalEventHandlers.dblclickEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> doubleClickEvent =
       const EventStreamProvider<Event>('dblclick');
 
-  @DomName('GlobalEventHandlers.dragEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragEvent =
       const EventStreamProvider<MouseEvent>('drag');
 
-  @DomName('GlobalEventHandlers.dragendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragEndEvent =
       const EventStreamProvider<MouseEvent>('dragend');
 
-  @DomName('GlobalEventHandlers.dragenterEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragEnterEvent =
       const EventStreamProvider<MouseEvent>('dragenter');
 
-  @DomName('GlobalEventHandlers.dragleaveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragLeaveEvent =
       const EventStreamProvider<MouseEvent>('dragleave');
 
-  @DomName('GlobalEventHandlers.dragoverEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragOverEvent =
       const EventStreamProvider<MouseEvent>('dragover');
 
-  @DomName('GlobalEventHandlers.dragstartEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragStartEvent =
       const EventStreamProvider<MouseEvent>('dragstart');
 
-  @DomName('GlobalEventHandlers.dropEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dropEvent =
       const EventStreamProvider<MouseEvent>('drop');
 
-  @DomName('GlobalEventHandlers.durationchangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> durationChangeEvent =
       const EventStreamProvider<Event>('durationchange');
 
-  @DomName('GlobalEventHandlers.emptiedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> emptiedEvent =
       const EventStreamProvider<Event>('emptied');
 
-  @DomName('GlobalEventHandlers.endedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent =
       const EventStreamProvider<Event>('ended');
 
-  @DomName('GlobalEventHandlers.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('GlobalEventHandlers.focusEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> focusEvent =
       const EventStreamProvider<Event>('focus');
 
-  @DomName('GlobalEventHandlers.inputEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> inputEvent =
       const EventStreamProvider<Event>('input');
 
-  @DomName('GlobalEventHandlers.invalidEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> invalidEvent =
       const EventStreamProvider<Event>('invalid');
 
-  @DomName('GlobalEventHandlers.keydownEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<KeyboardEvent> keyDownEvent =
       const EventStreamProvider<KeyboardEvent>('keydown');
 
-  @DomName('GlobalEventHandlers.keypressEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<KeyboardEvent> keyPressEvent =
       const EventStreamProvider<KeyboardEvent>('keypress');
 
-  @DomName('GlobalEventHandlers.keyupEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<KeyboardEvent> keyUpEvent =
       const EventStreamProvider<KeyboardEvent>('keyup');
 
-  @DomName('GlobalEventHandlers.loadEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadEvent =
       const EventStreamProvider<Event>('load');
 
-  @DomName('GlobalEventHandlers.loadeddataEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadedDataEvent =
       const EventStreamProvider<Event>('loadeddata');
 
-  @DomName('GlobalEventHandlers.loadedmetadataEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadedMetadataEvent =
       const EventStreamProvider<Event>('loadedmetadata');
 
-  @DomName('GlobalEventHandlers.mousedownEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseDownEvent =
       const EventStreamProvider<MouseEvent>('mousedown');
 
-  @DomName('GlobalEventHandlers.mouseenterEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent =
       const EventStreamProvider<MouseEvent>('mouseenter');
 
-  @DomName('GlobalEventHandlers.mouseleaveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent =
       const EventStreamProvider<MouseEvent>('mouseleave');
 
-  @DomName('GlobalEventHandlers.mousemoveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseMoveEvent =
       const EventStreamProvider<MouseEvent>('mousemove');
 
-  @DomName('GlobalEventHandlers.mouseoutEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseOutEvent =
       const EventStreamProvider<MouseEvent>('mouseout');
 
-  @DomName('GlobalEventHandlers.mouseoverEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseOverEvent =
       const EventStreamProvider<MouseEvent>('mouseover');
 
-  @DomName('GlobalEventHandlers.mouseupEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseUpEvent =
       const EventStreamProvider<MouseEvent>('mouseup');
 
-  @DomName('GlobalEventHandlers.mousewheelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const EventStreamProvider<WheelEvent>('mousewheel');
 
-  @DomName('GlobalEventHandlers.pauseEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> pauseEvent =
       const EventStreamProvider<Event>('pause');
 
-  @DomName('GlobalEventHandlers.playEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> playEvent =
       const EventStreamProvider<Event>('play');
 
-  @DomName('GlobalEventHandlers.playingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> playingEvent =
       const EventStreamProvider<Event>('playing');
 
-  @DomName('GlobalEventHandlers.ratechangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> rateChangeEvent =
       const EventStreamProvider<Event>('ratechange');
 
-  @DomName('GlobalEventHandlers.resetEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> resetEvent =
       const EventStreamProvider<Event>('reset');
 
-  @DomName('GlobalEventHandlers.resizeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> resizeEvent =
       const EventStreamProvider<Event>('resize');
 
-  @DomName('GlobalEventHandlers.scrollEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> scrollEvent =
       const EventStreamProvider<Event>('scroll');
 
-  @DomName('GlobalEventHandlers.seekedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> seekedEvent =
       const EventStreamProvider<Event>('seeked');
 
-  @DomName('GlobalEventHandlers.seekingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> seekingEvent =
       const EventStreamProvider<Event>('seeking');
 
-  @DomName('GlobalEventHandlers.selectEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> selectEvent =
       const EventStreamProvider<Event>('select');
 
-  @DomName('GlobalEventHandlers.stalledEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> stalledEvent =
       const EventStreamProvider<Event>('stalled');
 
-  @DomName('GlobalEventHandlers.submitEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> submitEvent =
       const EventStreamProvider<Event>('submit');
 
-  @DomName('GlobalEventHandlers.suspendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> suspendEvent =
       const EventStreamProvider<Event>('suspend');
 
-  @DomName('GlobalEventHandlers.timeupdateEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> timeUpdateEvent =
       const EventStreamProvider<Event>('timeupdate');
 
-  @DomName('GlobalEventHandlers.touchcancelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchCancelEvent =
       const EventStreamProvider<TouchEvent>('touchcancel');
 
-  @DomName('GlobalEventHandlers.touchendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchEndEvent =
       const EventStreamProvider<TouchEvent>('touchend');
 
-  @DomName('GlobalEventHandlers.touchmoveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchMoveEvent =
       const EventStreamProvider<TouchEvent>('touchmove');
 
-  @DomName('GlobalEventHandlers.touchstartEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchStartEvent =
       const EventStreamProvider<TouchEvent>('touchstart');
 
-  @DomName('GlobalEventHandlers.volumechangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> volumeChangeEvent =
       const EventStreamProvider<Event>('volumechange');
 
-  @DomName('GlobalEventHandlers.waitingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> waitingEvent =
       const EventStreamProvider<Event>('waiting');
 
-  @DomName('GlobalEventHandlers.wheelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<WheelEvent> wheelEvent =
       const EventStreamProvider<WheelEvent>('wheel');
 
-  @DomName('GlobalEventHandlers.onabort')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onblur')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.oncanplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.oncanplaythrough')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onclick')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.oncontextmenu')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondblclick')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondrag')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondragend')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondragenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondragleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondragover')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondragstart')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondrop')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ondurationchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onemptied')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onEmptied => emptiedEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onfocus')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onFocus => focusEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.oninput')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onInput => inputEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.oninvalid')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onInvalid => invalidEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onkeydown')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onkeypress')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onkeyup')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onload')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onLoad => loadEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onloadeddata')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onloadedmetadata')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmousedown')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmousemove')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmouseout')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmouseover')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmouseup')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onmousewheel')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onpause')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPlay => playEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onplaying')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPlaying => playingEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onratechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onreset')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onReset => resetEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onresize')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onscroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onseeked')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSeeked => seekedEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onseeking')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSeeking => seekingEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onselect')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSelect => selectEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onstalled')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onStalled => stalledEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onsubmit')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSubmit => submitEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onsuspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onSuspend => suspendEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ontimeupdate')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ontouchcancel')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ontouchend')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ontouchmove')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.ontouchstart')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onvolumechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onwaiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onWaiting => waitingEvent.forTarget(this);
 
-  @DomName('GlobalEventHandlers.onwheel')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<WheelEvent> get onWheel => wheelEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Gyroscope')
-@Experimental() // untriaged
 @Native("Gyroscope")
 class Gyroscope extends Sensor {
   // To suppress missing implicit constructor warnings.
@@ -21555,8 +16476,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Gyroscope.Gyroscope')
-  @DocsEditable()
   factory Gyroscope([Map sensorOptions]) {
     if (sensorOptions != null) {
       var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
@@ -21568,30 +16487,19 @@
       JS('Gyroscope', 'new Gyroscope(#)', sensorOptions);
   static Gyroscope _create_2() => JS('Gyroscope', 'new Gyroscope()');
 
-  @DomName('Gyroscope.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num x;
 
-  @DomName('Gyroscope.y')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num y;
 
-  @DomName('Gyroscope.z')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * An `<hr>` tag.
  */
-@DomName('HTMLHRElement')
 @Native("HTMLHRElement")
 class HRElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -21599,8 +16507,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLHRElement.HTMLHRElement')
-  @DocsEditable()
   factory HRElement() => JS('returns:HRElement;creates:HRElement;new:true',
       '#.createElement(#)', document, "hr");
   /**
@@ -21610,9 +16516,6 @@
    */
   HRElement.created() : super.created();
 
-  @DomName('HTMLHRElement.color')
-  @DocsEditable()
-  @Experimental() // untriaged
   String color;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -21621,7 +16524,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('HashChangeEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -21643,8 +16545,6 @@
         convertDartToNative_Dictionary(options));
   }
 
-  @DomName('HashChangeEvent.HashChangeEvent')
-  @DocsEditable()
   factory HashChangeEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -21661,21 +16561,15 @@
   static bool get supported => Device.isEventTypeSupported('HashChangeEvent');
 
   @JSName('newURL')
-  @DomName('HashChangeEvent.newURL')
-  @DocsEditable()
   final String newUrl;
 
   @JSName('oldURL')
-  @DomName('HashChangeEvent.oldURL')
-  @DocsEditable()
   final String oldUrl;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLHeadElement')
 @Native("HTMLHeadElement")
 class HeadElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -21683,8 +16577,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLHeadElement.HTMLHeadElement')
-  @DocsEditable()
   factory HeadElement() => JS(
       'returns:HeadElement;creates:HeadElement;new:true',
       '#.createElement(#)',
@@ -21701,9 +16593,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Headers')
-@Experimental() // untriaged
 @Native("Headers")
 class Headers extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -21711,8 +16600,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Headers.Headers')
-  @DocsEditable()
   factory Headers([Object init]) {
     if (init != null) {
       return Headers._create_1(init);
@@ -21726,8 +16613,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLHeadingElement')
 @Native("HTMLHeadingElement")
 class HeadingElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -21735,48 +16620,36 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLHeadingElement.HTMLHeadingElement')
-  @DocsEditable()
   factory HeadingElement.h1() => JS(
       'returns:HeadingElement;creates:HeadingElement;new:true',
       '#.createElement(#)',
       document,
       "h1");
 
-  @DomName('HTMLHeadingElement.HTMLHeadingElement')
-  @DocsEditable()
   factory HeadingElement.h2() => JS(
       'returns:HeadingElement;creates:HeadingElement;new:true',
       '#.createElement(#)',
       document,
       "h2");
 
-  @DomName('HTMLHeadingElement.HTMLHeadingElement')
-  @DocsEditable()
   factory HeadingElement.h3() => JS(
       'returns:HeadingElement;creates:HeadingElement;new:true',
       '#.createElement(#)',
       document,
       "h3");
 
-  @DomName('HTMLHeadingElement.HTMLHeadingElement')
-  @DocsEditable()
   factory HeadingElement.h4() => JS(
       'returns:HeadingElement;creates:HeadingElement;new:true',
       '#.createElement(#)',
       document,
       "h4");
 
-  @DomName('HTMLHeadingElement.HTMLHeadingElement')
-  @DocsEditable()
   factory HeadingElement.h5() => JS(
       'returns:HeadingElement;creates:HeadingElement;new:true',
       '#.createElement(#)',
       document,
       "h5");
 
-  @DomName('HTMLHeadingElement.HTMLHeadingElement')
-  @DocsEditable()
   factory HeadingElement.h6() => JS(
       'returns:HeadingElement;creates:HeadingElement;new:true',
       '#.createElement(#)',
@@ -21793,7 +16666,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('History')
 @Native("History")
 class History extends Interceptor implements HistoryBase {
   /**
@@ -21811,40 +16683,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('History.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('History.scrollRestoration')
-  @DocsEditable()
-  @Experimental() // untriaged
   String scrollRestoration;
 
-  @DomName('History.state')
-  @DocsEditable()
   dynamic get state =>
       convertNativeToDart_SerializedScriptValue(this._get_state);
   @JSName('state')
-  @DomName('History.state')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_state;
 
-  @DomName('History.back')
-  @DocsEditable()
   void back() native;
 
-  @DomName('History.forward')
-  @DocsEditable()
   void forward() native;
 
-  @DomName('History.go')
-  @DocsEditable()
   void go([int delta]) native;
 
-  @DomName('History.pushState')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -21856,16 +16711,12 @@
   }
 
   @JSName('pushState')
-  @DomName('History.pushState')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
   void _pushState_1(data, title, url) native;
 
-  @DomName('History.replaceState')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -21877,8 +16728,6 @@
   }
 
   @JSName('replaceState')
-  @DomName('History.replaceState')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -21889,8 +16738,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLCollection')
 @Native("HTMLCollection")
 class HtmlCollection extends Interceptor
     with ListMixin<Node>, ImmutableListMixin<Node>
@@ -21900,8 +16747,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLCollection.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   Node operator [](int index) {
@@ -21947,12 +16792,8 @@
   Node elementAt(int index) => this[index];
   // -- end List<Node> mixins.
 
-  @DomName('HTMLCollection.item')
-  @DocsEditable()
   Node item(int index) native;
 
-  @DomName('HTMLCollection.namedItem')
-  @DocsEditable()
   Object namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21961,7 +16802,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('HTMLDocument')
 @Native("HTMLDocument")
 class HtmlDocument extends Document {
   // To suppress missing implicit constructor warnings.
@@ -21969,46 +16809,35 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Document.body')
   BodyElement body;
 
   /// UNSTABLE: Chrome-only - create a Range from the given point.
-  @DomName('Document.caretRangeFromPoint')
   @Unstable()
   Range caretRangeFromPoint(int x, int y) {
     return _caretRangeFromPoint(x, y);
   }
 
-  @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
     return _elementFromPoint(x, y);
   }
 
-  @DomName('Document.head')
   HeadElement get head => _head;
 
-  @DomName('Document.lastModified')
   String get lastModified => _lastModified;
 
-  @DomName('Document.preferredStylesheetSet')
   String get preferredStylesheetSet => _preferredStylesheetSet;
 
-  @DomName('Document.referrer')
   String get referrer => _referrer;
 
-  @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => _selectedStylesheetSet;
   set selectedStylesheetSet(String value) {
     _selectedStylesheetSet = value;
   }
 
-  @DomName('Document.styleSheets')
   List<StyleSheet> get styleSheets => _styleSheets;
 
-  @DomName('Document.title')
   String get title => _title;
 
-  @DomName('Document.title')
   set title(String value) {
     _title = value;
   }
@@ -22025,15 +16854,12 @@
    *   from WebPlatform.org.
    * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
    */
-  @DomName('Document.webkitExitFullscreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   void exitFullscreen() {
     _webkitExitFullscreen();
   }
 
-  @Experimental()
   /**
    * Register a custom subclass of Element to be instantiatable by the DOM.
    *
@@ -22081,7 +16907,6 @@
 
   /** *Deprecated*: use [registerElement] instead. */
   @deprecated
-  @Experimental()
   void register(String tag, Type customElementClass, {String extendsTag}) {
     return registerElement(tag, customElementClass, extendsTag: extendsTag);
   }
@@ -22092,11 +16917,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
-  @Experimental()
   static const EventStreamProvider<Event> visibilityChangeEvent =
       const _CustomEventStreamProvider<Event>(
           _determineVisibilityChangeEventType);
@@ -22118,7 +16941,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
-  @Experimental()
   Stream<Event> get onVisibilityChange => visibilityChangeEvent.forTarget(this);
 
   /// Creates an element upgrader which can be used to change the Dart wrapper
@@ -22129,7 +16951,6 @@
   ///
   /// If the type is not a direct subclass of HtmlElement then the extendsTag
   /// parameter must be provided.
-  @Experimental()
   ElementUpgrader createElementUpgrader(Type type, {String extendsTag}) {
     return new _JSElementUpgrader(this, type, extendsTag);
   }
@@ -22138,8 +16959,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLFormControlsCollection')
 @Native("HTMLFormControlsCollection")
 class HtmlFormControlsCollection extends HtmlCollection {
   // To suppress missing implicit constructor warnings.
@@ -22147,21 +16966,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLFormControlsCollection.item')
-  @DocsEditable()
-  @Experimental() // untriaged
   Node item(int index) native;
 
-  @DomName('HTMLFormControlsCollection.namedItem')
-  @DocsEditable()
   Object namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLHtmlElement')
 @Native("HTMLHtmlElement")
 class HtmlHtmlElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -22169,8 +16981,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLHtmlElement.HTMLHtmlElement')
-  @DocsEditable()
   factory HtmlHtmlElement() => JS(
       'returns:HtmlHtmlElement;creates:HtmlHtmlElement;new:true',
       '#.createElement(#)',
@@ -22187,9 +16997,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLHyperlinkElementUtils')
-@Experimental() // untriaged
 @Native("HTMLHyperlinkElementUtils")
 class HtmlHyperlinkElementUtils extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -22197,67 +17004,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLHyperlinkElementUtils.hash')
-  @DocsEditable()
-  @Experimental() // untriaged
   String hash;
 
-  @DomName('HTMLHyperlinkElementUtils.host')
-  @DocsEditable()
-  @Experimental() // untriaged
   String host;
 
-  @DomName('HTMLHyperlinkElementUtils.hostname')
-  @DocsEditable()
-  @Experimental() // untriaged
   String hostname;
 
-  @DomName('HTMLHyperlinkElementUtils.href')
-  @DocsEditable()
-  @Experimental() // untriaged
   String href;
 
-  @DomName('HTMLHyperlinkElementUtils.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
-  @DomName('HTMLHyperlinkElementUtils.password')
-  @DocsEditable()
-  @Experimental() // untriaged
   String password;
 
-  @DomName('HTMLHyperlinkElementUtils.pathname')
-  @DocsEditable()
-  @Experimental() // untriaged
   String pathname;
 
-  @DomName('HTMLHyperlinkElementUtils.port')
-  @DocsEditable()
-  @Experimental() // untriaged
   String port;
 
-  @DomName('HTMLHyperlinkElementUtils.protocol')
-  @DocsEditable()
-  @Experimental() // untriaged
   String protocol;
 
-  @DomName('HTMLHyperlinkElementUtils.search')
-  @DocsEditable()
-  @Experimental() // untriaged
   String search;
 
-  @DomName('HTMLHyperlinkElementUtils.username')
-  @DocsEditable()
-  @Experimental() // untriaged
   String username;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLOptionsCollection')
 @Native("HTMLOptionsCollection")
 class HtmlOptionsCollection extends HtmlCollection {
   // To suppress missing implicit constructor warnings.
@@ -22266,9 +17038,6 @@
   }
 
   @JSName('item')
-  @DomName('HTMLOptionsCollection.item')
-  @DocsEditable()
-  @Experimental() // untriaged
   Element _item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22322,7 +17091,6 @@
   * * [JS XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest)
   * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
  */
-@DomName('XMLHttpRequest')
 @Native("XMLHttpRequest")
 class HttpRequest extends HttpRequestEventTarget {
   /**
@@ -22572,7 +17340,6 @@
    * This API provides a subset of [request] which works on IE9. If IE9
    * cross-origin support is not required then [request] should be used instead.
    */
-  @Experimental()
   static Future<String> requestCrossOrigin(String url,
       {String method, String sendData}) {
     if (supportsCrossOrigin) {
@@ -22669,8 +17436,6 @@
    * `open` method is intended only for more complex HTTP requests where
    * finer-grained control is needed.
    */
-  @DomName('XMLHttpRequest.open')
-  @DocsEditable()
   void open(String method, String url,
       {bool async, String user, String password}) native;
 
@@ -22685,8 +17450,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequest.readystatechangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> readyStateChangeEvent =
       const EventStreamProvider<Event>('readystatechange');
 
@@ -22706,31 +17469,19 @@
    *     HttpRequest.getString('http://dartlang.org').then(
    *         (result) => print('Request complete: $result'));
    */
-  @DomName('XMLHttpRequest.XMLHttpRequest')
-  @DocsEditable()
   factory HttpRequest() {
     return HttpRequest._create_1();
   }
   static HttpRequest _create_1() => JS('HttpRequest', 'new XMLHttpRequest()');
 
-  @DomName('XMLHttpRequest.DONE')
-  @DocsEditable()
   static const int DONE = 4;
 
-  @DomName('XMLHttpRequest.HEADERS_RECEIVED')
-  @DocsEditable()
   static const int HEADERS_RECEIVED = 2;
 
-  @DomName('XMLHttpRequest.LOADING')
-  @DocsEditable()
   static const int LOADING = 3;
 
-  @DomName('XMLHttpRequest.OPENED')
-  @DocsEditable()
   static const int OPENED = 1;
 
-  @DomName('XMLHttpRequest.UNSENT')
-  @DocsEditable()
   static const int UNSENT = 0;
 
   /**
@@ -22765,8 +17516,6 @@
    *   </tr>
    * </table>
    */
-  @DomName('XMLHttpRequest.readyState')
-  @DocsEditable()
   final int readyState;
 
   /**
@@ -22776,8 +17525,6 @@
    * form of a [String], [ByteBuffer], [Document], [Blob], or json (also a
    * [String]). `null` indicates request failure.
    */
-  @DomName('XMLHttpRequest.response')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -22791,8 +17538,6 @@
    * form of a [String], [ByteBuffer], [Document], [Blob], or json (also a
    * [String]). `null` indicates request failure.
    */
-  @DomName('XMLHttpRequest.response')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -22804,8 +17549,6 @@
   /**
    * The response in String form or empty String on failure.
    */
-  @DomName('XMLHttpRequest.responseText')
-  @DocsEditable()
   final String responseText;
 
   /**
@@ -22819,14 +17562,9 @@
    * See also: [MDN
    * responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype)
    */
-  @DomName('XMLHttpRequest.responseType')
-  @DocsEditable()
   String responseType;
 
   @JSName('responseURL')
-  @DomName('XMLHttpRequest.responseURL')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String responseUrl;
 
   @JSName('responseXML')
@@ -22837,24 +17575,18 @@
    * `text/xml` stream, unless responseType = 'document' and the request is
    * synchronous.
    */
-  @DomName('XMLHttpRequest.responseXML')
-  @DocsEditable()
   final Document responseXml;
 
   /**
    * The HTTP result code from the request (200, 404, etc).
    * See also: [HTTP Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
    */
-  @DomName('XMLHttpRequest.status')
-  @DocsEditable()
   final int status;
 
   /**
    * The request response string (such as \"200 OK\").
    * See also: [HTTP Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
    */
-  @DomName('XMLHttpRequest.statusText')
-  @DocsEditable()
   final String statusText;
 
   /**
@@ -22872,17 +17604,12 @@
    * * [The timeout attribute](http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
    *   from W3C.
    */
-  @DomName('XMLHttpRequest.timeout')
-  @DocsEditable()
-  @Experimental() // untriaged
   int timeout;
 
   /**
    * [EventTarget] that can hold listeners to track the progress of the request.
    * The events fired will be members of [HttpRequestUploadEvents].
    */
-  @DomName('XMLHttpRequest.upload')
-  @DocsEditable()
   @Unstable()
   final HttpRequestUpload upload;
 
@@ -22892,8 +17619,6 @@
    *
    * This value is ignored for same-site requests.
    */
-  @DomName('XMLHttpRequest.withCredentials')
-  @DocsEditable()
   bool withCredentials;
 
   /**
@@ -22903,8 +17628,6 @@
    * `LOADING`. If this method is not in the process of being sent, the method
    * has no effect.
    */
-  @DomName('XMLHttpRequest.abort')
-  @DocsEditable()
   void abort() native;
 
   /**
@@ -22918,8 +17641,6 @@
    * headers](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields)
    * for a list of common response headers.
    */
-  @DomName('XMLHttpRequest.getAllResponseHeaders')
-  @DocsEditable()
   @Unstable()
   String getAllResponseHeaders() native;
 
@@ -22930,8 +17651,6 @@
    * headers](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields)
    * for a list of common response headers.
    */
-  @DomName('XMLHttpRequest.getResponseHeader')
-  @DocsEditable()
   @Unstable()
   String getResponseHeader(String name) native;
 
@@ -22942,8 +17661,6 @@
    * This value must be set before the request has been sent. See also the list
    * of [IANA Official MIME types](https://www.iana.org/assignments/media-types/media-types.xhtml)
    */
-  @DomName('XMLHttpRequest.overrideMimeType')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -22962,8 +17679,6 @@
    * * [XMLHttpRequest.send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
    *   from MDN.
    */
-  @DomName('XMLHttpRequest.send')
-  @DocsEditable()
   void send([body_OR_data]) native;
 
   /**
@@ -22983,8 +17698,6 @@
    *   method](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method)
    *   from W3C.
    */
-  @DomName('XMLHttpRequest.setRequestHeader')
-  @DocsEditable()
   void setRequestHeader(String name, String value) native;
 
   /// Stream of `readystatechange` events handled by this [HttpRequest].
@@ -22992,17 +17705,12 @@
    * Event listeners to be notified every time the [HttpRequest]
    * object's `readyState` changes values.
    */
-  @DomName('XMLHttpRequest.onreadystatechange')
-  @DocsEditable()
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XMLHttpRequestEventTarget')
-@Experimental() // untriaged
 @Native("XMLHttpRequestEventTarget")
 class HttpRequestEventTarget extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -23016,9 +17724,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequestEventTarget.abortEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> abortEvent =
       const EventStreamProvider<ProgressEvent>('abort');
 
@@ -23028,9 +17733,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequestEventTarget.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> errorEvent =
       const EventStreamProvider<ProgressEvent>('error');
 
@@ -23040,9 +17742,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequestEventTarget.loadEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEvent =
       const EventStreamProvider<ProgressEvent>('load');
 
@@ -23052,9 +17751,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequestEventTarget.loadendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEndEvent =
       const EventStreamProvider<ProgressEvent>('loadend');
 
@@ -23064,9 +17760,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequestEventTarget.loadstartEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadStartEvent =
       const EventStreamProvider<ProgressEvent>('loadstart');
 
@@ -23076,9 +17769,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequestEventTarget.progressEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> progressEvent =
       const EventStreamProvider<ProgressEvent>('progress');
 
@@ -23088,70 +17778,42 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('XMLHttpRequestEventTarget.timeoutEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> timeoutEvent =
       const EventStreamProvider<ProgressEvent>('timeout');
 
   /// Stream of `abort` events handled by this [HttpRequestEventTarget].
-  @DomName('XMLHttpRequestEventTarget.onabort')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [HttpRequestEventTarget].
-  @DomName('XMLHttpRequestEventTarget.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
 
   /// Stream of `load` events handled by this [HttpRequestEventTarget].
-  @DomName('XMLHttpRequestEventTarget.onload')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
   /// Stream of `loadend` events handled by this [HttpRequestEventTarget].
-  @DomName('XMLHttpRequestEventTarget.onloadend')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
   /// Stream of `loadstart` events handled by this [HttpRequestEventTarget].
-  @DomName('XMLHttpRequestEventTarget.onloadstart')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
   /// Stream of `progress` events handled by this [HttpRequestEventTarget].
-  @DomName('XMLHttpRequestEventTarget.onprogress')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental() // untriaged
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
   /// Stream of `timeout` events handled by this [HttpRequestEventTarget].
-  @DomName('XMLHttpRequestEventTarget.ontimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<ProgressEvent> get onTimeout => timeoutEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XMLHttpRequestUpload')
-// http://xhr.spec.whatwg.org/#xmlhttprequestupload
-@Experimental()
 @Native("XMLHttpRequestUpload")
 class HttpRequestUpload extends HttpRequestEventTarget {
   // To suppress missing implicit constructor warnings.
@@ -23163,8 +17825,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLIFrameElement')
 @Native("HTMLIFrameElement")
 class IFrameElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -23172,8 +17832,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLIFrameElement.HTMLIFrameElement')
-  @DocsEditable()
   factory IFrameElement() => JS(
       'returns:IFrameElement;creates:IFrameElement;new:true',
       '#.createElement(#)',
@@ -23186,73 +17844,39 @@
    */
   IFrameElement.created() : super.created();
 
-  @DomName('HTMLIFrameElement.allow')
-  @DocsEditable()
-  @Experimental() // untriaged
   String allow;
 
-  @DomName('HTMLIFrameElement.allowFullscreen')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool allowFullscreen;
 
-  @DomName('HTMLIFrameElement.allowPaymentRequest')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool allowPaymentRequest;
 
-  @DomName('HTMLIFrameElement.contentWindow')
-  @DocsEditable()
   WindowBase get contentWindow =>
       _convertNativeToDart_Window(this._get_contentWindow);
   @JSName('contentWindow')
-  @DomName('HTMLIFrameElement.contentWindow')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_contentWindow;
 
-  @DomName('HTMLIFrameElement.csp')
-  @DocsEditable()
-  @Experimental() // untriaged
   String csp;
 
-  @DomName('HTMLIFrameElement.height')
-  @DocsEditable()
   String height;
 
-  @DomName('HTMLIFrameElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLIFrameElement.referrerPolicy')
-  @DocsEditable()
-  @Experimental() // untriaged
   String referrerPolicy;
 
-  @DomName('HTMLIFrameElement.sandbox')
-  @DocsEditable()
   final DomTokenList sandbox;
 
-  @DomName('HTMLIFrameElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLIFrameElement.srcdoc')
-  @DocsEditable()
   String srcdoc;
 
-  @DomName('HTMLIFrameElement.width')
-  @DocsEditable()
   String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IdleDeadline')
-@Experimental() // untriaged
 @Native("IdleDeadline")
 class IdleDeadline extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -23260,14 +17884,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IdleDeadline.didTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool didTimeout;
 
-  @DomName('IdleDeadline.timeRemaining')
-  @DocsEditable()
-  @Experimental() // untriaged
   double timeRemaining() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23276,16 +17894,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('IdleRequestCallback')
-@Experimental() // untriaged
 typedef void IdleRequestCallback(IdleDeadline deadline);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ImageBitmap')
-@Experimental() // untriaged
 @Native("ImageBitmap")
 class ImageBitmap extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -23293,28 +17906,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ImageBitmap.height')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int height;
 
-  @DomName('ImageBitmap.width')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int width;
 
-  @DomName('ImageBitmap.close')
-  @DocsEditable()
-  @Experimental() // untriaged
   void close() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ImageBitmapRenderingContext')
-@Experimental() // untriaged
 @Native("ImageBitmapRenderingContext")
 class ImageBitmapRenderingContext extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -23322,23 +17923,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ImageBitmapRenderingContext.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CanvasElement canvas;
 
-  @DomName('ImageBitmapRenderingContext.transferFromImageBitmap')
-  @DocsEditable()
-  @Experimental() // untriaged
   void transferFromImageBitmap(ImageBitmap bitmap) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ImageCapture')
-@Experimental() // untriaged
 @Native("ImageCapture")
 class ImageCapture extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -23346,55 +17938,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ImageCapture.ImageCapture')
-  @DocsEditable()
   factory ImageCapture(MediaStreamTrack track) {
     return ImageCapture._create_1(track);
   }
   static ImageCapture _create_1(track) =>
       JS('ImageCapture', 'new ImageCapture(#)', track);
 
-  @DomName('ImageCapture.track')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaStreamTrack track;
 
-  @DomName('ImageCapture.getPhotoCapabilities')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PhotoCapabilities> getPhotoCapabilities() =>
       promiseToFuture<PhotoCapabilities>(
           JS("", "#.getPhotoCapabilities()", this));
 
-  @DomName('ImageCapture.getPhotoSettings')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Map<String, dynamic>> getPhotoSettings() =>
       promiseToFutureAsMap(JS("", "#.getPhotoSettings()", this));
 
-  @DomName('ImageCapture.grabFrame')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<ImageBitmap> grabFrame() =>
       promiseToFuture<ImageBitmap>(JS("", "#.grabFrame()", this));
 
-  @DomName('ImageCapture.setOptions')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future setOptions(Map photoSettings) {
     var photoSettings_1 = convertDartToNative_Dictionary(photoSettings);
     return _setOptions_1(photoSettings_1);
   }
 
   @JSName('setOptions')
-  @DomName('ImageCapture.setOptions')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _setOptions_1(photoSettings) native;
 
-  @DomName('ImageCapture.takePhoto')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future takePhoto([Map photoSettings]) {
     if (photoSettings != null) {
       var photoSettings_1 = convertDartToNative_Dictionary(photoSettings);
@@ -23404,21 +17973,14 @@
   }
 
   @JSName('takePhoto')
-  @DomName('ImageCapture.takePhoto')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _takePhoto_1(photoSettings) native;
   @JSName('takePhoto')
-  @DomName('ImageCapture.takePhoto')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _takePhoto_2() native;
 }
 // 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.
 
-@DomName('ImageData')
 @Native("ImageData")
 class ImageData extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -23426,8 +17988,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ImageData.ImageData')
-  @DocsEditable()
   factory ImageData(data_OR_sw, int sh_OR_sw, [int sh]) {
     if ((sh_OR_sw is int) && (data_OR_sw is int) && sh == null) {
       return ImageData._create_1(data_OR_sw, sh_OR_sw);
@@ -23447,25 +18007,18 @@
   static ImageData _create_3(data_OR_sw, sh_OR_sw, sh) =>
       JS('ImageData', 'new ImageData(#,#,#)', data_OR_sw, sh_OR_sw, sh);
 
-  @DomName('ImageData.data')
-  @DocsEditable()
   @Creates('NativeUint8ClampedList')
   @Returns('NativeUint8ClampedList')
   final Uint8ClampedList data;
 
-  @DomName('ImageData.height')
-  @DocsEditable()
   final int height;
 
-  @DomName('ImageData.width')
-  @DocsEditable()
   final int width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('HTMLImageElement')
 @Native("HTMLImageElement")
 class ImageElement extends HtmlElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
@@ -23473,8 +18026,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLImageElement.HTMLImageElement')
-  @DocsEditable()
   factory ImageElement({String src, int width, int height}) {
     ImageElement e = JS('returns:ImageElement;creates:ImageElement;new:true',
         '#.createElement(#)', document, "img");
@@ -23490,83 +18041,42 @@
    */
   ImageElement.created() : super.created();
 
-  @DomName('HTMLImageElement.alt')
-  @DocsEditable()
   String alt;
 
-  @DomName('HTMLImageElement.async')
-  @DocsEditable()
-  @Experimental() // untriaged
   String async;
 
-  @DomName('HTMLImageElement.complete')
-  @DocsEditable()
   final bool complete;
 
-  @DomName('HTMLImageElement.crossOrigin')
-  @DocsEditable()
   String crossOrigin;
 
-  @DomName('HTMLImageElement.currentSrc')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String currentSrc;
 
-  @DomName('HTMLImageElement.height')
-  @DocsEditable()
   int height;
 
-  @DomName('HTMLImageElement.isMap')
-  @DocsEditable()
   bool isMap;
 
-  @DomName('HTMLImageElement.naturalHeight')
-  @DocsEditable()
   final int naturalHeight;
 
-  @DomName('HTMLImageElement.naturalWidth')
-  @DocsEditable()
   final int naturalWidth;
 
-  @DomName('HTMLImageElement.referrerPolicy')
-  @DocsEditable()
-  @Experimental() // untriaged
   String referrerPolicy;
 
-  @DomName('HTMLImageElement.sizes')
-  @DocsEditable()
-  @Experimental() // untriaged
   String sizes;
 
-  @DomName('HTMLImageElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLImageElement.srcset')
-  @DocsEditable()
-  @Experimental() // untriaged
   String srcset;
 
-  @DomName('HTMLImageElement.useMap')
-  @DocsEditable()
   String useMap;
 
-  @DomName('HTMLImageElement.width')
-  @DocsEditable()
   int width;
 
-  @DomName('HTMLImageElement.decode')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future decode() => promiseToFuture(JS("", "#.decode()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('InputDeviceCapabilities')
-@Experimental() // untriaged
 @Native("InputDeviceCapabilities")
 class InputDeviceCapabilities extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -23574,8 +18084,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('InputDeviceCapabilities.InputDeviceCapabilities')
-  @DocsEditable()
   factory InputDeviceCapabilities([Map deviceInitDict]) {
     if (deviceInitDict != null) {
       var deviceInitDict_1 = convertDartToNative_Dictionary(deviceInitDict);
@@ -23590,16 +18098,12 @@
   static InputDeviceCapabilities _create_2() =>
       JS('InputDeviceCapabilities', 'new InputDeviceCapabilities()');
 
-  @DomName('InputDeviceCapabilities.firesTouchEvents')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool firesTouchEvents;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('HTMLInputElement')
 @Native("HTMLInputElement")
 class InputElement extends HtmlElement
     implements
@@ -23646,194 +18150,99 @@
    */
   InputElement.created() : super.created();
 
-  @DomName('HTMLInputElement.accept')
-  @DocsEditable()
   String accept;
 
-  @DomName('HTMLInputElement.alt')
-  @DocsEditable()
   String alt;
 
-  @DomName('HTMLInputElement.autocapitalize')
-  @DocsEditable()
-  @Experimental() // untriaged
   String autocapitalize;
 
-  @DomName('HTMLInputElement.autocomplete')
-  @DocsEditable()
   String autocomplete;
 
-  @DomName('HTMLInputElement.autofocus')
-  @DocsEditable()
   bool autofocus;
 
-  @DomName('HTMLInputElement.capture')
-  @DocsEditable()
-  @Experimental() // untriaged
   String capture;
 
-  @DomName('HTMLInputElement.checked')
-  @DocsEditable()
   bool checked;
 
-  @DomName('HTMLInputElement.defaultChecked')
-  @DocsEditable()
   bool defaultChecked;
 
-  @DomName('HTMLInputElement.defaultValue')
-  @DocsEditable()
   String defaultValue;
 
-  @DomName('HTMLInputElement.dirName')
-  @DocsEditable()
   String dirName;
 
-  @DomName('HTMLInputElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLInputElement.files')
-  @DocsEditable()
   @Returns('FileList|Null')
   @Creates('FileList')
   List<File> files;
 
-  @DomName('HTMLInputElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLInputElement.formAction')
-  @DocsEditable()
   String formAction;
 
-  @DomName('HTMLInputElement.formEnctype')
-  @DocsEditable()
   String formEnctype;
 
-  @DomName('HTMLInputElement.formMethod')
-  @DocsEditable()
   String formMethod;
 
-  @DomName('HTMLInputElement.formNoValidate')
-  @DocsEditable()
   bool formNoValidate;
 
-  @DomName('HTMLInputElement.formTarget')
-  @DocsEditable()
   String formTarget;
 
-  @DomName('HTMLInputElement.height')
-  @DocsEditable()
   int height;
 
-  @DomName('HTMLInputElement.incremental')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
   bool incremental;
 
-  @DomName('HTMLInputElement.indeterminate')
-  @DocsEditable()
   bool indeterminate;
 
-  @DomName('HTMLInputElement.labels')
-  @DocsEditable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> labels;
 
-  @DomName('HTMLInputElement.list')
-  @DocsEditable()
   final HtmlElement list;
 
-  @DomName('HTMLInputElement.max')
-  @DocsEditable()
   String max;
 
-  @DomName('HTMLInputElement.maxLength')
-  @DocsEditable()
   int maxLength;
 
-  @DomName('HTMLInputElement.min')
-  @DocsEditable()
   String min;
 
-  @DomName('HTMLInputElement.minLength')
-  @DocsEditable()
-  @Experimental() // untriaged
   int minLength;
 
-  @DomName('HTMLInputElement.multiple')
-  @DocsEditable()
   bool multiple;
 
-  @DomName('HTMLInputElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLInputElement.pattern')
-  @DocsEditable()
   String pattern;
 
-  @DomName('HTMLInputElement.placeholder')
-  @DocsEditable()
   String placeholder;
 
-  @DomName('HTMLInputElement.readOnly')
-  @DocsEditable()
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
-  @DocsEditable()
   bool required;
 
-  @DomName('HTMLInputElement.selectionDirection')
-  @DocsEditable()
   String selectionDirection;
 
-  @DomName('HTMLInputElement.selectionEnd')
-  @DocsEditable()
   int selectionEnd;
 
-  @DomName('HTMLInputElement.selectionStart')
-  @DocsEditable()
   int selectionStart;
 
-  @DomName('HTMLInputElement.size')
-  @DocsEditable()
   int size;
 
-  @DomName('HTMLInputElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLInputElement.step')
-  @DocsEditable()
   String step;
 
-  @DomName('HTMLInputElement.type')
-  @DocsEditable()
   String type;
 
-  @DomName('HTMLInputElement.validationMessage')
-  @DocsEditable()
   final String validationMessage;
 
-  @DomName('HTMLInputElement.validity')
-  @DocsEditable()
   final ValidityState validity;
 
-  @DomName('HTMLInputElement.value')
-  @DocsEditable()
   String value;
 
-  @DomName('HTMLInputElement.valueAsDate')
-  @DocsEditable()
   DateTime get valueAsDate =>
       convertNativeToDart_DateTime(this._get_valueAsDate);
   @JSName('valueAsDate')
-  @DomName('HTMLInputElement.valueAsDate')
-  @DocsEditable()
   @Creates('Null')
   final dynamic _get_valueAsDate;
 
@@ -23845,70 +18254,37 @@
     JS("void", "#.valueAsDate = #", this, value);
   }
 
-  @DomName('HTMLInputElement.valueAsNumber')
-  @DocsEditable()
   num valueAsNumber;
 
   @JSName('webkitEntries')
-  @DomName('HTMLInputElement.webkitEntries')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
   final List<Entry> entries;
 
   @JSName('webkitdirectory')
-  @DomName('HTMLInputElement.webkitdirectory')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
   bool directory;
 
-  @DomName('HTMLInputElement.width')
-  @DocsEditable()
   int width;
 
-  @DomName('HTMLInputElement.willValidate')
-  @DocsEditable()
   final bool willValidate;
 
-  @DomName('HTMLInputElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLInputElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLInputElement.select')
-  @DocsEditable()
   void select() native;
 
-  @DomName('HTMLInputElement.setCustomValidity')
-  @DocsEditable()
   void setCustomValidity(String error) native;
 
-  @DomName('HTMLInputElement.setRangeText')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
-  @Experimental() // experimental
   void setRangeText(String replacement,
       {int start, int end, String selectionMode}) native;
 
-  @DomName('HTMLInputElement.setSelectionRange')
-  @DocsEditable()
   void setSelectionRange(int start, int end, [String direction]) native;
 
-  @DomName('HTMLInputElement.stepDown')
-  @DocsEditable()
   void stepDown([int n]) native;
 
-  @DomName('HTMLInputElement.stepUp')
-  @DocsEditable()
   void stepUp([int n]) native;
 }
 
@@ -23920,40 +18296,28 @@
  * Exposes the functionality common between all InputElement types.
  */
 abstract class InputElementBase implements Element {
-  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  @DomName('HTMLInputElement.disabled')
   bool disabled;
 
-  @DomName('HTMLInputElement.incremental')
   bool incremental;
 
-  @DomName('HTMLInputElement.indeterminate')
   bool indeterminate;
 
-  @DomName('HTMLInputElement.labels')
   List<Node> get labels;
 
-  @DomName('HTMLInputElement.name')
   String name;
 
-  @DomName('HTMLInputElement.validationMessage')
   String get validationMessage;
 
-  @DomName('HTMLInputElement.validity')
   ValidityState get validity;
 
-  @DomName('HTMLInputElement.value')
   String value;
 
-  @DomName('HTMLInputElement.willValidate')
   bool get willValidate;
 
-  @DomName('HTMLInputElement.checkValidity')
   bool checkValidity();
 
-  @DomName('HTMLInputElement.setCustomValidity')
   void setCustomValidity(String error);
 }
 
@@ -23968,40 +18332,28 @@
  * Base interface for all inputs which involve text editing.
  */
 abstract class TextInputElementBase implements InputElementBase {
-  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
-  @DomName('HTMLInputElement.size')
   int size;
 
-  @DomName('HTMLInputElement.select')
   void select();
 
-  @DomName('HTMLInputElement.selectionDirection')
   String selectionDirection;
 
-  @DomName('HTMLInputElement.selectionEnd')
   int selectionEnd;
 
-  @DomName('HTMLInputElement.selectionStart')
   int selectionStart;
 
-  @DomName('HTMLInputElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]);
 }
 
@@ -24018,10 +18370,8 @@
 abstract class SearchInputElement implements TextInputElementBase {
   factory SearchInputElement() => new InputElement(type: 'search');
 
-  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24036,10 +18386,8 @@
 abstract class TextInputElement implements TextInputElementBase {
   factory TextInputElement() => new InputElement(type: 'text');
 
-  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 }
 
@@ -24055,7 +18403,6 @@
 abstract class UrlInputElement implements TextInputElementBase {
   factory UrlInputElement() => new InputElement(type: 'url');
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24079,7 +18426,6 @@
 abstract class TelephoneInputElement implements TextInputElementBase {
   factory TelephoneInputElement() => new InputElement(type: 'tel');
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24100,34 +18446,24 @@
 abstract class EmailInputElement implements TextInputElementBase {
   factory EmailInputElement() => new InputElement(type: 'email');
 
-  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
-  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
-  @DomName('HTMLInputElement.size')
   int size;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24147,25 +18483,18 @@
  * Base interface for all input element types which involve ranges.
  */
 abstract class RangeInputElementBase implements InputElementBase {
-  @DomName('HTMLInputElement.list')
   Element get list;
 
-  @DomName('HTMLInputElement.max')
   String max;
 
-  @DomName('HTMLInputElement.min')
   String min;
 
-  @DomName('HTMLInputElement.step')
   String step;
 
-  @DomName('HTMLInputElement.valueAsNumber')
   num valueAsNumber;
 
-  @DomName('HTMLInputElement.stepDown')
   void stepDown([int n]);
 
-  @DomName('HTMLInputElement.stepUp')
   void stepUp([int n]);
 }
 
@@ -24175,17 +18504,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class DateInputElement implements RangeInputElementBase {
   factory DateInputElement() => new InputElement(type: 'date');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24200,17 +18525,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class MonthInputElement implements RangeInputElementBase {
   factory MonthInputElement() => new InputElement(type: 'month');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24225,17 +18546,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class WeekInputElement implements RangeInputElementBase {
   factory WeekInputElement() => new InputElement(type: 'week');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24250,17 +18567,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
 abstract class TimeInputElement implements RangeInputElementBase {
   factory TimeInputElement() => new InputElement(type: 'time');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24276,15 +18589,12 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class LocalDateTimeInputElement implements RangeInputElementBase {
   factory LocalDateTimeInputElement() =>
       new InputElement(type: 'datetime-local');
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24299,17 +18609,13 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
 abstract class NumberInputElement implements RangeInputElementBase {
   factory NumberInputElement() => new InputElement(type: 'number');
 
-  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -24326,7 +18632,6 @@
  */
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
-@Experimental()
 abstract class RangeInputElement implements RangeInputElementBase {
   factory RangeInputElement() => new InputElement(type: 'range');
 
@@ -24345,10 +18650,8 @@
 abstract class CheckboxInputElement implements InputElementBase {
   factory CheckboxInputElement() => new InputElement(type: 'checkbox');
 
-  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -24366,10 +18669,8 @@
 abstract class RadioButtonInputElement implements InputElementBase {
   factory RadioButtonInputElement() => new InputElement(type: 'radio');
 
-  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -24379,16 +18680,12 @@
 abstract class FileUploadInputElement implements InputElementBase {
   factory FileUploadInputElement() => new InputElement(type: 'file');
 
-  @DomName('HTMLInputElement.accept')
   String accept;
 
-  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
-  @DomName('HTMLInputElement.files')
   List<File> files;
 }
 
@@ -24398,19 +18695,14 @@
 abstract class SubmitButtonInputElement implements InputElementBase {
   factory SubmitButtonInputElement() => new InputElement(type: 'submit');
 
-  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 }
 
@@ -24421,31 +18713,22 @@
 abstract class ImageButtonInputElement implements InputElementBase {
   factory ImageButtonInputElement() => new InputElement(type: 'image');
 
-  @DomName('HTMLInputElement.alt')
   String alt;
 
-  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 
-  @DomName('HTMLInputElement.height')
   int height;
 
-  @DomName('HTMLInputElement.src')
   String src;
 
-  @DomName('HTMLInputElement.width')
   int width;
 }
 
@@ -24466,9 +18749,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('InstallEvent')
-@Experimental() // untriaged
 @Native("InstallEvent")
 class InstallEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -24476,8 +18756,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('InstallEvent.InstallEvent')
-  @DocsEditable()
   factory InstallEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -24490,9 +18768,6 @@
   static InstallEvent _create_2(type) =>
       JS('InstallEvent', 'new InstallEvent(#)', type);
 
-  @DomName('InstallEvent.registerForeignFetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   void registerForeignFetch(Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     _registerForeignFetch_1(options_1);
@@ -24500,18 +18775,12 @@
   }
 
   @JSName('registerForeignFetch')
-  @DomName('InstallEvent.registerForeignFetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _registerForeignFetch_1(options) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IntersectionObserver')
-@Experimental() // untriaged
 @Native("IntersectionObserver")
 class IntersectionObserver extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -24519,8 +18788,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IntersectionObserver.IntersectionObserver')
-  @DocsEditable()
   factory IntersectionObserver(IntersectionObserverCallback callback,
       [Map options]) {
     if (options != null) {
@@ -24537,39 +18804,18 @@
   static IntersectionObserver _create_2(callback) =>
       JS('IntersectionObserver', 'new IntersectionObserver(#)', callback);
 
-  @DomName('IntersectionObserver.root')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element root;
 
-  @DomName('IntersectionObserver.rootMargin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String rootMargin;
 
-  @DomName('IntersectionObserver.thresholds')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<num> thresholds;
 
-  @DomName('IntersectionObserver.disconnect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void disconnect() native;
 
-  @DomName('IntersectionObserver.observe')
-  @DocsEditable()
-  @Experimental() // untriaged
   void observe(Element target) native;
 
-  @DomName('IntersectionObserver.takeRecords')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<IntersectionObserverEntry> takeRecords() native;
 
-  @DomName('IntersectionObserver.unobserve')
-  @DocsEditable()
-  @Experimental() // untriaged
   void unobserve(Element target) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24578,17 +18824,12 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('IntersectionObserverCallback')
-@Experimental() // untriaged
 typedef void IntersectionObserverCallback(
     List<IntersectionObserverEntry> entries, IntersectionObserver observer);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IntersectionObserverEntry')
-@Experimental() // untriaged
 @Native("IntersectionObserverEntry")
 class IntersectionObserverEntry extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -24596,48 +18837,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IntersectionObserverEntry.boundingClientRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomRectReadOnly boundingClientRect;
 
-  @DomName('IntersectionObserverEntry.intersectionRatio')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num intersectionRatio;
 
-  @DomName('IntersectionObserverEntry.intersectionRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomRectReadOnly intersectionRect;
 
-  @DomName('IntersectionObserverEntry.isIntersecting')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isIntersecting;
 
-  @DomName('IntersectionObserverEntry.rootBounds')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomRectReadOnly rootBounds;
 
-  @DomName('IntersectionObserverEntry.target')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element target;
 
-  @DomName('IntersectionObserverEntry.time')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num time;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('InterventionReport')
-@Experimental() // untriaged
 @Native("InterventionReport")
 class InterventionReport extends ReportBody {
   // To suppress missing implicit constructor warnings.
@@ -24645,19 +18862,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('InterventionReport.lineNumber')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int lineNumber;
 
-  @DomName('InterventionReport.message')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String message;
 
-  @DomName('InterventionReport.sourceFile')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String sourceFile;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24673,7 +18881,6 @@
  *
  * * [KeyboardEvent](https://developer.mozilla.org/en/DOM/KeyboardEvent) at MDN.
  */
-@DomName('KeyboardEvent')
 @Native("KeyboardEvent")
 class KeyboardEvent extends UIEvent {
   /**
@@ -24706,7 +18913,6 @@
     return e;
   }
 
-  @DomName('KeyboardEvent.initKeyboardEvent')
   void _initKeyboardEvent(
       String type,
       bool canBubble,
@@ -24744,17 +18950,12 @@
     }
   }
 
-  @DomName('KeyboardEvent.keyCode')
   final int keyCode;
 
-  @DomName('KeyboardEvent.charCode')
   final int charCode;
 
-  @DomName('KeyboardEvent.which')
   int get which => _which;
 
-  @DomName('KeyboardEvent.KeyboardEvent')
-  @DocsEditable()
   factory KeyboardEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -24767,91 +18968,44 @@
   static KeyboardEvent _create_2(type) =>
       JS('KeyboardEvent', 'new KeyboardEvent(#)', type);
 
-  @DomName('KeyboardEvent.DOM_KEY_LOCATION_LEFT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int DOM_KEY_LOCATION_LEFT = 0x01;
 
-  @DomName('KeyboardEvent.DOM_KEY_LOCATION_NUMPAD')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int DOM_KEY_LOCATION_NUMPAD = 0x03;
 
-  @DomName('KeyboardEvent.DOM_KEY_LOCATION_RIGHT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int DOM_KEY_LOCATION_RIGHT = 0x02;
 
-  @DomName('KeyboardEvent.DOM_KEY_LOCATION_STANDARD')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int DOM_KEY_LOCATION_STANDARD = 0x00;
 
-  @DomName('KeyboardEvent.altKey')
-  @DocsEditable()
   final bool altKey;
 
   @JSName('charCode')
-  @DomName('KeyboardEvent.charCode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int _charCode;
 
-  @DomName('KeyboardEvent.code')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String code;
 
-  @DomName('KeyboardEvent.ctrlKey')
-  @DocsEditable()
   final bool ctrlKey;
 
-  @DomName('KeyboardEvent.isComposing')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isComposing;
 
-  @DomName('KeyboardEvent.key')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String key;
 
   @JSName('keyCode')
-  @DomName('KeyboardEvent.keyCode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int _keyCode;
 
-  @DomName('KeyboardEvent.location')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int location;
 
-  @DomName('KeyboardEvent.metaKey')
-  @DocsEditable()
   final bool metaKey;
 
-  @DomName('KeyboardEvent.repeat')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool repeat;
 
-  @DomName('KeyboardEvent.shiftKey')
-  @DocsEditable()
   final bool shiftKey;
 
-  @DomName('KeyboardEvent.getModifierState')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool getModifierState(String keyArg) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('KeyframeEffect')
-@Experimental() // untriaged
 @Native("KeyframeEffect")
 class KeyframeEffect extends KeyframeEffectReadOnly {
   // To suppress missing implicit constructor warnings.
@@ -24859,8 +19013,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('KeyframeEffect.KeyframeEffect')
-  @DocsEditable()
   factory KeyframeEffect(Element target, Object effect, [Object options]) {
     if (options != null) {
       return KeyframeEffect._create_1(target, effect, options);
@@ -24876,9 +19028,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('KeyframeEffectReadOnly')
-@Experimental() // untriaged
 @Native("KeyframeEffectReadOnly")
 class KeyframeEffectReadOnly extends AnimationEffectReadOnly {
   // To suppress missing implicit constructor warnings.
@@ -24886,8 +19035,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('KeyframeEffectReadOnly.KeyframeEffectReadOnly')
-  @DocsEditable()
   factory KeyframeEffectReadOnly(Element target, Object effect,
       [Object options]) {
     if (options != null) {
@@ -24911,8 +19058,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLLIElement')
 @Native("HTMLLIElement")
 class LIElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -24920,8 +19065,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLLIElement.HTMLLIElement')
-  @DocsEditable()
   factory LIElement() => JS('returns:LIElement;creates:LIElement;new:true',
       '#.createElement(#)', document, "li");
   /**
@@ -24931,16 +19074,12 @@
    */
   LIElement.created() : super.created();
 
-  @DomName('HTMLLIElement.value')
-  @DocsEditable()
   int value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLLabelElement')
 @Native("HTMLLabelElement")
 class LabelElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -24948,8 +19087,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLLabelElement.HTMLLabelElement')
-  @DocsEditable()
   factory LabelElement() => JS(
       'returns:LabelElement;creates:LabelElement;new:true',
       '#.createElement(#)',
@@ -24962,24 +19099,16 @@
    */
   LabelElement.created() : super.created();
 
-  @DomName('HTMLLabelElement.control')
-  @DocsEditable()
   final HtmlElement control;
 
-  @DomName('HTMLLabelElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLLabelElement.htmlFor')
-  @DocsEditable()
   String htmlFor;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLLegendElement')
 @Native("HTMLLegendElement")
 class LegendElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -24987,8 +19116,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLLegendElement.HTMLLegendElement')
-  @DocsEditable()
   factory LegendElement() => JS(
       'returns:LegendElement;creates:LegendElement;new:true',
       '#.createElement(#)',
@@ -25001,17 +19128,12 @@
    */
   LegendElement.created() : super.created();
 
-  @DomName('HTMLLegendElement.form')
-  @DocsEditable()
   final FormElement form;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('LinearAccelerationSensor')
-@Experimental() // untriaged
 @Native("LinearAccelerationSensor")
 class LinearAccelerationSensor extends Accelerometer {
   // To suppress missing implicit constructor warnings.
@@ -25019,8 +19141,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('LinearAccelerationSensor.LinearAccelerationSensor')
-  @DocsEditable()
   factory LinearAccelerationSensor([Map sensorOptions]) {
     if (sensorOptions != null) {
       var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
@@ -25039,8 +19159,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLLinkElement')
 @Native("HTMLLinkElement")
 class LinkElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -25048,8 +19166,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLLinkElement.HTMLLinkElement')
-  @DocsEditable()
   factory LinkElement() => JS(
       'returns:LinkElement;creates:LinkElement;new:true',
       '#.createElement(#)',
@@ -25062,72 +19178,34 @@
    */
   LinkElement.created() : super.created();
 
-  @DomName('HTMLLinkElement.as')
-  @DocsEditable()
-  @Experimental() // untriaged
   String as;
 
-  @DomName('HTMLLinkElement.crossOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   String crossOrigin;
 
-  @DomName('HTMLLinkElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLLinkElement.href')
-  @DocsEditable()
   String href;
 
-  @DomName('HTMLLinkElement.hreflang')
-  @DocsEditable()
   String hreflang;
 
-  @DomName('HTMLLinkElement.import')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
-  @Experimental()
   final Document import;
 
-  @DomName('HTMLLinkElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
   String integrity;
 
-  @DomName('HTMLLinkElement.media')
-  @DocsEditable()
   String media;
 
-  @DomName('HTMLLinkElement.referrerPolicy')
-  @DocsEditable()
-  @Experimental() // untriaged
   String referrerPolicy;
 
-  @DomName('HTMLLinkElement.rel')
-  @DocsEditable()
   String rel;
 
-  @DomName('HTMLLinkElement.relList')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomTokenList relList;
 
-  @DomName('HTMLLinkElement.scope')
-  @DocsEditable()
-  @Experimental() // untriaged
   String scope;
 
-  @DomName('HTMLLinkElement.sheet')
-  @DocsEditable()
   final StyleSheet sheet;
 
-  @DomName('HTMLLinkElement.sizes')
-  @DocsEditable()
   final DomTokenList sizes;
 
-  @DomName('HTMLLinkElement.type')
-  @DocsEditable()
   String type;
 
   /// Checks if HTML imports are supported on the current platform.
@@ -25139,8 +19217,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Location')
 @Native("Location")
 class Location extends Interceptor implements LocationBase {
   // To suppress missing implicit constructor warnings.
@@ -25148,63 +19224,34 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Location.ancestorOrigins')
-  @DocsEditable()
-  @Experimental() // nonstandard
   @Returns('DomStringList|Null')
   @Creates('DomStringList')
   final List<String> ancestorOrigins;
 
-  @DomName('Location.hash')
-  @DocsEditable()
   String hash;
 
-  @DomName('Location.host')
-  @DocsEditable()
   String host;
 
-  @DomName('Location.hostname')
-  @DocsEditable()
   String hostname;
 
-  @DomName('Location.href')
-  @DocsEditable()
   String href;
 
-  @DomName('Location.pathname')
-  @DocsEditable()
   String pathname;
 
-  @DomName('Location.port')
-  @DocsEditable()
   String port;
 
-  @DomName('Location.protocol')
-  @DocsEditable()
   String protocol;
 
-  @DomName('Location.search')
-  @DocsEditable()
   String search;
 
-  @DomName('Location.trustedHref')
-  @DocsEditable()
-  @Experimental() // untriaged
   TrustedUrl trustedHref;
 
-  @DomName('Location.assign')
-  @DocsEditable()
   void assign([String url]) native;
 
-  @DomName('Location.reload')
-  @DocsEditable()
   void reload() native;
 
-  @DomName('Location.replace')
-  @DocsEditable()
   void replace(String url) native;
 
-  @DomName('Location.origin')
   String get origin {
     if (JS('bool', '("origin" in #)', this)) {
       return JS('String', '#.origin', this);
@@ -25212,17 +19259,12 @@
     return '${this.protocol}//${this.host}';
   }
 
-  @DomName('Location.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Magnetometer')
-@Experimental() // untriaged
 @Native("Magnetometer")
 class Magnetometer extends Sensor {
   // To suppress missing implicit constructor warnings.
@@ -25230,8 +19272,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Magnetometer.Magnetometer')
-  @DocsEditable()
   factory Magnetometer([Map sensorOptions]) {
     if (sensorOptions != null) {
       var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
@@ -25243,27 +19283,16 @@
       JS('Magnetometer', 'new Magnetometer(#)', sensorOptions);
   static Magnetometer _create_2() => JS('Magnetometer', 'new Magnetometer()');
 
-  @DomName('Magnetometer.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num x;
 
-  @DomName('Magnetometer.y')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num y;
 
-  @DomName('Magnetometer.z')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLMapElement')
 @Native("HTMLMapElement")
 class MapElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -25271,8 +19300,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLMapElement.HTMLMapElement')
-  @DocsEditable()
   factory MapElement() => JS('returns:MapElement;creates:MapElement;new:true',
       '#.createElement(#)', document, "map");
   /**
@@ -25282,23 +19309,16 @@
    */
   MapElement.created() : super.created();
 
-  @DomName('HTMLMapElement.areas')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> areas;
 
-  @DomName('HTMLMapElement.name')
-  @DocsEditable()
   String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaCapabilities')
-@Experimental() // untriaged
 @Native("MediaCapabilities")
 class MediaCapabilities extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -25306,41 +19326,26 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaCapabilities.decodingInfo')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future decodingInfo(Map configuration) {
     var configuration_1 = convertDartToNative_Dictionary(configuration);
     return _decodingInfo_1(configuration_1);
   }
 
   @JSName('decodingInfo')
-  @DomName('MediaCapabilities.decodingInfo')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _decodingInfo_1(configuration) native;
 
-  @DomName('MediaCapabilities.encodingInfo')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future encodingInfo(Map configuration) {
     var configuration_1 = convertDartToNative_Dictionary(configuration);
     return _encodingInfo_1(configuration_1);
   }
 
   @JSName('encodingInfo')
-  @DomName('MediaCapabilities.encodingInfo')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _encodingInfo_1(configuration) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaCapabilitiesInfo')
-@Experimental() // untriaged
 @Native("MediaCapabilitiesInfo")
 class MediaCapabilitiesInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -25348,28 +19353,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaCapabilitiesInfo.powerEfficient')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool powerEfficient;
 
-  @DomName('MediaCapabilitiesInfo.smooth')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool smooth;
 
-  @DomName('MediaCapabilitiesInfo.supported')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool supported;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaDeviceInfo')
-@Experimental() // untriaged
 @Native("MediaDeviceInfo")
 class MediaDeviceInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -25377,33 +19370,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaDeviceInfo.deviceId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String deviceId;
 
-  @DomName('MediaDeviceInfo.groupId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String groupId;
 
-  @DomName('MediaDeviceInfo.kind')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String kind;
 
-  @DomName('MediaDeviceInfo.label')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String label;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaDevices')
-@Experimental() // untriaged
 @Native("MediaDevices")
 class MediaDevices extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -25411,32 +19389,21 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaDevices.enumerateDevices')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<MediaDeviceInfo>> enumerateDevices() =>
       promiseToFuture<List<MediaDeviceInfo>>(
           JS("", "#.enumerateDevices()", this));
 
-  @DomName('MediaDevices.getSupportedConstraints')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getSupportedConstraints() {
     return convertNativeToDart_Dictionary(_getSupportedConstraints_1());
   }
 
   @JSName('getSupportedConstraints')
-  @DomName('MediaDevices.getSupportedConstraints')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getSupportedConstraints_1() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLMediaElement')
 @Unstable()
 @Native("HTMLMediaElement")
 class MediaElement extends HtmlElement {
@@ -25451,237 +19418,114 @@
    */
   MediaElement.created() : super.created();
 
-  @DomName('HTMLMediaElement.HAVE_CURRENT_DATA')
-  @DocsEditable()
   static const int HAVE_CURRENT_DATA = 2;
 
-  @DomName('HTMLMediaElement.HAVE_ENOUGH_DATA')
-  @DocsEditable()
   static const int HAVE_ENOUGH_DATA = 4;
 
-  @DomName('HTMLMediaElement.HAVE_FUTURE_DATA')
-  @DocsEditable()
   static const int HAVE_FUTURE_DATA = 3;
 
-  @DomName('HTMLMediaElement.HAVE_METADATA')
-  @DocsEditable()
   static const int HAVE_METADATA = 1;
 
-  @DomName('HTMLMediaElement.HAVE_NOTHING')
-  @DocsEditable()
   static const int HAVE_NOTHING = 0;
 
-  @DomName('HTMLMediaElement.NETWORK_EMPTY')
-  @DocsEditable()
   static const int NETWORK_EMPTY = 0;
 
-  @DomName('HTMLMediaElement.NETWORK_IDLE')
-  @DocsEditable()
   static const int NETWORK_IDLE = 1;
 
-  @DomName('HTMLMediaElement.NETWORK_LOADING')
-  @DocsEditable()
   static const int NETWORK_LOADING = 2;
 
-  @DomName('HTMLMediaElement.NETWORK_NO_SOURCE')
-  @DocsEditable()
   static const int NETWORK_NO_SOURCE = 3;
 
-  @DomName('HTMLMediaElement.audioTracks')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioTrackList audioTracks;
 
-  @DomName('HTMLMediaElement.autoplay')
-  @DocsEditable()
   bool autoplay;
 
-  @DomName('HTMLMediaElement.buffered')
-  @DocsEditable()
   final TimeRanges buffered;
 
-  @DomName('HTMLMediaElement.controls')
-  @DocsEditable()
   bool controls;
 
-  @DomName('HTMLMediaElement.controlsList')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomTokenList controlsList;
 
-  @DomName('HTMLMediaElement.crossOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   String crossOrigin;
 
-  @DomName('HTMLMediaElement.currentSrc')
-  @DocsEditable()
   final String currentSrc;
 
-  @DomName('HTMLMediaElement.currentTime')
-  @DocsEditable()
   num currentTime;
 
-  @DomName('HTMLMediaElement.defaultMuted')
-  @DocsEditable()
   bool defaultMuted;
 
-  @DomName('HTMLMediaElement.defaultPlaybackRate')
-  @DocsEditable()
   num defaultPlaybackRate;
 
-  @DomName('HTMLMediaElement.disableRemotePlayback')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool disableRemotePlayback;
 
-  @DomName('HTMLMediaElement.duration')
-  @DocsEditable()
   final num duration;
 
-  @DomName('HTMLMediaElement.ended')
-  @DocsEditable()
   final bool ended;
 
-  @DomName('HTMLMediaElement.error')
-  @DocsEditable()
   final MediaError error;
 
-  @DomName('HTMLMediaElement.loop')
-  @DocsEditable()
   bool loop;
 
-  @DomName('HTMLMediaElement.mediaKeys')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
-  @Experimental()
   final MediaKeys mediaKeys;
 
-  @DomName('HTMLMediaElement.muted')
-  @DocsEditable()
   bool muted;
 
-  @DomName('HTMLMediaElement.networkState')
-  @DocsEditable()
   final int networkState;
 
-  @DomName('HTMLMediaElement.paused')
-  @DocsEditable()
   final bool paused;
 
-  @DomName('HTMLMediaElement.playbackRate')
-  @DocsEditable()
   num playbackRate;
 
-  @DomName('HTMLMediaElement.played')
-  @DocsEditable()
   final TimeRanges played;
 
-  @DomName('HTMLMediaElement.preload')
-  @DocsEditable()
   String preload;
 
-  @DomName('HTMLMediaElement.readyState')
-  @DocsEditable()
   final int readyState;
 
-  @DomName('HTMLMediaElement.remote')
-  @DocsEditable()
-  @Experimental() // untriaged
   final RemotePlayback remote;
 
-  @DomName('HTMLMediaElement.seekable')
-  @DocsEditable()
   final TimeRanges seekable;
 
-  @DomName('HTMLMediaElement.seeking')
-  @DocsEditable()
   final bool seeking;
 
-  @DomName('HTMLMediaElement.sinkId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String sinkId;
 
-  @DomName('HTMLMediaElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLMediaElement.srcObject')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStream srcObject;
 
-  @DomName('HTMLMediaElement.textTracks')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
-  @Experimental()
   final TextTrackList textTracks;
 
-  @DomName('HTMLMediaElement.videoTracks')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VideoTrackList videoTracks;
 
-  @DomName('HTMLMediaElement.volume')
-  @DocsEditable()
   num volume;
 
   @JSName('webkitAudioDecodedByteCount')
-  @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // nonstandard
   final int audioDecodedByteCount;
 
   @JSName('webkitVideoDecodedByteCount')
-  @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // nonstandard
   final int videoDecodedByteCount;
 
-  @DomName('HTMLMediaElement.addTextTrack')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-addtexttrack
-  @Experimental()
   TextTrack addTextTrack(String kind, [String label, String language]) native;
 
-  @DomName('HTMLMediaElement.canPlayType')
-  @DocsEditable()
   @Unstable()
   String canPlayType(String type, [String keySystem]) native;
 
-  @DomName('HTMLMediaElement.captureStream')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStream captureStream() native;
 
-  @DomName('HTMLMediaElement.load')
-  @DocsEditable()
   void load() native;
 
-  @DomName('HTMLMediaElement.pause')
-  @DocsEditable()
   void pause() native;
 
-  @DomName('HTMLMediaElement.play')
-  @DocsEditable()
   Future play() => promiseToFuture(JS("", "#.play()", this));
 
-  @DomName('HTMLMediaElement.setMediaKeys')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future setMediaKeys(MediaKeys mediaKeys) =>
       promiseToFuture(JS("", "#.setMediaKeys(#)", this, mediaKeys));
 
-  @DomName('HTMLMediaElement.setSinkId')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future setSinkId(String sinkId) =>
       promiseToFuture(JS("", "#.setSinkId(#)", this, sinkId));
 }
@@ -25689,9 +19533,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaEncryptedEvent')
-@Experimental() // untriaged
 @Native("MediaEncryptedEvent")
 class MediaEncryptedEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -25699,8 +19540,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaEncryptedEvent.MediaEncryptedEvent')
-  @DocsEditable()
   factory MediaEncryptedEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -25716,22 +19555,14 @@
   static MediaEncryptedEvent _create_2(type) =>
       JS('MediaEncryptedEvent', 'new MediaEncryptedEvent(#)', type);
 
-  @DomName('MediaEncryptedEvent.initData')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteBuffer initData;
 
-  @DomName('MediaEncryptedEvent.initDataType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String initDataType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaError')
 @Unstable()
 @Native("MediaError")
 class MediaError extends Interceptor {
@@ -25740,39 +19571,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaError.MEDIA_ERR_ABORTED')
-  @DocsEditable()
   static const int MEDIA_ERR_ABORTED = 1;
 
-  @DomName('MediaError.MEDIA_ERR_DECODE')
-  @DocsEditable()
   static const int MEDIA_ERR_DECODE = 3;
 
-  @DomName('MediaError.MEDIA_ERR_NETWORK')
-  @DocsEditable()
   static const int MEDIA_ERR_NETWORK = 2;
 
-  @DomName('MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED')
-  @DocsEditable()
   static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
-  @DomName('MediaError.code')
-  @DocsEditable()
   final int code;
 
-  @DomName('MediaError.message')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaKeyMessageEvent')
-// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeymessageevent
-@Experimental()
 @Native("MediaKeyMessageEvent")
 class MediaKeyMessageEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -25780,8 +19594,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaKeyMessageEvent.MediaKeyMessageEvent')
-  @DocsEditable()
   factory MediaKeyMessageEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return MediaKeyMessageEvent._create_1(type, eventInitDict_1);
@@ -25792,23 +19604,14 @@
       type,
       eventInitDict);
 
-  @DomName('MediaKeyMessageEvent.message')
-  @DocsEditable()
   final ByteBuffer message;
 
-  @DomName('MediaKeyMessageEvent.messageType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String messageType;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaKeySession')
-// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeysession
-@Experimental()
 @Native("MediaKeySession")
 class MediaKeySession extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -25816,70 +19619,37 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaKeySession.messageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('MediaKeySession.closed')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<void> get closed => promiseToFuture<void>(JS("", "#.closed", this));
 
-  @DomName('MediaKeySession.expiration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num expiration;
 
-  @DomName('MediaKeySession.keyStatuses')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaKeyStatusMap keyStatuses;
 
-  @DomName('MediaKeySession.sessionId')
-  @DocsEditable()
   final String sessionId;
 
-  @DomName('MediaKeySession.close')
-  @DocsEditable()
   Future close() => promiseToFuture(JS("", "#.close()", this));
 
-  @DomName('MediaKeySession.generateRequest')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future generateRequest(String initDataType, /*BufferSource*/ initData) =>
       promiseToFuture(
           JS("", "#.generateRequest(#, #)", this, initDataType, initData));
 
-  @DomName('MediaKeySession.load')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future load(String sessionId) =>
       promiseToFuture(JS("", "#.load(#)", this, sessionId));
 
-  @DomName('MediaKeySession.remove')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future remove() => promiseToFuture(JS("", "#.remove()", this));
 
   @JSName('update')
-  @DomName('MediaKeySession.update')
-  @DocsEditable()
   Future _update(/*BufferSource*/ response) native;
 
-  @DomName('MediaKeySession.onmessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaKeyStatusMap')
-@Experimental() // untriaged
 @Native("MediaKeyStatusMap")
 class MediaKeyStatusMap extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -25887,28 +19657,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaKeyStatusMap.size')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int size;
 
-  @DomName('MediaKeyStatusMap.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object get(/*BufferSource*/ keyId) native;
 
-  @DomName('MediaKeyStatusMap.has')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool has(/*BufferSource*/ keyId) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaKeySystemAccess')
-@Experimental() // untriaged
 @Native("MediaKeySystemAccess")
 class MediaKeySystemAccess extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -25916,38 +19674,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaKeySystemAccess.keySystem')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String keySystem;
 
-  @DomName('MediaKeySystemAccess.createMediaKeys')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future createMediaKeys() =>
       promiseToFuture(JS("", "#.createMediaKeys()", this));
 
-  @DomName('MediaKeySystemAccess.getConfiguration')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getConfiguration() {
     return convertNativeToDart_Dictionary(_getConfiguration_1());
   }
 
   @JSName('getConfiguration')
-  @DomName('MediaKeySystemAccess.getConfiguration')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getConfiguration_1() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaKeys')
-// https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
-@Experimental()
 @Native("MediaKeys")
 class MediaKeys extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -25956,19 +19698,11 @@
   }
 
   @JSName('createSession')
-  @DomName('MediaKeys.createSession')
-  @DocsEditable()
   MediaKeySession _createSession([String sessionType]) native;
 
-  @DomName('MediaKeys.getStatusForPolicy')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future getStatusForPolicy(MediaKeysPolicy policy) =>
       promiseToFuture(JS("", "#.getStatusForPolicy(#)", this, policy));
 
-  @DomName('MediaKeys.setServerCertificate')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future setServerCertificate(/*BufferSource*/ serverCertificate) =>
       promiseToFuture(
           JS("", "#.setServerCertificate(#)", this, serverCertificate));
@@ -25977,9 +19711,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaKeysPolicy')
-@Experimental() // untriaged
 @Native("MediaKeysPolicy")
 class MediaKeysPolicy extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -25987,8 +19718,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaKeysPolicy.MediaKeysPolicy')
-  @DocsEditable()
   factory MediaKeysPolicy(Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
     return MediaKeysPolicy._create_1(init_1);
@@ -25996,17 +19725,12 @@
   static MediaKeysPolicy _create_1(init) =>
       JS('MediaKeysPolicy', 'new MediaKeysPolicy(#)', init);
 
-  @DomName('MediaKeysPolicy.minHdcpVersion')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String minHdcpVersion;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaList')
 @Unstable()
 @Native("MediaList")
 class MediaList extends Interceptor {
@@ -26015,33 +19739,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaList.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('MediaList.mediaText')
-  @DocsEditable()
   String mediaText;
 
-  @DomName('MediaList.appendMedium')
-  @DocsEditable()
   void appendMedium(String medium) native;
 
-  @DomName('MediaList.deleteMedium')
-  @DocsEditable()
   void deleteMedium(String medium) native;
 
-  @DomName('MediaList.item')
-  @DocsEditable()
   String item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaMetadata')
-@Experimental() // untriaged
 @Native("MediaMetadata")
 class MediaMetadata extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -26049,8 +19760,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaMetadata.MediaMetadata')
-  @DocsEditable()
   factory MediaMetadata([Map metadata]) {
     if (metadata != null) {
       var metadata_1 = convertDartToNative_Dictionary(metadata);
@@ -26063,32 +19772,18 @@
   static MediaMetadata _create_2() =>
       JS('MediaMetadata', 'new MediaMetadata()');
 
-  @DomName('MediaMetadata.album')
-  @DocsEditable()
-  @Experimental() // untriaged
   String album;
 
-  @DomName('MediaMetadata.artist')
-  @DocsEditable()
-  @Experimental() // untriaged
   String artist;
 
-  @DomName('MediaMetadata.artwork')
-  @DocsEditable()
-  @Experimental() // untriaged
   List artwork;
 
-  @DomName('MediaMetadata.title')
-  @DocsEditable()
-  @Experimental() // untriaged
   String title;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaQueryList')
 @Unstable()
 @Native("MediaQueryList")
 class MediaQueryList extends EventTarget {
@@ -26097,40 +19792,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaQueryList.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('MediaQueryList.matches')
-  @DocsEditable()
   final bool matches;
 
-  @DomName('MediaQueryList.media')
-  @DocsEditable()
   final String media;
 
-  @DomName('MediaQueryList.addListener')
-  @DocsEditable()
   void addListener(EventListener listener) native;
 
-  @DomName('MediaQueryList.removeListener')
-  @DocsEditable()
   void removeListener(EventListener listener) native;
 
-  @DomName('MediaQueryList.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaQueryListEvent')
-@Experimental() // untriaged
 @Native("MediaQueryListEvent")
 class MediaQueryListEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -26138,8 +19816,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaQueryListEvent.MediaQueryListEvent')
-  @DocsEditable()
   factory MediaQueryListEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -26155,23 +19831,14 @@
   static MediaQueryListEvent _create_2(type) =>
       JS('MediaQueryListEvent', 'new MediaQueryListEvent(#)', type);
 
-  @DomName('MediaQueryListEvent.matches')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool matches;
 
-  @DomName('MediaQueryListEvent.media')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String media;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaRecorder')
-@Experimental() // untriaged
 @Native("MediaRecorder")
 class MediaRecorder extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -26179,20 +19846,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaRecorder.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('MediaRecorder.pauseEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> pauseEvent =
       const EventStreamProvider<Event>('pause');
 
-  @DomName('MediaRecorder.MediaRecorder')
-  @DocsEditable()
   factory MediaRecorder(MediaStream stream, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -26205,78 +19864,36 @@
   static MediaRecorder _create_2(stream) =>
       JS('MediaRecorder', 'new MediaRecorder(#)', stream);
 
-  @DomName('MediaRecorder.audioBitsPerSecond')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int audioBitsPerSecond;
 
-  @DomName('MediaRecorder.mimeType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String mimeType;
 
-  @DomName('MediaRecorder.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 
-  @DomName('MediaRecorder.stream')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaStream stream;
 
-  @DomName('MediaRecorder.videoBitsPerSecond')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int videoBitsPerSecond;
 
-  @DomName('MediaRecorder.isTypeSupported')
-  @DocsEditable()
-  @Experimental() // untriaged
   static bool isTypeSupported(String type) native;
 
-  @DomName('MediaRecorder.pause')
-  @DocsEditable()
-  @Experimental() // untriaged
   void pause() native;
 
-  @DomName('MediaRecorder.requestData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void requestData() native;
 
-  @DomName('MediaRecorder.resume')
-  @DocsEditable()
-  @Experimental() // untriaged
   void resume() native;
 
-  @DomName('MediaRecorder.start')
-  @DocsEditable()
-  @Experimental() // untriaged
   void start([int timeslice]) native;
 
-  @DomName('MediaRecorder.stop')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stop() native;
 
-  @DomName('MediaRecorder.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
-  @DomName('MediaRecorder.onpause')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaSession')
-@Experimental() // untriaged
 @Native("MediaSession")
 class MediaSession extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -26284,19 +19901,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaSession.metadata')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaMetadata metadata;
 
-  @DomName('MediaSession.playbackState')
-  @DocsEditable()
-  @Experimental() // untriaged
   String playbackState;
 
-  @DomName('MediaSession.setActionHandler')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setActionHandler(String action, MediaSessionActionHandler handler)
       native;
 }
@@ -26306,16 +19914,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('MediaSessionActionHandler')
-@Experimental() // untriaged
 typedef void MediaSessionActionHandler();
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaSettingsRange')
-@Experimental() // untriaged
 @Native("MediaSettingsRange")
 class MediaSettingsRange extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -26323,31 +19926,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaSettingsRange.max')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num max;
 
-  @DomName('MediaSettingsRange.min')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num min;
 
-  @DomName('MediaSettingsRange.step')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num step;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaSource')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '11')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource
-@Experimental()
 @Native("MediaSource")
 class MediaSource extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -26355,8 +19945,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaSource.MediaSource')
-  @DocsEditable()
   factory MediaSource() {
     return MediaSource._create_1();
   }
@@ -26365,56 +19953,31 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.MediaSource)');
 
-  @DomName('MediaSource.activeSourceBuffers')
-  @DocsEditable()
   final SourceBufferList activeSourceBuffers;
 
-  @DomName('MediaSource.duration')
-  @DocsEditable()
   num duration;
 
-  @DomName('MediaSource.readyState')
-  @DocsEditable()
   final String readyState;
 
-  @DomName('MediaSource.sourceBuffers')
-  @DocsEditable()
   final SourceBufferList sourceBuffers;
 
-  @DomName('MediaSource.addSourceBuffer')
-  @DocsEditable()
   SourceBuffer addSourceBuffer(String type) native;
 
-  @DomName('MediaSource.clearLiveSeekableRange')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearLiveSeekableRange() native;
 
-  @DomName('MediaSource.endOfStream')
-  @DocsEditable()
   void endOfStream([String error]) native;
 
-  @DomName('MediaSource.isTypeSupported')
-  @DocsEditable()
   static bool isTypeSupported(String type) native;
 
-  @DomName('MediaSource.removeSourceBuffer')
-  @DocsEditable()
   void removeSourceBuffer(SourceBuffer buffer) native;
 
-  @DomName('MediaSource.setLiveSeekableRange')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setLiveSeekableRange(num start, num end) native;
 }
 // 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.
 
-@DomName('MediaStream')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastream
 @Native("MediaStream")
 class MediaStream extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -26428,8 +19991,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('MediaStream.addtrackEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> addTrackEvent =
       const EventStreamProvider<Event>('addtrack');
 
@@ -26439,13 +20000,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('MediaStream.removetrackEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> removeTrackEvent =
       const EventStreamProvider<Event>('removetrack');
 
-  @DomName('MediaStream.MediaStream')
-  @DocsEditable()
   factory MediaStream([stream_OR_tracks]) {
     if (stream_OR_tracks == null) {
       return MediaStream._create_1();
@@ -26464,57 +20021,32 @@
   static MediaStream _create_3(stream_OR_tracks) =>
       JS('MediaStream', 'new MediaStream(#)', stream_OR_tracks);
 
-  @DomName('MediaStream.active')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool active;
 
-  @DomName('MediaStream.id')
-  @DocsEditable()
   final String id;
 
-  @DomName('MediaStream.addTrack')
-  @DocsEditable()
   void addTrack(MediaStreamTrack track) native;
 
-  @DomName('MediaStream.clone')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStream clone() native;
 
-  @DomName('MediaStream.getAudioTracks')
-  @DocsEditable()
   @Creates('JSExtendableArray|MediaStreamTrack')
   @Returns('JSExtendableArray')
   List<MediaStreamTrack> getAudioTracks() native;
 
-  @DomName('MediaStream.getTrackById')
-  @DocsEditable()
   MediaStreamTrack getTrackById(String trackId) native;
 
-  @DomName('MediaStream.getTracks')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<MediaStreamTrack> getTracks() native;
 
-  @DomName('MediaStream.getVideoTracks')
-  @DocsEditable()
   @Creates('JSExtendableArray|MediaStreamTrack')
   @Returns('JSExtendableArray')
   List<MediaStreamTrack> getVideoTracks() native;
 
-  @DomName('MediaStream.removeTrack')
-  @DocsEditable()
   void removeTrack(MediaStreamTrack track) native;
 
   /// Stream of `addtrack` events handled by this [MediaStream].
-  @DomName('MediaStream.onaddtrack')
-  @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
 
   /// Stream of `removetrack` events handled by this [MediaStream].
-  @DomName('MediaStream.onremovetrack')
-  @DocsEditable()
   Stream<Event> get onRemoveTrack => removeTrackEvent.forTarget(this);
 
   /**
@@ -26537,11 +20069,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.
 
-@DocsEditable()
-@DomName('MediaStreamEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://dev.w3.org/2011/webrtc/editor/getusermedia.html
 @Native("MediaStreamEvent")
 class MediaStreamEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -26549,8 +20077,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaStreamEvent.MediaStreamEvent')
-  @DocsEditable()
   factory MediaStreamEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -26566,19 +20092,13 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Device.isEventTypeSupported('MediaStreamEvent');
 
-  @DomName('MediaStreamEvent.stream')
-  @DocsEditable()
   final MediaStream stream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaStreamTrack')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack
 @Native("MediaStreamTrack")
 class MediaStreamTrack extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -26592,8 +20112,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('MediaStreamTrack.endedEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> endedEvent =
       const EventStreamProvider<Event>('ended');
 
@@ -26603,8 +20121,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('MediaStreamTrack.muteEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> muteEvent =
       const EventStreamProvider<Event>('mute');
 
@@ -26614,44 +20130,23 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('MediaStreamTrack.unmuteEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> unmuteEvent =
       const EventStreamProvider<Event>('unmute');
 
-  @DomName('MediaStreamTrack.contentHint')
-  @DocsEditable()
-  @Experimental() // untriaged
   String contentHint;
 
-  @DomName('MediaStreamTrack.enabled')
-  @DocsEditable()
   bool enabled;
 
-  @DomName('MediaStreamTrack.id')
-  @DocsEditable()
   final String id;
 
-  @DomName('MediaStreamTrack.kind')
-  @DocsEditable()
   final String kind;
 
-  @DomName('MediaStreamTrack.label')
-  @DocsEditable()
   final String label;
 
-  @DomName('MediaStreamTrack.muted')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool muted;
 
-  @DomName('MediaStreamTrack.readyState')
-  @DocsEditable()
   final String readyState;
 
-  @DomName('MediaStreamTrack.applyConstraints')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future applyConstraints([Map constraints]) {
     if (constraints != null) {
       var constraints_1 = convertDartToNative_Dictionary(constraints);
@@ -26661,89 +20156,49 @@
   }
 
   @JSName('applyConstraints')
-  @DomName('MediaStreamTrack.applyConstraints')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _applyConstraints_1(constraints) native;
   @JSName('applyConstraints')
-  @DomName('MediaStreamTrack.applyConstraints')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _applyConstraints_2() native;
 
-  @DomName('MediaStreamTrack.clone')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStreamTrack clone() native;
 
-  @DomName('MediaStreamTrack.getCapabilities')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getCapabilities() {
     return convertNativeToDart_Dictionary(_getCapabilities_1());
   }
 
   @JSName('getCapabilities')
-  @DomName('MediaStreamTrack.getCapabilities')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getCapabilities_1() native;
 
-  @DomName('MediaStreamTrack.getConstraints')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getConstraints() {
     return convertNativeToDart_Dictionary(_getConstraints_1());
   }
 
   @JSName('getConstraints')
-  @DomName('MediaStreamTrack.getConstraints')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getConstraints_1() native;
 
-  @DomName('MediaStreamTrack.getSettings')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getSettings() {
     return convertNativeToDart_Dictionary(_getSettings_1());
   }
 
   @JSName('getSettings')
-  @DomName('MediaStreamTrack.getSettings')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getSettings_1() native;
 
-  @DomName('MediaStreamTrack.stop')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stop() native;
 
   /// Stream of `ended` events handled by this [MediaStreamTrack].
-  @DomName('MediaStreamTrack.onended')
-  @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
   /// Stream of `mute` events handled by this [MediaStreamTrack].
-  @DomName('MediaStreamTrack.onmute')
-  @DocsEditable()
   Stream<Event> get onMute => muteEvent.forTarget(this);
 
   /// Stream of `unmute` events handled by this [MediaStreamTrack].
-  @DomName('MediaStreamTrack.onunmute')
-  @DocsEditable()
   Stream<Event> get onUnmute => unmuteEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaStreamTrackEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://dev.w3.org/2011/webrtc/editor/getusermedia.html
 @Native("MediaStreamTrackEvent")
 class MediaStreamTrackEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -26751,8 +20206,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaStreamTrackEvent.MediaStreamTrackEvent')
-  @DocsEditable()
   factory MediaStreamTrackEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return MediaStreamTrackEvent._create_1(type, eventInitDict_1);
@@ -26767,17 +20220,12 @@
   static bool get supported =>
       Device.isEventTypeSupported('MediaStreamTrackEvent');
 
-  @DomName('MediaStreamTrackEvent.track')
-  @DocsEditable()
   final MediaStreamTrack track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MemoryInfo')
-@Experimental() // nonstandard
 @Native("MemoryInfo")
 class MemoryInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -26785,23 +20233,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MemoryInfo.jsHeapSizeLimit')
-  @DocsEditable()
   final int jsHeapSizeLimit;
 
-  @DomName('MemoryInfo.totalJSHeapSize')
-  @DocsEditable()
   final int totalJSHeapSize;
 
-  @DomName('MemoryInfo.usedJSHeapSize')
-  @DocsEditable()
   final int usedJSHeapSize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * An HTML <menu> element.
  *
@@ -26812,7 +20253,6 @@
  *  * [Menu Element](https://developer.mozilla.org/en-US/docs/HTML/Element/menu) from MDN.
  *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
  */
-@DomName('HTMLMenuElement')
 @Native("HTMLMenuElement")
 class MenuElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -26820,8 +20260,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLMenuElement.HTMLMenuElement')
-  @DocsEditable()
   factory MenuElement() => JS(
       'returns:MenuElement;creates:MenuElement;new:true',
       '#.createElement(#)',
@@ -26840,15 +20278,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('MessageCallback')
-@Experimental() // untriaged
 typedef void MessageCallback(Map message);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MessageChannel')
 @Unstable()
 @Native("MessageChannel")
 class MessageChannel extends Interceptor {
@@ -26857,20 +20291,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MessageChannel.MessageChannel')
-  @DocsEditable()
   factory MessageChannel() {
     return MessageChannel._create_1();
   }
   static MessageChannel _create_1() =>
       JS('MessageChannel', 'new MessageChannel()');
 
-  @DomName('MessageChannel.port1')
-  @DocsEditable()
   final MessagePort port1;
 
-  @DomName('MessageChannel.port2')
-  @DocsEditable()
   final MessagePort port2;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -26879,7 +20307,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('MessageEvent')
 @Native("MessageEvent")
 class MessageEvent extends Event {
   factory MessageEvent(String type,
@@ -26917,19 +20344,13 @@
   // TODO(alanknight): This really should be generated by the
   // _OutputConversion in the systemnative.py script, but that doesn't
   // use those conversions right now, so do this as a one-off.
-  @DomName('MessageEvent.data')
-  @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(this._get_data);
 
   @JSName('data')
-  @DomName('MessageEvent.data')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_data;
 
-  @DomName('MessageEvent.MessageEvent')
-  @DocsEditable()
   factory MessageEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -26942,32 +20363,19 @@
   static MessageEvent _create_2(type) =>
       JS('MessageEvent', 'new MessageEvent(#)', type);
 
-  @DomName('MessageEvent.lastEventId')
-  @DocsEditable()
   @Unstable()
   final String lastEventId;
 
-  @DomName('MessageEvent.origin')
-  @DocsEditable()
   final String origin;
 
-  @DomName('MessageEvent.source')
-  @DocsEditable()
   EventTarget get source => _convertNativeToDart_EventTarget(this._get_source);
   @JSName('source')
-  @DomName('MessageEvent.source')
-  @DocsEditable()
   @Creates('Null')
   @Returns('EventTarget|=Object')
   final dynamic _get_source;
 
-  @DomName('MessageEvent.suborigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String suborigin;
 
-  @DomName('MessageEvent.initMessageEvent')
-  @DocsEditable()
   void _initMessageEvent(
       String typeArg,
       bool canBubbleArg,
@@ -26984,8 +20392,6 @@
   }
 
   @JSName('initMessageEvent')
-  @DomName('MessageEvent.initMessageEvent')
-  @DocsEditable()
   void _initMessageEvent_1(typeArg, canBubbleArg, cancelableArg, dataArg,
       originArg, lastEventIdArg, sourceArg, List<MessagePort> portsArg) native;
 }
@@ -26995,7 +20401,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('MessagePort')
 @Unstable()
 @Native("MessagePort")
 class MessagePort extends EventTarget {
@@ -27021,17 +20426,11 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('MessagePort.messageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('MessagePort.close')
-  @DocsEditable()
   void close() native;
 
-  @DomName('MessagePort.postMessage')
-  @DocsEditable()
   void postMessage(/*any*/ message, [List<Object> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
@@ -27044,22 +20443,14 @@
   }
 
   @JSName('postMessage')
-  @DomName('MessagePort.postMessage')
-  @DocsEditable()
   void _postMessage_1(message, List<Object> transfer) native;
   @JSName('postMessage')
-  @DomName('MessagePort.postMessage')
-  @DocsEditable()
   void _postMessage_2(message) native;
 
   @JSName('start')
-  @DomName('MessagePort.start')
-  @DocsEditable()
   void _start() native;
 
   /// Stream of `message` events handled by this [MessagePort].
-  @DomName('MessagePort.onmessage')
-  @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 
@@ -27067,8 +20458,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLMetaElement')
 @Native("HTMLMetaElement")
 class MetaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -27076,8 +20465,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLMetaElement.HTMLMetaElement')
-  @DocsEditable()
   factory MetaElement() => JS(
       'returns:MetaElement;creates:MetaElement;new:true',
       '#.createElement(#)',
@@ -27090,26 +20477,16 @@
    */
   MetaElement.created() : super.created();
 
-  @DomName('HTMLMetaElement.content')
-  @DocsEditable()
   String content;
 
-  @DomName('HTMLMetaElement.httpEquiv')
-  @DocsEditable()
   String httpEquiv;
 
-  @DomName('HTMLMetaElement.name')
-  @DocsEditable()
   String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Metadata')
-// http://www.w3.org/TR/file-system-api/#the-metadata-interface
-@Experimental()
 @Native("Metadata")
 class Metadata extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -27117,18 +20494,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Metadata.modificationTime')
-  @DocsEditable()
   DateTime get modificationTime =>
       convertNativeToDart_DateTime(this._get_modificationTime);
   @JSName('modificationTime')
-  @DomName('Metadata.modificationTime')
-  @DocsEditable()
   @Creates('Null')
   final dynamic _get_modificationTime;
 
-  @DomName('Metadata.size')
-  @DocsEditable()
   final int size;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27137,16 +20508,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('MetadataCallback')
-// http://www.w3.org/TR/file-system-api/#idl-def-MetadataCallback
-@Experimental()
 typedef void MetadataCallback(Metadata metadata);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLMeterElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -27158,8 +20524,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLMeterElement.HTMLMeterElement')
-  @DocsEditable()
   factory MeterElement() => document.createElement("meter");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -27171,45 +20535,27 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('meter');
 
-  @DomName('HTMLMeterElement.high')
-  @DocsEditable()
   num high;
 
-  @DomName('HTMLMeterElement.labels')
-  @DocsEditable()
   @Unstable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> labels;
 
-  @DomName('HTMLMeterElement.low')
-  @DocsEditable()
   num low;
 
-  @DomName('HTMLMeterElement.max')
-  @DocsEditable()
   num max;
 
-  @DomName('HTMLMeterElement.min')
-  @DocsEditable()
   num min;
 
-  @DomName('HTMLMeterElement.optimum')
-  @DocsEditable()
   num optimum;
 
-  @DomName('HTMLMeterElement.value')
-  @DocsEditable()
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIAccess')
-// http://webaudio.github.io/web-midi-api/#midiaccess-interface
-@Experimental()
 @Native("MIDIAccess")
 class MidiAccess extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -27217,27 +20563,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MIDIAccess.inputs')
-  @DocsEditable()
   final MidiInputMap inputs;
 
-  @DomName('MIDIAccess.outputs')
-  @DocsEditable()
   final MidiOutputMap outputs;
 
-  @DomName('MIDIAccess.sysexEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool sysexEnabled;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIConnectionEvent')
-// http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface
-@Experimental()
 @Native("MIDIConnectionEvent")
 class MidiConnectionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -27245,8 +20580,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MIDIConnectionEvent.MIDIConnectionEvent')
-  @DocsEditable()
   factory MidiConnectionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -27262,18 +20595,12 @@
   static MidiConnectionEvent _create_2(type) =>
       JS('MidiConnectionEvent', 'new MIDIConnectionEvent(#)', type);
 
-  @DomName('MIDIConnectionEvent.port')
-  @DocsEditable()
   final MidiPort port;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIInput')
-// http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput
-@Experimental()
 @Native("MIDIInput")
 class MidiInput extends MidiPort {
   // To suppress missing implicit constructor warnings.
@@ -27287,14 +20614,10 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('MIDIInput.midimessageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MidiMessageEvent> midiMessageEvent =
       const EventStreamProvider<MidiMessageEvent>('midimessage');
 
   /// Stream of `midimessage` events handled by this [MidiInput].
-  @DomName('MIDIInput.onmidimessage')
-  @DocsEditable()
   Stream<MidiMessageEvent> get onMidiMessage =>
       midiMessageEvent.forTarget(this);
 }
@@ -27302,9 +20625,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIInputMap')
-@Experimental() // untriaged
 @Native("MIDIInputMap")
 class MidiInputMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
@@ -27373,10 +20693,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIMessageEvent')
-// http://webaudio.github.io/web-midi-api/#midimessageevent-interface
-@Experimental()
 @Native("MIDIMessageEvent")
 class MidiMessageEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -27384,8 +20700,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MIDIMessageEvent.MIDIMessageEvent')
-  @DocsEditable()
   factory MidiMessageEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -27398,18 +20712,12 @@
   static MidiMessageEvent _create_2(type) =>
       JS('MidiMessageEvent', 'new MIDIMessageEvent(#)', type);
 
-  @DomName('MIDIMessageEvent.data')
-  @DocsEditable()
   final Uint8List data;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIOutput')
-// http://webaudio.github.io/web-midi-api/#midioutput-interface
-@Experimental()
 @Native("MIDIOutput")
 class MidiOutput extends MidiPort {
   // To suppress missing implicit constructor warnings.
@@ -27417,17 +20725,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MIDIOutput.send')
-  @DocsEditable()
   void send(Uint8List data, [num timestamp]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIOutputMap')
-@Experimental() // untriaged
 @Native("MIDIOutputMap")
 class MidiOutputMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
@@ -27496,10 +20799,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MIDIPort')
-// http://webaudio.github.io/web-midi-api/#idl-def-MIDIPort
-@Experimental()
 @Native("MIDIPort")
 class MidiPort extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -27507,53 +20806,28 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MIDIPort.connection')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String connection;
 
-  @DomName('MIDIPort.id')
-  @DocsEditable()
   final String id;
 
-  @DomName('MIDIPort.manufacturer')
-  @DocsEditable()
   final String manufacturer;
 
-  @DomName('MIDIPort.name')
-  @DocsEditable()
   final String name;
 
-  @DomName('MIDIPort.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 
-  @DomName('MIDIPort.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('MIDIPort.version')
-  @DocsEditable()
   final String version;
 
-  @DomName('MIDIPort.close')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future close() => promiseToFuture(JS("", "#.close()", this));
 
-  @DomName('MIDIPort.open')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future open() => promiseToFuture(JS("", "#.open()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MimeType')
-@Experimental() // non-standard
 @Native("MimeType")
 class MimeType extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -27561,29 +20835,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MimeType.description')
-  @DocsEditable()
   final String description;
 
-  @DomName('MimeType.enabledPlugin')
-  @DocsEditable()
   final Plugin enabledPlugin;
 
-  @DomName('MimeType.suffixes')
-  @DocsEditable()
   final String suffixes;
 
-  @DomName('MimeType.type')
-  @DocsEditable()
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MimeTypeArray')
-@Experimental() // non-standard
 @Native("MimeTypeArray")
 class MimeTypeArray extends Interceptor
     with ListMixin<MimeType>, ImmutableListMixin<MimeType>
@@ -27593,8 +20856,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MimeTypeArray.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   MimeType operator [](int index) {
@@ -27640,20 +20901,14 @@
   MimeType elementAt(int index) => this[index];
   // -- end List<MimeType> mixins.
 
-  @DomName('MimeTypeArray.item')
-  @DocsEditable()
   MimeType item(int index) native;
 
-  @DomName('MimeTypeArray.namedItem')
-  @DocsEditable()
   MimeType namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLModElement')
 @Unstable()
 @Native("HTMLModElement")
 class ModElement extends HtmlElement {
@@ -27668,12 +20923,8 @@
    */
   ModElement.created() : super.created();
 
-  @DomName('HTMLModElement.cite')
-  @DocsEditable()
   String cite;
 
-  @DomName('HTMLModElement.dateTime')
-  @DocsEditable()
   String dateTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27682,14 +20933,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('MojoWatchCallback')
-@Experimental() // untriaged
 typedef void MojoWatchCallback(int result);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('MouseEvent')
 @Native("MouseEvent,DragEvent")
 class MouseEvent extends UIEvent {
   factory MouseEvent(String type,
@@ -27730,8 +20978,6 @@
     return event;
   }
 
-  @DomName('MouseEvent.MouseEvent')
-  @DocsEditable()
   factory MouseEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -27744,31 +20990,18 @@
   static MouseEvent _create_2(type) =>
       JS('MouseEvent', 'new MouseEvent(#)', type);
 
-  @DomName('MouseEvent.altKey')
-  @DocsEditable()
   final bool altKey;
 
-  @DomName('MouseEvent.button')
-  @DocsEditable()
   final int button;
 
-  @DomName('MouseEvent.buttons')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int buttons;
 
   @JSName('clientX')
-  @DomName('MouseEvent.clientX')
-  @DocsEditable()
   final num _clientX;
 
   @JSName('clientY')
-  @DomName('MouseEvent.clientY')
-  @DocsEditable()
   final num _clientY;
 
-  @DomName('MouseEvent.ctrlKey')
-  @DocsEditable()
   final bool ctrlKey;
 
   /**
@@ -27778,79 +21011,44 @@
    * This member is deprecated and not cross-browser compatible; use
    * relatedTarget to get the same information in the standard way.
    */
-  @DomName('MouseEvent.fromElement')
-  @DocsEditable()
   @deprecated
   final Node fromElement;
 
   @JSName('layerX')
-  @DomName('MouseEvent.layerX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int _layerX;
 
   @JSName('layerY')
-  @DomName('MouseEvent.layerY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int _layerY;
 
-  @DomName('MouseEvent.metaKey')
-  @DocsEditable()
   final bool metaKey;
 
   @JSName('movementX')
-  @DomName('MouseEvent.movementX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int _movementX;
 
   @JSName('movementY')
-  @DomName('MouseEvent.movementY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int _movementY;
 
   @JSName('pageX')
-  @DomName('MouseEvent.pageX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num _pageX;
 
   @JSName('pageY')
-  @DomName('MouseEvent.pageY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num _pageY;
 
-  @DomName('MouseEvent.region')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String region;
 
-  @DomName('MouseEvent.relatedTarget')
-  @DocsEditable()
   EventTarget get relatedTarget =>
       _convertNativeToDart_EventTarget(this._get_relatedTarget);
   @JSName('relatedTarget')
-  @DomName('MouseEvent.relatedTarget')
-  @DocsEditable()
   @Creates('Node')
   @Returns('EventTarget|=Object')
   final dynamic _get_relatedTarget;
 
   @JSName('screenX')
-  @DomName('MouseEvent.screenX')
-  @DocsEditable()
   final num _screenX;
 
   @JSName('screenY')
-  @DomName('MouseEvent.screenY')
-  @DocsEditable()
   final num _screenY;
 
-  @DomName('MouseEvent.shiftKey')
-  @DocsEditable()
   final bool shiftKey;
 
   /**
@@ -27860,18 +21058,11 @@
    * This member is deprecated and not cross-browser compatible; use
    * relatedTarget to get the same information in the standard way.
    */
-  @DomName('MouseEvent.toElement')
-  @DocsEditable()
   @deprecated
   final Node toElement;
 
-  @DomName('MouseEvent.getModifierState')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool getModifierState(String keyArg) native;
 
-  @DomName('MouseEvent.initMouseEvent')
-  @DocsEditable()
   void _initMouseEvent(
       String type,
       bool bubbles,
@@ -27909,8 +21100,6 @@
   }
 
   @JSName('initMouseEvent')
-  @DomName('MouseEvent.initMouseEvent')
-  @DocsEditable()
   void _initMouseEvent_1(
       type,
       bubbles,
@@ -27928,15 +21117,10 @@
       button,
       relatedTarget) native;
 
-  @DomName('MouseEvent.clientX')
-  @DomName('MouseEvent.clientY')
   Point get client => new Point(_clientX, _clientY);
 
-  @DomName('MouseEvent.movementX')
-  @DomName('MouseEvent.movementY')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @Experimental()
   Point get movement => new Point(_movementX, _movementY);
 
   /**
@@ -27962,19 +21146,12 @@
     }
   }
 
-  @DomName('MouseEvent.screenX')
-  @DomName('MouseEvent.screenY')
   Point get screen => new Point(_screenX, _screenY);
 
-  @DomName('MouseEvent.layerX')
-  @DomName('MouseEvent.layerY')
   Point get layer => new Point(_layerX, _layerY);
 
-  @DomName('MouseEvent.pageX')
-  @DomName('MouseEvent.pageY')
   Point get page => new Point(_pageX, _pageY);
 
-  @DomName('MouseEvent.dataTransfer')
   DataTransfer get dataTransfer =>
       JS('DataTransfer', "#['dataTransfer']", this);
 }
@@ -27984,15 +21161,12 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('MutationCallback')
 typedef void MutationCallback(
     List<MutationRecord> mutations, MutationObserver observer);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MutationEvent')
 // http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents
 @deprecated
 @Native("MutationEvent")
@@ -28002,40 +21176,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MutationEvent.ADDITION')
-  @DocsEditable()
   static const int ADDITION = 2;
 
-  @DomName('MutationEvent.MODIFICATION')
-  @DocsEditable()
   static const int MODIFICATION = 1;
 
-  @DomName('MutationEvent.REMOVAL')
-  @DocsEditable()
   static const int REMOVAL = 3;
 
-  @DomName('MutationEvent.attrChange')
-  @DocsEditable()
   final int attrChange;
 
-  @DomName('MutationEvent.attrName')
-  @DocsEditable()
   final String attrName;
 
-  @DomName('MutationEvent.newValue')
-  @DocsEditable()
   final String newValue;
 
-  @DomName('MutationEvent.prevValue')
-  @DocsEditable()
   final String prevValue;
 
-  @DomName('MutationEvent.relatedNode')
-  @DocsEditable()
   final Node relatedNode;
 
-  @DomName('MutationEvent.initMutationEvent')
-  @DocsEditable()
   void initMutationEvent(
       String type,
       bool bubbles,
@@ -28050,19 +21206,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('MutationObserver')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
 @Native("MutationObserver,WebKitMutationObserver")
 class MutationObserver extends Interceptor {
-  @DomName('MutationObserver.disconnect')
-  @DocsEditable()
   void disconnect() native;
 
-  @DomName('MutationObserver.observe')
-  @DocsEditable()
   void _observe(Node target, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -28074,16 +21224,10 @@
   }
 
   @JSName('observe')
-  @DomName('MutationObserver.observe')
-  @DocsEditable()
   void _observe_1(Node target, options) native;
   @JSName('observe')
-  @DomName('MutationObserver.observe')
-  @DocsEditable()
   void _observe_2(Node target) native;
 
-  @DomName('MutationObserver.takeRecords')
-  @DocsEditable()
   List<MutationRecord> takeRecords() native;
 
   /**
@@ -28170,8 +21314,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MutationRecord')
 @Native("MutationRecord")
 class MutationRecord extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -28179,53 +21321,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MutationRecord.addedNodes')
-  @DocsEditable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> addedNodes;
 
-  @DomName('MutationRecord.attributeName')
-  @DocsEditable()
   final String attributeName;
 
-  @DomName('MutationRecord.attributeNamespace')
-  @DocsEditable()
   final String attributeNamespace;
 
-  @DomName('MutationRecord.nextSibling')
-  @DocsEditable()
   final Node nextSibling;
 
-  @DomName('MutationRecord.oldValue')
-  @DocsEditable()
   final String oldValue;
 
-  @DomName('MutationRecord.previousSibling')
-  @DocsEditable()
   final Node previousSibling;
 
-  @DomName('MutationRecord.removedNodes')
-  @DocsEditable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> removedNodes;
 
-  @DomName('MutationRecord.target')
-  @DocsEditable()
   final Node target;
 
-  @DomName('MutationRecord.type')
-  @DocsEditable()
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigationPreloadManager')
-@Experimental() // untriaged
 @Native("NavigationPreloadManager")
 class NavigationPreloadManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -28233,19 +21354,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NavigationPreloadManager.disable')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future disable() => promiseToFuture(JS("", "#.disable()", this));
 
-  @DomName('NavigationPreloadManager.enable')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future enable() => promiseToFuture(JS("", "#.enable()", this));
 
-  @DomName('NavigationPreloadManager.getState')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Map<String, dynamic>> getState() =>
       promiseToFutureAsMap(JS("", "#.getState()", this));
 }
@@ -28253,7 +21365,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('Navigator')
 @Native("Navigator")
 class Navigator extends NavigatorConcurrentHardware
     implements
@@ -28262,7 +21373,6 @@
         NavigatorOnLine,
         NavigatorAutomationInformation,
         NavigatorID {
-  @DomName('Navigator.getGamepads')
   List<Gamepad> getGamepads() {
     var gamepadList = _getGamepads();
 
@@ -28276,7 +21386,6 @@
     return gamepadList;
   }
 
-  @DomName('Navigator.language')
   String get language =>
       JS('String', '#.language || #.userLanguage', this, this);
 
@@ -28315,9 +21424,7 @@
    * See also:
    * * [MediaStream.supported]
    */
-  @DomName('Navigator.webkitGetUserMedia')
   @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
   Future<MediaStream> getUserMedia({audio: false, video: false}) {
     var completer = new Completer<MediaStream>();
     var options = {'audio': audio, 'video': video};
@@ -28355,168 +21462,80 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Navigator.budget')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _BudgetService budget;
 
-  @DomName('Navigator.clipboard')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _Clipboard clipboard;
 
-  @DomName('Navigator.connection')
-  @DocsEditable()
-  @Experimental() // untriaged
   final NetworkInformation connection;
 
-  @DomName('Navigator.credentials')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CredentialsContainer credentials;
 
-  @DomName('Navigator.deviceMemory')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num deviceMemory;
 
-  @DomName('Navigator.doNotTrack')
-  @DocsEditable()
-  // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
-  @Experimental() // experimental
   final String doNotTrack;
 
-  @DomName('Navigator.geolocation')
-  @DocsEditable()
   @Unstable()
   final Geolocation geolocation;
 
-  @DomName('Navigator.maxTouchPoints')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int maxTouchPoints;
 
-  @DomName('Navigator.mediaCapabilities')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaCapabilities mediaCapabilities;
 
-  @DomName('Navigator.mediaDevices')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaDevices mediaDevices;
 
-  @DomName('Navigator.mediaSession')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaSession mediaSession;
 
-  @DomName('Navigator.mimeTypes')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final MimeTypeArray mimeTypes;
 
-  @DomName('Navigator.nfc')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _NFC nfc;
 
-  @DomName('Navigator.permissions')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Permissions permissions;
 
-  @DomName('Navigator.presentation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Presentation presentation;
 
-  @DomName('Navigator.productSub')
-  @DocsEditable()
   @Unstable()
   final String productSub;
 
-  @DomName('Navigator.serviceWorker')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ServiceWorkerContainer serviceWorker;
 
-  @DomName('Navigator.storage')
-  @DocsEditable()
-  @Experimental() // untriaged
   final StorageManager storage;
 
-  @DomName('Navigator.vendor')
-  @DocsEditable()
   @Unstable()
   final String vendor;
 
-  @DomName('Navigator.vendorSub')
-  @DocsEditable()
   @Unstable()
   final String vendorSub;
 
-  @DomName('Navigator.vr')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VR vr;
 
   @JSName('webkitPersistentStorage')
-  @DomName('Navigator.webkitPersistentStorage')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.w3.org/TR/quota-api/#accessing-storagequota
   final DeprecatedStorageQuota persistentStorage;
 
   @JSName('webkitTemporaryStorage')
-  @DomName('Navigator.webkitTemporaryStorage')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.w3.org/TR/quota-api/#accessing-storagequota
   final DeprecatedStorageQuota temporaryStorage;
 
-  @DomName('Navigator.cancelKeyboardLock')
-  @DocsEditable()
-  @Experimental() // untriaged
   void cancelKeyboardLock() native;
 
-  @DomName('Navigator.getBattery')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future getBattery() => promiseToFuture(JS("", "#.getBattery()", this));
 
   @JSName('getGamepads')
-  @DomName('Navigator.getGamepads')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('_GamepadList|Null')
   @Creates('_GamepadList')
   List<Gamepad> _getGamepads() native;
 
-  @DomName('Navigator.getInstalledRelatedApps')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<RelatedApplication> getInstalledRelatedApps() =>
       promiseToFuture<RelatedApplication>(
           JS("", "#.getInstalledRelatedApps()", this));
 
-  @DomName('Navigator.getVRDisplays')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future getVRDisplays() => promiseToFuture(JS("", "#.getVRDisplays()", this));
 
-  @DomName('Navigator.registerProtocolHandler')
-  @DocsEditable()
   @Unstable()
   void registerProtocolHandler(String scheme, String url, String title) native;
 
-  @DomName('Navigator.requestKeyboardLock')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future requestKeyboardLock([List<String> keyCodes]) {
     if (keyCodes != null) {
       List keyCodes_1 = convertDartToNative_StringArray(keyCodes);
@@ -28526,19 +21545,10 @@
   }
 
   @JSName('requestKeyboardLock')
-  @DomName('Navigator.requestKeyboardLock')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestKeyboardLock_1(List keyCodes) native;
   @JSName('requestKeyboardLock')
-  @DomName('Navigator.requestKeyboardLock')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestKeyboardLock_2() native;
 
-  @DomName('Navigator.requestMIDIAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future requestMidiAccess([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -28548,32 +21558,17 @@
   }
 
   @JSName('requestMIDIAccess')
-  @DomName('Navigator.requestMIDIAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestMidiAccess_1(options) native;
   @JSName('requestMIDIAccess')
-  @DomName('Navigator.requestMIDIAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestMidiAccess_2() native;
 
-  @DomName('Navigator.requestMediaKeySystemAccess')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future requestMediaKeySystemAccess(
           String keySystem, List<Map> supportedConfigurations) =>
       promiseToFuture(JS("", "#.requestMediaKeySystemAccess(#, #)", this,
           keySystem, supportedConfigurations));
 
-  @DomName('Navigator.sendBeacon')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool sendBeacon(String url, Object data) native;
 
-  @DomName('Navigator.share')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future share([Map data]) {
     if (data != null) {
       var data_1 = convertDartToNative_Dictionary(data);
@@ -28583,74 +21578,42 @@
   }
 
   @JSName('share')
-  @DomName('Navigator.share')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _share_1(data) native;
   @JSName('share')
-  @DomName('Navigator.share')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _share_2() native;
 
   // From NavigatorAutomationInformation
 
-  @DomName('Navigator.webdriver')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool webdriver;
 
   // From NavigatorCookies
 
-  @DomName('Navigator.cookieEnabled')
-  @DocsEditable()
   @Unstable()
   final bool cookieEnabled;
 
   // From NavigatorID
 
-  @DomName('Navigator.appCodeName')
-  @DocsEditable()
-  @Experimental() // non-standard
   final String appCodeName;
 
-  @DomName('Navigator.appName')
-  @DocsEditable()
   final String appName;
 
-  @DomName('Navigator.appVersion')
-  @DocsEditable()
   final String appVersion;
 
-  @DomName('Navigator.dartEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool dartEnabled;
 
-  @DomName('Navigator.platform')
-  @DocsEditable()
   final String platform;
 
-  @DomName('Navigator.product')
-  @DocsEditable()
   @Unstable()
   final String product;
 
-  @DomName('Navigator.userAgent')
-  @DocsEditable()
   final String userAgent;
 
   // From NavigatorLanguage
 
-  @DomName('Navigator.languages')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<String> languages;
 
   // From NavigatorOnLine
 
-  @DomName('Navigator.onLine')
-  @DocsEditable()
   @Unstable()
   final bool onLine;
 }
@@ -28658,9 +21621,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigatorAutomationInformation')
-@Experimental() // untriaged
 @Native("NavigatorAutomationInformation")
 class NavigatorAutomationInformation extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -28668,18 +21628,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NavigatorAutomationInformation.webdriver')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool webdriver;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigatorConcurrentHardware')
-@Experimental() // untriaged
 @Native("NavigatorConcurrentHardware")
 class NavigatorConcurrentHardware extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -28687,18 +21641,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NavigatorConcurrentHardware.hardwareConcurrency')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int hardwareConcurrency;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigatorCookies')
-@Experimental() // untriaged
 @Native("NavigatorCookies")
 class NavigatorCookies extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -28706,18 +21654,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NavigatorCookies.cookieEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool cookieEnabled;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigatorID')
-@Experimental() // untriaged
 abstract class NavigatorID extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory NavigatorID._() {
@@ -28742,9 +21684,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigatorLanguage')
-@Experimental() // untriaged
 abstract class NavigatorLanguage extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory NavigatorLanguage._() {
@@ -28759,9 +21698,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigatorOnLine')
-@Experimental() // untriaged
 abstract class NavigatorOnLine extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory NavigatorOnLine._() {
@@ -28774,10 +21710,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NavigatorUserMediaError')
-// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError
-@Experimental()
 @Native("NavigatorUserMediaError")
 class NavigatorUserMediaError extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -28785,16 +21717,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NavigatorUserMediaError.constraintName')
-  @DocsEditable()
   final String constraintName;
 
-  @DomName('NavigatorUserMediaError.message')
-  @DocsEditable()
   final String message;
 
-  @DomName('NavigatorUserMediaError.name')
-  @DocsEditable()
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28803,9 +21729,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('NavigatorUserMediaErrorCallback')
-// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaErrorCallback
-@Experimental()
 typedef void _NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28813,17 +21736,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('NavigatorUserMediaSuccessCallback')
-// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaSuccessCallback
-@Experimental()
 typedef void _NavigatorUserMediaSuccessCallback(MediaStream stream);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NetworkInformation')
-@Experimental() // untriaged
 @Native("NetworkInformation")
 class NetworkInformation extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -28831,40 +21748,19 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NetworkInformation.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('NetworkInformation.downlink')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num downlink;
 
-  @DomName('NetworkInformation.downlinkMax')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num downlinkMax;
 
-  @DomName('NetworkInformation.effectiveType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String effectiveType;
 
-  @DomName('NetworkInformation.rtt')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int rtt;
 
-  @DomName('NetworkInformation.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('NetworkInformation.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29040,7 +21936,6 @@
   List<Node> get rawList => _this.childNodes;
 }
 
-@DomName('Node')
 @Native("Node")
 class Node extends EventTarget {
   // Custom element created callback.
@@ -29066,7 +21961,6 @@
   /**
    * Removes this node from the DOM.
    */
-  @DomName('Node.removeChild')
   void remove() {
     // TODO(jacobr): should we throw an exception if parent is already null?
     // TODO(vsm): Use the native remove when available.
@@ -29079,7 +21973,6 @@
   /**
    * Replaces this node with another node.
    */
-  @DomName('Node.replaceChild')
   Node replaceWith(Node otherNode) {
     try {
       final Node parent = this.parentNode;
@@ -29136,8 +22029,6 @@
    * * [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
    *   from MDN.
    */
-  @DomName('Node.childNodes')
-  @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> childNodes;
@@ -29147,57 +22038,31 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Node.ATTRIBUTE_NODE')
-  @DocsEditable()
   static const int ATTRIBUTE_NODE = 2;
 
-  @DomName('Node.CDATA_SECTION_NODE')
-  @DocsEditable()
   static const int CDATA_SECTION_NODE = 4;
 
-  @DomName('Node.COMMENT_NODE')
-  @DocsEditable()
   static const int COMMENT_NODE = 8;
 
-  @DomName('Node.DOCUMENT_FRAGMENT_NODE')
-  @DocsEditable()
   static const int DOCUMENT_FRAGMENT_NODE = 11;
 
-  @DomName('Node.DOCUMENT_NODE')
-  @DocsEditable()
   static const int DOCUMENT_NODE = 9;
 
-  @DomName('Node.DOCUMENT_TYPE_NODE')
-  @DocsEditable()
   static const int DOCUMENT_TYPE_NODE = 10;
 
-  @DomName('Node.ELEMENT_NODE')
-  @DocsEditable()
   static const int ELEMENT_NODE = 1;
 
-  @DomName('Node.ENTITY_NODE')
-  @DocsEditable()
   static const int ENTITY_NODE = 6;
 
-  @DomName('Node.ENTITY_REFERENCE_NODE')
-  @DocsEditable()
   static const int ENTITY_REFERENCE_NODE = 5;
 
-  @DomName('Node.NOTATION_NODE')
-  @DocsEditable()
   static const int NOTATION_NODE = 12;
 
-  @DomName('Node.PROCESSING_INSTRUCTION_NODE')
-  @DocsEditable()
   static const int PROCESSING_INSTRUCTION_NODE = 7;
 
-  @DomName('Node.TEXT_NODE')
-  @DocsEditable()
   static const int TEXT_NODE = 3;
 
   @JSName('baseURI')
-  @DomName('Node.baseURI')
-  @DocsEditable()
   final String baseUri;
 
   /**
@@ -29208,13 +22073,8 @@
    * * [Node.firstChild](https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)
    *   from MDN.
    */
-  @DomName('Node.firstChild')
-  @DocsEditable()
   final Node firstChild;
 
-  @DomName('Node.isConnected')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isConnected;
 
   /**
@@ -29225,8 +22085,6 @@
    * * [Node.lastChild](https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)
    *   from MDN.
    */
-  @DomName('Node.lastChild')
-  @DocsEditable()
   final Node lastChild;
 
   @JSName('nextSibling')
@@ -29238,8 +22096,6 @@
    * * [Node.nextSibling](https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)
    *   from MDN.
    */
-  @DomName('Node.nextSibling')
-  @DocsEditable()
   final Node nextNode;
 
   /**
@@ -29253,8 +22109,6 @@
    *   from MDN. This page contains a table of [nodeName] values for each
    *   [nodeType].
    */
-  @DomName('Node.nodeName')
-  @DocsEditable()
   final String nodeName;
 
   /**
@@ -29280,8 +22134,6 @@
    * * [Node.nodeType](https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType)
    *   from MDN.
    */
-  @DomName('Node.nodeType')
-  @DocsEditable()
   final int nodeType;
 
   /**
@@ -29295,8 +22147,6 @@
    *   from MDN. This page contains a table of [nodeValue] values for each
    *   [nodeType].
    */
-  @DomName('Node.nodeValue')
-  @DocsEditable()
   final String nodeValue;
 
   /**
@@ -29309,8 +22159,6 @@
    * * [Node.ownerDocument](https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument)
    *   from MDN.
    */
-  @DomName('Node.ownerDocument')
-  @DocsEditable()
   final Document ownerDocument;
 
   @JSName('parentElement')
@@ -29325,8 +22173,6 @@
    * * [Node.parentElement](https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement)
    *   from W3C.
    */
-  @DomName('Node.parentElement')
-  @DocsEditable()
   final Element parent;
 
   /**
@@ -29337,8 +22183,6 @@
    * * [Node.parentNode](https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode)
    *   from MDN.
    */
-  @DomName('Node.parentNode')
-  @DocsEditable()
   final Node parentNode;
 
   @JSName('previousSibling')
@@ -29350,8 +22194,6 @@
    * * [Node.previousSibling](https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)
    *   from MDN.
    */
-  @DomName('Node.previousSibling')
-  @DocsEditable()
   final Node previousNode;
 
   @JSName('textContent')
@@ -29363,8 +22205,6 @@
    * * [Node.textContent](https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent)
    *   from MDN.
    */
-  @DomName('Node.textContent')
-  @DocsEditable()
   String text;
 
   @JSName('appendChild')
@@ -29377,8 +22217,6 @@
    * This method is more efficient than `nodes.add`, and is the preferred
    * way of appending a child node.
    */
-  @DomName('Node.appendChild')
-  @DocsEditable()
   Node append(Node node) native;
 
   @JSName('cloneNode')
@@ -29393,8 +22231,6 @@
    * * [Node.cloneNode](https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode)
    *   from MDN.
    */
-  @DomName('Node.cloneNode')
-  @DocsEditable()
   Node clone(bool deep) native;
 
   /**
@@ -29405,13 +22241,8 @@
    * * [Node.contains](https://developer.mozilla.org/en-US/docs/Web/API/Node.contains)
    *   from MDN.
    */
-  @DomName('Node.contains')
-  @DocsEditable()
   bool contains(Node other) native;
 
-  @DomName('Node.getRootNode')
-  @DocsEditable()
-  @Experimental() // untriaged
   Node getRootNode([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -29421,14 +22252,8 @@
   }
 
   @JSName('getRootNode')
-  @DomName('Node.getRootNode')
-  @DocsEditable()
-  @Experimental() // untriaged
   Node _getRootNode_1(options) native;
   @JSName('getRootNode')
-  @DomName('Node.getRootNode')
-  @DocsEditable()
-  @Experimental() // untriaged
   Node _getRootNode_2() native;
 
   /**
@@ -29439,8 +22264,6 @@
    * * [Node.hasChildNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes)
    *   from MDN.
    */
-  @DomName('Node.hasChildNodes')
-  @DocsEditable()
   bool hasChildNodes() native;
 
   /**
@@ -29451,26 +22274,18 @@
    * * [Node.insertBefore](https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore)
    *   from MDN.
    */
-  @DomName('Node.insertBefore')
-  @DocsEditable()
   Node insertBefore(Node node, Node child) native;
 
   @JSName('removeChild')
-  @DomName('Node.removeChild')
-  @DocsEditable()
   Node _removeChild(Node child) native;
 
   @JSName('replaceChild')
-  @DomName('Node.replaceChild')
-  @DocsEditable()
   Node _replaceChild(Node node, Node child) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NodeFilter')
 @Unstable()
 @Native("NodeFilter")
 class NodeFilter extends Interceptor {
@@ -29479,55 +22294,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NodeFilter.FILTER_ACCEPT')
-  @DocsEditable()
   static const int FILTER_ACCEPT = 1;
 
-  @DomName('NodeFilter.FILTER_REJECT')
-  @DocsEditable()
   static const int FILTER_REJECT = 2;
 
-  @DomName('NodeFilter.FILTER_SKIP')
-  @DocsEditable()
   static const int FILTER_SKIP = 3;
 
-  @DomName('NodeFilter.SHOW_ALL')
-  @DocsEditable()
   static const int SHOW_ALL = 0xFFFFFFFF;
 
-  @DomName('NodeFilter.SHOW_COMMENT')
-  @DocsEditable()
   static const int SHOW_COMMENT = 0x80;
 
-  @DomName('NodeFilter.SHOW_DOCUMENT')
-  @DocsEditable()
   static const int SHOW_DOCUMENT = 0x100;
 
-  @DomName('NodeFilter.SHOW_DOCUMENT_FRAGMENT')
-  @DocsEditable()
   static const int SHOW_DOCUMENT_FRAGMENT = 0x400;
 
-  @DomName('NodeFilter.SHOW_DOCUMENT_TYPE')
-  @DocsEditable()
   static const int SHOW_DOCUMENT_TYPE = 0x200;
 
-  @DomName('NodeFilter.SHOW_ELEMENT')
-  @DocsEditable()
   static const int SHOW_ELEMENT = 0x1;
 
-  @DomName('NodeFilter.SHOW_PROCESSING_INSTRUCTION')
-  @DocsEditable()
   static const int SHOW_PROCESSING_INSTRUCTION = 0x40;
 
-  @DomName('NodeFilter.SHOW_TEXT')
-  @DocsEditable()
   static const int SHOW_TEXT = 0x4;
 }
 // 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.
 
-@DomName('NodeIterator')
 @Unstable()
 @Native("NodeIterator")
 class NodeIterator extends Interceptor {
@@ -29539,40 +22331,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NodeIterator.pointerBeforeReferenceNode')
-  @DocsEditable()
   final bool pointerBeforeReferenceNode;
 
-  @DomName('NodeIterator.referenceNode')
-  @DocsEditable()
   final Node referenceNode;
 
-  @DomName('NodeIterator.root')
-  @DocsEditable()
   final Node root;
 
-  @DomName('NodeIterator.whatToShow')
-  @DocsEditable()
   final int whatToShow;
 
-  @DomName('NodeIterator.detach')
-  @DocsEditable()
   void detach() native;
 
-  @DomName('NodeIterator.nextNode')
-  @DocsEditable()
   Node nextNode() native;
 
-  @DomName('NodeIterator.previousNode')
-  @DocsEditable()
   Node previousNode() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NodeList')
 @Native("NodeList,RadioNodeList")
 class NodeList extends Interceptor
     with ListMixin<Node>, ImmutableListMixin<Node>
@@ -29582,8 +22358,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NodeList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   Node operator [](int index) {
@@ -29630,17 +22404,12 @@
   // -- end List<Node> mixins.
 
   @JSName('item')
-  @DomName('NodeList.item')
-  @DocsEditable()
   Node _item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NonDocumentTypeChildNode')
-@Experimental() // untriaged
 @Native("NonDocumentTypeChildNode")
 class NonDocumentTypeChildNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -29648,23 +22417,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NonDocumentTypeChildNode.nextElementSibling')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element nextElementSibling;
 
-  @DomName('NonDocumentTypeChildNode.previousElementSibling')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element previousElementSibling;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NonElementParentNode')
-@Experimental() // untriaged
 @Native("NonElementParentNode")
 class NonElementParentNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -29672,18 +22432,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NonElementParentNode.getElementById')
-  @DocsEditable()
-  @Experimental() // untriaged
   Element getElementById(String elementId) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NoncedElement')
-@Experimental() // untriaged
 @Native("NoncedElement")
 class NoncedElement extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -29691,18 +22445,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NoncedElement.nonce')
-  @DocsEditable()
-  @Experimental() // untriaged
   String nonce;
 }
 // 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.
 
-@DomName('Notification')
-// http://www.w3.org/TR/notifications/#notification
-@Experimental() // experimental
 @Native("Notification")
 class Notification extends EventTarget {
   factory Notification(String title,
@@ -29730,8 +22478,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Notification.clickEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> clickEvent =
       const EventStreamProvider<Event>('click');
 
@@ -29741,8 +22487,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Notification.closeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> closeEvent =
       const EventStreamProvider<Event>('close');
 
@@ -29752,8 +22496,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Notification.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -29763,13 +22505,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Notification.showEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> showEvent =
       const EventStreamProvider<Event>('show');
 
-  @DomName('Notification.Notification')
-  @DocsEditable()
   static Notification _factoryNotification(String title, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -29786,105 +22524,49 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.Notification)');
 
-  @DomName('Notification.actions')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List actions;
 
-  @DomName('Notification.badge')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String badge;
 
-  @DomName('Notification.body')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String body;
 
-  @DomName('Notification.data')
-  @DocsEditable()
-  @Experimental() // untriaged
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final Object data;
 
-  @DomName('Notification.dir')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final String dir;
 
-  @DomName('Notification.icon')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String icon;
 
-  @DomName('Notification.image')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String image;
 
-  @DomName('Notification.lang')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String lang;
 
-  @DomName('Notification.maxActions')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final int maxActions;
+  static final int maxActions;
 
-  @DomName('Notification.permission')
-  @DocsEditable()
-  final String permission;
+  static final String permission;
 
-  @DomName('Notification.renotify')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool renotify;
 
-  @DomName('Notification.requireInteraction')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool requireInteraction;
 
-  @DomName('Notification.silent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool silent;
 
-  @DomName('Notification.tag')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final String tag;
 
-  @DomName('Notification.timestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int timestamp;
 
-  @DomName('Notification.title')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String title;
 
-  @DomName('Notification.vibrate')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<int> vibrate;
 
-  @DomName('Notification.close')
-  @DocsEditable()
   void close() native;
 
   @JSName('requestPermission')
-  @DomName('Notification.requestPermission')
-  @DocsEditable()
   static Future _requestPermission(
       [_NotificationPermissionCallback deprecatedCallback]) native;
 
   @JSName('requestPermission')
-  @DomName('Notification.requestPermission')
-  @DocsEditable()
   static Future<String> requestPermission() {
     var completer = new Completer<String>();
     _requestPermission((value) {
@@ -29894,32 +22576,21 @@
   }
 
   /// Stream of `click` events handled by this [Notification].
-  @DomName('Notification.onclick')
-  @DocsEditable()
   Stream<Event> get onClick => clickEvent.forTarget(this);
 
   /// Stream of `close` events handled by this [Notification].
-  @DomName('Notification.onclose')
-  @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [Notification].
-  @DomName('Notification.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `show` events handled by this [Notification].
-  @DomName('Notification.onshow')
-  @DocsEditable()
   Stream<Event> get onShow => showEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NotificationEvent')
-@Experimental() // untriaged
 @Native("NotificationEvent")
 class NotificationEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -29927,8 +22598,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NotificationEvent.NotificationEvent')
-  @DocsEditable()
   factory NotificationEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return NotificationEvent._create_1(type, eventInitDict_1);
@@ -29936,19 +22605,10 @@
   static NotificationEvent _create_1(type, eventInitDict) => JS(
       'NotificationEvent', 'new NotificationEvent(#,#)', type, eventInitDict);
 
-  @DomName('NotificationEvent.action')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String action;
 
-  @DomName('NotificationEvent.notification')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Notification notification;
 
-  @DomName('NotificationEvent.reply')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String reply;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29957,16 +22617,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('NotificationPermissionCallback')
-// http://www.w3.org/TR/notifications/#notificationpermissioncallback
-@Experimental()
 typedef void _NotificationPermissionCallback(String permission);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLOListElement')
 @Native("HTMLOListElement")
 class OListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -29974,8 +22629,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLOListElement.HTMLOListElement')
-  @DocsEditable()
   factory OListElement() => JS(
       'returns:OListElement;creates:OListElement;new:true',
       '#.createElement(#)',
@@ -29988,24 +22641,16 @@
    */
   OListElement.created() : super.created();
 
-  @DomName('HTMLOListElement.reversed')
-  @DocsEditable()
   bool reversed;
 
-  @DomName('HTMLOListElement.start')
-  @DocsEditable()
   int start;
 
-  @DomName('HTMLOListElement.type')
-  @DocsEditable()
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLObjectElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -30017,8 +22662,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLObjectElement.HTMLObjectElement')
-  @DocsEditable()
   factory ObjectElement() => document.createElement("object");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -30030,87 +22673,47 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('object');
 
-  @DomName('HTMLObjectElement.contentWindow')
-  @DocsEditable()
-  @Experimental() // untriaged
   WindowBase get contentWindow =>
       _convertNativeToDart_Window(this._get_contentWindow);
   @JSName('contentWindow')
-  @DomName('HTMLObjectElement.contentWindow')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_contentWindow;
 
-  @DomName('HTMLObjectElement.data')
-  @DocsEditable()
   String data;
 
-  @DomName('HTMLObjectElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLObjectElement.height')
-  @DocsEditable()
   String height;
 
-  @DomName('HTMLObjectElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLObjectElement.type')
-  @DocsEditable()
   String type;
 
-  @DomName('HTMLObjectElement.useMap')
-  @DocsEditable()
   String useMap;
 
-  @DomName('HTMLObjectElement.validationMessage')
-  @DocsEditable()
   final String validationMessage;
 
-  @DomName('HTMLObjectElement.validity')
-  @DocsEditable()
   final ValidityState validity;
 
-  @DomName('HTMLObjectElement.width')
-  @DocsEditable()
   String width;
 
-  @DomName('HTMLObjectElement.willValidate')
-  @DocsEditable()
   final bool willValidate;
 
-  @DomName('HTMLObjectElement.__getter__')
-  @DocsEditable()
   Node __getter__(String name) native;
 
-  @DomName('HTMLObjectElement.__setter__')
-  @DocsEditable()
   void __setter__(String name, Node value) native;
 
-  @DomName('HTMLObjectElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLObjectElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLObjectElement.setCustomValidity')
-  @DocsEditable()
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OffscreenCanvas')
-@Experimental() // untriaged
 @Native("OffscreenCanvas")
 class OffscreenCanvas extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -30118,27 +22721,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OffscreenCanvas.OffscreenCanvas')
-  @DocsEditable()
   factory OffscreenCanvas(int width, int height) {
     return OffscreenCanvas._create_1(width, height);
   }
   static OffscreenCanvas _create_1(width, height) =>
       JS('OffscreenCanvas', 'new OffscreenCanvas(#,#)', width, height);
 
-  @DomName('OffscreenCanvas.height')
-  @DocsEditable()
-  @Experimental() // untriaged
   int height;
 
-  @DomName('OffscreenCanvas.width')
-  @DocsEditable()
-  @Experimental() // untriaged
   int width;
 
-  @DomName('OffscreenCanvas.convertToBlob')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future convertToBlob([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -30148,19 +22740,10 @@
   }
 
   @JSName('convertToBlob')
-  @DomName('OffscreenCanvas.convertToBlob')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _convertToBlob_1(options) native;
   @JSName('convertToBlob')
-  @DomName('OffscreenCanvas.convertToBlob')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _convertToBlob_2() native;
 
-  @DomName('OffscreenCanvas.getContext')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getContext(String contextType, [Map attributes]) {
     if (attributes != null) {
       var attributes_1 = convertDartToNative_Dictionary(attributes);
@@ -30170,28 +22753,16 @@
   }
 
   @JSName('getContext')
-  @DomName('OffscreenCanvas.getContext')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object _getContext_1(contextType, attributes) native;
   @JSName('getContext')
-  @DomName('OffscreenCanvas.getContext')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object _getContext_2(contextType) native;
 
-  @DomName('OffscreenCanvas.transferToImageBitmap')
-  @DocsEditable()
-  @Experimental() // untriaged
   ImageBitmap transferToImageBitmap() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OffscreenCanvasRenderingContext2D')
-@Experimental() // untriaged
 @Native("OffscreenCanvasRenderingContext2D")
 class OffscreenCanvasRenderingContext2D extends Interceptor
     implements _CanvasPath {
@@ -30200,134 +22771,56 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OffscreenCanvasRenderingContext2D.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
   final OffscreenCanvas canvas;
 
-  @DomName('OffscreenCanvasRenderingContext2D.direction')
-  @DocsEditable()
-  @Experimental() // untriaged
   String direction;
 
-  @DomName('OffscreenCanvasRenderingContext2D.fillStyle')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object fillStyle;
 
-  @DomName('OffscreenCanvasRenderingContext2D.filter')
-  @DocsEditable()
-  @Experimental() // untriaged
   String filter;
 
-  @DomName('OffscreenCanvasRenderingContext2D.font')
-  @DocsEditable()
-  @Experimental() // untriaged
   String font;
 
-  @DomName('OffscreenCanvasRenderingContext2D.globalAlpha')
-  @DocsEditable()
-  @Experimental() // untriaged
   num globalAlpha;
 
-  @DomName('OffscreenCanvasRenderingContext2D.globalCompositeOperation')
-  @DocsEditable()
-  @Experimental() // untriaged
   String globalCompositeOperation;
 
-  @DomName('OffscreenCanvasRenderingContext2D.imageSmoothingEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool imageSmoothingEnabled;
 
-  @DomName('OffscreenCanvasRenderingContext2D.imageSmoothingQuality')
-  @DocsEditable()
-  @Experimental() // untriaged
   String imageSmoothingQuality;
 
-  @DomName('OffscreenCanvasRenderingContext2D.lineCap')
-  @DocsEditable()
-  @Experimental() // untriaged
   String lineCap;
 
-  @DomName('OffscreenCanvasRenderingContext2D.lineDashOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
   num lineDashOffset;
 
-  @DomName('OffscreenCanvasRenderingContext2D.lineJoin')
-  @DocsEditable()
-  @Experimental() // untriaged
   String lineJoin;
 
-  @DomName('OffscreenCanvasRenderingContext2D.lineWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   num lineWidth;
 
-  @DomName('OffscreenCanvasRenderingContext2D.miterLimit')
-  @DocsEditable()
-  @Experimental() // untriaged
   num miterLimit;
 
-  @DomName('OffscreenCanvasRenderingContext2D.shadowBlur')
-  @DocsEditable()
-  @Experimental() // untriaged
   num shadowBlur;
 
-  @DomName('OffscreenCanvasRenderingContext2D.shadowColor')
-  @DocsEditable()
-  @Experimental() // untriaged
   String shadowColor;
 
-  @DomName('OffscreenCanvasRenderingContext2D.shadowOffsetX')
-  @DocsEditable()
-  @Experimental() // untriaged
   num shadowOffsetX;
 
-  @DomName('OffscreenCanvasRenderingContext2D.shadowOffsetY')
-  @DocsEditable()
-  @Experimental() // untriaged
   num shadowOffsetY;
 
-  @DomName('OffscreenCanvasRenderingContext2D.strokeStyle')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object strokeStyle;
 
-  @DomName('OffscreenCanvasRenderingContext2D.textAlign')
-  @DocsEditable()
-  @Experimental() // untriaged
   String textAlign;
 
-  @DomName('OffscreenCanvasRenderingContext2D.textBaseline')
-  @DocsEditable()
-  @Experimental() // untriaged
   String textBaseline;
 
-  @DomName('OffscreenCanvasRenderingContext2D.beginPath')
-  @DocsEditable()
-  @Experimental() // untriaged
   void beginPath() native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.clearRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearRect(num x, num y, num width, num height) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.clip')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clip([Path2D path]) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.commit')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
-  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   ImageData createImageData(data_OR_imagedata_OR_sw,
       [int sh_OR_sw,
       imageDataColorSettings_OR_sh,
@@ -30371,47 +22864,23 @@
   }
 
   @JSName('createImageData')
-  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   _createImageData_1(imagedata) native;
   @JSName('createImageData')
-  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   _createImageData_2(int sw, sh) native;
   @JSName('createImageData')
-  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   _createImageData_3(int sw, sh, imageDataColorSettings) native;
   @JSName('createImageData')
-  @DomName('OffscreenCanvasRenderingContext2D.createImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   _createImageData_4(data, sw, int sh, imageDataColorSettings) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.createLinearGradient')
-  @DocsEditable()
-  @Experimental() // untriaged
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.createPattern')
-  @DocsEditable()
-  @Experimental() // untriaged
   CanvasPattern createPattern(
       /*CanvasImageSource*/ image,
       String repetitionType) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.createRadialGradient')
-  @DocsEditable()
-  @Experimental() // untriaged
   CanvasGradient createRadialGradient(
       num x0, num y0, num r0, num x1, num y1, num r1) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.drawImage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawImage(/*CanvasImageSource*/ image, num sx_OR_x, num sy_OR_y,
       [num sw_OR_width,
       num height_OR_sh,
@@ -30420,58 +22889,28 @@
       num dw,
       num dh]) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.fill')
-  @DocsEditable()
-  @Experimental() // untriaged
   void fill([path_OR_winding, String winding]) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.fillRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void fillRect(num x, num y, num width, num height) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.fillText')
-  @DocsEditable()
-  @Experimental() // untriaged
   void fillText(String text, num x, num y, [num maxWidth]) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.getImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   ImageData getImageData(int sx, int sy, int sw, int sh) {
     return convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
 
   @JSName('getImageData')
-  @DomName('OffscreenCanvasRenderingContext2D.getImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getImageData_1(sx, sy, sw, sh) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.getLineDash')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<num> getLineDash() native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.isPointInPath')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding])
       native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.isPointInStroke')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.measureText')
-  @DocsEditable()
-  @Experimental() // untriaged
   TextMetrics measureText(String text) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.putImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void putImageData(ImageData imagedata, int dx, int dy,
       [int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight]) {
     if (dirtyX == null &&
@@ -30495,133 +22934,62 @@
   }
 
   @JSName('putImageData')
-  @DomName('OffscreenCanvasRenderingContext2D.putImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _putImageData_1(imagedata, dx, dy) native;
   @JSName('putImageData')
-  @DomName('OffscreenCanvasRenderingContext2D.putImageData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _putImageData_2(
       imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.resetTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void resetTransform() native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.restore')
-  @DocsEditable()
-  @Experimental() // untriaged
   void restore() native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.rotate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void rotate(num angle) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.save')
-  @DocsEditable()
-  @Experimental() // untriaged
   void save() native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.scale')
-  @DocsEditable()
-  @Experimental() // untriaged
   void scale(num x, num y) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.setLineDash')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setLineDash(List<num> dash) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.setTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setTransform(num a, num b, num c, num d, num e, num f) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.stroke')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stroke([Path2D path]) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.strokeRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void strokeRect(num x, num y, num width, num height) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.strokeText')
-  @DocsEditable()
-  @Experimental() // untriaged
   void strokeText(String text, num x, num y, [num maxWidth]) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.transform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void transform(num a, num b, num c, num d, num e, num f) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.translate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void translate(num x, num y) native;
 
   // From CanvasPath
 
-  @DomName('OffscreenCanvasRenderingContext2D.arc')
-  @DocsEditable()
-  @Experimental() // untriaged
   void arc(num x, num y, num radius, num startAngle, num endAngle,
       bool anticlockwise) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.arcTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void arcTo(num x1, num y1, num x2, num y2, num radius) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.bezierCurveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
       native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.closePath')
-  @DocsEditable()
-  @Experimental() // untriaged
   void closePath() native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.ellipse')
-  @DocsEditable()
-  @Experimental() // untriaged
   void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
       num startAngle, num endAngle, bool anticlockwise) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.lineTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void lineTo(num x, num y) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.moveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void moveTo(num x, num y) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.quadraticCurveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
 
-  @DomName('OffscreenCanvasRenderingContext2D.rect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void rect(num x, num y, num width, num height) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLOptGroupElement')
 @Native("HTMLOptGroupElement")
 class OptGroupElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -30629,8 +22997,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLOptGroupElement.HTMLOptGroupElement')
-  @DocsEditable()
   factory OptGroupElement() => JS(
       'returns:OptGroupElement;creates:OptGroupElement;new:true',
       '#.createElement(#)',
@@ -30643,19 +23009,14 @@
    */
   OptGroupElement.created() : super.created();
 
-  @DomName('HTMLOptGroupElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLOptGroupElement.label')
-  @DocsEditable()
   String label;
 }
 // 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.
 
-@DomName('HTMLOptionElement')
 @Native("HTMLOptionElement")
 class OptionElement extends HtmlElement {
   factory OptionElement(
@@ -30663,8 +23024,6 @@
     return new OptionElement._(data, value, null, selected);
   }
 
-  @DomName('HTMLOptionElement.HTMLOptionElement')
-  @DocsEditable()
   factory OptionElement._(
       [String data, String value, bool defaultSelected, bool selected]) {
     if (selected != null) {
@@ -30702,41 +23061,24 @@
    */
   OptionElement.created() : super.created();
 
-  @DomName('HTMLOptionElement.defaultSelected')
-  @DocsEditable()
   bool defaultSelected;
 
-  @DomName('HTMLOptionElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLOptionElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLOptionElement.index')
-  @DocsEditable()
   final int index;
 
-  @DomName('HTMLOptionElement.label')
-  @DocsEditable()
   String label;
 
-  @DomName('HTMLOptionElement.selected')
-  @DocsEditable()
   bool selected;
 
-  @DomName('HTMLOptionElement.value')
-  @DocsEditable()
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OrientationSensor')
-@Experimental() // untriaged
 @Native("OrientationSensor")
 class OrientationSensor extends Sensor {
   // To suppress missing implicit constructor warnings.
@@ -30744,22 +23086,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OrientationSensor.quaternion')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<num> quaternion;
 
-  @DomName('OrientationSensor.populateMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   void populateMatrix(Object targetBuffer) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLOutputElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -30770,8 +23104,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLOutputElement.HTMLOutputElement')
-  @DocsEditable()
   factory OutputElement() => document.createElement("output");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -30783,69 +23115,39 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('output');
 
-  @DomName('HTMLOutputElement.defaultValue')
-  @DocsEditable()
   String defaultValue;
 
-  @DomName('HTMLOutputElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLOutputElement.htmlFor')
-  @DocsEditable()
   final DomTokenList htmlFor;
 
-  @DomName('HTMLOutputElement.labels')
-  @DocsEditable()
   @Unstable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> labels;
 
-  @DomName('HTMLOutputElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLOutputElement.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('HTMLOutputElement.validationMessage')
-  @DocsEditable()
   final String validationMessage;
 
-  @DomName('HTMLOutputElement.validity')
-  @DocsEditable()
   final ValidityState validity;
 
-  @DomName('HTMLOutputElement.value')
-  @DocsEditable()
   String value;
 
-  @DomName('HTMLOutputElement.willValidate')
-  @DocsEditable()
   final bool willValidate;
 
-  @DomName('HTMLOutputElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLOutputElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLOutputElement.setCustomValidity')
-  @DocsEditable()
   void setCustomValidity(String error) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OverconstrainedError')
-@Experimental() // untriaged
 @Native("OverconstrainedError")
 class OverconstrainedError extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -30853,8 +23155,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OverconstrainedError.OverconstrainedError')
-  @DocsEditable()
   factory OverconstrainedError(String constraint, String message) {
     return OverconstrainedError._create_1(constraint, message);
   }
@@ -30864,29 +23164,16 @@
       constraint,
       message);
 
-  @DomName('OverconstrainedError.constraint')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String constraint;
 
-  @DomName('OverconstrainedError.message')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String message;
 
-  @DomName('OverconstrainedError.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PageTransitionEvent')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent
-@Experimental()
 @Native("PageTransitionEvent")
 class PageTransitionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -30894,8 +23181,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PageTransitionEvent.PageTransitionEvent')
-  @DocsEditable()
   factory PageTransitionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -30911,17 +23196,12 @@
   static PageTransitionEvent _create_2(type) =>
       JS('PageTransitionEvent', 'new PageTransitionEvent(#)', type);
 
-  @DomName('PageTransitionEvent.persisted')
-  @DocsEditable()
   final bool persisted;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaintRenderingContext2D')
-@Experimental() // untriaged
 @Native("PaintRenderingContext2D")
 class PaintRenderingContext2D extends Interceptor implements _CanvasPath {
   // To suppress missing implicit constructor warnings.
@@ -30929,127 +23209,55 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaintRenderingContext2D.currentTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   Matrix currentTransform;
 
-  @DomName('PaintRenderingContext2D.fillStyle')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object fillStyle;
 
-  @DomName('PaintRenderingContext2D.filter')
-  @DocsEditable()
-  @Experimental() // untriaged
   String filter;
 
-  @DomName('PaintRenderingContext2D.globalAlpha')
-  @DocsEditable()
-  @Experimental() // untriaged
   num globalAlpha;
 
-  @DomName('PaintRenderingContext2D.globalCompositeOperation')
-  @DocsEditable()
-  @Experimental() // untriaged
   String globalCompositeOperation;
 
-  @DomName('PaintRenderingContext2D.imageSmoothingEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool imageSmoothingEnabled;
 
-  @DomName('PaintRenderingContext2D.imageSmoothingQuality')
-  @DocsEditable()
-  @Experimental() // untriaged
   String imageSmoothingQuality;
 
-  @DomName('PaintRenderingContext2D.lineCap')
-  @DocsEditable()
-  @Experimental() // untriaged
   String lineCap;
 
-  @DomName('PaintRenderingContext2D.lineDashOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
   num lineDashOffset;
 
-  @DomName('PaintRenderingContext2D.lineJoin')
-  @DocsEditable()
-  @Experimental() // untriaged
   String lineJoin;
 
-  @DomName('PaintRenderingContext2D.lineWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   num lineWidth;
 
-  @DomName('PaintRenderingContext2D.miterLimit')
-  @DocsEditable()
-  @Experimental() // untriaged
   num miterLimit;
 
-  @DomName('PaintRenderingContext2D.shadowBlur')
-  @DocsEditable()
-  @Experimental() // untriaged
   num shadowBlur;
 
-  @DomName('PaintRenderingContext2D.shadowColor')
-  @DocsEditable()
-  @Experimental() // untriaged
   String shadowColor;
 
-  @DomName('PaintRenderingContext2D.shadowOffsetX')
-  @DocsEditable()
-  @Experimental() // untriaged
   num shadowOffsetX;
 
-  @DomName('PaintRenderingContext2D.shadowOffsetY')
-  @DocsEditable()
-  @Experimental() // untriaged
   num shadowOffsetY;
 
-  @DomName('PaintRenderingContext2D.strokeStyle')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object strokeStyle;
 
-  @DomName('PaintRenderingContext2D.beginPath')
-  @DocsEditable()
-  @Experimental() // untriaged
   void beginPath() native;
 
-  @DomName('PaintRenderingContext2D.clearRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearRect(num x, num y, num width, num height) native;
 
-  @DomName('PaintRenderingContext2D.clip')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clip([path_OR_winding, String winding]) native;
 
-  @DomName('PaintRenderingContext2D.createLinearGradient')
-  @DocsEditable()
-  @Experimental() // untriaged
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
-  @DomName('PaintRenderingContext2D.createPattern')
-  @DocsEditable()
-  @Experimental() // untriaged
   CanvasPattern createPattern(
       /*CanvasImageSource*/ image,
       String repetitionType) native;
 
-  @DomName('PaintRenderingContext2D.createRadialGradient')
-  @DocsEditable()
-  @Experimental() // untriaged
   CanvasGradient createRadialGradient(
       num x0, num y0, num r0, num x1, num y1, num r1) native;
 
-  @DomName('PaintRenderingContext2D.drawImage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawImage(/*CanvasImageSource*/ image, num sx_OR_x, num sy_OR_y,
       [num sw_OR_width,
       num height_OR_sh,
@@ -31058,144 +23266,66 @@
       num dw,
       num dh]) native;
 
-  @DomName('PaintRenderingContext2D.fill')
-  @DocsEditable()
-  @Experimental() // untriaged
   void fill([path_OR_winding, String winding]) native;
 
-  @DomName('PaintRenderingContext2D.fillRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void fillRect(num x, num y, num width, num height) native;
 
-  @DomName('PaintRenderingContext2D.getLineDash')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<num> getLineDash() native;
 
-  @DomName('PaintRenderingContext2D.isPointInPath')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding])
       native;
 
-  @DomName('PaintRenderingContext2D.isPointInStroke')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native;
 
-  @DomName('PaintRenderingContext2D.resetTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void resetTransform() native;
 
-  @DomName('PaintRenderingContext2D.restore')
-  @DocsEditable()
-  @Experimental() // untriaged
   void restore() native;
 
-  @DomName('PaintRenderingContext2D.rotate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void rotate(num angle) native;
 
-  @DomName('PaintRenderingContext2D.save')
-  @DocsEditable()
-  @Experimental() // untriaged
   void save() native;
 
-  @DomName('PaintRenderingContext2D.scale')
-  @DocsEditable()
-  @Experimental() // untriaged
   void scale(num x, num y) native;
 
-  @DomName('PaintRenderingContext2D.setLineDash')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setLineDash(List<num> dash) native;
 
-  @DomName('PaintRenderingContext2D.setTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setTransform(num a, num b, num c, num d, num e, num f) native;
 
-  @DomName('PaintRenderingContext2D.stroke')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stroke([Path2D path]) native;
 
-  @DomName('PaintRenderingContext2D.strokeRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void strokeRect(num x, num y, num width, num height) native;
 
-  @DomName('PaintRenderingContext2D.transform')
-  @DocsEditable()
-  @Experimental() // untriaged
   void transform(num a, num b, num c, num d, num e, num f) native;
 
-  @DomName('PaintRenderingContext2D.translate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void translate(num x, num y) native;
 
   // From CanvasPath
 
-  @DomName('PaintRenderingContext2D.arc')
-  @DocsEditable()
-  @Experimental() // untriaged
   void arc(num x, num y, num radius, num startAngle, num endAngle,
       bool anticlockwise) native;
 
-  @DomName('PaintRenderingContext2D.arcTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void arcTo(num x1, num y1, num x2, num y2, num radius) native;
 
-  @DomName('PaintRenderingContext2D.bezierCurveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
       native;
 
-  @DomName('PaintRenderingContext2D.closePath')
-  @DocsEditable()
-  @Experimental() // untriaged
   void closePath() native;
 
-  @DomName('PaintRenderingContext2D.ellipse')
-  @DocsEditable()
-  @Experimental() // untriaged
   void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
       num startAngle, num endAngle, bool anticlockwise) native;
 
-  @DomName('PaintRenderingContext2D.lineTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void lineTo(num x, num y) native;
 
-  @DomName('PaintRenderingContext2D.moveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void moveTo(num x, num y) native;
 
-  @DomName('PaintRenderingContext2D.quadraticCurveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
 
-  @DomName('PaintRenderingContext2D.rect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void rect(num x, num y, num width, num height) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaintSize')
-@Experimental() // untriaged
 @Native("PaintSize")
 class PaintSize extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -31203,23 +23333,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaintSize.height')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num height;
 
-  @DomName('PaintSize.width')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaintWorkletGlobalScope')
-@Experimental() // untriaged
 @Native("PaintWorkletGlobalScope")
 class PaintWorkletGlobalScope extends WorkletGlobalScope {
   // To suppress missing implicit constructor warnings.
@@ -31227,22 +23348,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaintWorkletGlobalScope.devicePixelRatio')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num devicePixelRatio;
 
-  @DomName('PaintWorkletGlobalScope.registerPaint')
-  @DocsEditable()
-  @Experimental() // untriaged
   void registerPaint(String name, Object paintCtor) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLParagraphElement')
 @Native("HTMLParagraphElement")
 class ParagraphElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -31250,8 +23363,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLParagraphElement.HTMLParagraphElement')
-  @DocsEditable()
   factory ParagraphElement() => JS(
       'returns:ParagraphElement;creates:ParagraphElement;new:true',
       '#.createElement(#)',
@@ -31268,8 +23379,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLParamElement')
 @Unstable()
 @Native("HTMLParamElement")
 class ParamElement extends HtmlElement {
@@ -31278,8 +23387,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLParamElement.HTMLParamElement')
-  @DocsEditable()
   factory ParamElement() => JS(
       'returns:ParamElement;creates:ParamElement;new:true',
       '#.createElement(#)',
@@ -31292,21 +23399,14 @@
    */
   ParamElement.created() : super.created();
 
-  @DomName('HTMLParamElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLParamElement.value')
-  @DocsEditable()
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ParentNode')
-@Experimental() // untriaged
 abstract class ParentNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory ParentNode._() {
@@ -31329,9 +23429,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PasswordCredential')
-@Experimental() // untriaged
 @Native("PasswordCredential")
 class PasswordCredential extends Credential implements CredentialUserData {
   // To suppress missing implicit constructor warnings.
@@ -31339,8 +23436,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PasswordCredential.PasswordCredential')
-  @DocsEditable()
   factory PasswordCredential(data_OR_form) {
     if ((data_OR_form is Map)) {
       var data_1 = convertDartToNative_Dictionary(data_OR_form);
@@ -31356,46 +23451,25 @@
   static PasswordCredential _create_2(data_OR_form) =>
       JS('PasswordCredential', 'new PasswordCredential(#)', data_OR_form);
 
-  @DomName('PasswordCredential.additionalData')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object additionalData;
 
-  @DomName('PasswordCredential.idName')
-  @DocsEditable()
-  @Experimental() // untriaged
   String idName;
 
-  @DomName('PasswordCredential.password')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String password;
 
-  @DomName('PasswordCredential.passwordName')
-  @DocsEditable()
-  @Experimental() // untriaged
   String passwordName;
 
   // From CredentialUserData
 
   @JSName('iconURL')
-  @DomName('PasswordCredential.iconURL')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String iconUrl;
 
-  @DomName('PasswordCredential.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Path2D')
-@Experimental() // untriaged
 @Native("Path2D")
 class Path2D extends Interceptor implements _CanvasPath {
   // To suppress missing implicit constructor warnings.
@@ -31403,8 +23477,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Path2D.Path2D')
-  @DocsEditable()
   factory Path2D([path_OR_text]) {
     if (path_OR_text == null) {
       return Path2D._create_1();
@@ -31423,68 +23495,35 @@
   static Path2D _create_3(path_OR_text) =>
       JS('Path2D', 'new Path2D(#)', path_OR_text);
 
-  @DomName('Path2D.addPath')
-  @DocsEditable()
-  @Experimental() // untriaged
   void addPath(Path2D path, [Matrix transform]) native;
 
   // From CanvasPath
 
-  @DomName('Path2D.arc')
-  @DocsEditable()
-  @Experimental() // untriaged
   void arc(num x, num y, num radius, num startAngle, num endAngle,
       bool anticlockwise) native;
 
-  @DomName('Path2D.arcTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void arcTo(num x1, num y1, num x2, num y2, num radius) native;
 
-  @DomName('Path2D.bezierCurveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
       native;
 
-  @DomName('Path2D.closePath')
-  @DocsEditable()
-  @Experimental() // untriaged
   void closePath() native;
 
-  @DomName('Path2D.ellipse')
-  @DocsEditable()
-  @Experimental() // untriaged
   void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
       num startAngle, num endAngle, bool anticlockwise) native;
 
-  @DomName('Path2D.lineTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void lineTo(num x, num y) native;
 
-  @DomName('Path2D.moveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void moveTo(num x, num y) native;
 
-  @DomName('Path2D.quadraticCurveTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
 
-  @DomName('Path2D.rect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void rect(num x, num y, num width, num height) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaymentAddress')
-@Experimental() // untriaged
 @Native("PaymentAddress")
 class PaymentAddress extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -31492,68 +23531,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaymentAddress.addressLine')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<String> addressLine;
 
-  @DomName('PaymentAddress.city')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String city;
 
-  @DomName('PaymentAddress.country')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String country;
 
-  @DomName('PaymentAddress.dependentLocality')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String dependentLocality;
 
-  @DomName('PaymentAddress.languageCode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String languageCode;
 
-  @DomName('PaymentAddress.organization')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String organization;
 
-  @DomName('PaymentAddress.phone')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String phone;
 
-  @DomName('PaymentAddress.postalCode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String postalCode;
 
-  @DomName('PaymentAddress.recipient')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String recipient;
 
-  @DomName('PaymentAddress.region')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String region;
 
-  @DomName('PaymentAddress.sortingCode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String sortingCode;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaymentInstruments')
-@Experimental() // untriaged
 @Native("PaymentInstruments")
 class PaymentInstruments extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -31561,56 +23564,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaymentInstruments.clear')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future clear() => promiseToFuture(JS("", "#.clear()", this));
 
-  @DomName('PaymentInstruments.delete')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> delete(String instrumentKey) =>
       promiseToFuture<bool>(JS("", "#.delete(#)", this, instrumentKey));
 
-  @DomName('PaymentInstruments.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Map<String, dynamic>> get(String instrumentKey) =>
       promiseToFutureAsMap(JS("", "#.get(#)", this, instrumentKey));
 
-  @DomName('PaymentInstruments.has')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future has(String instrumentKey) =>
       promiseToFuture(JS("", "#.has(#)", this, instrumentKey));
 
-  @DomName('PaymentInstruments.keys')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<String>> keys() =>
       promiseToFuture<List<String>>(JS("", "#.keys()", this));
 
-  @DomName('PaymentInstruments.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future set(String instrumentKey, Map details) {
     var details_1 = convertDartToNative_Dictionary(details);
     return _set_1(instrumentKey, details_1);
   }
 
   @JSName('set')
-  @DomName('PaymentInstruments.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _set_1(instrumentKey, details) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaymentManager')
-@Experimental() // untriaged
 @Native("PaymentManager")
 class PaymentManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -31618,23 +23597,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaymentManager.instruments')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PaymentInstruments instruments;
 
-  @DomName('PaymentManager.userHint')
-  @DocsEditable()
-  @Experimental() // untriaged
   String userHint;
 }
 // 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.
 
-@DocsEditable()
-@DomName('PaymentRequest')
-@Experimental() // untriaged
 @Native("PaymentRequest")
 class PaymentRequest extends EventTarget {
   factory PaymentRequest(List<Map> methodData, Map details, [Map options]) {
@@ -31665,40 +23635,19 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaymentRequest.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('PaymentRequest.shippingAddress')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PaymentAddress shippingAddress;
 
-  @DomName('PaymentRequest.shippingOption')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String shippingOption;
 
-  @DomName('PaymentRequest.shippingType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String shippingType;
 
-  @DomName('PaymentRequest.abort')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future abort() => promiseToFuture(JS("", "#.abort()", this));
 
-  @DomName('PaymentRequest.canMakePayment')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> canMakePayment() =>
       promiseToFuture<bool>(JS("", "#.canMakePayment()", this));
 
-  @DomName('PaymentRequest.show')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PaymentResponse> show() =>
       promiseToFuture<PaymentResponse>(JS("", "#.show()", this));
 }
@@ -31707,9 +23656,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaymentRequestEvent')
-@Experimental() // untriaged
 @Native("PaymentRequestEvent")
 class PaymentRequestEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -31717,8 +23663,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaymentRequestEvent.PaymentRequestEvent')
-  @DocsEditable()
   factory PaymentRequestEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return PaymentRequestEvent._create_1(type, eventInitDict_1);
@@ -31729,59 +23673,29 @@
       type,
       eventInitDict);
 
-  @DomName('PaymentRequestEvent.instrumentKey')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String instrumentKey;
 
-  @DomName('PaymentRequestEvent.methodData')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List methodData;
 
-  @DomName('PaymentRequestEvent.modifiers')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List modifiers;
 
-  @DomName('PaymentRequestEvent.paymentRequestId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String paymentRequestId;
 
-  @DomName('PaymentRequestEvent.paymentRequestOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String paymentRequestOrigin;
 
-  @DomName('PaymentRequestEvent.topLevelOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String topLevelOrigin;
 
-  @DomName('PaymentRequestEvent.total')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object total;
 
-  @DomName('PaymentRequestEvent.openWindow')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<WindowClient> openWindow(String url) =>
       promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
 
-  @DomName('PaymentRequestEvent.respondWith')
-  @DocsEditable()
-  @Experimental() // untriaged
   void respondWith(Future response) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaymentRequestUpdateEvent')
-@Experimental() // untriaged
 @Native("PaymentRequestUpdateEvent")
 class PaymentRequestUpdateEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -31789,8 +23703,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaymentRequestUpdateEvent.PaymentRequestUpdateEvent')
-  @DocsEditable()
   factory PaymentRequestUpdateEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -31806,18 +23718,12 @@
   static PaymentRequestUpdateEvent _create_2(type) =>
       JS('PaymentRequestUpdateEvent', 'new PaymentRequestUpdateEvent(#)', type);
 
-  @DomName('PaymentRequestUpdateEvent.updateWith')
-  @DocsEditable()
-  @Experimental() // untriaged
   void updateWith(Future detailsPromise) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PaymentResponse')
-@Experimental() // untriaged
 @Native("PaymentResponse")
 class PaymentResponse extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -31825,49 +23731,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PaymentResponse.details')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object details;
 
-  @DomName('PaymentResponse.methodName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String methodName;
 
-  @DomName('PaymentResponse.payerEmail')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String payerEmail;
 
-  @DomName('PaymentResponse.payerName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String payerName;
 
-  @DomName('PaymentResponse.payerPhone')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String payerPhone;
 
-  @DomName('PaymentResponse.requestId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String requestId;
 
-  @DomName('PaymentResponse.shippingAddress')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PaymentAddress shippingAddress;
 
-  @DomName('PaymentResponse.shippingOption')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String shippingOption;
 
-  @DomName('PaymentResponse.complete')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future complete([String paymentResult]) =>
       promiseToFuture(JS("", "#.complete(#)", this, paymentResult));
 }
@@ -31875,8 +23754,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Performance')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE)
@@ -31890,88 +23767,38 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.performance)');
 
-  @DomName('Performance.memory')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final MemoryInfo memory;
 
-  @DomName('Performance.navigation')
-  @DocsEditable()
   final PerformanceNavigation navigation;
 
-  @DomName('Performance.timeOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num timeOrigin;
 
-  @DomName('Performance.timing')
-  @DocsEditable()
   final PerformanceTiming timing;
 
-  @DomName('Performance.clearMarks')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
-  @Experimental()
   void clearMarks(String markName) native;
 
-  @DomName('Performance.clearMeasures')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
-  @Experimental()
   void clearMeasures(String measureName) native;
 
-  @DomName('Performance.clearResourceTimings')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearResourceTimings() native;
 
-  @DomName('Performance.getEntries')
-  @DocsEditable()
-  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
-  @Experimental()
   List<PerformanceEntry> getEntries() native;
 
-  @DomName('Performance.getEntriesByName')
-  @DocsEditable()
-  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
-  @Experimental()
   List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
 
-  @DomName('Performance.getEntriesByType')
-  @DocsEditable()
-  // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
-  @Experimental()
   List<PerformanceEntry> getEntriesByType(String entryType) native;
 
-  @DomName('Performance.mark')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
-  @Experimental()
   void mark(String markName) native;
 
-  @DomName('Performance.measure')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
-  @Experimental()
   void measure(String measureName, String startMark, String endMark) native;
 
-  @DomName('Performance.now')
-  @DocsEditable()
   double now() native;
 
-  @DomName('Performance.setResourceTimingBufferSize')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setResourceTimingBufferSize(int maxSize) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceEntry')
-// http://www.w3.org/TR/performance-timeline/#sec-PerformanceEntry-interface
-@Experimental()
 @Native("PerformanceEntry")
 class PerformanceEntry extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -31979,29 +23806,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceEntry.duration')
-  @DocsEditable()
   final num duration;
 
-  @DomName('PerformanceEntry.entryType')
-  @DocsEditable()
   final String entryType;
 
-  @DomName('PerformanceEntry.name')
-  @DocsEditable()
   final String name;
 
-  @DomName('PerformanceEntry.startTime')
-  @DocsEditable()
   final num startTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceLongTaskTiming')
-@Experimental() // untriaged
 @Native("PerformanceLongTaskTiming")
 class PerformanceLongTaskTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
@@ -32009,19 +23825,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceLongTaskTiming.attribution')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<TaskAttributionTiming> attribution;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceMark')
-// http://www.w3.org/TR/user-timing/#performancemark
-@Experimental()
 @Native("PerformanceMark")
 class PerformanceMark extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
@@ -32033,10 +23842,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceMeasure')
-// http://www.w3.org/TR/user-timing/#performancemeasure
-@Experimental()
 @Native("PerformanceMeasure")
 class PerformanceMeasure extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
@@ -32048,8 +23853,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceNavigation')
 @Unstable()
 @Native("PerformanceNavigation")
 class PerformanceNavigation extends Interceptor {
@@ -32058,37 +23861,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceNavigation.TYPE_BACK_FORWARD')
-  @DocsEditable()
   static const int TYPE_BACK_FORWARD = 2;
 
-  @DomName('PerformanceNavigation.TYPE_NAVIGATE')
-  @DocsEditable()
   static const int TYPE_NAVIGATE = 0;
 
-  @DomName('PerformanceNavigation.TYPE_RELOAD')
-  @DocsEditable()
   static const int TYPE_RELOAD = 1;
 
-  @DomName('PerformanceNavigation.TYPE_RESERVED')
-  @DocsEditable()
   static const int TYPE_RESERVED = 255;
 
-  @DomName('PerformanceNavigation.redirectCount')
-  @DocsEditable()
   final int redirectCount;
 
-  @DomName('PerformanceNavigation.type')
-  @DocsEditable()
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceNavigationTiming')
-@Experimental() // untriaged
 @Native("PerformanceNavigationTiming")
 class PerformanceNavigationTiming extends PerformanceResourceTiming {
   // To suppress missing implicit constructor warnings.
@@ -32096,63 +23884,30 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceNavigationTiming.domComplete')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num domComplete;
 
-  @DomName('PerformanceNavigationTiming.domContentLoadedEventEnd')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num domContentLoadedEventEnd;
 
-  @DomName('PerformanceNavigationTiming.domContentLoadedEventStart')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num domContentLoadedEventStart;
 
-  @DomName('PerformanceNavigationTiming.domInteractive')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num domInteractive;
 
-  @DomName('PerformanceNavigationTiming.loadEventEnd')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num loadEventEnd;
 
-  @DomName('PerformanceNavigationTiming.loadEventStart')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num loadEventStart;
 
-  @DomName('PerformanceNavigationTiming.redirectCount')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int redirectCount;
 
-  @DomName('PerformanceNavigationTiming.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('PerformanceNavigationTiming.unloadEventEnd')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num unloadEventEnd;
 
-  @DomName('PerformanceNavigationTiming.unloadEventStart')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num unloadEventStart;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceObserver')
-@Experimental() // untriaged
 @Native("PerformanceObserver")
 class PerformanceObserver extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -32160,22 +23915,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceObserver.PerformanceObserver')
-  @DocsEditable()
   factory PerformanceObserver(PerformanceObserverCallback callback) {
     return PerformanceObserver._create_1(callback);
   }
   static PerformanceObserver _create_1(callback) =>
       JS('PerformanceObserver', 'new PerformanceObserver(#)', callback);
 
-  @DomName('PerformanceObserver.disconnect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void disconnect() native;
 
-  @DomName('PerformanceObserver.observe')
-  @DocsEditable()
-  @Experimental() // untriaged
   void observe(Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     _observe_1(options_1);
@@ -32183,9 +23930,6 @@
   }
 
   @JSName('observe')
-  @DomName('PerformanceObserver.observe')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _observe_1(options) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32194,17 +23938,12 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('PerformanceObserverCallback')
-@Experimental() // untriaged
 typedef void PerformanceObserverCallback(
     PerformanceObserverEntryList entries, PerformanceObserver observer);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceObserverEntryList')
-@Experimental() // untriaged
 @Native("PerformanceObserverEntryList")
 class PerformanceObserverEntryList extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -32212,28 +23951,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceObserverEntryList.getEntries')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<PerformanceEntry> getEntries() native;
 
-  @DomName('PerformanceObserverEntryList.getEntriesByName')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
 
-  @DomName('PerformanceObserverEntryList.getEntriesByType')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<PerformanceEntry> getEntriesByType(String entryType) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformancePaintTiming')
-@Experimental() // untriaged
 @Native("PerformancePaintTiming")
 class PerformancePaintTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
@@ -32245,10 +23972,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceResourceTiming')
-// http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming
-@Experimental()
 @Native("PerformanceResourceTiming")
 class PerformanceResourceTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
@@ -32256,94 +23979,46 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceResourceTiming.connectEnd')
-  @DocsEditable()
   final num connectEnd;
 
-  @DomName('PerformanceResourceTiming.connectStart')
-  @DocsEditable()
   final num connectStart;
 
-  @DomName('PerformanceResourceTiming.decodedBodySize')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int decodedBodySize;
 
-  @DomName('PerformanceResourceTiming.domainLookupEnd')
-  @DocsEditable()
   final num domainLookupEnd;
 
-  @DomName('PerformanceResourceTiming.domainLookupStart')
-  @DocsEditable()
   final num domainLookupStart;
 
-  @DomName('PerformanceResourceTiming.encodedBodySize')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int encodedBodySize;
 
-  @DomName('PerformanceResourceTiming.fetchStart')
-  @DocsEditable()
   final num fetchStart;
 
-  @DomName('PerformanceResourceTiming.initiatorType')
-  @DocsEditable()
   final String initiatorType;
 
-  @DomName('PerformanceResourceTiming.nextHopProtocol')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String nextHopProtocol;
 
-  @DomName('PerformanceResourceTiming.redirectEnd')
-  @DocsEditable()
   final num redirectEnd;
 
-  @DomName('PerformanceResourceTiming.redirectStart')
-  @DocsEditable()
   final num redirectStart;
 
-  @DomName('PerformanceResourceTiming.requestStart')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final num requestStart;
 
-  @DomName('PerformanceResourceTiming.responseEnd')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final num responseEnd;
 
-  @DomName('PerformanceResourceTiming.responseStart')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final num responseStart;
 
-  @DomName('PerformanceResourceTiming.secureConnectionStart')
-  @DocsEditable()
   final num secureConnectionStart;
 
-  @DomName('PerformanceResourceTiming.serverTiming')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<PerformanceServerTiming> serverTiming;
 
-  @DomName('PerformanceResourceTiming.transferSize')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int transferSize;
 
-  @DomName('PerformanceResourceTiming.workerStart')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num workerStart;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceServerTiming')
-@Experimental() // untriaged
 @Native("PerformanceServerTiming")
 class PerformanceServerTiming extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -32351,27 +24026,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceServerTiming.description')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String description;
 
-  @DomName('PerformanceServerTiming.duration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num duration;
 
-  @DomName('PerformanceServerTiming.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PerformanceTiming')
 @Unstable()
 @Native("PerformanceTiming")
 class PerformanceTiming extends Interceptor {
@@ -32380,97 +24044,52 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PerformanceTiming.connectEnd')
-  @DocsEditable()
   final int connectEnd;
 
-  @DomName('PerformanceTiming.connectStart')
-  @DocsEditable()
   final int connectStart;
 
-  @DomName('PerformanceTiming.domComplete')
-  @DocsEditable()
   final int domComplete;
 
-  @DomName('PerformanceTiming.domContentLoadedEventEnd')
-  @DocsEditable()
   final int domContentLoadedEventEnd;
 
-  @DomName('PerformanceTiming.domContentLoadedEventStart')
-  @DocsEditable()
   final int domContentLoadedEventStart;
 
-  @DomName('PerformanceTiming.domInteractive')
-  @DocsEditable()
   final int domInteractive;
 
-  @DomName('PerformanceTiming.domLoading')
-  @DocsEditable()
   final int domLoading;
 
-  @DomName('PerformanceTiming.domainLookupEnd')
-  @DocsEditable()
   final int domainLookupEnd;
 
-  @DomName('PerformanceTiming.domainLookupStart')
-  @DocsEditable()
   final int domainLookupStart;
 
-  @DomName('PerformanceTiming.fetchStart')
-  @DocsEditable()
   final int fetchStart;
 
-  @DomName('PerformanceTiming.loadEventEnd')
-  @DocsEditable()
   final int loadEventEnd;
 
-  @DomName('PerformanceTiming.loadEventStart')
-  @DocsEditable()
   final int loadEventStart;
 
-  @DomName('PerformanceTiming.navigationStart')
-  @DocsEditable()
   final int navigationStart;
 
-  @DomName('PerformanceTiming.redirectEnd')
-  @DocsEditable()
   final int redirectEnd;
 
-  @DomName('PerformanceTiming.redirectStart')
-  @DocsEditable()
   final int redirectStart;
 
-  @DomName('PerformanceTiming.requestStart')
-  @DocsEditable()
   final int requestStart;
 
-  @DomName('PerformanceTiming.responseEnd')
-  @DocsEditable()
   final int responseEnd;
 
-  @DomName('PerformanceTiming.responseStart')
-  @DocsEditable()
   final int responseStart;
 
-  @DomName('PerformanceTiming.secureConnectionStart')
-  @DocsEditable()
   final int secureConnectionStart;
 
-  @DomName('PerformanceTiming.unloadEventEnd')
-  @DocsEditable()
   final int unloadEventEnd;
 
-  @DomName('PerformanceTiming.unloadEventStart')
-  @DocsEditable()
   final int unloadEventStart;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PermissionStatus')
-@Experimental() // untriaged
 @Native("PermissionStatus")
 class PermissionStatus extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -32478,29 +24097,17 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PermissionStatus.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('PermissionStatus.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 
-  @DomName('PermissionStatus.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Permissions')
-@Experimental() // untriaged
 @Native("Permissions")
 class Permissions extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -32508,62 +24115,38 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Permissions.query')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future query(Map permission) {
     var permission_1 = convertDartToNative_Dictionary(permission);
     return _query_1(permission_1);
   }
 
   @JSName('query')
-  @DomName('Permissions.query')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _query_1(permission) native;
 
-  @DomName('Permissions.request')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future request(Map permissions) {
     var permissions_1 = convertDartToNative_Dictionary(permissions);
     return _request_1(permissions_1);
   }
 
   @JSName('request')
-  @DomName('Permissions.request')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _request_1(permissions) native;
 
-  @DomName('Permissions.requestAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PermissionStatus> requestAll(List<Map> permissions) =>
       promiseToFuture<PermissionStatus>(
           JS("", "#.requestAll(#)", this, permissions));
 
-  @DomName('Permissions.revoke')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future revoke(Map permission) {
     var permission_1 = convertDartToNative_Dictionary(permission);
     return _revoke_1(permission_1);
   }
 
   @JSName('revoke')
-  @DomName('Permissions.revoke')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _revoke_1(permission) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PhotoCapabilities')
-@Experimental() // untriaged
 @Native("PhotoCapabilities")
 class PhotoCapabilities extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -32571,33 +24154,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PhotoCapabilities.fillLightMode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List fillLightMode;
 
-  @DomName('PhotoCapabilities.imageHeight')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaSettingsRange imageHeight;
 
-  @DomName('PhotoCapabilities.imageWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaSettingsRange imageWidth;
 
-  @DomName('PhotoCapabilities.redEyeReduction')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String redEyeReduction;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLPictureElement')
-@Experimental() // untriaged
 @Native("HTMLPictureElement")
 class PictureElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -32615,9 +24183,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Plugin')
-@Experimental() // non-standard
 @Native("Plugin")
 class Plugin extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -32625,37 +24190,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Plugin.description')
-  @DocsEditable()
   final String description;
 
-  @DomName('Plugin.filename')
-  @DocsEditable()
   final String filename;
 
-  @DomName('Plugin.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('Plugin.name')
-  @DocsEditable()
   final String name;
 
-  @DomName('Plugin.item')
-  @DocsEditable()
   MimeType item(int index) native;
 
-  @DomName('Plugin.namedItem')
-  @DocsEditable()
   MimeType namedItem(String name) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PluginArray')
-@Experimental() // non-standard
 @Native("PluginArray")
 class PluginArray extends Interceptor
     with ListMixin<Plugin>, ImmutableListMixin<Plugin>
@@ -32665,8 +24215,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PluginArray.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   Plugin operator [](int index) {
@@ -32712,25 +24260,16 @@
   Plugin elementAt(int index) => this[index];
   // -- end List<Plugin> mixins.
 
-  @DomName('PluginArray.item')
-  @DocsEditable()
   Plugin item(int index) native;
 
-  @DomName('PluginArray.namedItem')
-  @DocsEditable()
   Plugin namedItem(String name) native;
 
-  @DomName('PluginArray.refresh')
-  @DocsEditable()
   void refresh(bool reload) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PointerEvent')
-@Experimental() // untriaged
 @Native("PointerEvent")
 class PointerEvent extends MouseEvent {
   // To suppress missing implicit constructor warnings.
@@ -32738,8 +24277,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PointerEvent.PointerEvent')
-  @DocsEditable()
   factory PointerEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -32752,67 +24289,32 @@
   static PointerEvent _create_2(type) =>
       JS('PointerEvent', 'new PointerEvent(#)', type);
 
-  @DomName('PointerEvent.height')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num height;
 
-  @DomName('PointerEvent.isPrimary')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isPrimary;
 
-  @DomName('PointerEvent.pointerId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int pointerId;
 
-  @DomName('PointerEvent.pointerType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String pointerType;
 
-  @DomName('PointerEvent.pressure')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num pressure;
 
-  @DomName('PointerEvent.tangentialPressure')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num tangentialPressure;
 
-  @DomName('PointerEvent.tiltX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int tiltX;
 
-  @DomName('PointerEvent.tiltY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int tiltY;
 
-  @DomName('PointerEvent.twist')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int twist;
 
-  @DomName('PointerEvent.width')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num width;
 
-  @DomName('PointerEvent.getCoalescedEvents')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<PointerEvent> getCoalescedEvents() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PopStateEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -32824,8 +24326,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PopStateEvent.PopStateEvent')
-  @DocsEditable()
   factory PopStateEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -32838,13 +24338,9 @@
   static PopStateEvent _create_2(type) =>
       JS('PopStateEvent', 'new PopStateEvent(#)', type);
 
-  @DomName('PopStateEvent.state')
-  @DocsEditable()
   dynamic get state =>
       convertNativeToDart_SerializedScriptValue(this._get_state);
   @JSName('state')
-  @DomName('PopStateEvent.state')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_state;
@@ -32855,15 +24351,12 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('PositionCallback')
 @Unstable()
 typedef void _PositionCallback(Geoposition position);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PositionError')
 @Unstable()
 @Native("PositionError")
 class PositionError extends Interceptor {
@@ -32872,24 +24365,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PositionError.PERMISSION_DENIED')
-  @DocsEditable()
   static const int PERMISSION_DENIED = 1;
 
-  @DomName('PositionError.POSITION_UNAVAILABLE')
-  @DocsEditable()
   static const int POSITION_UNAVAILABLE = 2;
 
-  @DomName('PositionError.TIMEOUT')
-  @DocsEditable()
   static const int TIMEOUT = 3;
 
-  @DomName('PositionError.code')
-  @DocsEditable()
   final int code;
 
-  @DomName('PositionError.message')
-  @DocsEditable()
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32898,15 +24381,12 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('PositionErrorCallback')
 @Unstable()
 typedef void _PositionErrorCallback(PositionError error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLPreElement')
 @Native("HTMLPreElement")
 class PreElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -32914,8 +24394,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLPreElement.HTMLPreElement')
-  @DocsEditable()
   factory PreElement() => JS('returns:PreElement;creates:PreElement;new:true',
       '#.createElement(#)', document, "pre");
   /**
@@ -32929,9 +24407,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Presentation')
-@Experimental() // untriaged
 @Native("Presentation")
 class Presentation extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -32939,23 +24414,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Presentation.defaultRequest')
-  @DocsEditable()
-  @Experimental() // untriaged
   PresentationRequest defaultRequest;
 
-  @DomName('Presentation.receiver')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PresentationReceiver receiver;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PresentationAvailability')
-@Experimental() // untriaged
 @Native("PresentationAvailability")
 class PresentationAvailability extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -32963,29 +24429,17 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PresentationAvailability.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('PresentationAvailability.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool value;
 
-  @DomName('PresentationAvailability.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PresentationConnection')
-@Experimental() // untriaged
 @Native("PresentationConnection")
 class PresentationConnection extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -32993,59 +24447,29 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PresentationConnection.messageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('PresentationConnection.binaryType')
-  @DocsEditable()
-  @Experimental() // untriaged
   String binaryType;
 
-  @DomName('PresentationConnection.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('PresentationConnection.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 
-  @DomName('PresentationConnection.url')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String url;
 
-  @DomName('PresentationConnection.close')
-  @DocsEditable()
-  @Experimental() // untriaged
   void close() native;
 
-  @DomName('PresentationConnection.send')
-  @DocsEditable()
-  @Experimental() // untriaged
   void send(data_OR_message) native;
 
-  @DomName('PresentationConnection.terminate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void terminate() native;
 
-  @DomName('PresentationConnection.onmessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PresentationConnectionAvailableEvent')
-@Experimental() // untriaged
 @Native("PresentationConnectionAvailableEvent")
 class PresentationConnectionAvailableEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -33053,9 +24477,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName(
-      'PresentationConnectionAvailableEvent.PresentationConnectionAvailableEvent')
-  @DocsEditable()
   factory PresentationConnectionAvailableEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return PresentationConnectionAvailableEvent._create_1(
@@ -33065,18 +24486,12 @@
       JS('PresentationConnectionAvailableEvent',
           'new PresentationConnectionAvailableEvent(#,#)', type, eventInitDict);
 
-  @DomName('PresentationConnectionAvailableEvent.connection')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PresentationConnection connection;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PresentationConnectionCloseEvent')
-@Experimental() // untriaged
 @Native("PresentationConnectionCloseEvent")
 class PresentationConnectionCloseEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -33084,8 +24499,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PresentationConnectionCloseEvent.PresentationConnectionCloseEvent')
-  @DocsEditable()
   factory PresentationConnectionCloseEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return PresentationConnectionCloseEvent._create_1(type, eventInitDict_1);
@@ -33096,23 +24509,14 @@
       type,
       eventInitDict);
 
-  @DomName('PresentationConnectionCloseEvent.message')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String message;
 
-  @DomName('PresentationConnectionCloseEvent.reason')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String reason;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PresentationConnectionList')
-@Experimental() // untriaged
 @Native("PresentationConnectionList")
 class PresentationConnectionList extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -33120,18 +24524,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PresentationConnectionList.connections')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<PresentationConnection> connections;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PresentationReceiver')
-@Experimental() // untriaged
 @Native("PresentationReceiver")
 class PresentationReceiver extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33139,9 +24537,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PresentationReceiver.connectionList')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PresentationConnectionList> get connectionList =>
       promiseToFuture<PresentationConnectionList>(
           JS("", "#.connectionList", this));
@@ -33150,9 +24545,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PresentationRequest')
-@Experimental() // untriaged
 @Native("PresentationRequest")
 class PresentationRequest extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -33160,8 +24552,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PresentationRequest.PresentationRequest')
-  @DocsEditable()
   factory PresentationRequest(url_OR_urls) {
     if ((url_OR_urls is String)) {
       return PresentationRequest._create_1(url_OR_urls);
@@ -33177,23 +24567,14 @@
   static PresentationRequest _create_2(url_OR_urls) =>
       JS('PresentationRequest', 'new PresentationRequest(#)', url_OR_urls);
 
-  @DomName('PresentationRequest.getAvailability')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PresentationAvailability> getAvailability() =>
       promiseToFuture<PresentationAvailability>(
           JS("", "#.getAvailability()", this));
 
-  @DomName('PresentationRequest.reconnect')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PresentationConnection> reconnect(String id) =>
       promiseToFuture<PresentationConnection>(
           JS("", "#.reconnect(#)", this, id));
 
-  @DomName('PresentationRequest.start')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PresentationConnection> start() =>
       promiseToFuture<PresentationConnection>(JS("", "#.start()", this));
 }
@@ -33201,8 +24582,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ProcessingInstruction')
 @Unstable()
 @Native("ProcessingInstruction")
 class ProcessingInstruction extends CharacterData {
@@ -33211,21 +24590,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ProcessingInstruction.sheet')
-  @DocsEditable()
-  @Experimental() // non-standard
   final StyleSheet sheet;
 
-  @DomName('ProcessingInstruction.target')
-  @DocsEditable()
   final String target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLProgressElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -33237,8 +24609,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLProgressElement.HTMLProgressElement')
-  @DocsEditable()
   factory ProgressElement() => document.createElement("progress");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -33250,31 +24620,21 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('progress');
 
-  @DomName('HTMLProgressElement.labels')
-  @DocsEditable()
   @Unstable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> labels;
 
-  @DomName('HTMLProgressElement.max')
-  @DocsEditable()
   num max;
 
-  @DomName('HTMLProgressElement.position')
-  @DocsEditable()
   final num position;
 
-  @DomName('HTMLProgressElement.value')
-  @DocsEditable()
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ProgressEvent')
 @Native("ProgressEvent")
 class ProgressEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -33282,8 +24642,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ProgressEvent.ProgressEvent')
-  @DocsEditable()
   factory ProgressEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -33296,25 +24654,16 @@
   static ProgressEvent _create_2(type) =>
       JS('ProgressEvent', 'new ProgressEvent(#)', type);
 
-  @DomName('ProgressEvent.lengthComputable')
-  @DocsEditable()
   final bool lengthComputable;
 
-  @DomName('ProgressEvent.loaded')
-  @DocsEditable()
   final int loaded;
 
-  @DomName('ProgressEvent.total')
-  @DocsEditable()
   final int total;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PromiseRejectionEvent')
-@Experimental() // untriaged
 @Native("PromiseRejectionEvent")
 class PromiseRejectionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -33322,8 +24671,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PromiseRejectionEvent.PromiseRejectionEvent')
-  @DocsEditable()
   factory PromiseRejectionEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return PromiseRejectionEvent._create_1(type, eventInitDict_1);
@@ -33334,23 +24681,14 @@
       type,
       eventInitDict);
 
-  @DomName('PromiseRejectionEvent.promise')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future get promise => promiseToFuture(JS("", "#.promise", this));
 
-  @DomName('PromiseRejectionEvent.reason')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object reason;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PublicKeyCredential')
-@Experimental() // untriaged
 @Native("PublicKeyCredential")
 class PublicKeyCredential extends Credential {
   // To suppress missing implicit constructor warnings.
@@ -33358,23 +24696,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PublicKeyCredential.rawId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteBuffer rawId;
 
-  @DomName('PublicKeyCredential.response')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AuthenticatorResponse response;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PushEvent')
-@Experimental() // untriaged
 @Native("PushEvent")
 class PushEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -33382,8 +24711,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PushEvent.PushEvent')
-  @DocsEditable()
   factory PushEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -33395,18 +24722,12 @@
       JS('PushEvent', 'new PushEvent(#,#)', type, eventInitDict);
   static PushEvent _create_2(type) => JS('PushEvent', 'new PushEvent(#)', type);
 
-  @DomName('PushEvent.data')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PushMessageData data;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PushManager')
-@Experimental() // untriaged
 @Native("PushManager")
 class PushManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33414,20 +24735,11 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PushManager.supportedContentEncodings')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final List<String> supportedContentEncodings;
+  static final List<String> supportedContentEncodings;
 
-  @DomName('PushManager.getSubscription')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<PushSubscription> getSubscription() =>
       promiseToFuture<PushSubscription>(JS("", "#.getSubscription()", this));
 
-  @DomName('PushManager.permissionState')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future permissionState([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -33437,19 +24749,10 @@
   }
 
   @JSName('permissionState')
-  @DomName('PushManager.permissionState')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _permissionState_1(options) native;
   @JSName('permissionState')
-  @DomName('PushManager.permissionState')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _permissionState_2() native;
 
-  @DomName('PushManager.subscribe')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future subscribe([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -33459,23 +24762,14 @@
   }
 
   @JSName('subscribe')
-  @DomName('PushManager.subscribe')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _subscribe_1(options) native;
   @JSName('subscribe')
-  @DomName('PushManager.subscribe')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _subscribe_2() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PushMessageData')
-@Experimental() // untriaged
 @Native("PushMessageData")
 class PushMessageData extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33483,33 +24777,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PushMessageData.arrayBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   ByteBuffer arrayBuffer() native;
 
-  @DomName('PushMessageData.blob')
-  @DocsEditable()
-  @Experimental() // untriaged
   Blob blob() native;
 
-  @DomName('PushMessageData.json')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object json() native;
 
-  @DomName('PushMessageData.text')
-  @DocsEditable()
-  @Experimental() // untriaged
   String text() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PushSubscription')
-@Experimental() // untriaged
 @Native("PushSubscription")
 class PushSubscription extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33517,29 +24796,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PushSubscription.endpoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String endpoint;
 
-  @DomName('PushSubscription.expirationTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int expirationTime;
 
-  @DomName('PushSubscription.options')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PushSubscriptionOptions options;
 
-  @DomName('PushSubscription.getKey')
-  @DocsEditable()
-  @Experimental() // untriaged
   ByteBuffer getKey(String name) native;
 
-  @DomName('PushSubscription.unsubscribe')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> unsubscribe() =>
       promiseToFuture<bool>(JS("", "#.unsubscribe()", this));
 }
@@ -33547,9 +24811,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PushSubscriptionOptions')
-@Experimental() // untriaged
 @Native("PushSubscriptionOptions")
 class PushSubscriptionOptions extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33557,22 +24818,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PushSubscriptionOptions.applicationServerKey')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ByteBuffer applicationServerKey;
 
-  @DomName('PushSubscriptionOptions.userVisibleOnly')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool userVisibleOnly;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLQuoteElement')
 @Native("HTMLQuoteElement")
 class QuoteElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -33580,8 +24833,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLQuoteElement.HTMLQuoteElement')
-  @DocsEditable()
   factory QuoteElement() => JS(
       'returns:QuoteElement;creates:QuoteElement;new:true',
       '#.createElement(#)',
@@ -33594,8 +24845,6 @@
    */
   QuoteElement.created() : super.created();
 
-  @DomName('HTMLQuoteElement.cite')
-  @DocsEditable()
   String cite;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33604,8 +24853,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('RTCPeerConnectionErrorCallback')
-@Experimental() // untriaged
 typedef void RtcPeerConnectionErrorCallback(DomException exception);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33613,9 +24860,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('RTCSessionDescriptionCallback')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription
-@Experimental()
 typedef void _RtcSessionDescriptionCallback(RtcSessionDescription sdp);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33623,9 +24867,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('RTCStatsCallback')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsCallback
-@Experimental()
 typedef void RtcStatsCallback(RtcStatsResponse response);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33633,7 +24874,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('Range')
 @Unstable()
 @Native("Range")
 class Range extends Interceptor {
@@ -33646,145 +24886,75 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Range.END_TO_END')
-  @DocsEditable()
   static const int END_TO_END = 2;
 
-  @DomName('Range.END_TO_START')
-  @DocsEditable()
   static const int END_TO_START = 3;
 
-  @DomName('Range.START_TO_END')
-  @DocsEditable()
   static const int START_TO_END = 1;
 
-  @DomName('Range.START_TO_START')
-  @DocsEditable()
   static const int START_TO_START = 0;
 
-  @DomName('Range.collapsed')
-  @DocsEditable()
   final bool collapsed;
 
-  @DomName('Range.commonAncestorContainer')
-  @DocsEditable()
   final Node commonAncestorContainer;
 
-  @DomName('Range.endContainer')
-  @DocsEditable()
   final Node endContainer;
 
-  @DomName('Range.endOffset')
-  @DocsEditable()
   final int endOffset;
 
-  @DomName('Range.startContainer')
-  @DocsEditable()
   final Node startContainer;
 
-  @DomName('Range.startOffset')
-  @DocsEditable()
   final int startOffset;
 
-  @DomName('Range.cloneContents')
-  @DocsEditable()
   DocumentFragment cloneContents() native;
 
-  @DomName('Range.cloneRange')
-  @DocsEditable()
   Range cloneRange() native;
 
-  @DomName('Range.collapse')
-  @DocsEditable()
   void collapse([bool toStart]) native;
 
-  @DomName('Range.compareBoundaryPoints')
-  @DocsEditable()
-  @Experimental() // untriaged
   int compareBoundaryPoints(int how, Range sourceRange) native;
 
-  @DomName('Range.comparePoint')
-  @DocsEditable()
   int comparePoint(Node node, int offset) native;
 
-  @DomName('Range.createContextualFragment')
-  @DocsEditable()
   DocumentFragment createContextualFragment(String fragment) native;
 
-  @DomName('Range.deleteContents')
-  @DocsEditable()
   void deleteContents() native;
 
-  @DomName('Range.detach')
-  @DocsEditable()
   void detach() native;
 
-  @DomName('Range.expand')
-  @DocsEditable()
-  @Experimental() // non-standard
   void expand(String unit) native;
 
-  @DomName('Range.extractContents')
-  @DocsEditable()
   DocumentFragment extractContents() native;
 
-  @DomName('Range.getBoundingClientRect')
-  @DocsEditable()
   Rectangle getBoundingClientRect() native;
 
   @JSName('getClientRects')
-  @DomName('Range.getClientRects')
-  @DocsEditable()
   @Returns('DomRectList|Null')
   @Creates('DomRectList')
   List<Rectangle> _getClientRects() native;
 
-  @DomName('Range.insertNode')
-  @DocsEditable()
   void insertNode(Node node) native;
 
-  @DomName('Range.isPointInRange')
-  @DocsEditable()
   bool isPointInRange(Node node, int offset) native;
 
-  @DomName('Range.selectNode')
-  @DocsEditable()
   void selectNode(Node node) native;
 
-  @DomName('Range.selectNodeContents')
-  @DocsEditable()
   void selectNodeContents(Node node) native;
 
-  @DomName('Range.setEnd')
-  @DocsEditable()
   void setEnd(Node node, int offset) native;
 
-  @DomName('Range.setEndAfter')
-  @DocsEditable()
   void setEndAfter(Node node) native;
 
-  @DomName('Range.setEndBefore')
-  @DocsEditable()
   void setEndBefore(Node node) native;
 
-  @DomName('Range.setStart')
-  @DocsEditable()
   void setStart(Node node, int offset) native;
 
-  @DomName('Range.setStartAfter')
-  @DocsEditable()
   void setStartAfter(Node node) native;
 
-  @DomName('Range.setStartBefore')
-  @DocsEditable()
   void setStartBefore(Node node) native;
 
-  @DomName('Range.surroundContents')
-  @DocsEditable()
   void surroundContents(Node newParent) native;
 
-  @DomName('Range.getClientRects')
-  @DocsEditable()
   List<Rectangle> getClientRects() {
     var value = _getClientRects();
 
@@ -33813,9 +24983,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RelatedApplication')
-@Experimental() // untriaged
 @Native("RelatedApplication")
 class RelatedApplication extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33823,28 +24990,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RelatedApplication.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('RelatedApplication.platform')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String platform;
 
-  @DomName('RelatedApplication.url')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String url;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RelativeOrientationSensor')
-@Experimental() // untriaged
 @Native("RelativeOrientationSensor")
 class RelativeOrientationSensor extends OrientationSensor {
   // To suppress missing implicit constructor warnings.
@@ -33852,8 +25007,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RelativeOrientationSensor.RelativeOrientationSensor')
-  @DocsEditable()
   factory RelativeOrientationSensor([Map sensorOptions]) {
     if (sensorOptions != null) {
       var sensorOptions_1 = convertDartToNative_Dictionary(sensorOptions);
@@ -33872,9 +25025,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RemotePlayback')
-@Experimental() // untriaged
 @Native("RemotePlayback")
 class RemotePlayback extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -33882,25 +25032,13 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RemotePlayback.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 
-  @DomName('RemotePlayback.cancelWatchAvailability')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future cancelWatchAvailability([int id]) =>
       promiseToFuture(JS("", "#.cancelWatchAvailability(#)", this, id));
 
-  @DomName('RemotePlayback.prompt')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
 
-  @DomName('RemotePlayback.watchAvailability')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<int> watchAvailability(RemotePlaybackAvailabilityCallback callback) =>
       promiseToFuture<int>(JS("", "#.watchAvailability(#)", this, callback));
 }
@@ -33910,16 +25048,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('RemotePlaybackAvailabilityCallback')
-@Experimental() // untriaged
 typedef void RemotePlaybackAvailabilityCallback(bool available);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ReportBody')
-@Experimental() // untriaged
 @Native("ReportBody")
 class ReportBody extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33931,9 +25064,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ReportingObserver')
-@Experimental() // untriaged
 @Native("ReportingObserver")
 class ReportingObserver extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33941,22 +25071,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ReportingObserver.ReportingObserver')
-  @DocsEditable()
   factory ReportingObserver(ReportingObserverCallback callback) {
     return ReportingObserver._create_1(callback);
   }
   static ReportingObserver _create_1(callback) =>
       JS('ReportingObserver', 'new ReportingObserver(#)', callback);
 
-  @DomName('ReportingObserver.disconnect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void disconnect() native;
 
-  @DomName('ReportingObserver.observe')
-  @DocsEditable()
-  @Experimental() // untriaged
   void observe() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33965,8 +25087,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('ReportingObserverCallback')
-@Experimental() // untriaged
 typedef void ReportingObserverCallback(
     List<_Report> reports, ReportingObserver observer);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33975,15 +25095,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('RequestAnimationFrameCallback')
 typedef void RequestAnimationFrameCallback(num highResTime);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ResizeObserver')
-@Experimental() // untriaged
 @Native("ResizeObserver")
 class ResizeObserver extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -33991,27 +25107,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ResizeObserver.ResizeObserver')
-  @DocsEditable()
   factory ResizeObserver(ResizeObserverCallback callback) {
     return ResizeObserver._create_1(callback);
   }
   static ResizeObserver _create_1(callback) =>
       JS('ResizeObserver', 'new ResizeObserver(#)', callback);
 
-  @DomName('ResizeObserver.disconnect')
-  @DocsEditable()
-  @Experimental() // untriaged
   void disconnect() native;
 
-  @DomName('ResizeObserver.observe')
-  @DocsEditable()
-  @Experimental() // untriaged
   void observe(Element target) native;
 
-  @DomName('ResizeObserver.unobserve')
-  @DocsEditable()
-  @Experimental() // untriaged
   void unobserve(Element target) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34020,17 +25125,12 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('ResizeObserverCallback')
-@Experimental() // untriaged
 typedef void ResizeObserverCallback(
     List<ResizeObserverEntry> entries, ResizeObserver observer);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ResizeObserverEntry')
-@Experimental() // untriaged
 @Native("ResizeObserverEntry")
 class ResizeObserverEntry extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -34038,23 +25138,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ResizeObserverEntry.contentRect')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomRectReadOnly contentRect;
 
-  @DomName('ResizeObserverEntry.target')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element target;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCCertificate')
-@Experimental() // untriaged
 @Native("RTCCertificate")
 class RtcCertificate extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -34062,24 +25153,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCCertificate.expires')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int expires;
 
-  @DomName('RTCCertificate.getFingerprints')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Map> getFingerprints() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCDataChannel')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannel
-@Experimental()
 @Native("RTCDataChannel,DataChannel")
 class RtcDataChannel extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -34093,8 +25174,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCDataChannel.closeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> closeEvent =
       const EventStreamProvider<Event>('close');
 
@@ -34104,8 +25183,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCDataChannel.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -34115,8 +25192,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCDataChannel.messageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
@@ -34126,122 +25201,65 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCDataChannel.openEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> openEvent =
       const EventStreamProvider<Event>('open');
 
-  @DomName('RTCDataChannel.binaryType')
-  @DocsEditable()
   String binaryType;
 
-  @DomName('RTCDataChannel.bufferedAmount')
-  @DocsEditable()
   final int bufferedAmount;
 
-  @DomName('RTCDataChannel.bufferedAmountLowThreshold')
-  @DocsEditable()
-  @Experimental() // untriaged
   int bufferedAmountLowThreshold;
 
-  @DomName('RTCDataChannel.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int id;
 
-  @DomName('RTCDataChannel.label')
-  @DocsEditable()
   final String label;
 
-  @DomName('RTCDataChannel.maxRetransmitTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int maxRetransmitTime;
 
-  @DomName('RTCDataChannel.maxRetransmits')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int maxRetransmits;
 
-  @DomName('RTCDataChannel.negotiated')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool negotiated;
 
-  @DomName('RTCDataChannel.ordered')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool ordered;
 
-  @DomName('RTCDataChannel.protocol')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String protocol;
 
-  @DomName('RTCDataChannel.readyState')
-  @DocsEditable()
   final String readyState;
 
-  @DomName('RTCDataChannel.reliable')
-  @DocsEditable()
   final bool reliable;
 
-  @DomName('RTCDataChannel.close')
-  @DocsEditable()
   void close() native;
 
-  @DomName('RTCDataChannel.send')
-  @DocsEditable()
   void send(data) native;
 
   @JSName('send')
-  @DomName('RTCDataChannel.send')
-  @DocsEditable()
   void sendBlob(Blob data) native;
 
   @JSName('send')
-  @DomName('RTCDataChannel.send')
-  @DocsEditable()
   void sendByteBuffer(ByteBuffer data) native;
 
   @JSName('send')
-  @DomName('RTCDataChannel.send')
-  @DocsEditable()
   void sendString(String data) native;
 
   @JSName('send')
-  @DomName('RTCDataChannel.send')
-  @DocsEditable()
   void sendTypedData(TypedData data) native;
 
   /// Stream of `close` events handled by this [RtcDataChannel].
-  @DomName('RTCDataChannel.onclose')
-  @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [RtcDataChannel].
-  @DomName('RTCDataChannel.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `message` events handled by this [RtcDataChannel].
-  @DomName('RTCDataChannel.onmessage')
-  @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
   /// Stream of `open` events handled by this [RtcDataChannel].
-  @DomName('RTCDataChannel.onopen')
-  @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCDataChannelEvent')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcdatachannelevent
-@Experimental()
 @Native("RTCDataChannelEvent")
 class RtcDataChannelEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -34249,8 +25267,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCDataChannelEvent.RTCDataChannelEvent')
-  @DocsEditable()
   factory RtcDataChannelEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return RtcDataChannelEvent._create_1(type, eventInitDict_1);
@@ -34261,18 +25277,12 @@
       type,
       eventInitDict);
 
-  @DomName('RTCDataChannelEvent.channel')
-  @DocsEditable()
   final RtcDataChannel channel;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCDTMFSender')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFSender
-@Experimental()
 @Native("RTCDTMFSender")
 class RtcDtmfSender extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -34286,40 +25296,24 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCDTMFSender.tonechangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent =
       const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
 
   @JSName('canInsertDTMF')
-  @DomName('RTCDTMFSender.canInsertDTMF')
-  @DocsEditable()
   final bool canInsertDtmf;
 
-  @DomName('RTCDTMFSender.duration')
-  @DocsEditable()
   final int duration;
 
-  @DomName('RTCDTMFSender.interToneGap')
-  @DocsEditable()
   final int interToneGap;
 
-  @DomName('RTCDTMFSender.toneBuffer')
-  @DocsEditable()
   final String toneBuffer;
 
-  @DomName('RTCDTMFSender.track')
-  @DocsEditable()
   final MediaStreamTrack track;
 
   @JSName('insertDTMF')
-  @DomName('RTCDTMFSender.insertDTMF')
-  @DocsEditable()
   void insertDtmf(String tones, [int duration, int interToneGap]) native;
 
   /// Stream of `tonechange` events handled by this [RtcDtmfSender].
-  @DomName('RTCDTMFSender.ontonechange')
-  @DocsEditable()
   Stream<RtcDtmfToneChangeEvent> get onToneChange =>
       toneChangeEvent.forTarget(this);
 }
@@ -34327,10 +25321,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCDTMFToneChangeEvent')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFToneChangeEvent
-@Experimental()
 @Native("RTCDTMFToneChangeEvent")
 class RtcDtmfToneChangeEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -34338,8 +25328,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCDTMFToneChangeEvent.RTCDTMFToneChangeEvent')
-  @DocsEditable()
   factory RtcDtmfToneChangeEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
@@ -34350,18 +25338,13 @@
       type,
       eventInitDict);
 
-  @DomName('RTCDTMFToneChangeEvent.tone')
-  @DocsEditable()
   final String tone;
 }
 // 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.
 
-@DomName('RTCIceCandidate')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCIceCandidate
 @Native("RTCIceCandidate,mozRTCIceCandidate")
 class RtcIceCandidate extends Interceptor {
   factory RtcIceCandidate(Map dictionary) {
@@ -34382,25 +25365,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCIceCandidate.candidate')
-  @DocsEditable()
   String candidate;
 
-  @DomName('RTCIceCandidate.sdpMLineIndex')
-  @DocsEditable()
   int sdpMLineIndex;
 
-  @DomName('RTCIceCandidate.sdpMid')
-  @DocsEditable()
   String sdpMid;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCLegacyStatsReport')
-@Experimental() // untriaged
 @Native("RTCLegacyStatsReport")
 class RtcLegacyStatsReport extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -34408,44 +25382,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCLegacyStatsReport.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('RTCLegacyStatsReport.timestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   DateTime get timestamp => convertNativeToDart_DateTime(this._get_timestamp);
   @JSName('timestamp')
-  @DomName('RTCLegacyStatsReport.timestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   final dynamic _get_timestamp;
 
-  @DomName('RTCLegacyStatsReport.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('RTCLegacyStatsReport.names')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<String> names() native;
 
-  @DomName('RTCLegacyStatsReport.stat')
-  @DocsEditable()
-  @Experimental() // untriaged
   String stat(String name) native;
 }
 // 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.
 
-@DomName('RTCPeerConnection')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCPeerConnection
 @Native("RTCPeerConnection,webkitRTCPeerConnection,mozRTCPeerConnection")
 class RtcPeerConnection extends EventTarget {
   factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
@@ -34506,9 +25459,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.generateCertificate')
-  @DocsEditable()
-  @Experimental() // untriaged
   static Future generateCertificate(/*AlgorithmIdentifier*/ keygenAlgorithm) =>
       JS('dynamic', 'generateCertificate(#)', keygenAlgorithm);
 
@@ -34523,8 +25473,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCPeerConnection.addstreamEvent')
-  @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> addStreamEvent =
       const EventStreamProvider<MediaStreamEvent>('addstream');
 
@@ -34534,8 +25482,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCPeerConnection.datachannelEvent')
-  @DocsEditable()
   static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent =
       const EventStreamProvider<RtcDataChannelEvent>('datachannel');
 
@@ -34545,8 +25491,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCPeerConnection.icecandidateEvent')
-  @DocsEditable()
   static const EventStreamProvider<RtcPeerConnectionIceEvent>
       iceCandidateEvent =
       const EventStreamProvider<RtcPeerConnectionIceEvent>('icecandidate');
@@ -34557,8 +25501,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> iceConnectionStateChangeEvent =
       const EventStreamProvider<Event>('iceconnectionstatechange');
 
@@ -34568,8 +25510,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCPeerConnection.negotiationneededEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> negotiationNeededEvent =
       const EventStreamProvider<Event>('negotiationneeded');
 
@@ -34579,8 +25519,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCPeerConnection.removestreamEvent')
-  @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> removeStreamEvent =
       const EventStreamProvider<MediaStreamEvent>('removestream');
 
@@ -34590,41 +25528,25 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('RTCPeerConnection.signalingstatechangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> signalingStateChangeEvent =
       const EventStreamProvider<Event>('signalingstatechange');
 
-  @DomName('RTCPeerConnection.iceConnectionState')
-  @DocsEditable()
   final String iceConnectionState;
 
-  @DomName('RTCPeerConnection.iceGatheringState')
-  @DocsEditable()
   final String iceGatheringState;
 
-  @DomName('RTCPeerConnection.localDescription')
-  @DocsEditable()
   final RtcSessionDescription localDescription;
 
-  @DomName('RTCPeerConnection.remoteDescription')
-  @DocsEditable()
   final RtcSessionDescription remoteDescription;
 
-  @DomName('RTCPeerConnection.signalingState')
-  @DocsEditable()
   final String signalingState;
 
-  @DomName('RTCPeerConnection.addIceCandidate')
-  @DocsEditable()
   Future addIceCandidate(Object candidate,
           [VoidCallback successCallback,
           RtcPeerConnectionErrorCallback failureCallback]) =>
       promiseToFuture(JS("", "#.addIceCandidate(#, #, #)", this, candidate,
           successCallback, failureCallback));
 
-  @DomName('RTCPeerConnection.addStream')
-  @DocsEditable()
   void addStream(MediaStream stream, [Map mediaConstraints]) {
     if (mediaConstraints != null) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
@@ -34636,25 +25558,14 @@
   }
 
   @JSName('addStream')
-  @DomName('RTCPeerConnection.addStream')
-  @DocsEditable()
   void _addStream_1(MediaStream stream, mediaConstraints) native;
   @JSName('addStream')
-  @DomName('RTCPeerConnection.addStream')
-  @DocsEditable()
   void _addStream_2(MediaStream stream) native;
 
-  @DomName('RTCPeerConnection.addTrack')
-  @DocsEditable()
-  @Experimental() // untriaged
   RtcRtpSender addTrack(MediaStreamTrack track, MediaStream streams) native;
 
-  @DomName('RTCPeerConnection.close')
-  @DocsEditable()
   void close() native;
 
-  @DomName('RTCPeerConnection.createAnswer')
-  @DocsEditable()
   Future _createAnswer(
       [options_OR_successCallback,
       RtcPeerConnectionErrorCallback failureCallback,
@@ -34687,31 +25598,19 @@
   }
 
   @JSName('createAnswer')
-  @DomName('RTCPeerConnection.createAnswer')
-  @DocsEditable()
   Future _createAnswer_1() native;
   @JSName('createAnswer')
-  @DomName('RTCPeerConnection.createAnswer')
-  @DocsEditable()
   Future _createAnswer_2(options) native;
   @JSName('createAnswer')
-  @DomName('RTCPeerConnection.createAnswer')
-  @DocsEditable()
   Future _createAnswer_3(_RtcSessionDescriptionCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback) native;
   @JSName('createAnswer')
-  @DomName('RTCPeerConnection.createAnswer')
-  @DocsEditable()
   Future _createAnswer_4(_RtcSessionDescriptionCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback, mediaConstraints) native;
 
   @JSName('createDTMFSender')
-  @DomName('RTCPeerConnection.createDTMFSender')
-  @DocsEditable()
   RtcDtmfSender createDtmfSender(MediaStreamTrack track) native;
 
-  @DomName('RTCPeerConnection.createDataChannel')
-  @DocsEditable()
   RtcDataChannel createDataChannel(String label, [Map dataChannelDict]) {
     if (dataChannelDict != null) {
       var dataChannelDict_1 = convertDartToNative_Dictionary(dataChannelDict);
@@ -34721,16 +25620,10 @@
   }
 
   @JSName('createDataChannel')
-  @DomName('RTCPeerConnection.createDataChannel')
-  @DocsEditable()
   RtcDataChannel _createDataChannel_1(label, dataChannelDict) native;
   @JSName('createDataChannel')
-  @DomName('RTCPeerConnection.createDataChannel')
-  @DocsEditable()
   RtcDataChannel _createDataChannel_2(label) native;
 
-  @DomName('RTCPeerConnection.createOffer')
-  @DocsEditable()
   Future _createOffer(
       [options_OR_successCallback,
       RtcPeerConnectionErrorCallback failureCallback,
@@ -34763,58 +25656,30 @@
   }
 
   @JSName('createOffer')
-  @DomName('RTCPeerConnection.createOffer')
-  @DocsEditable()
   Future _createOffer_1() native;
   @JSName('createOffer')
-  @DomName('RTCPeerConnection.createOffer')
-  @DocsEditable()
   Future _createOffer_2(options) native;
   @JSName('createOffer')
-  @DomName('RTCPeerConnection.createOffer')
-  @DocsEditable()
   Future _createOffer_3(_RtcSessionDescriptionCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback) native;
   @JSName('createOffer')
-  @DomName('RTCPeerConnection.createOffer')
-  @DocsEditable()
   Future _createOffer_4(_RtcSessionDescriptionCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback, rtcOfferOptions) native;
 
-  @DomName('RTCPeerConnection.getLocalStreams')
-  @DocsEditable()
   List<MediaStream> getLocalStreams() native;
 
-  @DomName('RTCPeerConnection.getReceivers')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<RtcRtpReceiver> getReceivers() native;
 
-  @DomName('RTCPeerConnection.getRemoteStreams')
-  @DocsEditable()
   List<MediaStream> getRemoteStreams() native;
 
-  @DomName('RTCPeerConnection.getSenders')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<RtcRtpSender> getSenders() native;
 
-  @DomName('RTCPeerConnection.getStats')
-  @DocsEditable()
   Future getStats() => promiseToFuture<dynamic>(JS("", "#.getStats()", this));
 
-  @DomName('RTCPeerConnection.removeStream')
-  @DocsEditable()
   void removeStream(MediaStream stream) native;
 
-  @DomName('RTCPeerConnection.removeTrack')
-  @DocsEditable()
-  @Experimental() // untriaged
   void removeTrack(RtcRtpSender sender) native;
 
-  @DomName('RTCPeerConnection.setConfiguration')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setConfiguration(Map configuration) {
     var configuration_1 = convertDartToNative_Dictionary(configuration);
     _setConfiguration_1(configuration_1);
@@ -34822,13 +25687,8 @@
   }
 
   @JSName('setConfiguration')
-  @DomName('RTCPeerConnection.setConfiguration')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _setConfiguration_1(configuration) native;
 
-  @DomName('RTCPeerConnection.setLocalDescription')
-  @DocsEditable()
   Future _setLocalDescription(Map description, VoidCallback successCallback,
       [RtcPeerConnectionErrorCallback failureCallback]) {
     var description_1 = convertDartToNative_Dictionary(description);
@@ -34837,14 +25697,10 @@
   }
 
   @JSName('setLocalDescription')
-  @DomName('RTCPeerConnection.setLocalDescription')
-  @DocsEditable()
   Future _setLocalDescription_1(description, VoidCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback) native;
 
   @JSName('setLocalDescription')
-  @DomName('RTCPeerConnection.setLocalDescription')
-  @DocsEditable()
   Future setLocalDescription(Map description) {
     var completer = new Completer();
     _setLocalDescription(description, () {
@@ -34855,8 +25711,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.setRemoteDescription')
-  @DocsEditable()
   Future _setRemoteDescription(Map description, VoidCallback successCallback,
       [RtcPeerConnectionErrorCallback failureCallback]) {
     var description_1 = convertDartToNative_Dictionary(description);
@@ -34865,14 +25719,10 @@
   }
 
   @JSName('setRemoteDescription')
-  @DomName('RTCPeerConnection.setRemoteDescription')
-  @DocsEditable()
   Future _setRemoteDescription_1(description, VoidCallback successCallback,
       RtcPeerConnectionErrorCallback failureCallback) native;
 
   @JSName('setRemoteDescription')
-  @DomName('RTCPeerConnection.setRemoteDescription')
-  @DocsEditable()
   Future setRemoteDescription(Map description) {
     var completer = new Completer();
     _setRemoteDescription(description, () {
@@ -34884,43 +25734,29 @@
   }
 
   /// Stream of `addstream` events handled by this [RtcPeerConnection].
-  @DomName('RTCPeerConnection.onaddstream')
-  @DocsEditable()
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
 
   /// Stream of `datachannel` events handled by this [RtcPeerConnection].
-  @DomName('RTCPeerConnection.ondatachannel')
-  @DocsEditable()
   Stream<RtcDataChannelEvent> get onDataChannel =>
       dataChannelEvent.forTarget(this);
 
   /// Stream of `icecandidate` events handled by this [RtcPeerConnection].
-  @DomName('RTCPeerConnection.onicecandidate')
-  @DocsEditable()
   Stream<RtcPeerConnectionIceEvent> get onIceCandidate =>
       iceCandidateEvent.forTarget(this);
 
   /// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection].
-  @DomName('RTCPeerConnection.oniceconnectionstatechange')
-  @DocsEditable()
   Stream<Event> get onIceConnectionStateChange =>
       iceConnectionStateChangeEvent.forTarget(this);
 
   /// Stream of `negotiationneeded` events handled by this [RtcPeerConnection].
-  @DomName('RTCPeerConnection.onnegotiationneeded')
-  @DocsEditable()
   Stream<Event> get onNegotiationNeeded =>
       negotiationNeededEvent.forTarget(this);
 
   /// Stream of `removestream` events handled by this [RtcPeerConnection].
-  @DomName('RTCPeerConnection.onremovestream')
-  @DocsEditable()
   Stream<MediaStreamEvent> get onRemoveStream =>
       removeStreamEvent.forTarget(this);
 
   /// Stream of `signalingstatechange` events handled by this [RtcPeerConnection].
-  @DomName('RTCPeerConnection.onsignalingstatechange')
-  @DocsEditable()
   Stream<Event> get onSignalingStateChange =>
       signalingStateChangeEvent.forTarget(this);
 }
@@ -34928,9 +25764,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCPeerConnectionIceEvent')
-@Experimental() // untriaged
 @Native("RTCPeerConnectionIceEvent")
 class RtcPeerConnectionIceEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -34938,8 +25771,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCPeerConnectionIceEvent.RTCPeerConnectionIceEvent')
-  @DocsEditable()
   factory RtcPeerConnectionIceEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -34955,18 +25786,12 @@
   static RtcPeerConnectionIceEvent _create_2(type) =>
       JS('RtcPeerConnectionIceEvent', 'new RTCPeerConnectionIceEvent(#)', type);
 
-  @DomName('RTCPeerConnectionIceEvent.candidate')
-  @DocsEditable()
-  @Experimental() // untriaged
   final RtcIceCandidate candidate;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCRtpContributingSource')
-@Experimental() // untriaged
 @Native("RTCRtpContributingSource")
 class RtcRtpContributingSource extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -34974,23 +25799,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCRtpContributingSource.source')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int source;
 
-  @DomName('RTCRtpContributingSource.timestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num timestamp;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCRtpReceiver')
-@Experimental() // untriaged
 @Native("RTCRtpReceiver")
 class RtcRtpReceiver extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -34998,23 +25814,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCRtpReceiver.track')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaStreamTrack track;
 
-  @DomName('RTCRtpReceiver.getContributingSources')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<RtcRtpContributingSource> getContributingSources() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCRtpSender')
-@Experimental() // untriaged
 @Native("RTCRtpSender")
 class RtcRtpSender extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -35022,19 +25829,13 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCRtpSender.track')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaStreamTrack track;
 }
 // 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.
 
-@DomName('RTCSessionDescription')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription
 @Native("RTCSessionDescription,mozRTCSessionDescription")
 class RtcSessionDescription extends Interceptor {
   factory RtcSessionDescription(Map dictionary) {
@@ -35055,22 +25856,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCSessionDescription.sdp')
-  @DocsEditable()
   String sdp;
 
-  @DomName('RTCSessionDescription.type')
-  @DocsEditable()
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCStatsReport')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsReport
-@Experimental()
 @Native("RTCStatsReport")
 class RtcStatsReport extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
@@ -35139,10 +25932,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCStatsResponse')
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCStatsReport-RTCStats-getter-DOMString-id
-@Experimental()
 @Native("RTCStatsResponse")
 class RtcStatsResponse extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -35150,21 +25939,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCStatsResponse.namedItem')
-  @DocsEditable()
   RtcLegacyStatsReport namedItem(String name) native;
 
-  @DomName('RTCStatsResponse.result')
-  @DocsEditable()
   List<RtcLegacyStatsReport> result() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('RTCTrackEvent')
-@Experimental() // untriaged
 @Native("RTCTrackEvent")
 class RtcTrackEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -35172,8 +25954,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('RTCTrackEvent.RTCTrackEvent')
-  @DocsEditable()
   factory RtcTrackEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return RtcTrackEvent._create_1(type, eventInitDict_1);
@@ -35181,33 +25961,18 @@
   static RtcTrackEvent _create_1(type, eventInitDict) =>
       JS('RtcTrackEvent', 'new RTCTrackEvent(#,#)', type, eventInitDict);
 
-  @DomName('RTCTrackEvent.receiver')
-  @DocsEditable()
-  @Experimental() // untriaged
   final RtcRtpReceiver receiver;
 
-  @DomName('RTCTrackEvent.streams')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<MediaStream> streams;
 
-  @DomName('RTCTrackEvent.track')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MediaStreamTrack track;
 }
 // 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.
 
-@DocsEditable()
-@DomName('Screen')
 @Native("Screen")
 class Screen extends Interceptor {
-  @DomName('Screen.availHeight')
-  @DomName('Screen.availLeft')
-  @DomName('Screen.availTop')
-  @DomName('Screen.availWidth')
   Rectangle get available =>
       new Rectangle(_availLeft, _availTop, _availWidth, _availHeight);
   // To suppress missing implicit constructor warnings.
@@ -35216,60 +25981,33 @@
   }
 
   @JSName('availHeight')
-  @DomName('Screen.availHeight')
-  @DocsEditable()
   final int _availHeight;
 
   @JSName('availLeft')
-  @DomName('Screen.availLeft')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final int _availLeft;
 
   @JSName('availTop')
-  @DomName('Screen.availTop')
-  @DocsEditable()
-  @Experimental() // nonstandard
   final int _availTop;
 
   @JSName('availWidth')
-  @DomName('Screen.availWidth')
-  @DocsEditable()
   final int _availWidth;
 
-  @DomName('Screen.colorDepth')
-  @DocsEditable()
   final int colorDepth;
 
-  @DomName('Screen.height')
-  @DocsEditable()
   final int height;
 
-  @DomName('Screen.keepAwake')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool keepAwake;
 
-  @DomName('Screen.orientation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ScreenOrientation orientation;
 
-  @DomName('Screen.pixelDepth')
-  @DocsEditable()
   final int pixelDepth;
 
-  @DomName('Screen.width')
-  @DocsEditable()
   final int width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ScreenOrientation')
-@Experimental() // untriaged
 @Native("ScreenOrientation")
 class ScreenOrientation extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -35277,44 +26015,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ScreenOrientation.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('ScreenOrientation.angle')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int angle;
 
-  @DomName('ScreenOrientation.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('ScreenOrientation.lock')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future lock(String orientation) =>
       promiseToFuture(JS("", "#.lock(#)", this, orientation));
 
-  @DomName('ScreenOrientation.unlock')
-  @DocsEditable()
-  @Experimental() // untriaged
   void unlock() native;
 
-  @DomName('ScreenOrientation.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLScriptElement')
 @Native("HTMLScriptElement")
 class ScriptElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -35322,8 +26040,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLScriptElement.HTMLScriptElement')
-  @DocsEditable()
   factory ScriptElement() => JS(
       'returns:ScriptElement;creates:ScriptElement;new:true',
       '#.createElement(#)',
@@ -35336,49 +26052,26 @@
    */
   ScriptElement.created() : super.created();
 
-  @DomName('HTMLScriptElement.async')
-  @DocsEditable()
   bool async;
 
-  @DomName('HTMLScriptElement.charset')
-  @DocsEditable()
   String charset;
 
-  @DomName('HTMLScriptElement.crossOrigin')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
-  @Experimental()
   String crossOrigin;
 
-  @DomName('HTMLScriptElement.defer')
-  @DocsEditable()
   bool defer;
 
-  @DomName('HTMLScriptElement.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
   String integrity;
 
-  @DomName('HTMLScriptElement.noModule')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool noModule;
 
-  @DomName('HTMLScriptElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLScriptElement.type')
-  @DocsEditable()
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ScrollState')
-@Experimental() // untriaged
 @Native("ScrollState")
 class ScrollState extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -35386,8 +26079,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ScrollState.ScrollState')
-  @DocsEditable()
   factory ScrollState([Map scrollStateInit]) {
     if (scrollStateInit != null) {
       var scrollStateInit_1 = convertDartToNative_Dictionary(scrollStateInit);
@@ -35399,74 +26090,32 @@
       JS('ScrollState', 'new ScrollState(#)', scrollStateInit);
   static ScrollState _create_2() => JS('ScrollState', 'new ScrollState()');
 
-  @DomName('ScrollState.deltaGranularity')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num deltaGranularity;
 
-  @DomName('ScrollState.deltaX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num deltaX;
 
-  @DomName('ScrollState.deltaY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num deltaY;
 
-  @DomName('ScrollState.fromUserInput')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool fromUserInput;
 
-  @DomName('ScrollState.inInertialPhase')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool inInertialPhase;
 
-  @DomName('ScrollState.isBeginning')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isBeginning;
 
-  @DomName('ScrollState.isDirectManipulation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isDirectManipulation;
 
-  @DomName('ScrollState.isEnding')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isEnding;
 
-  @DomName('ScrollState.positionX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int positionX;
 
-  @DomName('ScrollState.positionY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int positionY;
 
-  @DomName('ScrollState.velocityX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num velocityX;
 
-  @DomName('ScrollState.velocityY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num velocityY;
 
-  @DomName('ScrollState.consumeDelta')
-  @DocsEditable()
-  @Experimental() // untriaged
   void consumeDelta(num x, num y) native;
 
-  @DomName('ScrollState.distributeToScrollChainDescendant')
-  @DocsEditable()
-  @Experimental() // untriaged
   void distributeToScrollChainDescendant() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35475,16 +26124,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('ScrollStateCallback')
-@Experimental() // untriaged
 typedef void ScrollStateCallback(ScrollState scrollState);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ScrollTimeline')
-@Experimental() // untriaged
 @Native("ScrollTimeline")
 class ScrollTimeline extends AnimationTimeline {
   // To suppress missing implicit constructor warnings.
@@ -35492,8 +26136,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ScrollTimeline.ScrollTimeline')
-  @DocsEditable()
   factory ScrollTimeline([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -35506,29 +26148,16 @@
   static ScrollTimeline _create_2() =>
       JS('ScrollTimeline', 'new ScrollTimeline()');
 
-  @DomName('ScrollTimeline.orientation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String orientation;
 
-  @DomName('ScrollTimeline.scrollSource')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element scrollSource;
 
-  @DomName('ScrollTimeline.timeRange')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object timeRange;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SecurityPolicyViolationEvent')
-// https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events
-@Experimental()
 @Native("SecurityPolicyViolationEvent")
 class SecurityPolicyViolationEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -35536,8 +26165,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SecurityPolicyViolationEvent.SecurityPolicyViolationEvent')
-  @DocsEditable()
   factory SecurityPolicyViolationEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -35556,63 +26183,35 @@
       type);
 
   @JSName('blockedURI')
-  @DomName('SecurityPolicyViolationEvent.blockedURI')
-  @DocsEditable()
   final String blockedUri;
 
-  @DomName('SecurityPolicyViolationEvent.columnNumber')
-  @DocsEditable()
   final int columnNumber;
 
-  @DomName('SecurityPolicyViolationEvent.disposition')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String disposition;
 
   @JSName('documentURI')
-  @DomName('SecurityPolicyViolationEvent.documentURI')
-  @DocsEditable()
   final String documentUri;
 
-  @DomName('SecurityPolicyViolationEvent.effectiveDirective')
-  @DocsEditable()
   final String effectiveDirective;
 
-  @DomName('SecurityPolicyViolationEvent.lineNumber')
-  @DocsEditable()
   final int lineNumber;
 
-  @DomName('SecurityPolicyViolationEvent.originalPolicy')
-  @DocsEditable()
   final String originalPolicy;
 
-  @DomName('SecurityPolicyViolationEvent.referrer')
-  @DocsEditable()
   final String referrer;
 
-  @DomName('SecurityPolicyViolationEvent.sample')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String sample;
 
-  @DomName('SecurityPolicyViolationEvent.sourceFile')
-  @DocsEditable()
   final String sourceFile;
 
-  @DomName('SecurityPolicyViolationEvent.statusCode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int statusCode;
 
-  @DomName('SecurityPolicyViolationEvent.violatedDirective')
-  @DocsEditable()
   final String violatedDirective;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('HTMLSelectElement')
 @Native("HTMLSelectElement")
 class SelectElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -35620,8 +26219,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLSelectElement.HTMLSelectElement')
-  @DocsEditable()
   factory SelectElement() => JS(
       'returns:SelectElement;creates:SelectElement;new:true',
       '#.createElement(#)',
@@ -35634,97 +26231,51 @@
    */
   SelectElement.created() : super.created();
 
-  @DomName('HTMLSelectElement.autofocus')
-  @DocsEditable()
   bool autofocus;
 
-  @DomName('HTMLSelectElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLSelectElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLSelectElement.labels')
-  @DocsEditable()
   @Unstable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> labels;
 
-  @DomName('HTMLSelectElement.length')
-  @DocsEditable()
   int length;
 
-  @DomName('HTMLSelectElement.multiple')
-  @DocsEditable()
   bool multiple;
 
-  @DomName('HTMLSelectElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLSelectElement.required')
-  @DocsEditable()
   bool required;
 
-  @DomName('HTMLSelectElement.selectedIndex')
-  @DocsEditable()
   int selectedIndex;
 
-  @DomName('HTMLSelectElement.size')
-  @DocsEditable()
   int size;
 
-  @DomName('HTMLSelectElement.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('HTMLSelectElement.validationMessage')
-  @DocsEditable()
   final String validationMessage;
 
-  @DomName('HTMLSelectElement.validity')
-  @DocsEditable()
   final ValidityState validity;
 
-  @DomName('HTMLSelectElement.value')
-  @DocsEditable()
   String value;
 
-  @DomName('HTMLSelectElement.willValidate')
-  @DocsEditable()
   final bool willValidate;
 
-  @DomName('HTMLSelectElement.__setter__')
-  @DocsEditable()
   void __setter__(int index, OptionElement option) native;
 
-  @DomName('HTMLSelectElement.add')
-  @DocsEditable()
-  @Experimental() // untriaged
   void add(Object element, Object before) native;
 
-  @DomName('HTMLSelectElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLSelectElement.item')
-  @DocsEditable()
   Element item(int index) native;
 
-  @DomName('HTMLSelectElement.namedItem')
-  @DocsEditable()
   OptionElement namedItem(String name) native;
 
-  @DomName('HTMLSelectElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLSelectElement.setCustomValidity')
-  @DocsEditable()
   void setCustomValidity(String error) native;
 
   // Override default options, since IE returns SelectElement itself and it
@@ -35748,8 +26299,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Selection')
 @Native("Selection")
 class Selection extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -35757,129 +26306,63 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Selection.anchorNode')
-  @DocsEditable()
   final Node anchorNode;
 
-  @DomName('Selection.anchorOffset')
-  @DocsEditable()
   final int anchorOffset;
 
-  @DomName('Selection.baseNode')
-  @DocsEditable()
-  @Experimental() // non-standard
   final Node baseNode;
 
-  @DomName('Selection.baseOffset')
-  @DocsEditable()
-  @Experimental() // non-standard
   final int baseOffset;
 
-  @DomName('Selection.extentNode')
-  @DocsEditable()
-  @Experimental() // non-standard
   final Node extentNode;
 
-  @DomName('Selection.extentOffset')
-  @DocsEditable()
-  @Experimental() // non-standard
   final int extentOffset;
 
-  @DomName('Selection.focusNode')
-  @DocsEditable()
   final Node focusNode;
 
-  @DomName('Selection.focusOffset')
-  @DocsEditable()
   final int focusOffset;
 
-  @DomName('Selection.isCollapsed')
-  @DocsEditable()
   final bool isCollapsed;
 
-  @DomName('Selection.rangeCount')
-  @DocsEditable()
   final int rangeCount;
 
-  @DomName('Selection.type')
-  @DocsEditable()
-  @Experimental() // non-standard
   final String type;
 
-  @DomName('Selection.addRange')
-  @DocsEditable()
   void addRange(Range range) native;
 
-  @DomName('Selection.collapse')
-  @DocsEditable()
   void collapse(Node node, [int offset]) native;
 
-  @DomName('Selection.collapseToEnd')
-  @DocsEditable()
   void collapseToEnd() native;
 
-  @DomName('Selection.collapseToStart')
-  @DocsEditable()
   void collapseToStart() native;
 
-  @DomName('Selection.containsNode')
-  @DocsEditable()
-  @Experimental() // non-standard
   bool containsNode(Node node, [bool allowPartialContainment]) native;
 
-  @DomName('Selection.deleteFromDocument')
-  @DocsEditable()
   void deleteFromDocument() native;
 
-  @DomName('Selection.empty')
-  @DocsEditable()
-  @Experimental() // non-standard
   void empty() native;
 
-  @DomName('Selection.extend')
-  @DocsEditable()
   void extend(Node node, [int offset]) native;
 
-  @DomName('Selection.getRangeAt')
-  @DocsEditable()
   Range getRangeAt(int index) native;
 
-  @DomName('Selection.modify')
-  @DocsEditable()
-  @Experimental() // non-standard
   void modify(String alter, String direction, String granularity) native;
 
-  @DomName('Selection.removeAllRanges')
-  @DocsEditable()
   void removeAllRanges() native;
 
-  @DomName('Selection.removeRange')
-  @DocsEditable()
-  @Experimental() // untriaged
   void removeRange(Range range) native;
 
-  @DomName('Selection.selectAllChildren')
-  @DocsEditable()
   void selectAllChildren(Node node) native;
 
-  @DomName('Selection.setBaseAndExtent')
-  @DocsEditable()
-  @Experimental() // non-standard
   void setBaseAndExtent(
       Node baseNode, int baseOffset, Node extentNode, int extentOffset) native;
 
-  @DomName('Selection.setPosition')
-  @DocsEditable()
-  @Experimental() // non-standard
   void setPosition(Node node, [int offset]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Sensor')
-@Experimental() // untriaged
 @Native("Sensor")
 class Sensor extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -35887,49 +26370,25 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Sensor.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('Sensor.activated')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool activated;
 
-  @DomName('Sensor.hasReading')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool hasReading;
 
-  @DomName('Sensor.timestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num timestamp;
 
-  @DomName('Sensor.start')
-  @DocsEditable()
-  @Experimental() // untriaged
   void start() native;
 
-  @DomName('Sensor.stop')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stop() native;
 
-  @DomName('Sensor.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SensorErrorEvent')
-@Experimental() // untriaged
 @Native("SensorErrorEvent")
 class SensorErrorEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -35937,8 +26396,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SensorErrorEvent.SensorErrorEvent')
-  @DocsEditable()
   factory SensorErrorEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return SensorErrorEvent._create_1(type, eventInitDict_1);
@@ -35946,18 +26403,12 @@
   static SensorErrorEvent _create_1(type, eventInitDict) =>
       JS('SensorErrorEvent', 'new SensorErrorEvent(#,#)', type, eventInitDict);
 
-  @DomName('SensorErrorEvent.error')
-  @DocsEditable()
-  @Experimental() // untriaged
   final DomException error;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ServiceWorker')
-@Experimental() // untriaged
 @Native("ServiceWorker")
 class ServiceWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
@@ -35965,40 +26416,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ServiceWorker.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
   @JSName('scriptURL')
-  @DomName('ServiceWorker.scriptURL')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String scriptUrl;
 
-  @DomName('ServiceWorker.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 
-  @DomName('ServiceWorker.postMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void postMessage(Object message, [List<Object> transfer]) native;
 
-  @DomName('ServiceWorker.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ServiceWorkerContainer')
-@Experimental() // untriaged
 @Native("ServiceWorkerContainer")
 class ServiceWorkerContainer extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -36006,40 +26439,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ServiceWorkerContainer.messageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('ServiceWorkerContainer.controller')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ServiceWorker controller;
 
-  @DomName('ServiceWorkerContainer.ready')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<ServiceWorkerRegistration> get ready =>
       promiseToFuture<ServiceWorkerRegistration>(JS("", "#.ready", this));
 
-  @DomName('ServiceWorkerContainer.getRegistration')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<ServiceWorkerRegistration> getRegistration([String documentURL]) =>
       promiseToFuture<ServiceWorkerRegistration>(
           JS("", "#.getRegistration(#)", this, documentURL));
 
-  @DomName('ServiceWorkerContainer.getRegistrations')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<ServiceWorkerRegistration>> getRegistrations() =>
       promiseToFuture<List<ServiceWorkerRegistration>>(
           JS("", "#.getRegistrations()", this));
 
-  @DomName('ServiceWorkerContainer.register')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future register(String url, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -36049,28 +26464,16 @@
   }
 
   @JSName('register')
-  @DomName('ServiceWorkerContainer.register')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _register_1(url, options) native;
   @JSName('register')
-  @DomName('ServiceWorkerContainer.register')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _register_2(url) native;
 
-  @DomName('ServiceWorkerContainer.onmessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ServiceWorkerGlobalScope')
-@Experimental() // untriaged
 @Native("ServiceWorkerGlobalScope")
 class ServiceWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
@@ -36078,84 +26481,42 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ServiceWorkerGlobalScope.activateEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> activateEvent =
       const EventStreamProvider<Event>('activate');
 
-  @DomName('ServiceWorkerGlobalScope.fetchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> fetchEvent =
       const EventStreamProvider<Event>('fetch');
 
-  @DomName('ServiceWorkerGlobalScope.foreignfetchEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<ForeignFetchEvent> foreignfetchEvent =
       const EventStreamProvider<ForeignFetchEvent>('foreignfetch');
 
-  @DomName('ServiceWorkerGlobalScope.installEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> installEvent =
       const EventStreamProvider<Event>('install');
 
-  @DomName('ServiceWorkerGlobalScope.messageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('ServiceWorkerGlobalScope.clients')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Clients clients;
 
-  @DomName('ServiceWorkerGlobalScope.registration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ServiceWorkerRegistration registration;
 
-  @DomName('ServiceWorkerGlobalScope.skipWaiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future skipWaiting() => promiseToFuture(JS("", "#.skipWaiting()", this));
 
-  @DomName('ServiceWorkerGlobalScope.onactivate')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onActivate => activateEvent.forTarget(this);
 
-  @DomName('ServiceWorkerGlobalScope.onfetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onFetch => fetchEvent.forTarget(this);
 
-  @DomName('ServiceWorkerGlobalScope.onforeignfetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<ForeignFetchEvent> get onForeignfetch =>
       foreignfetchEvent.forTarget(this);
 
-  @DomName('ServiceWorkerGlobalScope.oninstall')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onInstall => installEvent.forTarget(this);
 
-  @DomName('ServiceWorkerGlobalScope.onmessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ServiceWorkerRegistration')
-@Experimental() // untriaged
 @Native("ServiceWorkerRegistration")
 class ServiceWorkerRegistration extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -36163,54 +26524,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ServiceWorkerRegistration.active')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ServiceWorker active;
 
-  @DomName('ServiceWorkerRegistration.backgroundFetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   final BackgroundFetchManager backgroundFetch;
 
-  @DomName('ServiceWorkerRegistration.installing')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ServiceWorker installing;
 
-  @DomName('ServiceWorkerRegistration.navigationPreload')
-  @DocsEditable()
-  @Experimental() // untriaged
   final NavigationPreloadManager navigationPreload;
 
-  @DomName('ServiceWorkerRegistration.paymentManager')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PaymentManager paymentManager;
 
-  @DomName('ServiceWorkerRegistration.pushManager')
-  @DocsEditable()
-  @Experimental() // untriaged
   final PushManager pushManager;
 
-  @DomName('ServiceWorkerRegistration.scope')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String scope;
 
-  @DomName('ServiceWorkerRegistration.sync')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SyncManager sync;
 
-  @DomName('ServiceWorkerRegistration.waiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ServiceWorker waiting;
 
-  @DomName('ServiceWorkerRegistration.getNotifications')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future getNotifications([Map filter]) {
     if (filter != null) {
       var filter_1 = convertDartToNative_Dictionary(filter);
@@ -36220,19 +26551,10 @@
   }
 
   @JSName('getNotifications')
-  @DomName('ServiceWorkerRegistration.getNotifications')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _getNotifications_1(filter) native;
   @JSName('getNotifications')
-  @DomName('ServiceWorkerRegistration.getNotifications')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _getNotifications_2() native;
 
-  @DomName('ServiceWorkerRegistration.showNotification')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future showNotification(String title, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -36242,36 +26564,20 @@
   }
 
   @JSName('showNotification')
-  @DomName('ServiceWorkerRegistration.showNotification')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _showNotification_1(title, options) native;
   @JSName('showNotification')
-  @DomName('ServiceWorkerRegistration.showNotification')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _showNotification_2(title) native;
 
-  @DomName('ServiceWorkerRegistration.unregister')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> unregister() =>
       promiseToFuture<bool>(JS("", "#.unregister()", this));
 
-  @DomName('ServiceWorkerRegistration.update')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future update() => promiseToFuture(JS("", "#.update()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLShadowElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
-@Experimental()
-// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
 @Native("HTMLShadowElement")
 class ShadowElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -36279,8 +26585,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLShadowElement.HTMLShadowElement')
-  @DocsEditable()
   factory ShadowElement() => document.createElement("shadow");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -36292,9 +26596,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('shadow');
 
-  @DomName('HTMLShadowElement.getDistributedNodes')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('NodeList|Null')
   @Creates('NodeList')
   List<Node> getDistributedNodes() native;
@@ -36305,10 +26606,7 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('ShadowRoot')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
-@Experimental()
-// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-root
 @Native("ShadowRoot")
 class ShadowRoot extends DocumentFragment implements DocumentOrShadowRoot {
   // To suppress missing implicit constructor warnings.
@@ -36316,65 +26614,33 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ShadowRoot.delegatesFocus')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool delegatesFocus;
 
-  @DomName('ShadowRoot.host')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element host;
 
   @JSName('innerHTML')
-  @DomName('ShadowRoot.innerHTML')
-  @DocsEditable()
   String innerHtml;
 
-  @DomName('ShadowRoot.mode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String mode;
 
-  @DomName('ShadowRoot.olderShadowRoot')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ShadowRoot olderShadowRoot;
 
   // From DocumentOrShadowRoot
 
-  @DomName('ShadowRoot.activeElement')
-  @DocsEditable()
   final Element activeElement;
 
-  @DomName('ShadowRoot.fullscreenElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element fullscreenElement;
 
-  @DomName('ShadowRoot.pointerLockElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Element pointerLockElement;
 
-  @DomName('ShadowRoot.styleSheets')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('_StyleSheetList|Null')
   @Creates('_StyleSheetList')
   final List<StyleSheet> styleSheets;
 
-  @DomName('ShadowRoot.elementFromPoint')
-  @DocsEditable()
   Element elementFromPoint(int x, int y) native;
 
-  @DomName('ShadowRoot.elementsFromPoint')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Element> elementsFromPoint(int x, int y) native;
 
-  @DomName('ShadowRoot.getSelection')
-  @DocsEditable()
   Selection getSelection() native;
 
   static bool get supported => JS(
@@ -36421,9 +26687,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SharedArrayBuffer')
-@Experimental() // untriaged
 @Native("SharedArrayBuffer")
 class SharedArrayBuffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -36431,19 +26694,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SharedArrayBuffer.byteLength')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int byteLength;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SharedWorker')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface
-@Experimental()
 @Native("SharedWorker")
 class SharedWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
@@ -36451,14 +26707,9 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SharedWorker.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('SharedWorker.SharedWorker')
-  @DocsEditable()
   factory SharedWorker(String scriptURL, [String name]) {
     if (name != null) {
       return SharedWorker._create_1(scriptURL, name);
@@ -36470,22 +26721,14 @@
   static SharedWorker _create_2(scriptURL) =>
       JS('SharedWorker', 'new SharedWorker(#)', scriptURL);
 
-  @DomName('SharedWorker.port')
-  @DocsEditable()
   final MessagePort port;
 
-  @DomName('SharedWorker.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SharedWorkerGlobalScope')
-@Experimental() // untriaged
 @Native("SharedWorkerGlobalScope")
 class SharedWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
@@ -36499,85 +26742,48 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SharedWorkerGlobalScope.connectEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> connectEvent =
       const EventStreamProvider<Event>('connect');
 
-  @DomName('SharedWorkerGlobalScope.PERSISTENT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int PERSISTENT = 1;
 
-  @DomName('SharedWorkerGlobalScope.TEMPORARY')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
-  @DomName('SharedWorkerGlobalScope.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String name;
 
-  @DomName('SharedWorkerGlobalScope.close')
-  @DocsEditable()
-  @Experimental() // untriaged
   void close() native;
 
   @JSName('webkitRequestFileSystem')
-  @DomName('SharedWorkerGlobalScope.webkitRequestFileSystem')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   void _webkitRequestFileSystem(int type, int size,
       [_FileSystemCallback successCallback,
       _ErrorCallback errorCallback]) native;
 
   @JSName('webkitRequestFileSystemSync')
-  @DomName('SharedWorkerGlobalScope.webkitRequestFileSystemSync')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   _DOMFileSystemSync requestFileSystemSync(int type, int size) native;
 
   @JSName('webkitResolveLocalFileSystemSyncURL')
-  @DomName('SharedWorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   _EntrySync resolveLocalFileSystemSyncUrl(String url) native;
 
   @JSName('webkitResolveLocalFileSystemURL')
-  @DomName('SharedWorkerGlobalScope.webkitResolveLocalFileSystemURL')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // untriaged
   void _webkitResolveLocalFileSystemUrl(
       String url, _EntryCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
   /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
-  @DomName('SharedWorkerGlobalScope.onconnect')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onConnect => connectEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLSlotElement')
-@Experimental() // untriaged
 @Native("HTMLSlotElement")
 class SlotElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -36591,14 +26797,8 @@
    */
   SlotElement.created() : super.created();
 
-  @DomName('HTMLSlotElement.name')
-  @DocsEditable()
-  @Experimental() // untriaged
   String name;
 
-  @DomName('HTMLSlotElement.assignedNodes')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Node> assignedNodes([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -36608,24 +26808,14 @@
   }
 
   @JSName('assignedNodes')
-  @DomName('HTMLSlotElement.assignedNodes')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Node> _assignedNodes_1(options) native;
   @JSName('assignedNodes')
-  @DomName('HTMLSlotElement.assignedNodes')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Node> _assignedNodes_2() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SourceBuffer')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
-@Experimental()
 @Native("SourceBuffer")
 class SourceBuffer extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -36633,99 +26823,47 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SourceBuffer.abortEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> abortEvent =
       const EventStreamProvider<Event>('abort');
 
-  @DomName('SourceBuffer.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('SourceBuffer.appendWindowEnd')
-  @DocsEditable()
-  @Experimental() // untriaged
   num appendWindowEnd;
 
-  @DomName('SourceBuffer.appendWindowStart')
-  @DocsEditable()
-  @Experimental() // untriaged
   num appendWindowStart;
 
-  @DomName('SourceBuffer.audioTracks')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioTrackList audioTracks;
 
-  @DomName('SourceBuffer.buffered')
-  @DocsEditable()
   final TimeRanges buffered;
 
-  @DomName('SourceBuffer.mode')
-  @DocsEditable()
-  @Experimental() // untriaged
   String mode;
 
-  @DomName('SourceBuffer.timestampOffset')
-  @DocsEditable()
   num timestampOffset;
 
-  @DomName('SourceBuffer.trackDefaults')
-  @DocsEditable()
-  @Experimental() // untriaged
   TrackDefaultList trackDefaults;
 
-  @DomName('SourceBuffer.updating')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool updating;
 
-  @DomName('SourceBuffer.videoTracks')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VideoTrackList videoTracks;
 
-  @DomName('SourceBuffer.abort')
-  @DocsEditable()
   void abort() native;
 
-  @DomName('SourceBuffer.appendBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void appendBuffer(ByteBuffer data) native;
 
   @JSName('appendBuffer')
-  @DomName('SourceBuffer.appendBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void appendTypedData(TypedData data) native;
 
-  @DomName('SourceBuffer.remove')
-  @DocsEditable()
-  @Experimental() // untriaged
   void remove(num start, num end) native;
 
-  @DomName('SourceBuffer.onabort')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
-  @DomName('SourceBuffer.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SourceBufferList')
-// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
-@Experimental()
 @Native("SourceBufferList")
 class SourceBufferList extends EventTarget
     with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer>
@@ -36735,8 +26873,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SourceBufferList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   SourceBuffer operator [](int index) {
@@ -36782,16 +26918,12 @@
   SourceBuffer elementAt(int index) => this[index];
   // -- end List<SourceBuffer> mixins.
 
-  @DomName('SourceBufferList.item')
-  @DocsEditable()
   SourceBuffer item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLSourceElement')
 @Native("HTMLSourceElement")
 class SourceElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -36799,8 +26931,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLSourceElement.HTMLSourceElement')
-  @DocsEditable()
   factory SourceElement() => JS(
       'returns:SourceElement;creates:SourceElement;new:true',
       '#.createElement(#)',
@@ -36813,34 +26943,20 @@
    */
   SourceElement.created() : super.created();
 
-  @DomName('HTMLSourceElement.media')
-  @DocsEditable()
   String media;
 
-  @DomName('HTMLSourceElement.sizes')
-  @DocsEditable()
-  @Experimental() // untriaged
   String sizes;
 
-  @DomName('HTMLSourceElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLSourceElement.srcset')
-  @DocsEditable()
-  @Experimental() // untriaged
   String srcset;
 
-  @DomName('HTMLSourceElement.type')
-  @DocsEditable()
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLSpanElement')
 @Native("HTMLSpanElement")
 class SpanElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -36848,8 +26964,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLSpanElement.HTMLSpanElement')
-  @DocsEditable()
   factory SpanElement() => JS(
       'returns:SpanElement;creates:SpanElement;new:true',
       '#.createElement(#)',
@@ -36866,10 +26980,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechGrammar')
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammar
-@Experimental()
 @Native("SpeechGrammar")
 class SpeechGrammar extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -36877,30 +26987,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechGrammar.SpeechGrammar')
-  @DocsEditable()
   factory SpeechGrammar() {
     return SpeechGrammar._create_1();
   }
   static SpeechGrammar _create_1() =>
       JS('SpeechGrammar', 'new SpeechGrammar()');
 
-  @DomName('SpeechGrammar.src')
-  @DocsEditable()
   String src;
 
-  @DomName('SpeechGrammar.weight')
-  @DocsEditable()
   num weight;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechGrammarList')
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammarlist
-@Experimental()
 @Native("SpeechGrammarList")
 class SpeechGrammarList extends Interceptor
     with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar>
@@ -36910,16 +27010,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechGrammarList.SpeechGrammarList')
-  @DocsEditable()
   factory SpeechGrammarList() {
     return SpeechGrammarList._create_1();
   }
   static SpeechGrammarList _create_1() =>
       JS('SpeechGrammarList', 'new SpeechGrammarList()');
 
-  @DomName('SpeechGrammarList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   SpeechGrammar operator [](int index) {
@@ -36965,26 +27061,17 @@
   SpeechGrammar elementAt(int index) => this[index];
   // -- end List<SpeechGrammar> mixins.
 
-  @DomName('SpeechGrammarList.addFromString')
-  @DocsEditable()
   void addFromString(String string, [num weight]) native;
 
-  @DomName('SpeechGrammarList.addFromUri')
-  @DocsEditable()
   void addFromUri(String src, [num weight]) native;
 
-  @DomName('SpeechGrammarList.item')
-  @DocsEditable()
   SpeechGrammar item(int index) native;
 }
 // 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.
 
-@DomName('SpeechRecognition')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-section
 @Native("SpeechRecognition")
 class SpeechRecognition extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -36998,8 +27085,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.audioendEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> audioEndEvent =
       const EventStreamProvider<Event>('audioend');
 
@@ -37009,8 +27094,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.audiostartEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> audioStartEvent =
       const EventStreamProvider<Event>('audiostart');
 
@@ -37020,8 +27103,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.endEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> endEvent =
       const EventStreamProvider<Event>('end');
 
@@ -37031,8 +27112,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionError> errorEvent =
       const EventStreamProvider<SpeechRecognitionError>('error');
 
@@ -37042,8 +27121,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.nomatchEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent =
       const EventStreamProvider<SpeechRecognitionEvent>('nomatch');
 
@@ -37053,8 +27130,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.resultEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> resultEvent =
       const EventStreamProvider<SpeechRecognitionEvent>('result');
 
@@ -37064,8 +27139,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.soundendEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> soundEndEvent =
       const EventStreamProvider<Event>('soundend');
 
@@ -37075,8 +27148,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.soundstartEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> soundStartEvent =
       const EventStreamProvider<Event>('soundstart');
 
@@ -37086,8 +27157,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.speechendEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> speechEndEvent =
       const EventStreamProvider<Event>('speechend');
 
@@ -37097,8 +27166,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.speechstartEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> speechStartEvent =
       const EventStreamProvider<Event>('speechstart');
 
@@ -37108,8 +27175,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechRecognition.startEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> startEvent =
       const EventStreamProvider<Event>('start');
 
@@ -37117,96 +27182,55 @@
   static bool get supported => JS(
       'bool', '!!(window.SpeechRecognition || window.webkitSpeechRecognition)');
 
-  @DomName('SpeechRecognition.audioTrack')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStreamTrack audioTrack;
 
-  @DomName('SpeechRecognition.continuous')
-  @DocsEditable()
   bool continuous;
 
-  @DomName('SpeechRecognition.grammars')
-  @DocsEditable()
   SpeechGrammarList grammars;
 
-  @DomName('SpeechRecognition.interimResults')
-  @DocsEditable()
   bool interimResults;
 
-  @DomName('SpeechRecognition.lang')
-  @DocsEditable()
   String lang;
 
-  @DomName('SpeechRecognition.maxAlternatives')
-  @DocsEditable()
   int maxAlternatives;
 
-  @DomName('SpeechRecognition.abort')
-  @DocsEditable()
   void abort() native;
 
-  @DomName('SpeechRecognition.start')
-  @DocsEditable()
   void start() native;
 
-  @DomName('SpeechRecognition.stop')
-  @DocsEditable()
   void stop() native;
 
   /// Stream of `audioend` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onaudioend')
-  @DocsEditable()
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
 
   /// Stream of `audiostart` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onaudiostart')
-  @DocsEditable()
   Stream<Event> get onAudioStart => audioStartEvent.forTarget(this);
 
   /// Stream of `end` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onend')
-  @DocsEditable()
   Stream<Event> get onEnd => endEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onerror')
-  @DocsEditable()
   Stream<SpeechRecognitionError> get onError => errorEvent.forTarget(this);
 
   /// Stream of `nomatch` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onnomatch')
-  @DocsEditable()
   Stream<SpeechRecognitionEvent> get onNoMatch => noMatchEvent.forTarget(this);
 
   /// Stream of `result` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onresult')
-  @DocsEditable()
   Stream<SpeechRecognitionEvent> get onResult => resultEvent.forTarget(this);
 
   /// Stream of `soundend` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onsoundend')
-  @DocsEditable()
   Stream<Event> get onSoundEnd => soundEndEvent.forTarget(this);
 
   /// Stream of `soundstart` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onsoundstart')
-  @DocsEditable()
   Stream<Event> get onSoundStart => soundStartEvent.forTarget(this);
 
   /// Stream of `speechend` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onspeechend')
-  @DocsEditable()
   Stream<Event> get onSpeechEnd => speechEndEvent.forTarget(this);
 
   /// Stream of `speechstart` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onspeechstart')
-  @DocsEditable()
   Stream<Event> get onSpeechStart => speechStartEvent.forTarget(this);
 
   /// Stream of `start` events handled by this [SpeechRecognition].
-  @DomName('SpeechRecognition.onstart')
-  @DocsEditable()
   Stream<Event> get onStart => startEvent.forTarget(this);
 
   factory SpeechRecognition() {
@@ -37218,11 +27242,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.
 
-@DocsEditable()
-@DomName('SpeechRecognitionAlternative')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionalternative
 @Native("SpeechRecognitionAlternative")
 class SpeechRecognitionAlternative extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -37230,23 +27250,15 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechRecognitionAlternative.confidence')
-  @DocsEditable()
   final num confidence;
 
-  @DomName('SpeechRecognitionAlternative.transcript')
-  @DocsEditable()
   final String transcript;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechRecognitionError')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-error
 @Native("SpeechRecognitionError")
 class SpeechRecognitionError extends Event {
   // To suppress missing implicit constructor warnings.
@@ -37254,8 +27266,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechRecognitionError.SpeechRecognitionError')
-  @DocsEditable()
   factory SpeechRecognitionError(String type, [Map initDict]) {
     if (initDict != null) {
       var initDict_1 = convertDartToNative_Dictionary(initDict);
@@ -37271,23 +27281,15 @@
   static SpeechRecognitionError _create_2(type) =>
       JS('SpeechRecognitionError', 'new SpeechRecognitionError(#)', type);
 
-  @DomName('SpeechRecognitionError.error')
-  @DocsEditable()
   final String error;
 
-  @DomName('SpeechRecognitionError.message')
-  @DocsEditable()
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechRecognitionEvent')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-event
 @Native("SpeechRecognitionEvent")
 class SpeechRecognitionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -37295,8 +27297,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechRecognitionEvent.SpeechRecognitionEvent')
-  @DocsEditable()
   factory SpeechRecognitionEvent(String type, [Map initDict]) {
     if (initDict != null) {
       var initDict_1 = convertDartToNative_Dictionary(initDict);
@@ -37312,20 +27312,12 @@
   static SpeechRecognitionEvent _create_2(type) =>
       JS('SpeechRecognitionEvent', 'new SpeechRecognitionEvent(#)', type);
 
-  @DomName('SpeechRecognitionEvent.emma')
-  @DocsEditable()
   final Document emma;
 
-  @DomName('SpeechRecognitionEvent.interpretation')
-  @DocsEditable()
   final Document interpretation;
 
-  @DomName('SpeechRecognitionEvent.resultIndex')
-  @DocsEditable()
   final int resultIndex;
 
-  @DomName('SpeechRecognitionEvent.results')
-  @DocsEditable()
   @Returns('_SpeechRecognitionResultList|Null')
   @Creates('_SpeechRecognitionResultList')
   final List<SpeechRecognitionResult> results;
@@ -37334,11 +27326,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.
 
-@DocsEditable()
-@DomName('SpeechRecognitionResult')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresult
 @Native("SpeechRecognitionResult")
 class SpeechRecognitionResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -37346,73 +27334,52 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechRecognitionResult.isFinal')
-  @DocsEditable()
   final bool isFinal;
 
-  @DomName('SpeechRecognitionResult.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('SpeechRecognitionResult.item')
-  @DocsEditable()
   SpeechRecognitionAlternative item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechSynthesis')
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
-@Experimental()
 @Native("SpeechSynthesis")
 class SpeechSynthesis extends EventTarget {
+  @DomName('SpeechSynthesis.getVoices')
+  @DocsEditable()
+  List<SpeechSynthesisVoice> getVoices() {
+    List<SpeechSynthesisVoice> voices = _getVoices();
+    if (voices.length > 0) applyExtension('SpeechSynthesisVoice', voices[0]);
+    return voices;
+  }
+
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesis._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechSynthesis.paused')
-  @DocsEditable()
   final bool paused;
 
-  @DomName('SpeechSynthesis.pending')
-  @DocsEditable()
   final bool pending;
 
-  @DomName('SpeechSynthesis.speaking')
-  @DocsEditable()
   final bool speaking;
 
-  @DomName('SpeechSynthesis.cancel')
-  @DocsEditable()
   void cancel() native;
 
-  @DomName('SpeechSynthesis.getVoices')
-  @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() native;
+  @JSName('getVoices')
+  List<SpeechSynthesisVoice> _getVoices() native;
 
-  @DomName('SpeechSynthesis.pause')
-  @DocsEditable()
   void pause() native;
 
-  @DomName('SpeechSynthesis.resume')
-  @DocsEditable()
   void resume() native;
 
-  @DomName('SpeechSynthesis.speak')
-  @DocsEditable()
   void speak(SpeechSynthesisUtterance utterance) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechSynthesisEvent')
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
-@Experimental()
 @Native("SpeechSynthesisEvent")
 class SpeechSynthesisEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -37420,31 +27387,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechSynthesisEvent.charIndex')
-  @DocsEditable()
   final int charIndex;
 
-  @DomName('SpeechSynthesisEvent.elapsedTime')
-  @DocsEditable()
   final num elapsedTime;
 
-  @DomName('SpeechSynthesisEvent.name')
-  @DocsEditable()
   final String name;
 
-  @DomName('SpeechSynthesisEvent.utterance')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SpeechSynthesisUtterance utterance;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechSynthesisUtterance')
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
-@Experimental()
 @Native("SpeechSynthesisUtterance")
 class SpeechSynthesisUtterance extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -37458,8 +27412,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechSynthesisUtterance.boundaryEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent =
       const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
@@ -37469,8 +27421,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechSynthesisUtterance.endEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent =
       const EventStreamProvider<SpeechSynthesisEvent>('end');
 
@@ -37480,8 +27430,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechSynthesisUtterance.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -37491,8 +27439,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechSynthesisUtterance.markEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent =
       const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
@@ -37502,8 +27448,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechSynthesisUtterance.pauseEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent =
       const EventStreamProvider<Event>('pause');
 
@@ -37513,8 +27457,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechSynthesisUtterance.resumeEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent =
       const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
@@ -37524,13 +27466,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('SpeechSynthesisUtterance.startEvent')
-  @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent =
       const EventStreamProvider<SpeechSynthesisEvent>('start');
 
-  @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
-  @DocsEditable()
   factory SpeechSynthesisUtterance([String text]) {
     if (text != null) {
       return SpeechSynthesisUtterance._create_1(text);
@@ -37542,73 +27480,43 @@
   static SpeechSynthesisUtterance _create_2() =>
       JS('SpeechSynthesisUtterance', 'new SpeechSynthesisUtterance()');
 
-  @DomName('SpeechSynthesisUtterance.lang')
-  @DocsEditable()
   String lang;
 
-  @DomName('SpeechSynthesisUtterance.pitch')
-  @DocsEditable()
   num pitch;
 
-  @DomName('SpeechSynthesisUtterance.rate')
-  @DocsEditable()
   num rate;
 
-  @DomName('SpeechSynthesisUtterance.text')
-  @DocsEditable()
   String text;
 
-  @DomName('SpeechSynthesisUtterance.voice')
-  @DocsEditable()
   SpeechSynthesisVoice voice;
 
-  @DomName('SpeechSynthesisUtterance.volume')
-  @DocsEditable()
   num volume;
 
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
-  @DomName('SpeechSynthesisUtterance.onboundary')
-  @DocsEditable()
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
   /// Stream of `end` events handled by this [SpeechSynthesisUtterance].
-  @DomName('SpeechSynthesisUtterance.onend')
-  @DocsEditable()
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [SpeechSynthesisUtterance].
-  @DomName('SpeechSynthesisUtterance.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `mark` events handled by this [SpeechSynthesisUtterance].
-  @DomName('SpeechSynthesisUtterance.onmark')
-  @DocsEditable()
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
   /// Stream of `pause` events handled by this [SpeechSynthesisUtterance].
-  @DomName('SpeechSynthesisUtterance.onpause')
-  @DocsEditable()
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
   /// Stream of `resume` events handled by this [SpeechSynthesisUtterance].
-  @DomName('SpeechSynthesisUtterance.onresume')
-  @DocsEditable()
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
   /// Stream of `start` events handled by this [SpeechSynthesisUtterance].
-  @DomName('SpeechSynthesisUtterance.onstart')
-  @DocsEditable()
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechSynthesisVoice')
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
-@Experimental()
 @Native("SpeechSynthesisVoice")
 class SpeechSynthesisVoice extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -37617,34 +27525,21 @@
   }
 
   @JSName('default')
-  @DomName('SpeechSynthesisVoice.default')
-  @DocsEditable()
   final bool defaultValue;
 
-  @DomName('SpeechSynthesisVoice.lang')
-  @DocsEditable()
   final String lang;
 
-  @DomName('SpeechSynthesisVoice.localService')
-  @DocsEditable()
   final bool localService;
 
-  @DomName('SpeechSynthesisVoice.name')
-  @DocsEditable()
   final String name;
 
   @JSName('voiceURI')
-  @DomName('SpeechSynthesisVoice.voiceURI')
-  @DocsEditable()
   final String voiceUri;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StaticRange')
-@Experimental() // untriaged
 @Native("StaticRange")
 class StaticRange extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -37652,29 +27547,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StaticRange.collapsed')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool collapsed;
 
-  @DomName('StaticRange.endContainer')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Node endContainer;
 
-  @DomName('StaticRange.endOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int endOffset;
 
-  @DomName('StaticRange.startContainer')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Node startContainer;
 
-  @DomName('StaticRange.startOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int startOffset;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37706,7 +27586,6 @@
  * [Maps](https://www.dartlang.org/guides/libraries/library-tour#maps)
  * section of the library tour.
  */
-@DomName('Storage')
 @Unstable()
 @Native("Storage")
 class Storage extends Interceptor with MapMixin<String, String> {
@@ -37772,33 +27651,21 @@
   }
 
   @JSName('length')
-  @DomName('Storage.length')
-  @DocsEditable()
   final int _length;
 
   @JSName('clear')
-  @DomName('Storage.clear')
-  @DocsEditable()
   void _clear() native;
 
   @JSName('getItem')
-  @DomName('Storage.getItem')
-  @DocsEditable()
   String _getItem(String key) native;
 
   @JSName('key')
-  @DomName('Storage.key')
-  @DocsEditable()
   String _key(int index) native;
 
   @JSName('removeItem')
-  @DomName('Storage.removeItem')
-  @DocsEditable()
   void _removeItem(String key) native;
 
   @JSName('setItem')
-  @DomName('Storage.setItem')
-  @DocsEditable()
   void _setItem(String key, String value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37807,9 +27674,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('StorageErrorCallback')
-// http://www.w3.org/TR/quota-api/#storageerrorcallback-callback
-@Experimental()
 typedef void StorageErrorCallback(DomError error);
 // 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
@@ -37817,7 +27681,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('StorageEvent')
 @Unstable()
 @Native("StorageEvent")
 class StorageEvent extends Event {
@@ -37835,8 +27698,6 @@
     return e;
   }
 
-  @DomName('StorageEvent.StorageEvent')
-  @DocsEditable()
   factory StorageEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -37849,29 +27710,17 @@
   static StorageEvent _create_2(type) =>
       JS('StorageEvent', 'new StorageEvent(#)', type);
 
-  @DomName('StorageEvent.key')
-  @DocsEditable()
   final String key;
 
-  @DomName('StorageEvent.newValue')
-  @DocsEditable()
   final String newValue;
 
-  @DomName('StorageEvent.oldValue')
-  @DocsEditable()
   final String oldValue;
 
-  @DomName('StorageEvent.storageArea')
-  @DocsEditable()
   final Storage storageArea;
 
-  @DomName('StorageEvent.url')
-  @DocsEditable()
   final String url;
 
   @JSName('initStorageEvent')
-  @DomName('StorageEvent.initStorageEvent')
-  @DocsEditable()
   void _initStorageEvent(
       String typeArg,
       bool canBubbleArg,
@@ -37886,9 +27735,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StorageManager')
-@Experimental() // untriaged
 @Native("StorageManager")
 class StorageManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -37896,20 +27742,11 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StorageManager.estimate')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<Map<String, dynamic>> estimate() =>
       promiseToFutureAsMap(JS("", "#.estimate()", this));
 
-  @DomName('StorageManager.persist')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> persist() => promiseToFuture<bool>(JS("", "#.persist()", this));
 
-  @DomName('StorageManager.persisted')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> persisted() =>
       promiseToFuture<bool>(JS("", "#.persisted()", this));
 }
@@ -37919,9 +27756,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('StorageQuotaCallback')
-// http://www.w3.org/TR/quota-api/#idl-def-StorageQuotaCallback
-@Experimental()
 typedef void StorageQuotaCallback(int grantedQuotaInBytes);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37929,17 +27763,12 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('StorageUsageCallback')
-// http://www.w3.org/TR/quota-api/#idl-def-StorageUsageCallback
-@Experimental()
 typedef void StorageUsageCallback(
     int currentUsageInBytes, int currentQuotaInBytes);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLStyleElement')
 @Native("HTMLStyleElement")
 class StyleElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -37947,8 +27776,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLStyleElement.HTMLStyleElement')
-  @DocsEditable()
   factory StyleElement() => JS(
       'returns:StyleElement;creates:StyleElement;new:true',
       '#.createElement(#)',
@@ -37961,30 +27788,18 @@
    */
   StyleElement.created() : super.created();
 
-  @DomName('HTMLStyleElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLStyleElement.media')
-  @DocsEditable()
   String media;
 
-  @DomName('HTMLStyleElement.sheet')
-  @DocsEditable()
   final StyleSheet sheet;
 
-  @DomName('HTMLStyleElement.type')
-  @DocsEditable()
   String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StyleMedia')
-// http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
-@Experimental() // nonstandard
 @Native("StyleMedia")
 class StyleMedia extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -37992,21 +27807,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StyleMedia.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('StyleMedia.matchMedium')
-  @DocsEditable()
   bool matchMedium(String mediaquery) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StylePropertyMap')
-@Experimental() // untriaged
 @Native("StylePropertyMap")
 class StylePropertyMap extends StylePropertyMapReadonly {
   // To suppress missing implicit constructor warnings.
@@ -38014,28 +27822,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StylePropertyMap.append')
-  @DocsEditable()
-  @Experimental() // untriaged
   void append(String property, Object value) native;
 
-  @DomName('StylePropertyMap.delete')
-  @DocsEditable()
-  @Experimental() // untriaged
   void delete(String property) native;
 
-  @DomName('StylePropertyMap.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   void set(String property, Object value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StylePropertyMapReadonly')
-@Experimental() // untriaged
 @Native("StylePropertyMapReadonly")
 class StylePropertyMapReadonly extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -38043,32 +27839,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StylePropertyMapReadonly.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   CssStyleValue get(String property) native;
 
-  @DomName('StylePropertyMapReadonly.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<CssStyleValue> getAll(String property) native;
 
-  @DomName('StylePropertyMapReadonly.getProperties')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<String> getProperties() native;
 
-  @DomName('StylePropertyMapReadonly.has')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool has(String property) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StyleSheet')
 @Native("StyleSheet")
 class StyleSheet extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -38076,41 +27858,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StyleSheet.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('StyleSheet.href')
-  @DocsEditable()
   final String href;
 
-  @DomName('StyleSheet.media')
-  @DocsEditable()
   final MediaList media;
 
-  @DomName('StyleSheet.ownerNode')
-  @DocsEditable()
   final Node ownerNode;
 
-  @DomName('StyleSheet.parentStyleSheet')
-  @DocsEditable()
   final StyleSheet parentStyleSheet;
 
-  @DomName('StyleSheet.title')
-  @DocsEditable()
   final String title;
 
-  @DomName('StyleSheet.type')
-  @DocsEditable()
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SyncEvent')
-@Experimental() // untriaged
 @Native("SyncEvent")
 class SyncEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
@@ -38118,8 +27883,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SyncEvent.SyncEvent')
-  @DocsEditable()
   factory SyncEvent(String type, Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
     return SyncEvent._create_1(type, init_1);
@@ -38127,23 +27890,14 @@
   static SyncEvent _create_1(type, init) =>
       JS('SyncEvent', 'new SyncEvent(#,#)', type, init);
 
-  @DomName('SyncEvent.lastChance')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool lastChance;
 
-  @DomName('SyncEvent.tag')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String tag;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SyncManager')
-@Experimental() // untriaged
 @Native("SyncManager")
 class SyncManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -38151,15 +27905,9 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SyncManager.getTags')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<String>> getTags() =>
       promiseToFuture<List<String>>(JS("", "#.getTags()", this));
 
-  @DomName('SyncManager.register')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future register(String tag) =>
       promiseToFuture(JS("", "#.register(#)", this, tag));
 }
@@ -38167,8 +27915,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLTableCaptionElement')
 @Native("HTMLTableCaptionElement")
 class TableCaptionElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -38176,8 +27922,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTableCaptionElement.HTMLTableCaptionElement')
-  @DocsEditable()
   factory TableCaptionElement() => JS(
       'returns:TableCaptionElement;creates:TableCaptionElement;new:true',
       '#.createElement(#)',
@@ -38194,8 +27938,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLTableCellElement')
 @Native(
     "HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement")
 class TableCellElement extends HtmlElement {
@@ -38204,8 +27946,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTableCellElement.HTMLTableCellElement')
-  @DocsEditable()
   factory TableCellElement() => JS(
       'returns:TableCellElement;creates:TableCellElement;new:true',
       '#.createElement(#)',
@@ -38218,28 +27958,18 @@
    */
   TableCellElement.created() : super.created();
 
-  @DomName('HTMLTableCellElement.cellIndex')
-  @DocsEditable()
   final int cellIndex;
 
-  @DomName('HTMLTableCellElement.colSpan')
-  @DocsEditable()
   int colSpan;
 
-  @DomName('HTMLTableCellElement.headers')
-  @DocsEditable()
   String headers;
 
-  @DomName('HTMLTableCellElement.rowSpan')
-  @DocsEditable()
   int rowSpan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLTableColElement')
 @Native("HTMLTableColElement")
 class TableColElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -38247,8 +27977,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTableColElement.HTMLTableColElement')
-  @DocsEditable()
   factory TableColElement() => JS(
       'returns:TableColElement;creates:TableColElement;new:true',
       '#.createElement(#)',
@@ -38261,23 +27989,17 @@
    */
   TableColElement.created() : super.created();
 
-  @DomName('HTMLTableColElement.span')
-  @DocsEditable()
   int span;
 }
 // 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.
 
-@DocsEditable()
-@DomName('HTMLTableElement')
 @Native("HTMLTableElement")
 class TableElement extends HtmlElement {
-  @DomName('HTMLTableElement.tBodies')
   List<TableSectionElement> get tBodies =>
       new _WrappedList<TableSectionElement>(_tBodies);
 
-  @DomName('HTMLTableElement.rows')
   List<TableRowElement> get rows => new _WrappedList<TableRowElement>(_rows);
 
   TableRowElement addRow() {
@@ -38323,8 +28045,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTableElement.HTMLTableElement')
-  @DocsEditable()
   factory TableElement() => JS(
       'returns:TableElement;creates:TableElement;new:true',
       '#.createElement(#)',
@@ -38337,77 +28057,48 @@
    */
   TableElement.created() : super.created();
 
-  @DomName('HTMLTableElement.caption')
-  @DocsEditable()
   TableCaptionElement caption;
 
   @JSName('rows')
-  @DomName('HTMLTableElement.rows')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> _rows;
 
   @JSName('tBodies')
-  @DomName('HTMLTableElement.tBodies')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> _tBodies;
 
-  @DomName('HTMLTableElement.tFoot')
-  @DocsEditable()
   TableSectionElement tFoot;
 
-  @DomName('HTMLTableElement.tHead')
-  @DocsEditable()
   TableSectionElement tHead;
 
   @JSName('createCaption')
-  @DomName('HTMLTableElement.createCaption')
-  @DocsEditable()
   TableCaptionElement _createCaption() native;
 
   @JSName('createTFoot')
-  @DomName('HTMLTableElement.createTFoot')
-  @DocsEditable()
   TableSectionElement _createTFoot() native;
 
   @JSName('createTHead')
-  @DomName('HTMLTableElement.createTHead')
-  @DocsEditable()
   TableSectionElement _createTHead() native;
 
-  @DomName('HTMLTableElement.deleteCaption')
-  @DocsEditable()
   void deleteCaption() native;
 
-  @DomName('HTMLTableElement.deleteRow')
-  @DocsEditable()
   void deleteRow(int index) native;
 
-  @DomName('HTMLTableElement.deleteTFoot')
-  @DocsEditable()
   void deleteTFoot() native;
 
-  @DomName('HTMLTableElement.deleteTHead')
-  @DocsEditable()
   void deleteTHead() native;
 
   @JSName('insertRow')
-  @DomName('HTMLTableElement.insertRow')
-  @DocsEditable()
   TableRowElement _insertRow([int index]) native;
 }
 // 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.
 
-@DocsEditable()
-@DomName('HTMLTableRowElement')
 @Native("HTMLTableRowElement")
 class TableRowElement extends HtmlElement {
-  @DomName('HTMLTableRowElement.cells')
   List<TableCellElement> get cells =>
       new _WrappedList<TableCellElement>(_cells);
 
@@ -38440,8 +28131,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTableRowElement.HTMLTableRowElement')
-  @DocsEditable()
   factory TableRowElement() => JS(
       'returns:TableRowElement;creates:TableRowElement;new:true',
       '#.createElement(#)',
@@ -38455,38 +28144,25 @@
   TableRowElement.created() : super.created();
 
   @JSName('cells')
-  @DomName('HTMLTableRowElement.cells')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> _cells;
 
-  @DomName('HTMLTableRowElement.rowIndex')
-  @DocsEditable()
   final int rowIndex;
 
-  @DomName('HTMLTableRowElement.sectionRowIndex')
-  @DocsEditable()
   final int sectionRowIndex;
 
-  @DomName('HTMLTableRowElement.deleteCell')
-  @DocsEditable()
   void deleteCell(int index) native;
 
   @JSName('insertCell')
-  @DomName('HTMLTableRowElement.insertCell')
-  @DocsEditable()
   HtmlElement _insertCell([int index]) native;
 }
 // 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.
 
-@DocsEditable()
-@DomName('HTMLTableSectionElement')
 @Native("HTMLTableSectionElement")
 class TableSectionElement extends HtmlElement {
-  @DomName('HTMLTableSectionElement.rows')
   List<TableRowElement> get rows => new _WrappedList<TableRowElement>(_rows);
 
   TableRowElement addRow() {
@@ -38524,28 +28200,19 @@
   TableSectionElement.created() : super.created();
 
   @JSName('rows')
-  @DomName('HTMLTableSectionElement.rows')
-  @DocsEditable()
   @Returns('HtmlCollection|Null')
   @Creates('HtmlCollection')
   final List<Node> _rows;
 
-  @DomName('HTMLTableSectionElement.deleteRow')
-  @DocsEditable()
   void deleteRow(int index) native;
 
   @JSName('insertRow')
-  @DomName('HTMLTableSectionElement.insertRow')
-  @DocsEditable()
   HtmlElement _insertRow([int index]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TaskAttributionTiming')
-@Experimental() // untriaged
 @Native("TaskAttributionTiming")
 class TaskAttributionTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
@@ -38553,30 +28220,15 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TaskAttributionTiming.containerId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String containerId;
 
-  @DomName('TaskAttributionTiming.containerName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String containerName;
 
-  @DomName('TaskAttributionTiming.containerSrc')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String containerSrc;
 
-  @DomName('TaskAttributionTiming.containerType')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String containerType;
 
   @JSName('scriptURL')
-  @DomName('TaskAttributionTiming.scriptURL')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String scriptUrl;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -38585,11 +28237,7 @@
 
 // WARNING: Do not edit - generated code.
 
-@Experimental()
-@DomName('HTMLTemplateElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
 @Native("HTMLTemplateElement")
 class TemplateElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -38597,8 +28245,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTemplateElement.HTMLTemplateElement')
-  @DocsEditable()
   factory TemplateElement() => document.createElement("template");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -38610,8 +28256,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('template');
 
-  @DomName('HTMLTemplateElement.content')
-  @DocsEditable()
   final DocumentFragment content;
 
   /**
@@ -38636,7 +28280,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('Text')
 @Native("Text")
 class Text extends CharacterData {
   factory Text(String data) => JS(
@@ -38649,32 +28292,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Text.assignedSlot')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SlotElement assignedSlot;
 
-  @DomName('Text.wholeText')
-  @DocsEditable()
   final String wholeText;
 
-  @DomName('Text.getDestinationInsertionPoints')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('NodeList|Null')
   @Creates('NodeList')
   List<Node> getDestinationInsertionPoints() native;
 
-  @DomName('Text.splitText')
-  @DocsEditable()
   Text splitText(int offset) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLTextAreaElement')
 @Native("HTMLTextAreaElement")
 class TextAreaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -38682,8 +28313,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTextAreaElement.HTMLTextAreaElement')
-  @DocsEditable()
   factory TextAreaElement() => JS(
       'returns:TextAreaElement;creates:TextAreaElement;new:true',
       '#.createElement(#)',
@@ -38696,148 +28325,76 @@
    */
   TextAreaElement.created() : super.created();
 
-  @DomName('HTMLTextAreaElement.autocapitalize')
-  @DocsEditable()
-  @Experimental() // untriaged
   String autocapitalize;
 
-  @DomName('HTMLTextAreaElement.autofocus')
-  @DocsEditable()
   bool autofocus;
 
-  @DomName('HTMLTextAreaElement.cols')
-  @DocsEditable()
   int cols;
 
-  @DomName('HTMLTextAreaElement.defaultValue')
-  @DocsEditable()
   String defaultValue;
 
-  @DomName('HTMLTextAreaElement.dirName')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
-  @Experimental()
   String dirName;
 
-  @DomName('HTMLTextAreaElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('HTMLTextAreaElement.form')
-  @DocsEditable()
   final FormElement form;
 
-  @DomName('HTMLTextAreaElement.labels')
-  @DocsEditable()
   @Unstable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   final List<Node> labels;
 
-  @DomName('HTMLTextAreaElement.maxLength')
-  @DocsEditable()
   int maxLength;
 
-  @DomName('HTMLTextAreaElement.minLength')
-  @DocsEditable()
-  @Experimental() // untriaged
   int minLength;
 
-  @DomName('HTMLTextAreaElement.name')
-  @DocsEditable()
   String name;
 
-  @DomName('HTMLTextAreaElement.placeholder')
-  @DocsEditable()
   String placeholder;
 
-  @DomName('HTMLTextAreaElement.readOnly')
-  @DocsEditable()
   bool readOnly;
 
-  @DomName('HTMLTextAreaElement.required')
-  @DocsEditable()
   bool required;
 
-  @DomName('HTMLTextAreaElement.rows')
-  @DocsEditable()
   int rows;
 
-  @DomName('HTMLTextAreaElement.selectionDirection')
-  @DocsEditable()
   String selectionDirection;
 
-  @DomName('HTMLTextAreaElement.selectionEnd')
-  @DocsEditable()
   int selectionEnd;
 
-  @DomName('HTMLTextAreaElement.selectionStart')
-  @DocsEditable()
   int selectionStart;
 
-  @DomName('HTMLTextAreaElement.textLength')
-  @DocsEditable()
   final int textLength;
 
-  @DomName('HTMLTextAreaElement.type')
-  @DocsEditable()
   final String type;
 
-  @DomName('HTMLTextAreaElement.validationMessage')
-  @DocsEditable()
   final String validationMessage;
 
-  @DomName('HTMLTextAreaElement.validity')
-  @DocsEditable()
   final ValidityState validity;
 
-  @DomName('HTMLTextAreaElement.value')
-  @DocsEditable()
   String value;
 
-  @DomName('HTMLTextAreaElement.willValidate')
-  @DocsEditable()
   final bool willValidate;
 
-  @DomName('HTMLTextAreaElement.wrap')
-  @DocsEditable()
   String wrap;
 
-  @DomName('HTMLTextAreaElement.checkValidity')
-  @DocsEditable()
   bool checkValidity() native;
 
-  @DomName('HTMLTextAreaElement.reportValidity')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool reportValidity() native;
 
-  @DomName('HTMLTextAreaElement.select')
-  @DocsEditable()
   void select() native;
 
-  @DomName('HTMLTextAreaElement.setCustomValidity')
-  @DocsEditable()
   void setCustomValidity(String error) native;
 
-  @DomName('HTMLTextAreaElement.setRangeText')
-  @DocsEditable()
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
-  @Experimental()
   void setRangeText(String replacement,
       {int start, int end, String selectionMode}) native;
 
-  @DomName('HTMLTextAreaElement.setSelectionRange')
-  @DocsEditable()
   void setSelectionRange(int start, int end, [String direction]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TextDetector')
-@Experimental() // untriaged
 @Native("TextDetector")
 class TextDetector extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -38845,16 +28402,11 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TextDetector.TextDetector')
-  @DocsEditable()
   factory TextDetector() {
     return TextDetector._create_1();
   }
   static TextDetector _create_1() => JS('TextDetector', 'new TextDetector()');
 
-  @DomName('TextDetector.detect')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<List<DetectedText>> detect(/*ImageBitmapSource*/ image) =>
       promiseToFuture<List<DetectedText>>(JS("", "#.detect(#)", this, image));
 }
@@ -38864,7 +28416,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('TextEvent')
 @Unstable()
 @Native("TextEvent")
 class TextEvent extends UIEvent {
@@ -38885,13 +28436,9 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TextEvent.data')
-  @DocsEditable()
   final String data;
 
   @JSName('initTextEvent')
-  @DomName('TextEvent.initTextEvent')
-  @DocsEditable()
   void _initTextEvent(String type, bool bubbles, bool cancelable, Window view,
       String data) native;
 }
@@ -38899,8 +28446,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TextMetrics')
 @Native("TextMetrics")
 class TextMetrics extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -38908,73 +28453,34 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TextMetrics.actualBoundingBoxAscent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num actualBoundingBoxAscent;
 
-  @DomName('TextMetrics.actualBoundingBoxDescent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num actualBoundingBoxDescent;
 
-  @DomName('TextMetrics.actualBoundingBoxLeft')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num actualBoundingBoxLeft;
 
-  @DomName('TextMetrics.actualBoundingBoxRight')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num actualBoundingBoxRight;
 
-  @DomName('TextMetrics.alphabeticBaseline')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num alphabeticBaseline;
 
-  @DomName('TextMetrics.emHeightAscent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num emHeightAscent;
 
-  @DomName('TextMetrics.emHeightDescent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num emHeightDescent;
 
-  @DomName('TextMetrics.fontBoundingBoxAscent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num fontBoundingBoxAscent;
 
-  @DomName('TextMetrics.fontBoundingBoxDescent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num fontBoundingBoxDescent;
 
-  @DomName('TextMetrics.hangingBaseline')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num hangingBaseline;
 
-  @DomName('TextMetrics.ideographicBaseline')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num ideographicBaseline;
 
-  @DomName('TextMetrics.width')
-  @DocsEditable()
   final num width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TextTrack')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrack
-@Experimental()
 @Native("TextTrack")
 class TextTrack extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -38988,61 +28494,34 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('TextTrack.cuechangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> cueChangeEvent =
       const EventStreamProvider<Event>('cuechange');
 
-  @DomName('TextTrack.activeCues')
-  @DocsEditable()
   final TextTrackCueList activeCues;
 
-  @DomName('TextTrack.cues')
-  @DocsEditable()
   final TextTrackCueList cues;
 
-  @DomName('TextTrack.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('TextTrack.kind')
-  @DocsEditable()
   final String kind;
 
-  @DomName('TextTrack.label')
-  @DocsEditable()
   final String label;
 
-  @DomName('TextTrack.language')
-  @DocsEditable()
   final String language;
 
-  @DomName('TextTrack.mode')
-  @DocsEditable()
   String mode;
 
-  @DomName('TextTrack.addCue')
-  @DocsEditable()
   void addCue(TextTrackCue cue) native;
 
-  @DomName('TextTrack.removeCue')
-  @DocsEditable()
   void removeCue(TextTrackCue cue) native;
 
   /// Stream of `cuechange` events handled by this [TextTrack].
-  @DomName('TextTrack.oncuechange')
-  @DocsEditable()
   Stream<Event> get onCueChange => cueChangeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TextTrackCue')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcue
-@Experimental()
 @Native("TextTrackCue")
 class TextTrackCue extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -39056,8 +28535,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('TextTrackCue.enterEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> enterEvent =
       const EventStreamProvider<Event>('enter');
 
@@ -39067,49 +28544,29 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('TextTrackCue.exitEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> exitEvent =
       const EventStreamProvider<Event>('exit');
 
-  @DomName('TextTrackCue.endTime')
-  @DocsEditable()
   num endTime;
 
-  @DomName('TextTrackCue.id')
-  @DocsEditable()
   String id;
 
-  @DomName('TextTrackCue.pauseOnExit')
-  @DocsEditable()
   bool pauseOnExit;
 
-  @DomName('TextTrackCue.startTime')
-  @DocsEditable()
   num startTime;
 
-  @DomName('TextTrackCue.track')
-  @DocsEditable()
   final TextTrack track;
 
   /// Stream of `enter` events handled by this [TextTrackCue].
-  @DomName('TextTrackCue.onenter')
-  @DocsEditable()
   Stream<Event> get onEnter => enterEvent.forTarget(this);
 
   /// Stream of `exit` events handled by this [TextTrackCue].
-  @DomName('TextTrackCue.onexit')
-  @DocsEditable()
   Stream<Event> get onExit => exitEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TextTrackCueList')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcuelist
-@Experimental()
 @Native("TextTrackCueList")
 class TextTrackCueList extends Interceptor
     with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue>
@@ -39119,8 +28576,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TextTrackCueList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   TextTrackCue operator [](int index) {
@@ -39166,23 +28621,14 @@
   TextTrackCue elementAt(int index) => this[index];
   // -- end List<TextTrackCue> mixins.
 
-  @DomName('TextTrackCueList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   TextTrackCue __getter__(int index) native;
 
-  @DomName('TextTrackCueList.getCueById')
-  @DocsEditable()
   TextTrackCue getCueById(String id) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TextTrackList')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttracklist
-@Experimental()
 @Native("TextTrackList")
 class TextTrackList extends EventTarget
     with ListMixin<TextTrack>, ImmutableListMixin<TextTrack>
@@ -39198,19 +28644,12 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('TextTrackList.addtrackEvent')
-  @DocsEditable()
   static const EventStreamProvider<TrackEvent> addTrackEvent =
       const EventStreamProvider<TrackEvent>('addtrack');
 
-  @DomName('TextTrackList.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('TextTrackList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   TextTrack operator [](int index) {
@@ -39256,33 +28695,19 @@
   TextTrack elementAt(int index) => this[index];
   // -- end List<TextTrack> mixins.
 
-  @DomName('TextTrackList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   TextTrack __getter__(int index) native;
 
-  @DomName('TextTrackList.getTrackById')
-  @DocsEditable()
-  @Experimental() // untriaged
   TextTrack getTrackById(String id) native;
 
   /// Stream of `addtrack` events handled by this [TextTrackList].
-  @DomName('TextTrackList.onaddtrack')
-  @DocsEditable()
   Stream<TrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
 
-  @DomName('TextTrackList.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLTimeElement')
-@Experimental() // untriaged
 @Native("HTMLTimeElement")
 class TimeElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -39296,17 +28721,12 @@
    */
   TimeElement.created() : super.created();
 
-  @DomName('HTMLTimeElement.dateTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   String dateTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TimeRanges')
 @Unstable()
 @Native("TimeRanges")
 class TimeRanges extends Interceptor {
@@ -39315,16 +28735,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TimeRanges.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('TimeRanges.end')
-  @DocsEditable()
   double end(int index) native;
 
-  @DomName('TimeRanges.start')
-  @DocsEditable()
   double start(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39333,14 +28747,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('TimeoutHandler')
 typedef void TimeoutHandler();
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLTitleElement')
 @Native("HTMLTitleElement")
 class TitleElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -39348,8 +28759,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTitleElement.HTMLTitleElement')
-  @DocsEditable()
   factory TitleElement() => JS(
       'returns:TitleElement;creates:TitleElement;new:true',
       '#.createElement(#)',
@@ -39366,10 +28775,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Touch')
-// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-@Experimental()
 @Native("Touch")
 class Touch extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -39377,8 +28782,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Touch.Touch')
-  @DocsEditable()
   factory Touch(Map initDict) {
     var initDict_1 = convertDartToNative_Dictionary(initDict);
     return Touch._create_1(initDict_1);
@@ -39386,72 +28789,39 @@
   static Touch _create_1(initDict) => JS('Touch', 'new Touch(#)', initDict);
 
   @JSName('clientX')
-  @DomName('Touch.clientX')
-  @DocsEditable()
   final num _clientX;
 
   @JSName('clientY')
-  @DomName('Touch.clientY')
-  @DocsEditable()
   final num _clientY;
 
-  @DomName('Touch.force')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num force;
 
-  @DomName('Touch.identifier')
-  @DocsEditable()
   final int identifier;
 
   @JSName('pageX')
-  @DomName('Touch.pageX')
-  @DocsEditable()
   final num _pageX;
 
   @JSName('pageY')
-  @DomName('Touch.pageY')
-  @DocsEditable()
   final num _pageY;
 
   @JSName('radiusX')
-  @DomName('Touch.radiusX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num _radiusX;
 
   @JSName('radiusY')
-  @DomName('Touch.radiusY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num _radiusY;
 
-  @DomName('Touch.region')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String region;
 
-  @DomName('Touch.rotationAngle')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num rotationAngle;
 
   @JSName('screenX')
-  @DomName('Touch.screenX')
-  @DocsEditable()
   final num _screenX;
 
   @JSName('screenY')
-  @DomName('Touch.screenY')
-  @DocsEditable()
   final num _screenY;
 
-  @DomName('Touch.target')
-  @DocsEditable()
   EventTarget get target => _convertNativeToDart_EventTarget(this._get_target);
   @JSName('target')
-  @DomName('Touch.target')
-  @DocsEditable()
   @Creates('Element|Document')
   @Returns('Element|Document')
   final dynamic _get_target;
@@ -39467,30 +28837,18 @@
   int get __radiusX => JS('num', '#.radiusX', this).round();
   int get __radiusY => JS('num', '#.radiusY', this).round();
 
-  @DomName('Touch.clientX')
-  @DomName('Touch.clientY')
   Point get client => new Point(__clientX, __clientY);
 
-  @DomName('Touch.pageX')
-  @DomName('Touch.pageY')
   Point get page => new Point(__pageX, __pageY);
 
-  @DomName('Touch.screenX')
-  @DomName('Touch.screenY')
   Point get screen => new Point(__screenX, __screenY);
 
-  @DomName('Touch.radiusX')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   int get radiusX => __radiusX;
 
-  @DomName('Touch.radiusY')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   int get radiusY => __radiusY;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -39499,9 +28857,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('TouchEvent')
-// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-@Experimental()
 @Native("TouchEvent")
 class TouchEvent extends UIEvent {
   // To suppress missing implicit constructor warnings.
@@ -39509,8 +28864,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TouchEvent.TouchEvent')
-  @DocsEditable()
   factory TouchEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -39523,32 +28876,18 @@
   static TouchEvent _create_2(type) =>
       JS('TouchEvent', 'new TouchEvent(#)', type);
 
-  @DomName('TouchEvent.altKey')
-  @DocsEditable()
   final bool altKey;
 
-  @DomName('TouchEvent.changedTouches')
-  @DocsEditable()
   final TouchList changedTouches;
 
-  @DomName('TouchEvent.ctrlKey')
-  @DocsEditable()
   final bool ctrlKey;
 
-  @DomName('TouchEvent.metaKey')
-  @DocsEditable()
   final bool metaKey;
 
-  @DomName('TouchEvent.shiftKey')
-  @DocsEditable()
   final bool shiftKey;
 
-  @DomName('TouchEvent.targetTouches')
-  @DocsEditable()
   final TouchList targetTouches;
 
-  @DomName('TouchEvent.touches')
-  @DocsEditable()
   final TouchList touches;
 
   /**
@@ -39565,9 +28904,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('TouchList')
-// http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-@Experimental()
 @Native("TouchList")
 class TouchList extends Interceptor
     with ListMixin<Touch>, ImmutableListMixin<Touch>
@@ -39585,8 +28921,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!document.createTouchList');
 
-  @DomName('TouchList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   Touch operator [](int index) {
@@ -39632,17 +28966,12 @@
   Touch elementAt(int index) => this[index];
   // -- end List<Touch> mixins.
 
-  @DomName('TouchList.item')
-  @DocsEditable()
   Touch item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TrackDefault')
-@Experimental() // untriaged
 @Native("TrackDefault")
 class TrackDefault extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -39650,8 +28979,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TrackDefault.TrackDefault')
-  @DocsEditable()
   factory TrackDefault(
       String type, String language, String label, List<String> kinds,
       [String byteStreamTrackID]) {
@@ -39675,38 +29002,20 @@
       label,
       kinds);
 
-  @DomName('TrackDefault.byteStreamTrackID')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String byteStreamTrackID;
 
-  @DomName('TrackDefault.kinds')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object kinds;
 
-  @DomName('TrackDefault.label')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String label;
 
-  @DomName('TrackDefault.language')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String language;
 
-  @DomName('TrackDefault.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TrackDefaultList')
-@Experimental() // untriaged
 @Native("TrackDefaultList")
 class TrackDefaultList extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -39714,8 +29023,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TrackDefaultList.TrackDefaultList')
-  @DocsEditable()
   factory TrackDefaultList([List<TrackDefault> trackDefaults]) {
     if (trackDefaults != null) {
       return TrackDefaultList._create_1(trackDefaults);
@@ -39727,27 +29034,17 @@
   static TrackDefaultList _create_2() =>
       JS('TrackDefaultList', 'new TrackDefaultList()');
 
-  @DomName('TrackDefaultList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int length;
 
-  @DomName('TrackDefaultList.item')
-  @DocsEditable()
-  @Experimental() // untriaged
   TrackDefault item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLTrackElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-track-element
-@Experimental()
 @Native("HTMLTrackElement")
 class TrackElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -39755,8 +29052,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLTrackElement.HTMLTrackElement')
-  @DocsEditable()
   factory TrackElement() => document.createElement("track");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -39768,57 +29063,33 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('track');
 
-  @DomName('HTMLTrackElement.ERROR')
-  @DocsEditable()
   static const int ERROR = 3;
 
-  @DomName('HTMLTrackElement.LOADED')
-  @DocsEditable()
   static const int LOADED = 2;
 
-  @DomName('HTMLTrackElement.LOADING')
-  @DocsEditable()
   static const int LOADING = 1;
 
-  @DomName('HTMLTrackElement.NONE')
-  @DocsEditable()
   static const int NONE = 0;
 
   @JSName('default')
-  @DomName('HTMLTrackElement.default')
-  @DocsEditable()
   bool defaultValue;
 
-  @DomName('HTMLTrackElement.kind')
-  @DocsEditable()
   String kind;
 
-  @DomName('HTMLTrackElement.label')
-  @DocsEditable()
   String label;
 
-  @DomName('HTMLTrackElement.readyState')
-  @DocsEditable()
   final int readyState;
 
-  @DomName('HTMLTrackElement.src')
-  @DocsEditable()
   String src;
 
-  @DomName('HTMLTrackElement.srclang')
-  @DocsEditable()
   String srclang;
 
-  @DomName('HTMLTrackElement.track')
-  @DocsEditable()
   final TextTrack track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TrackEvent')
 @Unstable()
 @Native("TrackEvent")
 class TrackEvent extends Event {
@@ -39827,8 +29098,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TrackEvent.TrackEvent')
-  @DocsEditable()
   factory TrackEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -39841,8 +29110,6 @@
   static TrackEvent _create_2(type) =>
       JS('TrackEvent', 'new TrackEvent(#)', type);
 
-  @DomName('TrackEvent.track')
-  @DocsEditable()
   @Creates('Null')
   final Object track;
 }
@@ -39850,8 +29117,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TransitionEvent')
 @Native("TransitionEvent,WebKitTransitionEvent")
 class TransitionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -39859,8 +29124,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TransitionEvent.TransitionEvent')
-  @DocsEditable()
   factory TransitionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -39873,23 +29136,16 @@
   static TransitionEvent _create_2(type) =>
       JS('TransitionEvent', 'new TransitionEvent(#)', type);
 
-  @DomName('TransitionEvent.elapsedTime')
-  @DocsEditable()
   final num elapsedTime;
 
-  @DomName('TransitionEvent.propertyName')
-  @DocsEditable()
   final String propertyName;
 
-  @DomName('TransitionEvent.pseudoElement')
-  @DocsEditable()
   final String pseudoElement;
 }
 // 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.
 
-@DomName('TreeWalker')
 @Unstable()
 @Native("TreeWalker")
 class TreeWalker extends Interceptor {
@@ -39901,57 +29157,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TreeWalker.currentNode')
-  @DocsEditable()
   Node currentNode;
 
-  @DomName('TreeWalker.filter')
-  @DocsEditable()
   final NodeFilter filter;
 
-  @DomName('TreeWalker.root')
-  @DocsEditable()
   final Node root;
 
-  @DomName('TreeWalker.whatToShow')
-  @DocsEditable()
   final int whatToShow;
 
-  @DomName('TreeWalker.firstChild')
-  @DocsEditable()
   Node firstChild() native;
 
-  @DomName('TreeWalker.lastChild')
-  @DocsEditable()
   Node lastChild() native;
 
-  @DomName('TreeWalker.nextNode')
-  @DocsEditable()
   Node nextNode() native;
 
-  @DomName('TreeWalker.nextSibling')
-  @DocsEditable()
   Node nextSibling() native;
 
-  @DomName('TreeWalker.parentNode')
-  @DocsEditable()
   Node parentNode() native;
 
-  @DomName('TreeWalker.previousNode')
-  @DocsEditable()
   Node previousNode() native;
 
-  @DomName('TreeWalker.previousSibling')
-  @DocsEditable()
   Node previousSibling() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TrustedHTML')
-@Experimental() // untriaged
 @Native("TrustedHTML")
 class TrustedHtml extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -39959,23 +29190,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TrustedHTML.escape')
-  @DocsEditable()
-  @Experimental() // untriaged
   static TrustedHtml escape(String html) native;
 
-  @DomName('TrustedHTML.unsafelyCreate')
-  @DocsEditable()
-  @Experimental() // untriaged
   static TrustedHtml unsafelyCreate(String html) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TrustedScriptURL')
-@Experimental() // untriaged
 @Native("TrustedScriptURL")
 class TrustedScriptUrl extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -39983,18 +29205,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TrustedScriptURL.unsafelyCreate')
-  @DocsEditable()
-  @Experimental() // untriaged
   static TrustedScriptUrl unsafelyCreate(String url) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('TrustedURL')
-@Experimental() // untriaged
 @Native("TrustedURL")
 class TrustedUrl extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40002,14 +29218,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('TrustedURL.create')
-  @DocsEditable()
-  @Experimental() // untriaged
   static TrustedUrl create(String url) native;
 
-  @DomName('TrustedURL.unsafelyCreate')
-  @DocsEditable()
-  @Experimental() // untriaged
   static TrustedUrl unsafelyCreate(String url) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40018,7 +29228,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('UIEvent')
 @Native("UIEvent")
 class UIEvent extends Event {
   // In JS, canBubble and cancelable are technically required parameters to
@@ -40040,8 +29249,6 @@
     return e;
   }
 
-  @DomName('UIEvent.UIEvent')
-  @DocsEditable()
   factory UIEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -40053,34 +29260,21 @@
       JS('UIEvent', 'new UIEvent(#,#)', type, eventInitDict);
   static UIEvent _create_2(type) => JS('UIEvent', 'new UIEvent(#)', type);
 
-  @DomName('UIEvent.detail')
-  @DocsEditable()
   final int detail;
 
-  @DomName('UIEvent.sourceCapabilities')
-  @DocsEditable()
-  @Experimental() // untriaged
   final InputDeviceCapabilities sourceCapabilities;
 
-  @DomName('UIEvent.view')
-  @DocsEditable()
   WindowBase get view => _convertNativeToDart_Window(this._get_view);
   @JSName('view')
-  @DomName('UIEvent.view')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_view;
 
   @JSName('which')
-  @DomName('UIEvent.which')
-  @DocsEditable()
   @Unstable()
   final int _which;
 
   @JSName('initUIEvent')
-  @DomName('UIEvent.initUIEvent')
-  @DocsEditable()
   void _initUIEvent(String type, bool bubbles, bool cancelable, Window view,
       int detail) native;
 }
@@ -40088,8 +29282,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLUListElement')
 @Native("HTMLUListElement")
 class UListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -40097,8 +29289,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLUListElement.HTMLUListElement')
-  @DocsEditable()
   factory UListElement() => JS(
       'returns:UListElement;creates:UListElement;new:true',
       '#.createElement(#)',
@@ -40115,9 +29305,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('UnderlyingSourceBase')
-@Experimental() // untriaged
 @Native("UnderlyingSourceBase")
 class UnderlyingSourceBase extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40125,30 +29312,15 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('UnderlyingSourceBase.cancel')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future cancel(Object reason) =>
       promiseToFuture(JS("", "#.cancel(#)", this, reason));
 
-  @DomName('UnderlyingSourceBase.notifyLockAcquired')
-  @DocsEditable()
-  @Experimental() // untriaged
   void notifyLockAcquired() native;
 
-  @DomName('UnderlyingSourceBase.notifyLockReleased')
-  @DocsEditable()
-  @Experimental() // untriaged
   void notifyLockReleased() native;
 
-  @DomName('UnderlyingSourceBase.pull')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future pull() => promiseToFuture(JS("", "#.pull()", this));
 
-  @DomName('UnderlyingSourceBase.start')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future start(Object stream) =>
       promiseToFuture(JS("", "#.start(#)", this, stream));
 }
@@ -40156,8 +29328,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLUnknownElement')
 @Native("HTMLUnknownElement")
 class UnknownElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
@@ -40175,7 +29345,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('URL')
 @Native("URL")
 class Url extends Interceptor {
   static String createObjectUrl(blob_OR_source_OR_stream) => JS(
@@ -40195,8 +29364,6 @@
   static void revokeObjectUrl(String url) =>
       JS('void', '(self.URL || self.webkitURL).revokeObjectURL(#)', url);
 
-  @DomName('URL.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 
   // To suppress missing implicit constructor warnings.
@@ -40204,73 +29371,34 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('URL.hash')
-  @DocsEditable()
-  @Experimental() // untriaged
   String hash;
 
-  @DomName('URL.host')
-  @DocsEditable()
-  @Experimental() // untriaged
   String host;
 
-  @DomName('URL.hostname')
-  @DocsEditable()
-  @Experimental() // untriaged
   String hostname;
 
-  @DomName('URL.href')
-  @DocsEditable()
-  @Experimental() // untriaged
   String href;
 
-  @DomName('URL.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
-  @DomName('URL.password')
-  @DocsEditable()
-  @Experimental() // untriaged
   String password;
 
-  @DomName('URL.pathname')
-  @DocsEditable()
-  @Experimental() // untriaged
   String pathname;
 
-  @DomName('URL.port')
-  @DocsEditable()
-  @Experimental() // untriaged
   String port;
 
-  @DomName('URL.protocol')
-  @DocsEditable()
-  @Experimental() // untriaged
   String protocol;
 
-  @DomName('URL.search')
-  @DocsEditable()
-  @Experimental() // untriaged
   String search;
 
-  @DomName('URL.searchParams')
-  @DocsEditable()
-  @Experimental() // untriaged
   final UrlSearchParams searchParams;
 
-  @DomName('URL.username')
-  @DocsEditable()
-  @Experimental() // untriaged
   String username;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('URLSearchParams')
-@Experimental() // untriaged
 @Native("URLSearchParams")
 class UrlSearchParams extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40278,8 +29406,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('URLSearchParams.URLSearchParams')
-  @DocsEditable()
   factory UrlSearchParams([Object init]) {
     if (init != null) {
       return UrlSearchParams._create_1(init);
@@ -40291,48 +29417,24 @@
   static UrlSearchParams _create_2() =>
       JS('UrlSearchParams', 'new URLSearchParams()');
 
-  @DomName('URLSearchParams.append')
-  @DocsEditable()
-  @Experimental() // untriaged
   void append(String name, String value) native;
 
-  @DomName('URLSearchParams.delete')
-  @DocsEditable()
-  @Experimental() // untriaged
   void delete(String name) native;
 
-  @DomName('URLSearchParams.get')
-  @DocsEditable()
-  @Experimental() // untriaged
   String get(String name) native;
 
-  @DomName('URLSearchParams.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<String> getAll(String name) native;
 
-  @DomName('URLSearchParams.has')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool has(String name) native;
 
-  @DomName('URLSearchParams.set')
-  @DocsEditable()
-  @Experimental() // untriaged
   void set(String name, String value) native;
 
-  @DomName('URLSearchParams.sort')
-  @DocsEditable()
-  @Experimental() // untriaged
   void sort() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('URLUtilsReadOnly')
-@Experimental() // untriaged
 abstract class UrlUtilsReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory UrlUtilsReadOnly._() {
@@ -40361,9 +29463,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VR')
-@Experimental() // untriaged
 @Native("VR")
 class VR extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -40371,18 +29470,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VR.getDevices')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future getDevices() => promiseToFuture(JS("", "#.getDevices()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRCoordinateSystem')
-@Experimental() // untriaged
 @Native("VRCoordinateSystem")
 class VRCoordinateSystem extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40390,18 +29483,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRCoordinateSystem.getTransformTo')
-  @DocsEditable()
-  @Experimental() // untriaged
   Float32List getTransformTo(VRCoordinateSystem other) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRDevice')
-@Experimental() // untriaged
 @Native("VRDevice")
 class VRDevice extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -40409,19 +29496,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRDevice.deviceName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String deviceName;
 
-  @DomName('VRDevice.isExternal')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isExternal;
 
-  @DomName('VRDevice.requestSession')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future requestSession([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -40431,19 +29509,10 @@
   }
 
   @JSName('requestSession')
-  @DomName('VRDevice.requestSession')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestSession_1(options) native;
   @JSName('requestSession')
-  @DomName('VRDevice.requestSession')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestSession_2() native;
 
-  @DomName('VRDevice.supportsSession')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future supportsSession([Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -40453,23 +29522,14 @@
   }
 
   @JSName('supportsSession')
-  @DomName('VRDevice.supportsSession')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _supportsSession_1(options) native;
   @JSName('supportsSession')
-  @DomName('VRDevice.supportsSession')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _supportsSession_2() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRDeviceEvent')
-@Experimental() // untriaged
 @Native("VRDeviceEvent")
 class VRDeviceEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -40477,8 +29537,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRDeviceEvent.VRDeviceEvent')
-  @DocsEditable()
   factory VRDeviceEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return VRDeviceEvent._create_1(type, eventInitDict_1);
@@ -40486,18 +29544,12 @@
   static VRDeviceEvent _create_1(type, eventInitDict) =>
       JS('VRDeviceEvent', 'new VRDeviceEvent(#,#)', type, eventInitDict);
 
-  @DomName('VRDeviceEvent.device')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRDevice device;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRDisplay')
-@Experimental() // untriaged
 @Native("VRDisplay")
 class VRDisplay extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -40505,89 +29557,41 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRDisplay.capabilities')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRDisplayCapabilities capabilities;
 
-  @DomName('VRDisplay.depthFar')
-  @DocsEditable()
-  @Experimental() // untriaged
   num depthFar;
 
-  @DomName('VRDisplay.depthNear')
-  @DocsEditable()
-  @Experimental() // untriaged
   num depthNear;
 
-  @DomName('VRDisplay.displayId')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int displayId;
 
-  @DomName('VRDisplay.displayName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String displayName;
 
-  @DomName('VRDisplay.isPresenting')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isPresenting;
 
-  @DomName('VRDisplay.stageParameters')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRStageParameters stageParameters;
 
-  @DomName('VRDisplay.cancelAnimationFrame')
-  @DocsEditable()
-  @Experimental() // untriaged
   void cancelAnimationFrame(int handle) native;
 
-  @DomName('VRDisplay.exitPresent')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future exitPresent() => promiseToFuture(JS("", "#.exitPresent()", this));
 
-  @DomName('VRDisplay.getEyeParameters')
-  @DocsEditable()
-  @Experimental() // untriaged
   VREyeParameters getEyeParameters(String whichEye) native;
 
-  @DomName('VRDisplay.getFrameData')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool getFrameData(VRFrameData frameData) native;
 
-  @DomName('VRDisplay.getLayers')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Map> getLayers() native;
 
-  @DomName('VRDisplay.requestAnimationFrame')
-  @DocsEditable()
-  @Experimental() // untriaged
   int requestAnimationFrame(FrameRequestCallback callback) native;
 
-  @DomName('VRDisplay.requestPresent')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future requestPresent(List<Map> layers) =>
       promiseToFuture(JS("", "#.requestPresent(#)", this, layers));
 
-  @DomName('VRDisplay.submitFrame')
-  @DocsEditable()
-  @Experimental() // untriaged
   void submitFrame() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRDisplayCapabilities')
-@Experimental() // untriaged
 @Native("VRDisplayCapabilities")
 class VRDisplayCapabilities extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40595,33 +29599,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRDisplayCapabilities.canPresent')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool canPresent;
 
-  @DomName('VRDisplayCapabilities.hasExternalDisplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool hasExternalDisplay;
 
-  @DomName('VRDisplayCapabilities.hasPosition')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool hasPosition;
 
-  @DomName('VRDisplayCapabilities.maxLayers')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int maxLayers;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRDisplayEvent')
-@Experimental() // untriaged
 @Native("VRDisplayEvent")
 class VRDisplayEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -40629,8 +29618,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRDisplayEvent.VRDisplayEvent')
-  @DocsEditable()
   factory VRDisplayEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -40643,23 +29630,14 @@
   static VRDisplayEvent _create_2(type) =>
       JS('VRDisplayEvent', 'new VRDisplayEvent(#)', type);
 
-  @DomName('VRDisplayEvent.display')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRDisplay display;
 
-  @DomName('VRDisplayEvent.reason')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String reason;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VREyeParameters')
-@Experimental() // untriaged
 @Native("VREyeParameters")
 class VREyeParameters extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40667,28 +29645,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VREyeParameters.offset')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List offset;
 
-  @DomName('VREyeParameters.renderHeight')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int renderHeight;
 
-  @DomName('VREyeParameters.renderWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int renderWidth;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRFrameData')
-@Experimental() // untriaged
 @Native("VRFrameData")
 class VRFrameData extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40696,45 +29662,25 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRFrameData.VRFrameData')
-  @DocsEditable()
   factory VRFrameData() {
     return VRFrameData._create_1();
   }
   static VRFrameData _create_1() => JS('VRFrameData', 'new VRFrameData()');
 
-  @DomName('VRFrameData.leftProjectionMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List leftProjectionMatrix;
 
-  @DomName('VRFrameData.leftViewMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List leftViewMatrix;
 
-  @DomName('VRFrameData.pose')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRPose pose;
 
-  @DomName('VRFrameData.rightProjectionMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List rightProjectionMatrix;
 
-  @DomName('VRFrameData.rightViewMatrix')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List rightViewMatrix;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRFrameOfReference')
-@Experimental() // untriaged
 @Native("VRFrameOfReference")
 class VRFrameOfReference extends VRCoordinateSystem {
   // To suppress missing implicit constructor warnings.
@@ -40742,23 +29688,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRFrameOfReference.bounds')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRStageBounds bounds;
 
-  @DomName('VRFrameOfReference.emulatedHeight')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num emulatedHeight;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRPose')
-@Experimental() // untriaged
 @Native("VRPose")
 class VRPose extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40766,43 +29703,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRPose.angularAcceleration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List angularAcceleration;
 
-  @DomName('VRPose.angularVelocity')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List angularVelocity;
 
-  @DomName('VRPose.linearAcceleration')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List linearAcceleration;
 
-  @DomName('VRPose.linearVelocity')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List linearVelocity;
 
-  @DomName('VRPose.orientation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List orientation;
 
-  @DomName('VRPose.position')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List position;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRSession')
-@Experimental() // untriaged
 @Native("VRSession")
 class VRSession extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -40810,46 +29726,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRSession.blurEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> blurEvent =
       const EventStreamProvider<Event>('blur');
 
-  @DomName('VRSession.focusEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> focusEvent =
       const EventStreamProvider<Event>('focus');
 
-  @DomName('VRSession.depthFar')
-  @DocsEditable()
-  @Experimental() // untriaged
   num depthFar;
 
-  @DomName('VRSession.depthNear')
-  @DocsEditable()
-  @Experimental() // untriaged
   num depthNear;
 
-  @DomName('VRSession.device')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRDevice device;
 
-  @DomName('VRSession.exclusive')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool exclusive;
 
-  @DomName('VRSession.end')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future end() => promiseToFuture(JS("", "#.end()", this));
 
-  @DomName('VRSession.requestFrameOfReference')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future requestFrameOfReference(String type, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -40859,33 +29751,18 @@
   }
 
   @JSName('requestFrameOfReference')
-  @DomName('VRSession.requestFrameOfReference')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestFrameOfReference_1(type, options) native;
   @JSName('requestFrameOfReference')
-  @DomName('VRSession.requestFrameOfReference')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _requestFrameOfReference_2(type) native;
 
-  @DomName('VRSession.onblur')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
-  @DomName('VRSession.onfocus')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onFocus => focusEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRSessionEvent')
-@Experimental() // untriaged
 @Native("VRSessionEvent")
 class VRSessionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -40893,8 +29770,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRSessionEvent.VRSessionEvent')
-  @DocsEditable()
   factory VRSessionEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return VRSessionEvent._create_1(type, eventInitDict_1);
@@ -40902,18 +29777,12 @@
   static VRSessionEvent _create_1(type, eventInitDict) =>
       JS('VRSessionEvent', 'new VRSessionEvent(#,#)', type, eventInitDict);
 
-  @DomName('VRSessionEvent.session')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VRSession session;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRStageBounds')
-@Experimental() // untriaged
 @Native("VRStageBounds")
 class VRStageBounds extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40921,18 +29790,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRStageBounds.geometry')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<VRStageBoundsPoint> geometry;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRStageBoundsPoint')
-@Experimental() // untriaged
 @Native("VRStageBoundsPoint")
 class VRStageBoundsPoint extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40940,23 +29803,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRStageBoundsPoint.x')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num x;
 
-  @DomName('VRStageBoundsPoint.z')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VRStageParameters')
-@Experimental() // untriaged
 @Native("VRStageParameters")
 class VRStageParameters extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40964,27 +29818,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VRStageParameters.sittingToStandingTransform')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Float32List sittingToStandingTransform;
 
-  @DomName('VRStageParameters.sizeX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num sizeX;
 
-  @DomName('VRStageParameters.sizeZ')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num sizeZ;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ValidityState')
 @Native("ValidityState")
 class ValidityState extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -40992,56 +29835,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ValidityState.badInput')
-  @DocsEditable()
   final bool badInput;
 
-  @DomName('ValidityState.customError')
-  @DocsEditable()
   final bool customError;
 
-  @DomName('ValidityState.patternMismatch')
-  @DocsEditable()
   final bool patternMismatch;
 
-  @DomName('ValidityState.rangeOverflow')
-  @DocsEditable()
   final bool rangeOverflow;
 
-  @DomName('ValidityState.rangeUnderflow')
-  @DocsEditable()
   final bool rangeUnderflow;
 
-  @DomName('ValidityState.stepMismatch')
-  @DocsEditable()
   final bool stepMismatch;
 
-  @DomName('ValidityState.tooLong')
-  @DocsEditable()
   final bool tooLong;
 
-  @DomName('ValidityState.tooShort')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool tooShort;
 
-  @DomName('ValidityState.typeMismatch')
-  @DocsEditable()
   final bool typeMismatch;
 
-  @DomName('ValidityState.valid')
-  @DocsEditable()
   final bool valid;
 
-  @DomName('ValidityState.valueMissing')
-  @DocsEditable()
   final bool valueMissing;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('HTMLVideoElement')
 @Native("HTMLVideoElement")
 class VideoElement extends MediaElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
@@ -41049,8 +29868,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('HTMLVideoElement.HTMLVideoElement')
-  @DocsEditable()
   factory VideoElement() => JS(
       'returns:VideoElement;creates:VideoElement;new:true',
       '#.createElement(#)',
@@ -41063,72 +29880,42 @@
    */
   VideoElement.created() : super.created();
 
-  @DomName('HTMLVideoElement.height')
-  @DocsEditable()
   int height;
 
-  @DomName('HTMLVideoElement.poster')
-  @DocsEditable()
   String poster;
 
-  @DomName('HTMLVideoElement.videoHeight')
-  @DocsEditable()
   final int videoHeight;
 
-  @DomName('HTMLVideoElement.videoWidth')
-  @DocsEditable()
   final int videoWidth;
 
   @JSName('webkitDecodedFrameCount')
-  @DomName('HTMLVideoElement.webkitDecodedFrameCount')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   final int decodedFrameCount;
 
   @JSName('webkitDroppedFrameCount')
-  @DomName('HTMLVideoElement.webkitDroppedFrameCount')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   final int droppedFrameCount;
 
-  @DomName('HTMLVideoElement.width')
-  @DocsEditable()
   int width;
 
-  @DomName('HTMLVideoElement.getVideoPlaybackQuality')
-  @DocsEditable()
-  @Experimental() // untriaged
   VideoPlaybackQuality getVideoPlaybackQuality() native;
 
   @JSName('webkitEnterFullscreen')
-  @DomName('HTMLVideoElement.webkitEnterFullscreen')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   void enterFullscreen() native;
 
   @JSName('webkitExitFullscreen')
-  @DomName('HTMLVideoElement.webkitExitFullscreen')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
   void exitFullscreen() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VideoPlaybackQuality')
-@Experimental() // untriaged
 @Native("VideoPlaybackQuality")
 class VideoPlaybackQuality extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -41136,33 +29923,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VideoPlaybackQuality.corruptedVideoFrames')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int corruptedVideoFrames;
 
-  @DomName('VideoPlaybackQuality.creationTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num creationTime;
 
-  @DomName('VideoPlaybackQuality.droppedVideoFrames')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int droppedVideoFrames;
 
-  @DomName('VideoPlaybackQuality.totalVideoFrames')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int totalVideoFrames;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VideoTrack')
-@Experimental() // untriaged
 @Native("VideoTrack")
 class VideoTrack extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -41170,43 +29942,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VideoTrack.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('VideoTrack.kind')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String kind;
 
-  @DomName('VideoTrack.label')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String label;
 
-  @DomName('VideoTrack.language')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String language;
 
-  @DomName('VideoTrack.selected')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool selected;
 
-  @DomName('VideoTrack.sourceBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SourceBuffer sourceBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VideoTrackList')
-@Experimental() // untriaged
 @Native("VideoTrackList")
 class VideoTrackList extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -41214,44 +29965,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VideoTrackList.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('VideoTrackList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int length;
 
-  @DomName('VideoTrackList.selectedIndex')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int selectedIndex;
 
-  @DomName('VideoTrackList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   VideoTrack __getter__(int index) native;
 
-  @DomName('VideoTrackList.getTrackById')
-  @DocsEditable()
-  @Experimental() // untriaged
   VideoTrack getTrackById(String id) native;
 
-  @DomName('VideoTrackList.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VisualViewport')
-@Experimental() // untriaged
 @Native("VisualViewport")
 class VisualViewport extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -41259,61 +29989,28 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VisualViewport.resizeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> resizeEvent =
       const EventStreamProvider<Event>('resize');
 
-  @DomName('VisualViewport.scrollEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> scrollEvent =
       const EventStreamProvider<Event>('scroll');
 
-  @DomName('VisualViewport.height')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num height;
 
-  @DomName('VisualViewport.offsetLeft')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num offsetLeft;
 
-  @DomName('VisualViewport.offsetTop')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num offsetTop;
 
-  @DomName('VisualViewport.pageLeft')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num pageLeft;
 
-  @DomName('VisualViewport.pageTop')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num pageTop;
 
-  @DomName('VisualViewport.scale')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num scale;
 
-  @DomName('VisualViewport.width')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num width;
 
-  @DomName('VisualViewport.onresize')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
-  @DomName('VisualViewport.onscroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41322,17 +30019,11 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('VoidCallback')
-// http://www.w3.org/TR/file-system-api/#the-voidcallback-interface
-@Experimental()
 typedef void VoidCallback();
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VTTCue')
-@Experimental() // untriaged
 @Native("VTTCue")
 class VttCue extends TextTrackCue {
   // To suppress missing implicit constructor warnings.
@@ -41340,71 +30031,39 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VTTCue.VTTCue')
-  @DocsEditable()
   factory VttCue(num startTime, num endTime, String text) {
     return VttCue._create_1(startTime, endTime, text);
   }
   static VttCue _create_1(startTime, endTime, text) =>
       JS('VttCue', 'new VTTCue(#,#,#)', startTime, endTime, text);
 
-  @DomName('VTTCue.align')
-  @DocsEditable()
-  @Experimental() // untriaged
   String align;
 
-  @DomName('VTTCue.line')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Null')
   @Returns('num|String')
   Object line;
 
-  @DomName('VTTCue.position')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Creates('Null')
   @Returns('num|String')
   Object position;
 
-  @DomName('VTTCue.region')
-  @DocsEditable()
-  @Experimental() // untriaged
   VttRegion region;
 
-  @DomName('VTTCue.size')
-  @DocsEditable()
-  @Experimental() // untriaged
   num size;
 
-  @DomName('VTTCue.snapToLines')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool snapToLines;
 
-  @DomName('VTTCue.text')
-  @DocsEditable()
-  @Experimental() // untriaged
   String text;
 
-  @DomName('VTTCue.vertical')
-  @DocsEditable()
-  @Experimental() // untriaged
   String vertical;
 
   @JSName('getCueAsHTML')
-  @DomName('VTTCue.getCueAsHTML')
-  @DocsEditable()
-  @Experimental() // untriaged
   DocumentFragment getCueAsHtml() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('VTTRegion')
-@Experimental() // untriaged
 @Native("VTTRegion")
 class VttRegion extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -41412,58 +30071,31 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('VTTRegion.VTTRegion')
-  @DocsEditable()
   factory VttRegion() {
     return VttRegion._create_1();
   }
   static VttRegion _create_1() => JS('VttRegion', 'new VTTRegion()');
 
-  @DomName('VTTRegion.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   String id;
 
-  @DomName('VTTRegion.lines')
-  @DocsEditable()
-  @Experimental() // untriaged
   int lines;
 
-  @DomName('VTTRegion.regionAnchorX')
-  @DocsEditable()
-  @Experimental() // untriaged
   num regionAnchorX;
 
-  @DomName('VTTRegion.regionAnchorY')
-  @DocsEditable()
-  @Experimental() // untriaged
   num regionAnchorY;
 
-  @DomName('VTTRegion.scroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   String scroll;
 
-  @DomName('VTTRegion.viewportAnchorX')
-  @DocsEditable()
-  @Experimental() // untriaged
   num viewportAnchorX;
 
-  @DomName('VTTRegion.viewportAnchorY')
-  @DocsEditable()
-  @Experimental() // untriaged
   num viewportAnchorY;
 
-  @DomName('VTTRegion.width')
-  @DocsEditable()
-  @Experimental() // untriaged
   num width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * Use the WebSocket interface to connect to a WebSocket,
  * and to send and receive data on that WebSocket.
@@ -41498,7 +30130,6 @@
  * [Introducing WebSockets](http://www.html5rocks.com/en/tutorials/websockets/basics/),
  * an HTML5Rocks.com tutorial.
  */
-@DomName('WebSocket')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -41517,8 +30148,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('WebSocket.closeEvent')
-  @DocsEditable()
   static const EventStreamProvider<CloseEvent> closeEvent =
       const EventStreamProvider<CloseEvent>('close');
 
@@ -41528,8 +30157,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('WebSocket.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -41539,8 +30166,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('WebSocket.messageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
@@ -41550,13 +30175,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('WebSocket.openEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> openEvent =
       const EventStreamProvider<Event>('open');
 
-  @DomName('WebSocket.WebSocket')
-  @DocsEditable()
   factory WebSocket(String url, [Object protocols]) {
     if (protocols != null) {
       return WebSocket._create_1(url, protocols);
@@ -41571,48 +30192,26 @@
   static bool get supported =>
       JS('bool', 'typeof window.WebSocket != "undefined"');
 
-  @DomName('WebSocket.CLOSED')
-  @DocsEditable()
   static const int CLOSED = 3;
 
-  @DomName('WebSocket.CLOSING')
-  @DocsEditable()
   static const int CLOSING = 2;
 
-  @DomName('WebSocket.CONNECTING')
-  @DocsEditable()
   static const int CONNECTING = 0;
 
-  @DomName('WebSocket.OPEN')
-  @DocsEditable()
   static const int OPEN = 1;
 
-  @DomName('WebSocket.binaryType')
-  @DocsEditable()
   String binaryType;
 
-  @DomName('WebSocket.bufferedAmount')
-  @DocsEditable()
   final int bufferedAmount;
 
-  @DomName('WebSocket.extensions')
-  @DocsEditable()
   final String extensions;
 
-  @DomName('WebSocket.protocol')
-  @DocsEditable()
   final String protocol;
 
-  @DomName('WebSocket.readyState')
-  @DocsEditable()
   final int readyState;
 
-  @DomName('WebSocket.url')
-  @DocsEditable()
   final String url;
 
-  @DomName('WebSocket.close')
-  @DocsEditable()
   void close([int code, String reason]) native;
 
   /**
@@ -41622,8 +30221,6 @@
    * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],
    * or [sendTypedData], in contrast, only accept data of the specified type.
    */
-  @DomName('WebSocket.send')
-  @DocsEditable()
   void send(data) native;
 
   @JSName('send')
@@ -41634,8 +30231,6 @@
    * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],
    * or [sendTypedData], in contrast, only accept data of the specified type.
    */
-  @DomName('WebSocket.send')
-  @DocsEditable()
   void sendBlob(Blob data) native;
 
   @JSName('send')
@@ -41646,8 +30241,6 @@
    * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],
    * or [sendTypedData], in contrast, only accept data of the specified type.
    */
-  @DomName('WebSocket.send')
-  @DocsEditable()
   void sendByteBuffer(ByteBuffer data) native;
 
   @JSName('send')
@@ -41658,8 +30251,6 @@
    * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],
    * or [sendTypedData], in contrast, only accept data of the specified type.
    */
-  @DomName('WebSocket.send')
-  @DocsEditable()
   void sendString(String data) native;
 
   @JSName('send')
@@ -41670,35 +30261,24 @@
    * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],
    * or [sendTypedData], in contrast, only accept data of the specified type.
    */
-  @DomName('WebSocket.send')
-  @DocsEditable()
   void sendTypedData(TypedData data) native;
 
   /// Stream of `close` events handled by this [WebSocket].
-  @DomName('WebSocket.onclose')
-  @DocsEditable()
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [WebSocket].
-  @DomName('WebSocket.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `message` events handled by this [WebSocket].
-  @DomName('WebSocket.onmessage')
-  @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
   /// Stream of `open` events handled by this [WebSocket].
-  @DomName('WebSocket.onopen')
-  @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('WheelEvent')
 @Native("WheelEvent")
 class WheelEvent extends MouseEvent {
   factory WheelEvent(String type,
@@ -41749,8 +30329,6 @@
         convertDartToNative_Dictionary(options));
   }
 
-  @DomName('WheelEvent.WheelEvent')
-  @DocsEditable()
   factory WheelEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -41763,30 +30341,18 @@
   static WheelEvent _create_2(type) =>
       JS('WheelEvent', 'new WheelEvent(#)', type);
 
-  @DomName('WheelEvent.DOM_DELTA_LINE')
-  @DocsEditable()
   static const int DOM_DELTA_LINE = 0x01;
 
-  @DomName('WheelEvent.DOM_DELTA_PAGE')
-  @DocsEditable()
   static const int DOM_DELTA_PAGE = 0x02;
 
-  @DomName('WheelEvent.DOM_DELTA_PIXEL')
-  @DocsEditable()
   static const int DOM_DELTA_PIXEL = 0x00;
 
   @JSName('deltaX')
-  @DomName('WheelEvent.deltaX')
-  @DocsEditable()
   final num _deltaX;
 
   @JSName('deltaY')
-  @DomName('WheelEvent.deltaY')
-  @DocsEditable()
   final num _deltaY;
 
-  @DomName('WheelEvent.deltaZ')
-  @DocsEditable()
   final num deltaZ;
 
   /**
@@ -41797,7 +30363,6 @@
    *
    * * [WheelEvent.deltaY](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaY) from the W3C.
    */
-  @DomName('WheelEvent.deltaY')
   num get deltaY {
     if (JS('bool', '#.deltaY !== undefined', this)) {
       // W3C WheelEvent
@@ -41814,7 +30379,6 @@
    *
    * * [WheelEvent.deltaX](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaX) from the W3C.
    */
-  @DomName('WheelEvent.deltaX')
   num get deltaX {
     if (JS('bool', '#.deltaX !== undefined', this)) {
       // W3C WheelEvent
@@ -41823,7 +30387,6 @@
     throw new UnsupportedError('deltaX is not supported');
   }
 
-  @DomName('WheelEvent.deltaMode')
   int get deltaMode {
     if (JS('bool', '!!(#.deltaMode)', this)) {
       return JS('int', '#.deltaMode', this);
@@ -41882,7 +30445,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * Top-level container for the current browser tab or window.
  *
@@ -41916,7 +30478,6 @@
  * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
  * * [Window](http://www.w3.org/TR/Window/) from the W3C.
  */
-@DomName('Window')
 @Native("Window,DOMWindow")
 class Window extends EventTarget
     implements
@@ -42024,7 +30585,6 @@
    * Note: The supplied [callback] needs to call [requestAnimationFrame] again
    * for the animation to continue.
    */
-  @DomName('Window.requestAnimationFrame')
   int requestAnimationFrame(FrameRequestCallback callback) {
     _ensureRequestAnimationFrame();
     return _requestAnimationFrame(_wrapZone(callback));
@@ -42084,7 +30644,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME, '23.0')
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15.0')
   @SupportedBrowser(SupportedBrowser.IE, '10.0')
-  @Experimental()
   IdbFactory get indexedDB => JS(
       'IdbFactory|Null', // If not supported, returns null.
       '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
@@ -42093,7 +30652,6 @@
       this);
 
   /// The debugging console for this window.
-  @DomName('Window.console')
   Console get console => Console._safeConsole;
 
   /**
@@ -42124,8 +30682,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.DOMContentLoadedEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> contentLoadedEvent =
       const EventStreamProvider<Event>('DOMContentLoaded');
 
@@ -42135,10 +30691,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.devicemotionEvent')
-  @DocsEditable()
-  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-  @Experimental()
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent =
       const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
@@ -42148,10 +30700,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.deviceorientationEvent')
-  @DocsEditable()
-  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-  @Experimental()
   static const EventStreamProvider<DeviceOrientationEvent>
       deviceOrientationEvent =
       const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
@@ -42162,13 +30710,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.hashchangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent =
       const EventStreamProvider<Event>('hashchange');
 
-  @DomName('Window.loadstartEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> loadStartEvent =
       const EventStreamProvider<Event>('loadstart');
 
@@ -42178,8 +30722,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.messageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
@@ -42189,8 +30731,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.offlineEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent =
       const EventStreamProvider<Event>('offline');
 
@@ -42200,8 +30740,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.onlineEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent =
       const EventStreamProvider<Event>('online');
 
@@ -42211,8 +30749,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.pagehideEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> pageHideEvent =
       const EventStreamProvider<Event>('pagehide');
 
@@ -42222,8 +30758,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.pageshowEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> pageShowEvent =
       const EventStreamProvider<Event>('pageshow');
 
@@ -42233,13 +30767,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.popstateEvent')
-  @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent =
       const EventStreamProvider<PopStateEvent>('popstate');
 
-  @DomName('Window.progressEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> progressEvent =
       const EventStreamProvider<Event>('progress');
 
@@ -42249,8 +30779,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.storageEvent')
-  @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent =
       const EventStreamProvider<StorageEvent>('storage');
 
@@ -42260,8 +30788,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.unloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent =
       const EventStreamProvider<Event>('unload');
 
@@ -42271,11 +30797,8 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.webkitAnimationEndEvent')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   static const EventStreamProvider<AnimationEvent> animationEndEvent =
       const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
@@ -42285,11 +30808,8 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.webkitAnimationIterationEvent')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   static const EventStreamProvider<AnimationEvent> animationIterationEvent =
       const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
@@ -42299,11 +30819,8 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.webkitAnimationStartEvent')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   static const EventStreamProvider<AnimationEvent> animationStartEvent =
       const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
@@ -42319,10 +30836,6 @@
    * * [File API](http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem)
    *   from W3C.
    */
-  @DomName('Window.PERSISTENT')
-  @DocsEditable()
-  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  @Experimental()
   static const int PERSISTENT = 1;
 
   /**
@@ -42335,15 +30848,8 @@
    * * [File API](http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem)
    *   from W3C.
    */
-  @DomName('Window.TEMPORARY')
-  @DocsEditable()
-  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  @Experimental()
   static const int TEMPORARY = 0;
 
-  @DomName('Window.animationWorklet')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _Worklet animationWorklet;
 
   /**
@@ -42358,27 +30864,14 @@
    *   API](https://html.spec.whatwg.org/multipage/browsers.html#application-cache-api)
    *   from WHATWG.
    */
-  @DomName('Window.applicationCache')
-  @DocsEditable()
   final ApplicationCache applicationCache;
 
-  @DomName('Window.audioWorklet')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _Worklet audioWorklet;
 
-  @DomName('Window.caches')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CacheStorage caches;
 
-  @DomName('Window.closed')
-  @DocsEditable()
   final bool closed;
 
-  @DomName('Window.cookieStore')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CookieStore cookieStore;
 
   /**
@@ -42388,27 +30881,14 @@
    *
    * * [Web cryptography API](http://www.w3.org/TR/WebCryptoAPI/) from W3C.
    */
-  @DomName('Window.crypto')
-  @DocsEditable()
-  // http://www.w3.org/TR/WebCryptoAPI/
-  @Experimental()
   final Crypto crypto;
 
-  @DomName('Window.customElements')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CustomElementRegistry customElements;
 
   /// *Deprecated*.
-  @DomName('Window.defaultStatus')
-  @DocsEditable()
-  @Experimental() // non-standard
   String defaultStatus;
 
   /// *Deprecated*.
-  @DomName('Window.defaultstatus')
-  @DocsEditable()
-  @Experimental() // non-standard
   String defaultstatus;
 
   /**
@@ -42421,15 +30901,8 @@
    * * [More about devicePixelRatio](http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html)
    *   from quirksmode.
    */
-  @DomName('Window.devicePixelRatio')
-  @DocsEditable()
-  // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
-  @Experimental() // non-standard
   final num devicePixelRatio;
 
-  @DomName('Window.external')
-  @DocsEditable()
-  @Experimental() // untriaged
   final External external;
 
   /**
@@ -42440,8 +30913,6 @@
    * * [Loading web pages](https://html.spec.whatwg.org/multipage/browsers.html)
    *   from WHATWG.
    */
-  @DomName('Window.history')
-  @DocsEditable()
   final History history;
 
   /**
@@ -42452,8 +30923,6 @@
    * * [innerHeight](http://docs.webplatform.org/wiki/css/cssom/properties/innerHeight)
    *   from WebPlatform.org.
    */
-  @DomName('Window.innerHeight')
-  @DocsEditable()
   final int innerHeight;
 
   /**
@@ -42464,13 +30933,8 @@
    * * [innerWidth](http://docs.webplatform.org/wiki/css/cssom/properties/innerWidth)
    *   from WebPlatform.org.
    */
-  @DomName('Window.innerWidth')
-  @DocsEditable()
   final int innerWidth;
 
-  @DomName('Window.isSecureContext')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isSecureContext;
 
   /**
@@ -42485,8 +30949,6 @@
    * * [Local storage specification](http://www.w3.org/TR/webstorage/#the-localstorage-attribute)
    *   from W3C.
    */
-  @DomName('Window.localStorage')
-  @DocsEditable()
   final Storage localStorage;
 
   /**
@@ -42498,8 +30960,6 @@
    *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)
    *   from WHATWG.
    */
-  @DomName('Window.locationbar')
-  @DocsEditable()
   final BarProp locationbar;
 
   /**
@@ -42511,8 +30971,6 @@
    *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)
    *   from WHATWG.
    */
-  @DomName('Window.menubar')
-  @DocsEditable()
   final BarProp menubar;
 
   /**
@@ -42523,8 +30981,6 @@
    * * [Window name](http://docs.webplatform.org/wiki/html/attributes/name_(window))
    *   from WebPlatform.org.
    */
-  @DomName('Window.name')
-  @DocsEditable()
   String name;
 
   /**
@@ -42536,8 +30992,6 @@
    *   object](https://html.spec.whatwg.org/multipage/webappapis.html#the-navigator-object)
    *   from WHATWG.
    */
-  @DomName('Window.navigator')
-  @DocsEditable()
   final Navigator navigator;
 
   /**
@@ -42548,17 +31002,10 @@
    * * [offscreenBuffering](http://docs.webplatform.org/wiki/dom/properties/offscreenBuffering)
    *   from WebPlatform.org.
    */
-  @DomName('Window.offscreenBuffering')
-  @DocsEditable()
-  @Experimental() // non-standard
   final bool offscreenBuffering;
 
-  @DomName('Window.opener')
-  @DocsEditable()
   WindowBase get opener => _convertNativeToDart_Window(this._get_opener);
   @JSName('opener')
-  @DomName('Window.opener')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_opener;
@@ -42567,14 +31014,8 @@
     JS("void", "#.opener = #", this, value);
   }
 
-  @DomName('Window.orientation')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int orientation;
 
-  @DomName('Window.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
   /**
@@ -42585,8 +31026,6 @@
    * * [outerHeight](http://docs.webplatform.org/wiki/css/cssom/properties/outerHeight)
    *   from WebPlatform.org.
    */
-  @DomName('Window.outerHeight')
-  @DocsEditable()
   final int outerHeight;
 
   /**
@@ -42597,8 +31036,6 @@
    * * [outerWidth](http://docs.webplatform.org/wiki/css/cssom/properties/outerWidth)
    *   from WebPlatform.org.
    */
-  @DomName('Window.outerWidth')
-  @DocsEditable()
   final int outerWidth;
 
   @JSName('pageXOffset')
@@ -42615,8 +31052,6 @@
    *   pageXOffset](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX)
    *   from MDN.
    */
-  @DomName('Window.pageXOffset')
-  @DocsEditable()
   final num _pageXOffset;
 
   @JSName('pageYOffset')
@@ -42633,16 +31068,10 @@
    *   pageYOffset](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY)
    *   from MDN.
    */
-  @DomName('Window.pageYOffset')
-  @DocsEditable()
   final num _pageYOffset;
 
-  @DomName('Window.parent')
-  @DocsEditable()
   WindowBase get parent => _convertNativeToDart_Window(this._get_parent);
   @JSName('parent')
-  @DomName('Window.parent')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_parent;
@@ -42658,8 +31087,6 @@
    * * [Navigation timing
    *   specification](http://www.w3.org/TR/navigation-timing/) from W3C.
    */
-  @DomName('Window.performance')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE)
@@ -42673,8 +31100,6 @@
    * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)
    *   from W3C.
    */
-  @DomName('Window.screen')
-  @DocsEditable()
   final Screen screen;
 
   /**
@@ -42686,8 +31111,6 @@
    * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)
    *   from W3C.
    */
-  @DomName('Window.screenLeft')
-  @DocsEditable()
   final int screenLeft;
 
   /**
@@ -42698,8 +31121,6 @@
    * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)
    *   from W3C.
    */
-  @DomName('Window.screenTop')
-  @DocsEditable()
   final int screenTop;
 
   /**
@@ -42710,8 +31131,6 @@
    * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)
    *   from W3C.
    */
-  @DomName('Window.screenX')
-  @DocsEditable()
   final int screenX;
 
   /**
@@ -42722,8 +31141,6 @@
    * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)
    *   from W3C.
    */
-  @DomName('Window.screenY')
-  @DocsEditable()
   final int screenY;
 
   /**
@@ -42735,8 +31152,6 @@
    *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)
    *   from WHATWG.
    */
-  @DomName('Window.scrollbars')
-  @DocsEditable()
   final BarProp scrollbars;
 
   /**
@@ -42747,8 +31162,6 @@
    * * [Window.self](https://developer.mozilla.org/en-US/docs/Web/API/Window.self)
    *   from MDN.
    */
-  @DomName('Window.self')
-  @DocsEditable()
   WindowBase get self => _convertNativeToDart_Window(this._get_self);
   @JSName('self')
   /**
@@ -42759,8 +31172,6 @@
    * * [Window.self](https://developer.mozilla.org/en-US/docs/Web/API/Window.self)
    *   from MDN.
    */
-  @DomName('Window.self')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_self;
@@ -42778,8 +31189,6 @@
    * * [Local storage
    *   specification](http://www.w3.org/TR/webstorage/#dom-sessionstorage) from W3C.
    */
-  @DomName('Window.sessionStorage')
-  @DocsEditable()
   final Storage sessionStorage;
 
   /**
@@ -42791,15 +31200,9 @@
    *   specification](https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section)
    *   from W3C.
    */
-  @DomName('Window.speechSynthesis')
-  @DocsEditable()
-  // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
-  @Experimental()
   final SpeechSynthesis speechSynthesis;
 
   /// *Deprecated*.
-  @DomName('Window.status')
-  @DocsEditable()
   String status;
 
   /**
@@ -42811,8 +31214,6 @@
    *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)
    *   from WHATWG.
    */
-  @DomName('Window.statusbar')
-  @DocsEditable()
   final BarProp statusbar;
 
   /**
@@ -42824,10 +31225,6 @@
    *   reference](https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/StyleMedia/)
    *   from Safari Developer Library.
    */
-  @DomName('Window.styleMedia')
-  @DocsEditable()
-  // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
-  @Experimental() // nonstandard
   final StyleMedia styleMedia;
 
   /**
@@ -42839,23 +31236,14 @@
    *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)
    *   from WHATWG.
    */
-  @DomName('Window.toolbar')
-  @DocsEditable()
   final BarProp toolbar;
 
-  @DomName('Window.top')
-  @DocsEditable()
   WindowBase get top => _convertNativeToDart_Window(this._get_top);
   @JSName('top')
-  @DomName('Window.top')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_top;
 
-  @DomName('Window.visualViewport')
-  @DocsEditable()
-  @Experimental() // untriaged
   final VisualViewport visualViewport;
 
   /**
@@ -42866,8 +31254,6 @@
    * * [Window.window](https://developer.mozilla.org/en-US/docs/Web/API/Window.window)
    *   from MDN.
    */
-  @DomName('Window.window')
-  @DocsEditable()
   WindowBase get window => _convertNativeToDart_Window(this._get_window);
   @JSName('window')
   /**
@@ -42878,14 +31264,10 @@
    * * [Window.window](https://developer.mozilla.org/en-US/docs/Web/API/Window.window)
    *   from MDN.
    */
-  @DomName('Window.window')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_window;
 
-  @DomName('Window.__getter__')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   WindowBase __getter__(index_OR_name) {
@@ -42899,14 +31281,10 @@
   }
 
   @JSName('__getter__')
-  @DomName('Window.__getter__')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   __getter___1(int index) native;
   @JSName('__getter__')
-  @DomName('Window.__getter__')
-  @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   __getter___2(String name) native;
@@ -42919,17 +31297,10 @@
    * * [User prompts](https://html.spec.whatwg.org/multipage/webappapis.html#user-prompts)
    *   from WHATWG.
    */
-  @DomName('Window.alert')
-  @DocsEditable()
   void alert([String message]) native;
 
-  @DomName('Window.cancelIdleCallback')
-  @DocsEditable()
-  @Experimental() // untriaged
   void cancelIdleCallback(int handle) native;
 
-  @DomName('Window.close')
-  @DocsEditable()
   void close() native;
 
   /**
@@ -42940,13 +31311,8 @@
    * * [User prompts](https://html.spec.whatwg.org/multipage/webappapis.html#user-prompts)
    *   from WHATWG.
    */
-  @DomName('Window.confirm')
-  @DocsEditable()
   bool confirm([String message]) native;
 
-  @DomName('Window.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future fetch(/*RequestInfo*/ input, [Map init]) {
     if (init != null) {
       var init_1 = convertDartToNative_Dictionary(init);
@@ -42956,14 +31322,8 @@
   }
 
   @JSName('fetch')
-  @DomName('Window.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _fetch_1(input, init) native;
   @JSName('fetch')
-  @DomName('Window.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _fetch_2(input) native;
 
   /**
@@ -42974,20 +31334,12 @@
    * * [Window.find](https://developer.mozilla.org/en-US/docs/Web/API/Window.find)
    *   from MDN.
    */
-  @DomName('Window.find')
-  @DocsEditable()
-  @Experimental() // non-standard
   bool find(String string, bool caseSensitive, bool backwards, bool wrap,
       bool wholeWord, bool searchInFrames, bool showDialog) native;
 
   @JSName('getComputedStyle')
-  @DomName('Window.getComputedStyle')
-  @DocsEditable()
   CssStyleDeclaration _getComputedStyle(Element elt, [String pseudoElt]) native;
 
-  @DomName('Window.getComputedStyleMap')
-  @DocsEditable()
-  @Experimental() // untriaged
   StylePropertyMapReadonly getComputedStyleMap(
       Element element, String pseudoElement) native;
 
@@ -42995,9 +31347,6 @@
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
    */
-  @DomName('Window.getMatchedCSSRules')
-  @DocsEditable()
-  @Experimental() // non-standard
   @Returns('_CssRuleList|Null')
   @Creates('_CssRuleList')
   List<CssRule> getMatchedCssRules(Element element, String pseudoElement)
@@ -43011,8 +31360,6 @@
    * * [Window.getSelection](https://developer.mozilla.org/en-US/docs/Web/API/Window.getSelection)
    *   from MDN.
    */
-  @DomName('Window.getSelection')
-  @DocsEditable()
   Selection getSelection() native;
 
   /**
@@ -43026,8 +31373,6 @@
    * * [The MediaQueryList
    *   specification](http://www.w3.org/TR/cssom-view/#the-mediaquerylist-interface) from W3C.
    */
-  @DomName('Window.matchMedia')
-  @DocsEditable()
   MediaQueryList matchMedia(String query) native;
 
   /**
@@ -43041,32 +31386,21 @@
    *   from MDN.
    * * [Window.moveBy](http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.
    */
-  @DomName('Window.moveBy')
-  @DocsEditable()
   void moveBy(int x, int y) native;
 
   @JSName('moveTo')
-  @DomName('Window.moveTo')
-  @DocsEditable()
   void _moveTo(int x, int y) native;
 
   @JSName('openDatabase')
 
   /// *Deprecated.*
-  @DomName('Window.openDatabase')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.w3.org/TR/webdatabase/
-  @Experimental() // deprecated
   @Creates('SqlDatabase')
   SqlDatabase _openDatabase(
       String name, String version, String displayName, int estimatedSize,
       [DatabaseCallback creationCallback]) native;
 
-  @DomName('Window.postMessage')
-  @DocsEditable()
   void postMessage(/*any*/ message, String targetOrigin,
       [List<Object> transfer]) {
     if (transfer != null) {
@@ -43080,12 +31414,8 @@
   }
 
   @JSName('postMessage')
-  @DomName('Window.postMessage')
-  @DocsEditable()
   void _postMessage_1(message, targetOrigin, List<Object> transfer) native;
   @JSName('postMessage')
-  @DomName('Window.postMessage')
-  @DocsEditable()
   void _postMessage_2(message, targetOrigin) native;
 
   /**
@@ -43096,13 +31426,8 @@
    * * [Window.print](https://developer.mozilla.org/en-US/docs/Web/API/Window.print)
    *   from MDN.
    */
-  @DomName('Window.print')
-  @DocsEditable()
   void print() native;
 
-  @DomName('Window.requestIdleCallback')
-  @DocsEditable()
-  @Experimental() // untriaged
   int requestIdleCallback(IdleRequestCallback callback, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -43112,14 +31437,8 @@
   }
 
   @JSName('requestIdleCallback')
-  @DomName('Window.requestIdleCallback')
-  @DocsEditable()
-  @Experimental() // untriaged
   int _requestIdleCallback_1(IdleRequestCallback callback, options) native;
   @JSName('requestIdleCallback')
-  @DomName('Window.requestIdleCallback')
-  @DocsEditable()
-  @Experimental() // untriaged
   int _requestIdleCallback_2(IdleRequestCallback callback) native;
 
   /**
@@ -43130,8 +31449,6 @@
    * * [Window resizeBy](http://docs.webplatform.org/wiki/dom/methods/resizeBy)
    *   from WebPlatform.org.
    */
-  @DomName('Window.resizeBy')
-  @DocsEditable()
   void resizeBy(int x, int y) native;
 
   /**
@@ -43142,8 +31459,6 @@
    * * [Window resizeTo](http://docs.webplatform.org/wiki/dom/methods/resizeTo)
    *   from WebPlatform.org.
    */
-  @DomName('Window.resizeTo')
-  @DocsEditable()
   void resizeTo(int x, int y) native;
 
   /**
@@ -43156,8 +31471,6 @@
    * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scroll')
-  @DocsEditable()
   void scroll([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
       _scroll_1();
@@ -43195,8 +31508,6 @@
    * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scroll')
-  @DocsEditable()
   void _scroll_1() native;
   @JSName('scroll')
   /**
@@ -43209,8 +31520,6 @@
    * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scroll')
-  @DocsEditable()
   void _scroll_2(options) native;
   @JSName('scroll')
   /**
@@ -43223,8 +31532,6 @@
    * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scroll')
-  @DocsEditable()
   void _scroll_3(num x, num y) native;
   @JSName('scroll')
   /**
@@ -43237,8 +31544,6 @@
    * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scroll')
-  @DocsEditable()
   void _scroll_4(int x, int y) native;
   @JSName('scroll')
   /**
@@ -43251,8 +31556,6 @@
    * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scroll')
-  @DocsEditable()
   void _scroll_5(int x, int y, scrollOptions) native;
 
   /**
@@ -43263,8 +31566,6 @@
    * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollBy')
-  @DocsEditable()
   void scrollBy([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
       _scrollBy_1();
@@ -43300,8 +31601,6 @@
    * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollBy')
-  @DocsEditable()
   void _scrollBy_1() native;
   @JSName('scrollBy')
   /**
@@ -43312,8 +31611,6 @@
    * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollBy')
-  @DocsEditable()
   void _scrollBy_2(options) native;
   @JSName('scrollBy')
   /**
@@ -43324,8 +31621,6 @@
    * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollBy')
-  @DocsEditable()
   void _scrollBy_3(num x, num y) native;
   @JSName('scrollBy')
   /**
@@ -43336,8 +31631,6 @@
    * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollBy')
-  @DocsEditable()
   void _scrollBy_4(int x, int y) native;
   @JSName('scrollBy')
   /**
@@ -43348,8 +31641,6 @@
    * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollBy')
-  @DocsEditable()
   void _scrollBy_5(int x, int y, scrollOptions) native;
 
   /**
@@ -43362,8 +31653,6 @@
    * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollTo')
-  @DocsEditable()
   void scrollTo([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
       _scrollTo_1();
@@ -43401,8 +31690,6 @@
    * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollTo')
-  @DocsEditable()
   void _scrollTo_1() native;
   @JSName('scrollTo')
   /**
@@ -43415,8 +31702,6 @@
    * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollTo')
-  @DocsEditable()
   void _scrollTo_2(options) native;
   @JSName('scrollTo')
   /**
@@ -43429,8 +31714,6 @@
    * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollTo')
-  @DocsEditable()
   void _scrollTo_3(num x, num y) native;
   @JSName('scrollTo')
   /**
@@ -43443,8 +31726,6 @@
    * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollTo')
-  @DocsEditable()
   void _scrollTo_4(int x, int y) native;
   @JSName('scrollTo')
   /**
@@ -43457,8 +31738,6 @@
    * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
    *   from WebPlatform.org.
    */
-  @DomName('Window.scrollTo')
-  @DocsEditable()
   void _scrollTo_5(int x, int y, scrollOptions) native;
 
   /**
@@ -43470,26 +31749,16 @@
    *   object](http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)
    *   from W3C.
    */
-  @DomName('Window.stop')
-  @DocsEditable()
   void stop() native;
 
   @JSName('webkitRequestFileSystem')
-  @DomName('Window.webkitRequestFileSystem')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
-  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   void __requestFileSystem(
       int type, int size, _FileSystemCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
   @JSName('webkitRequestFileSystem')
-  @DomName('Window.webkitRequestFileSystem')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
-  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   Future<FileSystem> _requestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
     __requestFileSystem(type, size, (value) {
@@ -43512,11 +31781,7 @@
    *   points](http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)
    * from W3C.
    */
-  @DomName('Window.webkitResolveLocalFileSystemURL')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
-  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback,
       [_ErrorCallback errorCallback]) native;
 
@@ -43530,11 +31795,7 @@
    *   points](http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)
    * from W3C.
    */
-  @DomName('Window.webkitResolveLocalFileSystemURL')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
-  // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   Future<Entry> resolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
     _resolveLocalFileSystemUrl(url, (value) {
@@ -43547,434 +31808,249 @@
 
   // From WindowBase64
 
-  @DomName('Window.atob')
-  @DocsEditable()
   String atob(String atob) native;
 
-  @DomName('Window.btoa')
-  @DocsEditable()
   String btoa(String btoa) native;
 
   // From WindowTimers
 
   @JSName('setInterval')
-  @DomName('Window.setInterval')
-  @DocsEditable()
   int _setInterval_String(String handler, [int timeout, Object arguments])
       native;
 
   @JSName('setTimeout')
-  @DomName('Window.setTimeout')
-  @DocsEditable()
   int _setTimeout_String(String handler, [int timeout, Object arguments])
       native;
 
   @JSName('clearInterval')
-  @DomName('Window.clearInterval')
-  @DocsEditable()
   void _clearInterval([int handle]) native;
 
   @JSName('clearTimeout')
-  @DomName('Window.clearTimeout')
-  @DocsEditable()
   void _clearTimeout([int handle]) native;
 
   @JSName('setInterval')
-  @DomName('Window.setInterval')
-  @DocsEditable()
   int _setInterval(Object handler, [int timeout]) native;
 
   @JSName('setTimeout')
-  @DomName('Window.setTimeout')
-  @DocsEditable()
   int _setTimeout(Object handler, [int timeout]) native;
 
   /// Stream of `contentloaded` events handled by this [Window].
-  @DomName('Window.onDOMContentLoaded')
-  @DocsEditable()
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
   /// Stream of `abort` events handled by this [Window].
-  @DomName('Window.onabort')
-  @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
   /// Stream of `blur` events handled by this [Window].
-  @DomName('Window.onblur')
-  @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
-  @DomName('Window.oncanplay')
-  @DocsEditable()
   Stream<Event> get onCanPlay => Element.canPlayEvent.forTarget(this);
 
-  @DomName('Window.oncanplaythrough')
-  @DocsEditable()
   Stream<Event> get onCanPlayThrough =>
       Element.canPlayThroughEvent.forTarget(this);
 
   /// Stream of `change` events handled by this [Window].
-  @DomName('Window.onchange')
-  @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
   /// Stream of `click` events handled by this [Window].
-  @DomName('Window.onclick')
-  @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
   /// Stream of `contextmenu` events handled by this [Window].
-  @DomName('Window.oncontextmenu')
-  @DocsEditable()
   Stream<MouseEvent> get onContextMenu =>
       Element.contextMenuEvent.forTarget(this);
 
   /// Stream of `doubleclick` events handled by this [Window].
-  @DomName('Window.ondblclick')
-  @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
   /// Stream of `devicemotion` events handled by this [Window].
-  @DomName('Window.ondevicemotion')
-  @DocsEditable()
-  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-  @Experimental()
   Stream<DeviceMotionEvent> get onDeviceMotion =>
       deviceMotionEvent.forTarget(this);
 
   /// Stream of `deviceorientation` events handled by this [Window].
-  @DomName('Window.ondeviceorientation')
-  @DocsEditable()
-  // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
-  @Experimental()
   Stream<DeviceOrientationEvent> get onDeviceOrientation =>
       deviceOrientationEvent.forTarget(this);
 
   /// Stream of `drag` events handled by this [Window].
-  @DomName('Window.ondrag')
-  @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
   /// Stream of `dragend` events handled by this [Window].
-  @DomName('Window.ondragend')
-  @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
   /// Stream of `dragenter` events handled by this [Window].
-  @DomName('Window.ondragenter')
-  @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
   /// Stream of `dragleave` events handled by this [Window].
-  @DomName('Window.ondragleave')
-  @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
   /// Stream of `dragover` events handled by this [Window].
-  @DomName('Window.ondragover')
-  @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
   /// Stream of `dragstart` events handled by this [Window].
-  @DomName('Window.ondragstart')
-  @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
   /// Stream of `drop` events handled by this [Window].
-  @DomName('Window.ondrop')
-  @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
-  @DomName('Window.ondurationchange')
-  @DocsEditable()
   Stream<Event> get onDurationChange =>
       Element.durationChangeEvent.forTarget(this);
 
-  @DomName('Window.onemptied')
-  @DocsEditable()
   Stream<Event> get onEmptied => Element.emptiedEvent.forTarget(this);
 
-  @DomName('Window.onended')
-  @DocsEditable()
   Stream<Event> get onEnded => Element.endedEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [Window].
-  @DomName('Window.onerror')
-  @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
   /// Stream of `focus` events handled by this [Window].
-  @DomName('Window.onfocus')
-  @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
   /// Stream of `hashchange` events handled by this [Window].
-  @DomName('Window.onhashchange')
-  @DocsEditable()
   Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
 
   /// Stream of `input` events handled by this [Window].
-  @DomName('Window.oninput')
-  @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
   /// Stream of `invalid` events handled by this [Window].
-  @DomName('Window.oninvalid')
-  @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
   /// Stream of `keydown` events handled by this [Window].
-  @DomName('Window.onkeydown')
-  @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
   /// Stream of `keypress` events handled by this [Window].
-  @DomName('Window.onkeypress')
-  @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
   /// Stream of `keyup` events handled by this [Window].
-  @DomName('Window.onkeyup')
-  @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
   /// Stream of `load` events handled by this [Window].
-  @DomName('Window.onload')
-  @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
-  @DomName('Window.onloadeddata')
-  @DocsEditable()
   Stream<Event> get onLoadedData => Element.loadedDataEvent.forTarget(this);
 
-  @DomName('Window.onloadedmetadata')
-  @DocsEditable()
   Stream<Event> get onLoadedMetadata =>
       Element.loadedMetadataEvent.forTarget(this);
 
-  @DomName('Window.onloadstart')
-  @DocsEditable()
   Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);
 
   /// Stream of `message` events handled by this [Window].
-  @DomName('Window.onmessage')
-  @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
   /// Stream of `mousedown` events handled by this [Window].
-  @DomName('Window.onmousedown')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
   /// Stream of `mouseenter` events handled by this [Window].
-  @DomName('Window.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter =>
       Element.mouseEnterEvent.forTarget(this);
 
   /// Stream of `mouseleave` events handled by this [Window].
-  @DomName('Window.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave =>
       Element.mouseLeaveEvent.forTarget(this);
 
   /// Stream of `mousemove` events handled by this [Window].
-  @DomName('Window.onmousemove')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
   /// Stream of `mouseout` events handled by this [Window].
-  @DomName('Window.onmouseout')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
   /// Stream of `mouseover` events handled by this [Window].
-  @DomName('Window.onmouseover')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
   /// Stream of `mouseup` events handled by this [Window].
-  @DomName('Window.onmouseup')
-  @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
   /// Stream of `mousewheel` events handled by this [Window].
-  @DomName('Window.onmousewheel')
-  @DocsEditable()
   Stream<WheelEvent> get onMouseWheel =>
       Element.mouseWheelEvent.forTarget(this);
 
   /// Stream of `offline` events handled by this [Window].
-  @DomName('Window.onoffline')
-  @DocsEditable()
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
   /// Stream of `online` events handled by this [Window].
-  @DomName('Window.ononline')
-  @DocsEditable()
   Stream<Event> get onOnline => onlineEvent.forTarget(this);
 
   /// Stream of `pagehide` events handled by this [Window].
-  @DomName('Window.onpagehide')
-  @DocsEditable()
   Stream<Event> get onPageHide => pageHideEvent.forTarget(this);
 
   /// Stream of `pageshow` events handled by this [Window].
-  @DomName('Window.onpageshow')
-  @DocsEditable()
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
-  @DomName('Window.onpause')
-  @DocsEditable()
   Stream<Event> get onPause => Element.pauseEvent.forTarget(this);
 
-  @DomName('Window.onplay')
-  @DocsEditable()
   Stream<Event> get onPlay => Element.playEvent.forTarget(this);
 
-  @DomName('Window.onplaying')
-  @DocsEditable()
   Stream<Event> get onPlaying => Element.playingEvent.forTarget(this);
 
   /// Stream of `popstate` events handled by this [Window].
-  @DomName('Window.onpopstate')
-  @DocsEditable()
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
-  @DomName('Window.onprogress')
-  @DocsEditable()
   Stream<Event> get onProgress => progressEvent.forTarget(this);
 
-  @DomName('Window.onratechange')
-  @DocsEditable()
   Stream<Event> get onRateChange => Element.rateChangeEvent.forTarget(this);
 
   /// Stream of `reset` events handled by this [Window].
-  @DomName('Window.onreset')
-  @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
   /// Stream of `resize` events handled by this [Window].
-  @DomName('Window.onresize')
-  @DocsEditable()
   Stream<Event> get onResize => Element.resizeEvent.forTarget(this);
 
   /// Stream of `scroll` events handled by this [Window].
-  @DomName('Window.onscroll')
-  @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
   /// Stream of `search` events handled by this [Window].
-  @DomName('Window.onsearch')
-  @DocsEditable()
-  // http://www.w3.org/TR/html-markup/input.search.html
-  @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
-  @DomName('Window.onseeked')
-  @DocsEditable()
   Stream<Event> get onSeeked => Element.seekedEvent.forTarget(this);
 
-  @DomName('Window.onseeking')
-  @DocsEditable()
   Stream<Event> get onSeeking => Element.seekingEvent.forTarget(this);
 
   /// Stream of `select` events handled by this [Window].
-  @DomName('Window.onselect')
-  @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
-  @DomName('Window.onstalled')
-  @DocsEditable()
   Stream<Event> get onStalled => Element.stalledEvent.forTarget(this);
 
   /// Stream of `storage` events handled by this [Window].
-  @DomName('Window.onstorage')
-  @DocsEditable()
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
   /// Stream of `submit` events handled by this [Window].
-  @DomName('Window.onsubmit')
-  @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
-  @DomName('Window.onsuspend')
-  @DocsEditable()
   Stream<Event> get onSuspend => Element.suspendEvent.forTarget(this);
 
-  @DomName('Window.ontimeupdate')
-  @DocsEditable()
   Stream<Event> get onTimeUpdate => Element.timeUpdateEvent.forTarget(this);
 
   /// Stream of `touchcancel` events handled by this [Window].
-  @DomName('Window.ontouchcancel')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchCancel =>
       Element.touchCancelEvent.forTarget(this);
 
   /// Stream of `touchend` events handled by this [Window].
-  @DomName('Window.ontouchend')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
   /// Stream of `touchmove` events handled by this [Window].
-  @DomName('Window.ontouchmove')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
   /// Stream of `touchstart` events handled by this [Window].
-  @DomName('Window.ontouchstart')
-  @DocsEditable()
-  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
-  @Experimental()
   Stream<TouchEvent> get onTouchStart =>
       Element.touchStartEvent.forTarget(this);
 
   /// Stream of `transitionend` events handled by this [Window].
-  @DomName('Window.ontransitionend')
-  @DocsEditable()
   Stream<TransitionEvent> get onTransitionEnd =>
       Element.transitionEndEvent.forTarget(this);
 
   /// Stream of `unload` events handled by this [Window].
-  @DomName('Window.onunload')
-  @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
-  @DomName('Window.onvolumechange')
-  @DocsEditable()
   Stream<Event> get onVolumeChange => Element.volumeChangeEvent.forTarget(this);
 
-  @DomName('Window.onwaiting')
-  @DocsEditable()
   Stream<Event> get onWaiting => Element.waitingEvent.forTarget(this);
 
   /// Stream of `animationend` events handled by this [Window].
-  @DomName('Window.onwebkitAnimationEnd')
-  @DocsEditable()
-  @Experimental()
   Stream<AnimationEvent> get onAnimationEnd =>
       animationEndEvent.forTarget(this);
 
   /// Stream of `animationiteration` events handled by this [Window].
-  @DomName('Window.onwebkitAnimationIteration')
-  @DocsEditable()
-  @Experimental()
   Stream<AnimationEvent> get onAnimationIteration =>
       animationIterationEvent.forTarget(this);
 
   /// Stream of `animationstart` events handled by this [Window].
-  @DomName('Window.onwebkitAnimationStart')
-  @DocsEditable()
-  @Experimental()
   Stream<AnimationEvent> get onAnimationStart =>
       animationStartEvent.forTarget(this);
 
@@ -43984,16 +32060,13 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.beforeunloadEvent')
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
   /// Stream of `beforeunload` events handled by this [Window].
-  @DomName('Window.onbeforeunload')
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   /// Stream of `wheel` events handled by this [Window].
-  @DomName('Window.onWheel')
   Stream<WheelEvent> get onWheel => Element.wheelEvent.forTarget(this);
 
   /**
@@ -44013,11 +32086,8 @@
   }
 
   @JSName('openDatabase')
-  @DomName('Window.openDatabase')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   @Creates('SqlDatabase')
   SqlDatabase openDatabase(
       String name, String version, String displayName, int estimatedSize,
@@ -44034,12 +32104,8 @@
     return db;
   }
 
-  @DomName('Window.pageXOffset')
-  @DocsEditable()
   int get pageXOffset => JS('num', '#.pageXOffset', this).round();
 
-  @DomName('Window.pageYOffset')
-  @DocsEditable()
   int get pageYOffset => JS('num', '#.pageYOffset', this).round();
 
   /**
@@ -44052,8 +32118,6 @@
    * * [scrollX](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX)
    *   from MDN.
    */
-  @DomName('Window.scrollX')
-  @DocsEditable()
   int get scrollX => JS('bool', '("scrollX" in #)', this)
       ? JS('num', '#.scrollX', this).round()
       : document.documentElement.scrollLeft;
@@ -44068,8 +32132,6 @@
    * * [scrollY](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY)
    *   from MDN.
    */
-  @DomName('Window.scrollY')
-  @DocsEditable()
   int get scrollY => JS('bool', '("scrollY" in #)', this)
       ? JS('num', '#.scrollY', this).round()
       : document.documentElement.scrollTop;
@@ -44133,9 +32195,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WindowBase64')
-@Experimental() // untriaged
 abstract class WindowBase64 extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory WindowBase64._() {
@@ -44150,9 +32209,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WindowClient')
-@Experimental() // untriaged
 @Native("WindowClient")
 class WindowClient extends Client {
   // To suppress missing implicit constructor warnings.
@@ -44160,25 +32216,13 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WindowClient.focused')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool focused;
 
-  @DomName('WindowClient.visibilityState')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String visibilityState;
 
-  @DomName('WindowClient.focus')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<WindowClient> focus() =>
       promiseToFuture<WindowClient>(JS("", "#.focus()", this));
 
-  @DomName('WindowClient.navigate')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<WindowClient> navigate(String url) =>
       promiseToFuture<WindowClient>(JS("", "#.navigate(#)", this, url));
 }
@@ -44186,104 +32230,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WindowEventHandlers')
-@Experimental() // untriaged
 abstract class WindowEventHandlers extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory WindowEventHandlers._() {
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WindowEventHandlers.hashchangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> hashChangeEvent =
       const EventStreamProvider<Event>('hashchange');
 
-  @DomName('WindowEventHandlers.messageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('WindowEventHandlers.offlineEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> offlineEvent =
       const EventStreamProvider<Event>('offline');
 
-  @DomName('WindowEventHandlers.onlineEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> onlineEvent =
       const EventStreamProvider<Event>('online');
 
-  @DomName('WindowEventHandlers.popstateEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<PopStateEvent> popStateEvent =
       const EventStreamProvider<PopStateEvent>('popstate');
 
-  @DomName('WindowEventHandlers.storageEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<StorageEvent> storageEvent =
       const EventStreamProvider<StorageEvent>('storage');
 
-  @DomName('WindowEventHandlers.unloadEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> unloadEvent =
       const EventStreamProvider<Event>('unload');
 
-  @DomName('WindowEventHandlers.onhashchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
 
-  @DomName('WindowEventHandlers.onmessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
-  @DomName('WindowEventHandlers.onoffline')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
-  @DomName('WindowEventHandlers.ononline')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onOnline => onlineEvent.forTarget(this);
 
-  @DomName('WindowEventHandlers.onpopstate')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
-  @DomName('WindowEventHandlers.onstorage')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
-  @DomName('WindowEventHandlers.onunload')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Worker')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#worker
-@Experimental() // stable
 @Native("Worker")
 class Worker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
@@ -44297,9 +32292,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Worker.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -44309,13 +32301,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Worker.messageEvent')
-  @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent =
       const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('Worker.Worker')
-  @DocsEditable()
   factory Worker(String scriptUrl) {
     return Worker._create_1(scriptUrl);
   }
@@ -44326,32 +32314,20 @@
   static bool get supported =>
       JS('bool', '(typeof window.Worker != "undefined")');
 
-  @DomName('Worker.postMessage')
-  @DocsEditable()
   void postMessage(Object message, [List<Object> transfer]) native;
 
-  @DomName('Worker.terminate')
-  @DocsEditable()
   void terminate() native;
 
   /// Stream of `error` events handled by this [Worker].
-  @DomName('Worker.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `message` events handled by this [Worker].
-  @DomName('Worker.onmessage')
-  @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WorkerGlobalScope')
-@Experimental() // untriaged
 @Native("WorkerGlobalScope")
 class WorkerGlobalScope extends EventTarget
     implements _WindowTimers, WindowBase64 {
@@ -44366,65 +32342,29 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('WorkerGlobalScope.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('WorkerGlobalScope.addressSpace')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String addressSpace;
 
-  @DomName('WorkerGlobalScope.caches')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CacheStorage caches;
 
-  @DomName('WorkerGlobalScope.crypto')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Crypto crypto;
 
-  @DomName('WorkerGlobalScope.indexedDB')
-  @DocsEditable()
-  @Experimental() // untriaged
   final IdbFactory indexedDB;
 
-  @DomName('WorkerGlobalScope.isSecureContext')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool isSecureContext;
 
-  @DomName('WorkerGlobalScope.location')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _WorkerLocation location;
 
-  @DomName('WorkerGlobalScope.navigator')
-  @DocsEditable()
-  @Experimental() // untriaged
   final _WorkerNavigator navigator;
 
-  @DomName('WorkerGlobalScope.origin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String origin;
 
-  @DomName('WorkerGlobalScope.performance')
-  @DocsEditable()
-  @Experimental() // untriaged
   final WorkerPerformance performance;
 
-  @DomName('WorkerGlobalScope.self')
-  @DocsEditable()
-  @Experimental() // untriaged
   final WorkerGlobalScope self;
 
-  @DomName('WorkerGlobalScope.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future fetch(/*RequestInfo*/ input, [Map init]) {
     if (init != null) {
       var init_1 = convertDartToNative_Dictionary(init);
@@ -44434,86 +32374,47 @@
   }
 
   @JSName('fetch')
-  @DomName('WorkerGlobalScope.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _fetch_1(input, init) native;
   @JSName('fetch')
-  @DomName('WorkerGlobalScope.fetch')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future _fetch_2(input) native;
 
-  @DomName('WorkerGlobalScope.importScripts')
-  @DocsEditable()
-  @Experimental() // untriaged
   void importScripts(String urls) native;
 
   // From WindowBase64
 
-  @DomName('WorkerGlobalScope.atob')
-  @DocsEditable()
-  @Experimental() // untriaged
   String atob(String atob) native;
 
-  @DomName('WorkerGlobalScope.btoa')
-  @DocsEditable()
-  @Experimental() // untriaged
   String btoa(String btoa) native;
 
   // From WindowTimers
 
   @JSName('setInterval')
-  @DomName('WorkerGlobalScope.setInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
   int _setInterval_String(String handler, [int timeout, Object arguments])
       native;
 
   @JSName('setTimeout')
-  @DomName('WorkerGlobalScope.setTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
   int _setTimeout_String(String handler, [int timeout, Object arguments])
       native;
 
   @JSName('clearInterval')
-  @DomName('WorkerGlobalScope.clearInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _clearInterval([int handle]) native;
 
   @JSName('clearTimeout')
-  @DomName('WorkerGlobalScope.clearTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _clearTimeout([int handle]) native;
 
   @JSName('setInterval')
-  @DomName('WorkerGlobalScope.setInterval')
-  @DocsEditable()
-  @Experimental() // untriaged
   int _setInterval(Object handler, [int timeout]) native;
 
   @JSName('setTimeout')
-  @DomName('WorkerGlobalScope.setTimeout')
-  @DocsEditable()
-  @Experimental() // untriaged
   int _setTimeout(Object handler, [int timeout]) native;
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
-  @DomName('WorkerGlobalScope.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WorkerPerformance')
-@Experimental() // untriaged
 @Native("WorkerPerformance")
 class WorkerPerformance extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -44521,73 +32422,34 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WorkerPerformance.memory')
-  @DocsEditable()
-  @Experimental() // untriaged
   final MemoryInfo memory;
 
-  @DomName('WorkerPerformance.timeOrigin')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num timeOrigin;
 
-  @DomName('WorkerPerformance.clearMarks')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearMarks(String markName) native;
 
-  @DomName('WorkerPerformance.clearMeasures')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearMeasures(String measureName) native;
 
-  @DomName('WorkerPerformance.clearResourceTimings')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearResourceTimings() native;
 
-  @DomName('WorkerPerformance.getEntries')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<PerformanceEntry> getEntries() native;
 
-  @DomName('WorkerPerformance.getEntriesByName')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
 
-  @DomName('WorkerPerformance.getEntriesByType')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<PerformanceEntry> getEntriesByType(String entryType) native;
 
-  @DomName('WorkerPerformance.mark')
-  @DocsEditable()
-  @Experimental() // untriaged
   void mark(String markName) native;
 
-  @DomName('WorkerPerformance.measure')
-  @DocsEditable()
-  @Experimental() // untriaged
   void measure(String measureName, String startMark, String endMark) native;
 
-  @DomName('WorkerPerformance.now')
-  @DocsEditable()
-  @Experimental() // untriaged
   double now() native;
 
-  @DomName('WorkerPerformance.setResourceTimingBufferSize')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setResourceTimingBufferSize(int maxSize) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WorkletAnimation')
-@Experimental() // untriaged
 @Native("WorkletAnimation")
 class WorkletAnimation extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -44595,8 +32457,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WorkletAnimation.WorkletAnimation')
-  @DocsEditable()
   factory WorkletAnimation(
       String animatorName,
       List<KeyframeEffectReadOnly> effects,
@@ -44611,28 +32471,16 @@
       JS('WorkletAnimation', 'new WorkletAnimation(#,#,#,#)', animatorName,
           effects, timelines, options);
 
-  @DomName('WorkletAnimation.playState')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String playState;
 
-  @DomName('WorkletAnimation.cancel')
-  @DocsEditable()
-  @Experimental() // untriaged
   void cancel() native;
 
-  @DomName('WorkletAnimation.play')
-  @DocsEditable()
-  @Experimental() // untriaged
   void play() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WorkletGlobalScope')
-@Experimental() // untriaged
 @Native("WorkletGlobalScope")
 class WorkletGlobalScope extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -44644,8 +32492,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XPathEvaluator')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
 @deprecated // experimental
 @Native("XPathEvaluator")
@@ -44655,25 +32501,17 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('XPathEvaluator.XPathEvaluator')
-  @DocsEditable()
   factory XPathEvaluator() {
     return XPathEvaluator._create_1();
   }
   static XPathEvaluator _create_1() =>
       JS('XPathEvaluator', 'new XPathEvaluator()');
 
-  @DomName('XPathEvaluator.createExpression')
-  @DocsEditable()
   XPathExpression createExpression(String expression, XPathNSResolver resolver)
       native;
 
-  @DomName('XPathEvaluator.createNSResolver')
-  @DocsEditable()
   XPathNSResolver createNSResolver(Node nodeResolver) native;
 
-  @DomName('XPathEvaluator.evaluate')
-  @DocsEditable()
   XPathResult evaluate(
       String expression, Node contextNode, XPathNSResolver resolver,
       [int type, Object inResult]) native;
@@ -44682,8 +32520,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XPathExpression')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression
 @deprecated // experimental
 @Native("XPathExpression")
@@ -44693,16 +32529,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('XPathExpression.evaluate')
-  @DocsEditable()
   XPathResult evaluate(Node contextNode, [int type, Object inResult]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XPathNSResolver')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNSResolver
 @deprecated // experimental
 @Native("XPathNSResolver")
@@ -44713,16 +32545,12 @@
   }
 
   @JSName('lookupNamespaceURI')
-  @DomName('XPathNSResolver.lookupNamespaceURI')
-  @DocsEditable()
   String lookupNamespaceUri(String prefix) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XPathResult')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult
 @deprecated // experimental
 @Native("XPathResult")
@@ -44732,89 +32560,48 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('XPathResult.ANY_TYPE')
-  @DocsEditable()
   static const int ANY_TYPE = 0;
 
-  @DomName('XPathResult.ANY_UNORDERED_NODE_TYPE')
-  @DocsEditable()
   static const int ANY_UNORDERED_NODE_TYPE = 8;
 
-  @DomName('XPathResult.BOOLEAN_TYPE')
-  @DocsEditable()
   static const int BOOLEAN_TYPE = 3;
 
-  @DomName('XPathResult.FIRST_ORDERED_NODE_TYPE')
-  @DocsEditable()
   static const int FIRST_ORDERED_NODE_TYPE = 9;
 
-  @DomName('XPathResult.NUMBER_TYPE')
-  @DocsEditable()
   static const int NUMBER_TYPE = 1;
 
-  @DomName('XPathResult.ORDERED_NODE_ITERATOR_TYPE')
-  @DocsEditable()
   static const int ORDERED_NODE_ITERATOR_TYPE = 5;
 
-  @DomName('XPathResult.ORDERED_NODE_SNAPSHOT_TYPE')
-  @DocsEditable()
   static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;
 
-  @DomName('XPathResult.STRING_TYPE')
-  @DocsEditable()
   static const int STRING_TYPE = 2;
 
-  @DomName('XPathResult.UNORDERED_NODE_ITERATOR_TYPE')
-  @DocsEditable()
   static const int UNORDERED_NODE_ITERATOR_TYPE = 4;
 
-  @DomName('XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE')
-  @DocsEditable()
   static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
 
-  @DomName('XPathResult.booleanValue')
-  @DocsEditable()
   final bool booleanValue;
 
-  @DomName('XPathResult.invalidIteratorState')
-  @DocsEditable()
   final bool invalidIteratorState;
 
-  @DomName('XPathResult.numberValue')
-  @DocsEditable()
   final num numberValue;
 
-  @DomName('XPathResult.resultType')
-  @DocsEditable()
   final int resultType;
 
-  @DomName('XPathResult.singleNodeValue')
-  @DocsEditable()
   final Node singleNodeValue;
 
-  @DomName('XPathResult.snapshotLength')
-  @DocsEditable()
   final int snapshotLength;
 
-  @DomName('XPathResult.stringValue')
-  @DocsEditable()
   final String stringValue;
 
-  @DomName('XPathResult.iterateNext')
-  @DocsEditable()
   Node iterateNext() native;
 
-  @DomName('XPathResult.snapshotItem')
-  @DocsEditable()
   Node snapshotItem(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XMLDocument')
-@Experimental() // untriaged
 @Native("XMLDocument")
 class XmlDocument extends Document {
   // To suppress missing implicit constructor warnings.
@@ -44826,8 +32613,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XMLSerializer')
 // http://domparsing.spec.whatwg.org/#the-xmlserializer-interface
 @deprecated // stable
 @Native("XMLSerializer")
@@ -44837,24 +32622,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('XMLSerializer.XMLSerializer')
-  @DocsEditable()
   factory XmlSerializer() {
     return XmlSerializer._create_1();
   }
   static XmlSerializer _create_1() =>
       JS('XmlSerializer', 'new XMLSerializer()');
 
-  @DomName('XMLSerializer.serializeToString')
-  @DocsEditable()
   String serializeToString(Node root) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('XSLTProcessor')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -44866,8 +32645,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('XSLTProcessor.XSLTProcessor')
-  @DocsEditable()
   factory XsltProcessor() {
     return XsltProcessor._create_1();
   }
@@ -44877,44 +32654,26 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.XSLTProcessor)');
 
-  @DomName('XSLTProcessor.clearParameters')
-  @DocsEditable()
   void clearParameters() native;
 
-  @DomName('XSLTProcessor.getParameter')
-  @DocsEditable()
   String getParameter(String namespaceURI, String localName) native;
 
-  @DomName('XSLTProcessor.importStylesheet')
-  @DocsEditable()
   void importStylesheet(Node style) native;
 
-  @DomName('XSLTProcessor.removeParameter')
-  @DocsEditable()
   void removeParameter(String namespaceURI, String localName) native;
 
-  @DomName('XSLTProcessor.reset')
-  @DocsEditable()
   void reset() native;
 
-  @DomName('XSLTProcessor.setParameter')
-  @DocsEditable()
   void setParameter(String namespaceURI, String localName, String value) native;
 
-  @DomName('XSLTProcessor.transformToDocument')
-  @DocsEditable()
   Document transformToDocument(Node source) native;
 
-  @DomName('XSLTProcessor.transformToFragment')
-  @DocsEditable()
   DocumentFragment transformToFragment(Node source, Document output) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Attr')
 @Native("Attr")
 class _Attr extends Node {
   // To suppress missing implicit constructor warnings.
@@ -44923,32 +32682,19 @@
   }
 
   @JSName('localName')
-  @DomName('Attr.localName')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String _localName;
 
-  @DomName('Attr.name')
-  @DocsEditable()
   final String name;
 
   @JSName('namespaceURI')
-  @DomName('Attr.namespaceURI')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String _namespaceUri;
 
-  @DomName('Attr.value')
-  @DocsEditable()
   String value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Bluetooth')
-@Experimental() // untriaged
 @Native("Bluetooth")
 abstract class _Bluetooth extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -44960,9 +32706,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BluetoothCharacteristicProperties')
-@Experimental() // untriaged
 @Native("BluetoothCharacteristicProperties")
 abstract class _BluetoothCharacteristicProperties extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -44974,9 +32717,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BluetoothDevice')
-@Experimental() // untriaged
 @Native("BluetoothDevice")
 abstract class _BluetoothDevice extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -44988,9 +32728,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BluetoothRemoteGATTCharacteristic')
-@Experimental() // untriaged
 @Native("BluetoothRemoteGATTCharacteristic")
 abstract class _BluetoothRemoteGATTCharacteristic extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -45002,9 +32739,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BluetoothRemoteGATTServer')
-@Experimental() // untriaged
 @Native("BluetoothRemoteGATTServer")
 abstract class _BluetoothRemoteGATTServer extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45016,9 +32750,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BluetoothRemoteGATTService')
-@Experimental() // untriaged
 @Native("BluetoothRemoteGATTService")
 abstract class _BluetoothRemoteGATTService extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45030,9 +32761,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BluetoothUUID')
-@Experimental() // untriaged
 @Native("BluetoothUUID")
 abstract class _BluetoothUUID extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45044,9 +32772,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BudgetService')
-@Experimental() // untriaged
 @Native("BudgetService")
 class _BudgetService extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45054,21 +32779,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BudgetService.getBudget')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<BudgetState> getBudget() =>
       promiseToFuture<BudgetState>(JS("", "#.getBudget()", this));
 
-  @DomName('BudgetService.getCost')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<double> getCost(String operation) =>
       promiseToFuture<double>(JS("", "#.getCost(#)", this, operation));
 
-  @DomName('BudgetService.reserve')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<bool> reserve(String operation) =>
       promiseToFuture<bool>(JS("", "#.reserve(#)", this, operation));
 }
@@ -45076,9 +32792,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Cache')
-@Experimental() // untriaged
 @Native("Cache")
 abstract class _Cache extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45090,9 +32803,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CanvasPath')
-@Experimental() // untriaged
 abstract class _CanvasPath extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory _CanvasPath._() {
@@ -45103,8 +32813,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Clipboard')
 @Native("Clipboard")
 class _Clipboard extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -45112,27 +32820,15 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Clipboard.read')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<DataTransfer> read() =>
       promiseToFuture<DataTransfer>(JS("", "#.read()", this));
 
-  @DomName('Clipboard.readText')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<String> readText() =>
       promiseToFuture<String>(JS("", "#.readText()", this));
 
-  @DomName('Clipboard.write')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future write(DataTransfer data) =>
       promiseToFuture(JS("", "#.write(#)", this, data));
 
-  @DomName('Clipboard.writeText')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future writeText(String data) =>
       promiseToFuture(JS("", "#.writeText(#)", this, data));
 }
@@ -45140,8 +32836,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('CSSRuleList')
 @Native("CSSRuleList")
 class _CssRuleList extends Interceptor
     with ListMixin<CssRule>, ImmutableListMixin<CssRule>
@@ -45151,8 +32845,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('CSSRuleList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   CssRule operator [](int index) {
@@ -45198,19 +32890,13 @@
   CssRule elementAt(int index) => this[index];
   // -- end List<CssRule> mixins.
 
-  @DomName('CSSRuleList.item')
-  @DocsEditable()
   CssRule item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMFileSystemSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
-// http://www.w3.org/TR/file-system-api/#the-filesystemsync-interface
 @Native("DOMFileSystemSync")
 abstract class _DOMFileSystemSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45222,10 +32908,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DirectoryEntrySync')
-// http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface
-@Experimental()
 @Native("DirectoryEntrySync")
 abstract class _DirectoryEntrySync extends _EntrySync {
   // To suppress missing implicit constructor warnings.
@@ -45237,10 +32919,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DirectoryReaderSync')
-// http://www.w3.org/TR/file-system-api/#idl-def-DirectoryReaderSync
-@Experimental()
 @Native("DirectoryReaderSync")
 abstract class _DirectoryReaderSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45252,8 +32930,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DocumentType')
 // http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927
 @deprecated // stable
 @Native("DocumentType")
@@ -45271,9 +32947,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DOMRect')
-@Experimental() // untriaged
 @Native("ClientRect,DOMRect")
 class _DomRect extends DomRectReadOnly implements Rectangle {
   // NOTE! All code below should be common with RectangleBase.
@@ -45370,8 +33043,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DOMRect.DOMRect')
-  @DocsEditable()
   factory _DomRect([num x, num y, num width, num height]) {
     if (height != null) {
       return _DomRect._create_1(x, y, width, height);
@@ -45464,10 +33135,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EntrySync')
-// http://www.w3.org/TR/file-system-api/#idl-def-EntrySync
-@Experimental()
 @Native("EntrySync")
 abstract class _EntrySync extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45479,10 +33146,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FileEntrySync')
-// http://www.w3.org/TR/file-system-api/#the-fileentrysync-interface
-@Experimental()
 @Native("FileEntrySync")
 abstract class _FileEntrySync extends _EntrySync {
   // To suppress missing implicit constructor warnings.
@@ -45494,10 +33157,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FileReaderSync')
-// http://www.w3.org/TR/FileAPI/#FileReaderSync
-@Experimental()
 @Native("FileReaderSync")
 abstract class _FileReaderSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45505,8 +33164,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('FileReaderSync.FileReaderSync')
-  @DocsEditable()
   factory _FileReaderSync() {
     return _FileReaderSync._create_1();
   }
@@ -45517,10 +33174,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('FileWriterSync')
-// http://www.w3.org/TR/file-writer-api/#idl-def-FileWriterSync
-@Experimental()
 @Native("FileWriterSync")
 abstract class _FileWriterSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45532,10 +33185,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('GamepadList')
-// https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html
-@Experimental()
 @Native("GamepadList")
 class _GamepadList extends Interceptor
     with ListMixin<Gamepad>, ImmutableListMixin<Gamepad>
@@ -45545,8 +33194,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('GamepadList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   Gamepad operator [](int index) {
@@ -45592,16 +33239,12 @@
   Gamepad elementAt(int index) => this[index];
   // -- end List<Gamepad> mixins.
 
-  @DomName('GamepadList.item')
-  @DocsEditable()
   Gamepad item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLAllCollection')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
 @deprecated // deprecated
 @Native("HTMLAllCollection")
@@ -45612,16 +33255,12 @@
   }
 
   @JSName('item')
-  @DomName('HTMLAllCollection.item')
-  @DocsEditable()
   Element _item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLDirectoryElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
 @deprecated // deprecated
 @Native("HTMLDirectoryElement")
@@ -45641,8 +33280,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLFontElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
 @deprecated // deprecated
 @Native("HTMLFontElement")
@@ -45662,8 +33299,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLFrameElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
 @deprecated // deprecated
 @Native("HTMLFrameElement")
@@ -45683,8 +33318,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLFrameSetElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
 @deprecated // deprecated
 @Native("HTMLFrameSetElement")
@@ -45706,8 +33339,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('HTMLMarqueeElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
 @deprecated // deprecated
 @Native("HTMLMarqueeElement")
@@ -45727,9 +33358,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Mojo')
-@Experimental() // untriaged
 @Native("Mojo")
 abstract class _Mojo extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45741,9 +33369,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MojoHandle')
-@Experimental() // untriaged
 @Native("MojoHandle")
 abstract class _MojoHandle extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45755,9 +33380,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MojoInterfaceInterceptor')
-@Experimental() // untriaged
 @Native("MojoInterfaceInterceptor")
 abstract class _MojoInterfaceInterceptor extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -45765,8 +33387,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MojoInterfaceInterceptor.MojoInterfaceInterceptor')
-  @DocsEditable()
   factory _MojoInterfaceInterceptor(String interfaceName, [String scope]) {
     if (scope != null) {
       return _MojoInterfaceInterceptor._create_1(interfaceName, scope);
@@ -45787,9 +33407,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MojoInterfaceRequestEvent')
-@Experimental() // untriaged
 @Native("MojoInterfaceRequestEvent")
 abstract class _MojoInterfaceRequestEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -45797,8 +33414,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MojoInterfaceRequestEvent.MojoInterfaceRequestEvent')
-  @DocsEditable()
   factory _MojoInterfaceRequestEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -45818,9 +33433,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MojoWatcher')
-@Experimental() // untriaged
 @Native("MojoWatcher")
 abstract class _MojoWatcher extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45832,9 +33444,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NFC')
-@Experimental() // untriaged
 @Native("NFC")
 abstract class _NFC extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45846,8 +33455,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('NamedNodeMap')
 // http://dom.spec.whatwg.org/#namednodemap
 @deprecated // deprecated
 @Native("NamedNodeMap,MozNamedAttrMap")
@@ -45859,8 +33466,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('NamedNodeMap.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   Node operator [](int index) {
@@ -45906,40 +33511,24 @@
   Node elementAt(int index) => this[index];
   // -- end List<Node> mixins.
 
-  @DomName('NamedNodeMap.getNamedItem')
-  @DocsEditable()
   _Attr getNamedItem(String name) native;
 
-  @DomName('NamedNodeMap.getNamedItemNS')
-  @DocsEditable()
   _Attr getNamedItemNS(String namespaceURI, String localName) native;
 
-  @DomName('NamedNodeMap.item')
-  @DocsEditable()
   _Attr item(int index) native;
 
-  @DomName('NamedNodeMap.removeNamedItem')
-  @DocsEditable()
   _Attr removeNamedItem(String name) native;
 
-  @DomName('NamedNodeMap.removeNamedItemNS')
-  @DocsEditable()
   _Attr removeNamedItemNS(String namespaceURI, String localName) native;
 
-  @DomName('NamedNodeMap.setNamedItem')
-  @DocsEditable()
   _Attr setNamedItem(_Attr attr) native;
 
-  @DomName('NamedNodeMap.setNamedItemNS')
-  @DocsEditable()
   _Attr setNamedItemNS(_Attr attr) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PagePopupController')
 @deprecated // nonstandard
 @Native("PagePopupController")
 abstract class _PagePopupController extends Interceptor {
@@ -45960,9 +33549,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Report')
-@Experimental() // untriaged
 @Native("Report")
 class _Report extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -45970,28 +33556,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Report.body')
-  @DocsEditable()
-  @Experimental() // untriaged
   final ReportBody body;
 
-  @DomName('Report.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('Report.url')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String url;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Request')
-@Experimental() // untriaged
 @Native("Request")
 class _Request extends Body {
   // To suppress missing implicit constructor warnings.
@@ -45999,8 +33573,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Request.Request')
-  @DocsEditable()
   factory _Request(Object input, [Map requestInitDict]) {
     if (requestInitDict != null) {
       var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
@@ -46012,62 +33584,30 @@
       JS('_Request', 'new Request(#,#)', input, requestInitDict);
   static _Request _create_2(input) => JS('_Request', 'new Request(#)', input);
 
-  @DomName('Request.cache')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String cache;
 
-  @DomName('Request.credentials')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String credentials;
 
-  @DomName('Request.headers')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Headers headers;
 
-  @DomName('Request.integrity')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String integrity;
 
-  @DomName('Request.mode')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String mode;
 
-  @DomName('Request.redirect')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String redirect;
 
-  @DomName('Request.referrer')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String referrer;
 
-  @DomName('Request.referrerPolicy')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String referrerPolicy;
 
-  @DomName('Request.url')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String url;
 
-  @DomName('Request.clone')
-  @DocsEditable()
-  @Experimental() // untriaged
   _Request clone() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ResourceProgressEvent')
 // https://chromiumcodereview.appspot.com/14773025/
 @deprecated // experimental
 @Native("ResourceProgressEvent")
@@ -46081,9 +33621,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Response')
-@Experimental() // untriaged
 @Native("Response")
 abstract class _Response extends Body {
   // To suppress missing implicit constructor warnings.
@@ -46091,8 +33628,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('Response.Response')
-  @DocsEditable()
   factory _Response([Object body, Map init]) {
     if (init != null) {
       var init_1 = convertDartToNative_Dictionary(init);
@@ -46112,10 +33647,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SpeechRecognitionResultList')
-// https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresultlist
-@Experimental()
 @Native("SpeechRecognitionResultList")
 class _SpeechRecognitionResultList extends Interceptor
     with
@@ -46129,8 +33660,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SpeechRecognitionResultList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   SpeechRecognitionResult operator [](int index) {
@@ -46176,16 +33705,12 @@
   SpeechRecognitionResult elementAt(int index) => this[index];
   // -- end List<SpeechRecognitionResult> mixins.
 
-  @DomName('SpeechRecognitionResultList.item')
-  @DocsEditable()
   SpeechRecognitionResult item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StyleSheetList')
 @Native("StyleSheetList")
 class _StyleSheetList extends Interceptor
     with ListMixin<StyleSheet>, ImmutableListMixin<StyleSheet>
@@ -46195,8 +33720,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StyleSheetList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   StyleSheet operator [](int index) {
@@ -46242,21 +33765,14 @@
   StyleSheet elementAt(int index) => this[index];
   // -- end List<StyleSheet> mixins.
 
-  @DomName('StyleSheetList.__getter__')
-  @DocsEditable()
   CssStyleSheet __getter__(String name) native;
 
-  @DomName('StyleSheetList.item')
-  @DocsEditable()
   StyleSheet item(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SubtleCrypto')
-@Experimental() // untriaged
 @Native("SubtleCrypto")
 abstract class _SubtleCrypto extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46268,9 +33784,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USB')
-@Experimental() // untriaged
 @Native("USB")
 abstract class _USB extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -46282,9 +33795,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBAlternateInterface')
-@Experimental() // untriaged
 @Native("USBAlternateInterface")
 abstract class _USBAlternateInterface extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46292,8 +33802,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBAlternateInterface.USBAlternateInterface')
-  @DocsEditable()
   factory _USBAlternateInterface(
       _USBInterface deviceInterface, int alternateSetting) {
     return _USBAlternateInterface._create_1(deviceInterface, alternateSetting);
@@ -46306,9 +33814,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBConfiguration')
-@Experimental() // untriaged
 @Native("USBConfiguration")
 abstract class _USBConfiguration extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46316,8 +33821,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBConfiguration.USBConfiguration')
-  @DocsEditable()
   factory _USBConfiguration(_USBDevice device, int configurationValue) {
     return _USBConfiguration._create_1(device, configurationValue);
   }
@@ -46331,9 +33834,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBConnectionEvent')
-@Experimental() // untriaged
 @Native("USBConnectionEvent")
 abstract class _USBConnectionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -46341,8 +33841,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBConnectionEvent.USBConnectionEvent')
-  @DocsEditable()
   factory _USBConnectionEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return _USBConnectionEvent._create_1(type, eventInitDict_1);
@@ -46357,9 +33855,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBDevice')
-@Experimental() // untriaged
 @Native("USBDevice")
 abstract class _USBDevice extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46371,9 +33866,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBEndpoint')
-@Experimental() // untriaged
 @Native("USBEndpoint")
 abstract class _USBEndpoint extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46381,8 +33873,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBEndpoint.USBEndpoint')
-  @DocsEditable()
   factory _USBEndpoint(
       _USBAlternateInterface alternate, int endpointNumber, String direction) {
     return _USBEndpoint._create_1(alternate, endpointNumber, direction);
@@ -46398,9 +33888,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBInTransferResult')
-@Experimental() // untriaged
 @Native("USBInTransferResult")
 abstract class _USBInTransferResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46408,8 +33895,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBInTransferResult.USBInTransferResult')
-  @DocsEditable()
   factory _USBInTransferResult(String status, [ByteData data]) {
     if (data != null) {
       return _USBInTransferResult._create_1(status, data);
@@ -46425,9 +33910,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBInterface')
-@Experimental() // untriaged
 @Native("USBInterface")
 abstract class _USBInterface extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46435,8 +33917,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBInterface.USBInterface')
-  @DocsEditable()
   factory _USBInterface(_USBConfiguration configuration, int interfaceNumber) {
     return _USBInterface._create_1(configuration, interfaceNumber);
   }
@@ -46447,9 +33927,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBIsochronousInTransferPacket')
-@Experimental() // untriaged
 @Native("USBIsochronousInTransferPacket")
 abstract class _USBIsochronousInTransferPacket extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46457,8 +33934,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBIsochronousInTransferPacket.USBIsochronousInTransferPacket')
-  @DocsEditable()
   factory _USBIsochronousInTransferPacket(String status, [ByteData data]) {
     if (data != null) {
       return _USBIsochronousInTransferPacket._create_1(status, data);
@@ -46479,9 +33954,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBIsochronousInTransferResult')
-@Experimental() // untriaged
 @Native("USBIsochronousInTransferResult")
 abstract class _USBIsochronousInTransferResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46489,8 +33961,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBIsochronousInTransferResult.USBIsochronousInTransferResult')
-  @DocsEditable()
   factory _USBIsochronousInTransferResult(
       List<_USBIsochronousInTransferPacket> packets,
       [ByteData data]) {
@@ -46513,9 +33983,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBIsochronousOutTransferPacket')
-@Experimental() // untriaged
 @Native("USBIsochronousOutTransferPacket")
 abstract class _USBIsochronousOutTransferPacket extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46523,8 +33990,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBIsochronousOutTransferPacket.USBIsochronousOutTransferPacket')
-  @DocsEditable()
   factory _USBIsochronousOutTransferPacket(String status, [int bytesWritten]) {
     if (bytesWritten != null) {
       return _USBIsochronousOutTransferPacket._create_1(status, bytesWritten);
@@ -46545,9 +34010,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBIsochronousOutTransferResult')
-@Experimental() // untriaged
 @Native("USBIsochronousOutTransferResult")
 abstract class _USBIsochronousOutTransferResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46555,8 +34017,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBIsochronousOutTransferResult.USBIsochronousOutTransferResult')
-  @DocsEditable()
   factory _USBIsochronousOutTransferResult(
       List<_USBIsochronousOutTransferPacket> packets) {
     return _USBIsochronousOutTransferResult._create_1(packets);
@@ -46570,9 +34030,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('USBOutTransferResult')
-@Experimental() // untriaged
 @Native("USBOutTransferResult")
 abstract class _USBOutTransferResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -46580,8 +34037,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('USBOutTransferResult.USBOutTransferResult')
-  @DocsEditable()
   factory _USBOutTransferResult(String status, [int bytesWritten]) {
     if (bytesWritten != null) {
       return _USBOutTransferResult._create_1(status, bytesWritten);
@@ -46600,9 +34055,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WindowTimers')
-@Experimental() // untriaged
 abstract class _WindowTimers extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory _WindowTimers._() {
@@ -46625,10 +34077,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WorkerLocation')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workerlocation
-@Experimental()
 @Native("WorkerLocation")
 abstract class _WorkerLocation extends Interceptor implements UrlUtilsReadOnly {
   // To suppress missing implicit constructor warnings.
@@ -46644,10 +34092,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WorkerNavigator')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
-@Experimental()
 @Native("WorkerNavigator")
 abstract class _WorkerNavigator extends NavigatorConcurrentHardware
     implements NavigatorOnLine, NavigatorID {
@@ -46666,9 +34110,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Worklet')
-@Experimental() // untriaged
 @Native("Worklet")
 abstract class _Worklet extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -47881,7 +35322,6 @@
  * [length measurement](https://developer.mozilla.org/en-US/docs/Web/CSS/length)
  * in CSS.
  */
-@Experimental()
 class Dimension {
   num _value;
   String _unit;
@@ -50850,95 +38290,73 @@
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
-  @DomName('Console.memory')
   MemoryInfo get memory =>
       _isConsoleDefined ? JS('MemoryInfo', 'window.console.memory') : null;
 
-  @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) => _isConsoleDefined
       ? JS('void', 'window.console.assertCondition(#, #)', condition, arg)
       : null;
 
-  @DomName('Console.clear')
   void clear(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.clear(#)', arg) : null;
 
-  @DomName('Console.count')
   void count(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.count(#)', arg) : null;
 
-  @DomName('Console.debug')
   void debug(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.debug(#)', arg) : null;
 
-  @DomName('Console.dir')
   void dir(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.dir(#)', arg) : null;
 
-  @DomName('Console.dirxml')
   void dirxml(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.dirxml(#)', arg) : null;
 
-  @DomName('Console.error')
   void error(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.error(#)', arg) : null;
 
-  @DomName('Console.group')
   void group(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.group(#)', arg) : null;
 
-  @DomName('Console.groupCollapsed')
   void groupCollapsed(Object arg) => _isConsoleDefined
       ? JS('void', 'window.console.groupCollapsed(#)', arg)
       : null;
 
-  @DomName('Console.groupEnd')
   void groupEnd() =>
       _isConsoleDefined ? JS('void', 'window.console.groupEnd()') : null;
 
-  @DomName('Console.info')
   void info(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.info(#)', arg) : null;
 
-  @DomName('Console.log')
   void log(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.log(#)', arg) : null;
 
-  @DomName('Console.markTimeline')
   void markTimeline(Object arg) => _isConsoleDefined
       ? JS('void', 'window.console.markTimeline(#)', arg)
       : null;
 
-  @DomName('Console.profile')
   void profile(String title) =>
       _isConsoleDefined ? JS('void', 'window.console.profile(#)', title) : null;
 
-  @DomName('Console.profileEnd')
   void profileEnd(String title) => _isConsoleDefined
       ? JS('void', 'window.console.profileEnd(#)', title)
       : null;
 
-  @DomName('Console.table')
   void table(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.table(#)', arg) : null;
 
-  @DomName('Console.time')
   void time(String title) =>
       _isConsoleDefined ? JS('void', 'window.console.time(#)', title) : null;
 
-  @DomName('Console.timeEnd')
   void timeEnd(String title) =>
       _isConsoleDefined ? JS('void', 'window.console.timeEnd(#)', title) : null;
 
-  @DomName('Console.timeStamp')
   void timeStamp(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.timeStamp(#)', arg) : null;
 
-  @DomName('Console.trace')
   void trace(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.trace(#)', arg) : null;
 
-  @DomName('Console.warn')
   void warn(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.warn(#)', arg) : null;
 }
@@ -51360,7 +38778,6 @@
  * on how we can make this class work with as many international keyboards as
  * possible. Bugs welcome!
  */
-@Experimental()
 class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
@@ -51565,10 +38982,8 @@
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
 
-  @Experimental() // untriaged
   bool getModifierState(String keyArgument) => throw new UnimplementedError();
 
-  @Experimental() // untriaged
   bool get repeat => throw new UnimplementedError();
   bool get isComposed => throw new UnimplementedError();
   dynamic get _get_view => throw new UnimplementedError();
@@ -51675,7 +39090,6 @@
    *   from W3C.
    */
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
-  @Experimental()
   List<Node> get path => wrapped.path;
 
   dynamic get _get_currentTarget => wrapped._get_currentTarget;
@@ -51735,7 +39149,7 @@
  * For details about CSS selector syntax, see the
  * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
  */
-ElementList<Element> querySelectorAll(String selectors) =>
+ElementList<T> querySelectorAll<T extends Element>(String selectors) =>
     document.querySelectorAll(selectors);
 
 /// A utility for changing the Dart wrapper type for elements.
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index e17e1e2..3429925 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -210,11 +210,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('IDBCursor')
 @Unstable()
 @Native("IDBCursor")
 class Cursor extends Interceptor {
-  @DomName('IDBCursor.delete')
   Future delete() {
     try {
       return _completeRequest(_delete());
@@ -223,7 +221,6 @@
     }
   }
 
-  @DomName('IDBCursor.value')
   Future update(value) {
     try {
       return _completeRequest(_update(value));
@@ -233,7 +230,6 @@
   }
 
   @JSName('continue')
-  @DomName('IDBCursor.continue')
   void next([Object key]) {
     if (key == null) {
       JS('void', '#.continue()', this);
@@ -247,60 +243,39 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBCursor.direction')
-  @DocsEditable()
   final String direction;
 
-  @DomName('IDBCursor.key')
-  @DocsEditable()
   @_annotation_Creates_IDBKey
   @_annotation_Returns_IDBKey
   final Object key;
 
-  @DomName('IDBCursor.primaryKey')
-  @DocsEditable()
   @_annotation_Creates_IDBKey
   @_annotation_Returns_IDBKey
   final Object primaryKey;
 
-  @DomName('IDBCursor.source')
-  @DocsEditable()
   @Creates('Null')
   @Returns('ObjectStore|Index|Null')
   final Object source;
 
-  @DomName('IDBCursor.advance')
-  @DocsEditable()
   void advance(int count) native;
 
-  @DomName('IDBCursor.continuePrimaryKey')
-  @DocsEditable()
-  @Experimental() // untriaged
   void continuePrimaryKey(Object key, Object primaryKey) native;
 
   @JSName('delete')
-  @DomName('IDBCursor.delete')
-  @DocsEditable()
   Request _delete() native;
 
-  @DomName('IDBCursor.update')
-  @DocsEditable()
   Request _update(/*any*/ value) {
     var value_1 = convertDartToNative_SerializedScriptValue(value);
     return _update_1(value_1);
   }
 
   @JSName('update')
-  @DomName('IDBCursor.update')
-  @DocsEditable()
   Request _update_1(value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IDBCursorWithValue')
 @Unstable()
 @Native("IDBCursorWithValue")
 class CursorWithValue extends Cursor {
@@ -309,12 +284,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBCursorWithValue.value')
-  @DocsEditable()
   dynamic get value => _convertNativeToDart_IDBAny(this._get_value);
   @JSName('value')
-  @DomName('IDBCursorWithValue.value')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_value;
@@ -323,21 +294,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
 /**
  * An indexed database object for storing client-side data
  * in web apps.
  */
-@DomName('IDBDatabase')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
-@Experimental()
 @Unstable()
 @Native("IDBDatabase")
 class Database extends EventTarget {
-  @DomName('IDBDatabase.createObjectStore')
-  @DocsEditable()
   ObjectStore createObjectStore(String name,
       {String keyPath, bool autoIncrement}) {
     var options = {};
@@ -404,8 +370,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBDatabase.abortEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> abortEvent =
       const EventStreamProvider<Event>('abort');
 
@@ -415,10 +379,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBDatabase.closeEvent')
-  @DocsEditable()
-  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
-  @Experimental()
   static const EventStreamProvider<Event> closeEvent =
       const EventStreamProvider<Event>('close');
 
@@ -428,8 +388,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBDatabase.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -439,33 +397,21 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBDatabase.versionchangeEvent')
-  @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> versionChangeEvent =
       const EventStreamProvider<VersionChangeEvent>('versionchange');
 
-  @DomName('IDBDatabase.name')
-  @DocsEditable()
   final String name;
 
-  @DomName('IDBDatabase.objectStoreNames')
-  @DocsEditable()
   @Returns('DomStringList|Null')
   @Creates('DomStringList')
   final List<String> objectStoreNames;
 
-  @DomName('IDBDatabase.version')
-  @DocsEditable()
   @Creates('int|String|Null')
   @Returns('int|String|Null')
   final int version;
 
-  @DomName('IDBDatabase.close')
-  @DocsEditable()
   void close() native;
 
-  @DomName('IDBDatabase.createObjectStore')
-  @DocsEditable()
   ObjectStore _createObjectStore(String name, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -475,38 +421,22 @@
   }
 
   @JSName('createObjectStore')
-  @DomName('IDBDatabase.createObjectStore')
-  @DocsEditable()
   ObjectStore _createObjectStore_1(name, options) native;
   @JSName('createObjectStore')
-  @DomName('IDBDatabase.createObjectStore')
-  @DocsEditable()
   ObjectStore _createObjectStore_2(name) native;
 
-  @DomName('IDBDatabase.deleteObjectStore')
-  @DocsEditable()
   void deleteObjectStore(String name) native;
 
   /// Stream of `abort` events handled by this [Database].
-  @DomName('IDBDatabase.onabort')
-  @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
   /// Stream of `close` events handled by this [Database].
-  @DomName('IDBDatabase.onclose')
-  @DocsEditable()
-  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
-  @Experimental()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [Database].
-  @DomName('IDBDatabase.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `versionchange` events handled by this [Database].
-  @DomName('IDBDatabase.onversionchange')
-  @DocsEditable()
   Stream<VersionChangeEvent> get onVersionChange =>
       versionChangeEvent.forTarget(this);
 }
@@ -516,18 +446,14 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('IDBObserverCallback')
-@Experimental() // untriaged
 typedef void ObserverCallback(ObserverChanges changes);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('IDBFactory')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
 @SupportedBrowser(SupportedBrowser.IE, '10')
-@Experimental()
 @Unstable()
 @Native("IDBFactory")
 class IdbFactory extends Interceptor {
@@ -542,7 +468,6 @@
         'window.mozIndexedDB)');
   }
 
-  @DomName('IDBFactory.open')
   Future<Database> open(String name,
       {int version,
       void onUpgradeNeeded(VersionChangeEvent event),
@@ -571,7 +496,6 @@
     }
   }
 
-  @DomName('IDBFactory.deleteDatabase')
   Future<IdbFactory> deleteDatabase(String name, {void onBlocked(Event e)}) {
     try {
       var request = _deleteDatabase(name);
@@ -605,18 +529,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBFactory.cmp')
-  @DocsEditable()
   int cmp(Object first, Object second) native;
 
   @JSName('deleteDatabase')
-  @DomName('IDBFactory.deleteDatabase')
-  @DocsEditable()
   OpenDBRequest _deleteDatabase(String name) native;
 
   @JSName('open')
-  @DomName('IDBFactory.open')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @Creates('Database')
@@ -642,11 +560,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('IDBIndex')
 @Unstable()
 @Native("IDBIndex")
 class Index extends Interceptor {
-  @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
     try {
       var request = _count(key_OR_range);
@@ -656,7 +572,6 @@
     }
   }
 
-  @DomName('IDBIndex.get')
   Future get(key) {
     try {
       var request = _get(key);
@@ -667,7 +582,6 @@
     }
   }
 
-  @DomName('IDBIndex.getKey')
   Future getKey(key) {
     try {
       var request = _getKey(key);
@@ -739,53 +653,31 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBIndex.keyPath')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   final Object keyPath;
 
-  @DomName('IDBIndex.multiEntry')
-  @DocsEditable()
   final bool multiEntry;
 
-  @DomName('IDBIndex.name')
-  @DocsEditable()
   String name;
 
-  @DomName('IDBIndex.objectStore')
-  @DocsEditable()
   final ObjectStore objectStore;
 
-  @DomName('IDBIndex.unique')
-  @DocsEditable()
   final bool unique;
 
   @JSName('count')
-  @DomName('IDBIndex.count')
-  @DocsEditable()
   Request _count(Object key) native;
 
   @JSName('get')
-  @DomName('IDBIndex.get')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
   Request _get(Object key) native;
 
-  @DomName('IDBIndex.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Request getAll(Object query, [int count]) native;
 
-  @DomName('IDBIndex.getAllKeys')
-  @DocsEditable()
-  @Experimental() // untriaged
   Request getAllKeys(Object query, [int count]) native;
 
   @JSName('getKey')
-  @DomName('IDBIndex.getKey')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
@@ -793,16 +685,12 @@
   Request _getKey(Object key) native;
 
   @JSName('openCursor')
-  @DomName('IDBIndex.openCursor')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
   Request _openCursor(Object range, [String direction]) native;
 
   @JSName('openKeyCursor')
-  @DomName('IDBIndex.openKeyCursor')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
@@ -812,23 +700,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('IDBKeyRange')
 @Unstable()
 @Native("IDBKeyRange")
 class KeyRange extends Interceptor {
-  @DomName('IDBKeyRange.only')
   factory KeyRange.only(/*Key*/ value) =>
       _KeyRangeFactoryProvider.createKeyRange_only(value);
 
-  @DomName('IDBKeyRange.lowerBound')
   factory KeyRange.lowerBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
 
-  @DomName('IDBKeyRange.upperBound')
   factory KeyRange.upperBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
 
-  @DomName('KeyRange.bound')
   factory KeyRange.bound(/*Key*/ lower, /*Key*/ upper,
           [bool lowerOpen = false, bool upperOpen = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_bound(
@@ -839,59 +722,38 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBKeyRange.lower')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   final Object lower;
 
-  @DomName('IDBKeyRange.lowerOpen')
-  @DocsEditable()
   final bool lowerOpen;
 
-  @DomName('IDBKeyRange.upper')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   final Object upper;
 
-  @DomName('IDBKeyRange.upperOpen')
-  @DocsEditable()
   final bool upperOpen;
 
   @JSName('bound')
-  @DomName('IDBKeyRange.bound')
-  @DocsEditable()
   static KeyRange bound_(Object lower, Object upper,
       [bool lowerOpen, bool upperOpen]) native;
 
-  @DomName('IDBKeyRange.includes')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool includes(Object key) native;
 
   @JSName('lowerBound')
-  @DomName('IDBKeyRange.lowerBound')
-  @DocsEditable()
   static KeyRange lowerBound_(Object bound, [bool open]) native;
 
   @JSName('only')
-  @DomName('IDBKeyRange.only')
-  @DocsEditable()
   static KeyRange only_(Object value) native;
 
   @JSName('upperBound')
-  @DomName('IDBKeyRange.upperBound')
-  @DocsEditable()
   static KeyRange upperBound_(Object bound, [bool open]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('IDBObjectStore')
 @Unstable()
 @Native("IDBObjectStore")
 class ObjectStore extends Interceptor {
-  @DomName('IDBObjectStore.add')
   Future add(value, [key]) {
     try {
       var request;
@@ -906,7 +768,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.clear')
   Future clear() {
     try {
       return _completeRequest(_clear());
@@ -915,7 +776,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.delete')
   Future delete(key_OR_keyRange) {
     try {
       return _completeRequest(_delete(key_OR_keyRange));
@@ -924,7 +784,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.count')
   Future<int> count([key_OR_range]) {
     try {
       var request = _count(key_OR_range);
@@ -934,7 +793,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.put')
   Future put(value, [key]) {
     try {
       var request;
@@ -949,7 +807,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.get')
   Future getObject(key) {
     try {
       var request = _get(key);
@@ -981,7 +838,6 @@
    * must be done synchronously unless they are additional async requests to
    * the current transaction.
    */
-  @DomName('IDBObjectStore.openCursor')
   Stream<CursorWithValue> openCursor(
       {key, KeyRange range, String direction, bool autoAdvance}) {
     var key_OR_range = null;
@@ -1004,7 +860,6 @@
     return _cursorStreamFromResult(request, autoAdvance);
   }
 
-  @DomName('IDBObjectStore.createIndex')
   Index createIndex(String name, keyPath, {bool unique, bool multiEntry}) {
     var options = {};
     if (unique != null) {
@@ -1022,31 +877,19 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBObjectStore.autoIncrement')
-  @DocsEditable()
   final bool autoIncrement;
 
-  @DomName('IDBObjectStore.indexNames')
-  @DocsEditable()
   @Returns('DomStringList|Null')
   @Creates('DomStringList')
   final List<String> indexNames;
 
-  @DomName('IDBObjectStore.keyPath')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   final Object keyPath;
 
-  @DomName('IDBObjectStore.name')
-  @DocsEditable()
   String name;
 
-  @DomName('IDBObjectStore.transaction')
-  @DocsEditable()
   final Transaction transaction;
 
-  @DomName('IDBObjectStore.add')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
@@ -1061,32 +904,22 @@
   }
 
   @JSName('add')
-  @DomName('IDBObjectStore.add')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
   Request _add_1(value, key) native;
   @JSName('add')
-  @DomName('IDBObjectStore.add')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
   Request _add_2(value) native;
 
   @JSName('clear')
-  @DomName('IDBObjectStore.clear')
-  @DocsEditable()
   Request _clear() native;
 
   @JSName('count')
-  @DomName('IDBObjectStore.count')
-  @DocsEditable()
   Request _count(Object key) native;
 
-  @DomName('IDBObjectStore.createIndex')
-  @DocsEditable()
   Index _createIndex(String name, Object keyPath, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1096,65 +929,37 @@
   }
 
   @JSName('createIndex')
-  @DomName('IDBObjectStore.createIndex')
-  @DocsEditable()
   Index _createIndex_1(name, keyPath, options) native;
   @JSName('createIndex')
-  @DomName('IDBObjectStore.createIndex')
-  @DocsEditable()
   Index _createIndex_2(name, keyPath) native;
 
   @JSName('delete')
-  @DomName('IDBObjectStore.delete')
-  @DocsEditable()
   Request _delete(Object key) native;
 
-  @DomName('IDBObjectStore.deleteIndex')
-  @DocsEditable()
   void deleteIndex(String name) native;
 
   @JSName('get')
-  @DomName('IDBObjectStore.get')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
   Request _get(Object key) native;
 
-  @DomName('IDBObjectStore.getAll')
-  @DocsEditable()
-  @Experimental() // untriaged
   Request getAll(Object query, [int count]) native;
 
-  @DomName('IDBObjectStore.getAllKeys')
-  @DocsEditable()
-  @Experimental() // untriaged
   Request getAllKeys(Object query, [int count]) native;
 
-  @DomName('IDBObjectStore.getKey')
-  @DocsEditable()
-  @Experimental() // untriaged
   Request getKey(Object key) native;
 
-  @DomName('IDBObjectStore.index')
-  @DocsEditable()
   Index index(String name) native;
 
   @JSName('openCursor')
-  @DomName('IDBObjectStore.openCursor')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
   Request _openCursor(Object range, [String direction]) native;
 
-  @DomName('IDBObjectStore.openKeyCursor')
-  @DocsEditable()
-  @Experimental() // untriaged
   Request openKeyCursor(Object range, [String direction]) native;
 
-  @DomName('IDBObjectStore.put')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
@@ -1169,15 +974,11 @@
   }
 
   @JSName('put')
-  @DomName('IDBObjectStore.put')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
   Request _put_1(value, key) native;
   @JSName('put')
-  @DomName('IDBObjectStore.put')
-  @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
@@ -1214,9 +1015,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IDBObservation')
-@Experimental() // untriaged
 @Native("IDBObservation")
 class Observation extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1224,28 +1022,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBObservation.key')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object key;
 
-  @DomName('IDBObservation.type')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String type;
 
-  @DomName('IDBObservation.value')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IDBObserver')
-@Experimental() // untriaged
 @Native("IDBObserver")
 class Observer extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1253,17 +1039,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBObserver.IDBObserver')
-  @DocsEditable()
   factory Observer(ObserverCallback callback) {
     return Observer._create_1(callback);
   }
   static Observer _create_1(callback) =>
       JS('Observer', 'new IDBObserver(#)', callback);
 
-  @DomName('IDBObserver.observe')
-  @DocsEditable()
-  @Experimental() // untriaged
   void observe(Database db, Transaction tx, Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     _observe_1(db, tx, options_1);
@@ -1271,23 +1052,14 @@
   }
 
   @JSName('observe')
-  @DomName('IDBObserver.observe')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _observe_1(Database db, Transaction tx, options) native;
 
-  @DomName('IDBObserver.unobserve')
-  @DocsEditable()
-  @Experimental() // untriaged
   void unobserve(Database db) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IDBObserverChanges')
-@Experimental() // untriaged
 @Native("IDBObserverChanges")
 class ObserverChanges extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1295,27 +1067,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBObserverChanges.database')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Database database;
 
-  @DomName('IDBObserverChanges.records')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Object records;
 
-  @DomName('IDBObserverChanges.transaction')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Transaction transaction;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IDBOpenDBRequest')
 @Unstable()
 @Native("IDBOpenDBRequest,IDBVersionChangeRequest")
 class OpenDBRequest extends Request {
@@ -1330,8 +1091,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBOpenDBRequest.blockedEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> blockedEvent =
       const EventStreamProvider<Event>('blocked');
 
@@ -1341,19 +1100,13 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBOpenDBRequest.upgradeneededEvent')
-  @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent =
       const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
   /// Stream of `blocked` events handled by this [OpenDBRequest].
-  @DomName('IDBOpenDBRequest.onblocked')
-  @DocsEditable()
   Stream<Event> get onBlocked => blockedEvent.forTarget(this);
 
   /// Stream of `upgradeneeded` events handled by this [OpenDBRequest].
-  @DomName('IDBOpenDBRequest.onupgradeneeded')
-  @DocsEditable()
   Stream<VersionChangeEvent> get onUpgradeNeeded =>
       upgradeNeededEvent.forTarget(this);
 }
@@ -1361,8 +1114,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IDBRequest')
 @Unstable()
 @Native("IDBRequest")
 class Request extends EventTarget {
@@ -1377,8 +1128,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBRequest.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
@@ -1388,52 +1137,33 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBRequest.successEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> successEvent =
       const EventStreamProvider<Event>('success');
 
-  @DomName('IDBRequest.error')
-  @DocsEditable()
   final DomException error;
 
-  @DomName('IDBRequest.readyState')
-  @DocsEditable()
   final String readyState;
 
-  @DomName('IDBRequest.result')
-  @DocsEditable()
   dynamic get result => _convertNativeToDart_IDBAny(this._get_result);
   @JSName('result')
-  @DomName('IDBRequest.result')
-  @DocsEditable()
   @Creates('Null')
   final dynamic _get_result;
 
-  @DomName('IDBRequest.source')
-  @DocsEditable()
   @Creates('Null')
   final Object source;
 
-  @DomName('IDBRequest.transaction')
-  @DocsEditable()
   final Transaction transaction;
 
   /// Stream of `error` events handled by this [Request].
-  @DomName('IDBRequest.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
   /// Stream of `success` events handled by this [Request].
-  @DomName('IDBRequest.onsuccess')
-  @DocsEditable()
   Stream<Event> get onSuccess => successEvent.forTarget(this);
 }
 // 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.
 
-@DomName('IDBTransaction')
 @Unstable()
 @Native("IDBTransaction")
 class Transaction extends EventTarget {
@@ -1476,8 +1206,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBTransaction.abortEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> abortEvent =
       const EventStreamProvider<Event>('abort');
 
@@ -1487,8 +1215,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBTransaction.completeEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> completeEvent =
       const EventStreamProvider<Event>('complete');
 
@@ -1498,58 +1224,36 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('IDBTransaction.errorEvent')
-  @DocsEditable()
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('IDBTransaction.db')
-  @DocsEditable()
   final Database db;
 
-  @DomName('IDBTransaction.error')
-  @DocsEditable()
   final DomException error;
 
-  @DomName('IDBTransaction.mode')
-  @DocsEditable()
   final String mode;
 
-  @DomName('IDBTransaction.objectStoreNames')
-  @DocsEditable()
-  @Experimental() // untriaged
   @Returns('DomStringList|Null')
   @Creates('DomStringList')
   final List<String> objectStoreNames;
 
-  @DomName('IDBTransaction.abort')
-  @DocsEditable()
   void abort() native;
 
-  @DomName('IDBTransaction.objectStore')
-  @DocsEditable()
   ObjectStore objectStore(String name) native;
 
   /// Stream of `abort` events handled by this [Transaction].
-  @DomName('IDBTransaction.onabort')
-  @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
   /// Stream of `complete` events handled by this [Transaction].
-  @DomName('IDBTransaction.oncomplete')
-  @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
 
   /// Stream of `error` events handled by this [Transaction].
-  @DomName('IDBTransaction.onerror')
-  @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 }
 // 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.
 
-@DomName('IDBVersionChangeEvent')
 @Unstable()
 @Native("IDBVersionChangeEvent")
 class VersionChangeEvent extends Event {
@@ -1558,8 +1262,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IDBVersionChangeEvent.IDBVersionChangeEvent')
-  @DocsEditable()
   factory VersionChangeEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
@@ -1575,30 +1277,18 @@
   static VersionChangeEvent _create_2(type) =>
       JS('VersionChangeEvent', 'new IDBVersionChangeEvent(#)', type);
 
-  @DomName('IDBVersionChangeEvent.dataLoss')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String dataLoss;
 
-  @DomName('IDBVersionChangeEvent.dataLossMessage')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String dataLossMessage;
 
-  @DomName('IDBVersionChangeEvent.newVersion')
-  @DocsEditable()
   @Creates('int|String|Null')
   @Returns('int|String|Null')
   final int newVersion;
 
-  @DomName('IDBVersionChangeEvent.oldVersion')
-  @DocsEditable()
   @Creates('int|String|Null')
   @Returns('int|String|Null')
   final int oldVersion;
 
   @JSName('target')
-  @DomName('IDBVersionChangeEvent.target')
-  @DocsEditable()
   final OpenDBRequest target;
 }
diff --git a/sdk/lib/internal/async_cast.dart b/sdk/lib/internal/async_cast.dart
index cb1e112..e041ff3 100644
--- a/sdk/lib/internal/async_cast.dart
+++ b/sdk/lib/internal/async_cast.dart
@@ -13,9 +13,10 @@
 
   StreamSubscription<T> listen(void onData(T data),
       {Function onError, void onDone(), bool cancelOnError}) {
-    return new CastStreamSubscription<S, T>(_source.listen(null,
-        onError: onError, onDone: onDone, cancelOnError: cancelOnError))
-      ..onData(onData);
+    return new CastStreamSubscription<S, T>(
+        _source.listen(null, onDone: onDone, cancelOnError: cancelOnError))
+      ..onData(onData)
+      ..onError(onError);
   }
 
   Stream<R> cast<R>() => new CastStream<S, R>(_source);
@@ -24,23 +25,62 @@
 class CastStreamSubscription<S, T> implements StreamSubscription<T> {
   final StreamSubscription<S> _source;
 
-  CastStreamSubscription(this._source);
+  /// Zone where listen was called.
+  final Zone _zone = Zone.current;
+
+  /// User's data handler. May be null.
+  void Function(T) _handleData;
+
+  /// Copy of _source's handleError so we can report errors in onData.
+  /// May be null.
+  Function _handleError;
+
+  CastStreamSubscription(this._source) {
+    _source.onData(_onData);
+  }
 
   Future cancel() => _source.cancel();
 
   void onData(void handleData(T data)) {
-    _source
-        .onData(handleData == null ? null : (S data) => handleData(data as T));
+    _handleData = handleData == null
+        ? null
+        : _zone.registerUnaryCallback<dynamic, T>(handleData);
   }
 
   void onError(Function handleError) {
     _source.onError(handleError);
+    if (handleError == null) {
+      _handleError = null;
+    } else if (handleError is Function(Null, Null)) {
+      _handleError = _zone
+          .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
+    } else {
+      _handleError = _zone.registerUnaryCallback<dynamic, Object>(handleError);
+    }
   }
 
   void onDone(void handleDone()) {
     _source.onDone(handleDone);
   }
 
+  void _onData(S data) {
+    if (_handleData == null) return;
+    T targetData;
+    try {
+      targetData = data as T;
+    } catch (error, stack) {
+      if (_handleError == null) {
+        _zone.handleUncaughtError(error, stack);
+      } else if (_handleError is Function(Null, Null)) {
+        _zone.runBinaryGuarded(_handleError, error, stack);
+      } else {
+        _zone.runUnaryGuarded(_handleError, error);
+      }
+      return;
+    }
+    _zone.runUnaryGuarded(_handleData, targetData);
+  }
+
   void pause([Future resumeSignal]) {
     _source.pause(resumeSignal);
   }
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 96bbddf..7ffc482 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -12,7 +12,8 @@
         Stream,
         StreamSubscription,
         StreamTransformer,
-        StreamTransformerBase;
+        StreamTransformerBase,
+        Zone;
 import 'dart:convert' show Converter;
 import 'dart:core' hide Symbol;
 import 'dart:core' as core;
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 23c0a70..fdd5a68 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -37,8 +37,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAElement')
 @Unstable()
 @Native("SVGAElement")
 class AElement extends GraphicsElement implements UriReference {
@@ -47,8 +45,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAElement.SVGAElement')
-  @DocsEditable()
   factory AElement() => _SvgElementFactoryProvider.createSvgElement_tag("a");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -57,22 +53,16 @@
    */
   AElement.created() : super.created();
 
-  @DomName('SVGAElement.target')
-  @DocsEditable()
   final AnimatedString target;
 
   // From SVGURIReference
 
-  @DomName('SVGAElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAngle')
 @Unstable()
 @Native("SVGAngle")
 class Angle extends Interceptor {
@@ -81,56 +71,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAngle.SVG_ANGLETYPE_DEG')
-  @DocsEditable()
   static const int SVG_ANGLETYPE_DEG = 2;
 
-  @DomName('SVGAngle.SVG_ANGLETYPE_GRAD')
-  @DocsEditable()
   static const int SVG_ANGLETYPE_GRAD = 4;
 
-  @DomName('SVGAngle.SVG_ANGLETYPE_RAD')
-  @DocsEditable()
   static const int SVG_ANGLETYPE_RAD = 3;
 
-  @DomName('SVGAngle.SVG_ANGLETYPE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_ANGLETYPE_UNKNOWN = 0;
 
-  @DomName('SVGAngle.SVG_ANGLETYPE_UNSPECIFIED')
-  @DocsEditable()
   static const int SVG_ANGLETYPE_UNSPECIFIED = 1;
 
-  @DomName('SVGAngle.unitType')
-  @DocsEditable()
   final int unitType;
 
-  @DomName('SVGAngle.value')
-  @DocsEditable()
   num value;
 
-  @DomName('SVGAngle.valueAsString')
-  @DocsEditable()
   String valueAsString;
 
-  @DomName('SVGAngle.valueInSpecifiedUnits')
-  @DocsEditable()
   num valueInSpecifiedUnits;
 
-  @DomName('SVGAngle.convertToSpecifiedUnits')
-  @DocsEditable()
   void convertToSpecifiedUnits(int unitType) native;
 
-  @DomName('SVGAngle.newValueSpecifiedUnits')
-  @DocsEditable()
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimateElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -142,8 +108,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimateElement.SVGAnimateElement')
-  @DocsEditable()
   factory AnimateElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("animate");
   /**
@@ -162,8 +126,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimateMotionElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -175,8 +137,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimateMotionElement.SVGAnimateMotionElement')
-  @DocsEditable()
   factory AnimateMotionElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
   /**
@@ -195,8 +155,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimateTransformElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -208,8 +166,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimateTransformElement.SVGAnimateTransformElement')
-  @DocsEditable()
   factory AnimateTransformElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
   /**
@@ -228,8 +184,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedAngle')
 @Unstable()
 @Native("SVGAnimatedAngle")
 class AnimatedAngle extends Interceptor {
@@ -238,20 +192,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedAngle.animVal')
-  @DocsEditable()
   final Angle animVal;
 
-  @DomName('SVGAnimatedAngle.baseVal')
-  @DocsEditable()
   final Angle baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedBoolean')
 @Unstable()
 @Native("SVGAnimatedBoolean")
 class AnimatedBoolean extends Interceptor {
@@ -260,20 +208,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedBoolean.animVal')
-  @DocsEditable()
   final bool animVal;
 
-  @DomName('SVGAnimatedBoolean.baseVal')
-  @DocsEditable()
   bool baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedEnumeration')
 @Unstable()
 @Native("SVGAnimatedEnumeration")
 class AnimatedEnumeration extends Interceptor {
@@ -282,20 +224,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedEnumeration.animVal')
-  @DocsEditable()
   final int animVal;
 
-  @DomName('SVGAnimatedEnumeration.baseVal')
-  @DocsEditable()
   int baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedInteger')
 @Unstable()
 @Native("SVGAnimatedInteger")
 class AnimatedInteger extends Interceptor {
@@ -304,20 +240,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedInteger.animVal')
-  @DocsEditable()
   final int animVal;
 
-  @DomName('SVGAnimatedInteger.baseVal')
-  @DocsEditable()
   int baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedLength')
 @Unstable()
 @Native("SVGAnimatedLength")
 class AnimatedLength extends Interceptor {
@@ -326,20 +256,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedLength.animVal')
-  @DocsEditable()
   final Length animVal;
 
-  @DomName('SVGAnimatedLength.baseVal')
-  @DocsEditable()
   final Length baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedLengthList')
 @Unstable()
 @Native("SVGAnimatedLengthList")
 class AnimatedLengthList extends Interceptor {
@@ -348,20 +272,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedLengthList.animVal')
-  @DocsEditable()
   final LengthList animVal;
 
-  @DomName('SVGAnimatedLengthList.baseVal')
-  @DocsEditable()
   final LengthList baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedNumber')
 @Unstable()
 @Native("SVGAnimatedNumber")
 class AnimatedNumber extends Interceptor {
@@ -370,20 +288,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedNumber.animVal')
-  @DocsEditable()
   final num animVal;
 
-  @DomName('SVGAnimatedNumber.baseVal')
-  @DocsEditable()
   num baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedNumberList')
 @Unstable()
 @Native("SVGAnimatedNumberList")
 class AnimatedNumberList extends Interceptor {
@@ -392,20 +304,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedNumberList.animVal')
-  @DocsEditable()
   final NumberList animVal;
 
-  @DomName('SVGAnimatedNumberList.baseVal')
-  @DocsEditable()
   final NumberList baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedPreserveAspectRatio')
 @Unstable()
 @Native("SVGAnimatedPreserveAspectRatio")
 class AnimatedPreserveAspectRatio extends Interceptor {
@@ -414,20 +320,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedPreserveAspectRatio.animVal')
-  @DocsEditable()
   final PreserveAspectRatio animVal;
 
-  @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
-  @DocsEditable()
   final PreserveAspectRatio baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedRect')
 @Unstable()
 @Native("SVGAnimatedRect")
 class AnimatedRect extends Interceptor {
@@ -436,20 +336,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedRect.animVal')
-  @DocsEditable()
   final Rect animVal;
 
-  @DomName('SVGAnimatedRect.baseVal')
-  @DocsEditable()
   final Rect baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedString')
 @Unstable()
 @Native("SVGAnimatedString")
 class AnimatedString extends Interceptor {
@@ -458,20 +352,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedString.animVal')
-  @DocsEditable()
   final String animVal;
 
-  @DomName('SVGAnimatedString.baseVal')
-  @DocsEditable()
   String baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimatedTransformList')
 @Unstable()
 @Native("SVGAnimatedTransformList")
 class AnimatedTransformList extends Interceptor {
@@ -480,20 +368,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimatedTransformList.animVal')
-  @DocsEditable()
   final TransformList animVal;
 
-  @DomName('SVGAnimatedTransformList.baseVal')
-  @DocsEditable()
   final TransformList baseVal;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGAnimationElement')
 @Unstable()
 @Native("SVGAnimationElement")
 class AnimationElement extends SvgElement implements Tests {
@@ -502,8 +384,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGAnimationElement.SVGAnimationElement')
-  @DocsEditable()
   factory AnimationElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("animation");
   /**
@@ -513,54 +393,32 @@
    */
   AnimationElement.created() : super.created();
 
-  @DomName('SVGAnimationElement.targetElement')
-  @DocsEditable()
   final SvgElement targetElement;
 
-  @DomName('SVGAnimationElement.beginElement')
-  @DocsEditable()
   void beginElement() native;
 
-  @DomName('SVGAnimationElement.beginElementAt')
-  @DocsEditable()
   void beginElementAt(num offset) native;
 
-  @DomName('SVGAnimationElement.endElement')
-  @DocsEditable()
   void endElement() native;
 
-  @DomName('SVGAnimationElement.endElementAt')
-  @DocsEditable()
   void endElementAt(num offset) native;
 
-  @DomName('SVGAnimationElement.getCurrentTime')
-  @DocsEditable()
   double getCurrentTime() native;
 
-  @DomName('SVGAnimationElement.getSimpleDuration')
-  @DocsEditable()
   double getSimpleDuration() native;
 
-  @DomName('SVGAnimationElement.getStartTime')
-  @DocsEditable()
   double getStartTime() native;
 
   // From SVGTests
 
-  @DomName('SVGAnimationElement.requiredExtensions')
-  @DocsEditable()
   final StringList requiredExtensions;
 
-  @DomName('SVGAnimationElement.systemLanguage')
-  @DocsEditable()
   final StringList systemLanguage;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGCircleElement')
 @Unstable()
 @Native("SVGCircleElement")
 class CircleElement extends GeometryElement {
@@ -569,8 +427,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGCircleElement.SVGCircleElement')
-  @DocsEditable()
   factory CircleElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("circle");
   /**
@@ -580,24 +436,16 @@
    */
   CircleElement.created() : super.created();
 
-  @DomName('SVGCircleElement.cx')
-  @DocsEditable()
   final AnimatedLength cx;
 
-  @DomName('SVGCircleElement.cy')
-  @DocsEditable()
   final AnimatedLength cy;
 
-  @DomName('SVGCircleElement.r')
-  @DocsEditable()
   final AnimatedLength r;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGClipPathElement')
 @Unstable()
 @Native("SVGClipPathElement")
 class ClipPathElement extends GraphicsElement {
@@ -606,8 +454,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGClipPathElement.SVGClipPathElement')
-  @DocsEditable()
   factory ClipPathElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
   /**
@@ -617,16 +463,12 @@
    */
   ClipPathElement.created() : super.created();
 
-  @DomName('SVGClipPathElement.clipPathUnits')
-  @DocsEditable()
   final AnimatedEnumeration clipPathUnits;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGDefsElement')
 @Unstable()
 @Native("SVGDefsElement")
 class DefsElement extends GraphicsElement {
@@ -635,8 +477,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGDefsElement.SVGDefsElement')
-  @DocsEditable()
   factory DefsElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("defs");
   /**
@@ -650,8 +490,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGDescElement')
 @Unstable()
 @Native("SVGDescElement")
 class DescElement extends SvgElement {
@@ -660,8 +498,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGDescElement.SVGDescElement')
-  @DocsEditable()
   factory DescElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("desc");
   /**
@@ -675,9 +511,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGDiscardElement')
-@Experimental() // untriaged
 @Native("SVGDiscardElement")
 class DiscardElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
@@ -695,8 +528,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGEllipseElement')
 @Unstable()
 @Native("SVGEllipseElement")
 class EllipseElement extends GeometryElement {
@@ -705,8 +536,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGEllipseElement.SVGEllipseElement')
-  @DocsEditable()
   factory EllipseElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
   /**
@@ -716,28 +545,18 @@
    */
   EllipseElement.created() : super.created();
 
-  @DomName('SVGEllipseElement.cx')
-  @DocsEditable()
   final AnimatedLength cx;
 
-  @DomName('SVGEllipseElement.cy')
-  @DocsEditable()
   final AnimatedLength cy;
 
-  @DomName('SVGEllipseElement.rx')
-  @DocsEditable()
   final AnimatedLength rx;
 
-  @DomName('SVGEllipseElement.ry')
-  @DocsEditable()
   final AnimatedLength ry;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEBlendElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -751,8 +570,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEBlendElement.SVGFEBlendElement')
-  @DocsEditable()
   factory FEBlendElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feBlend");
   /**
@@ -767,70 +584,40 @@
       SvgElement.isTagSupported('feBlend') &&
       (new SvgElement.tag('feBlend') is FEBlendElement);
 
-  @DomName('SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN')
-  @DocsEditable()
   static const int SVG_FEBLEND_MODE_DARKEN = 4;
 
-  @DomName('SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN')
-  @DocsEditable()
   static const int SVG_FEBLEND_MODE_LIGHTEN = 5;
 
-  @DomName('SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY')
-  @DocsEditable()
   static const int SVG_FEBLEND_MODE_MULTIPLY = 2;
 
-  @DomName('SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL')
-  @DocsEditable()
   static const int SVG_FEBLEND_MODE_NORMAL = 1;
 
-  @DomName('SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN')
-  @DocsEditable()
   static const int SVG_FEBLEND_MODE_SCREEN = 3;
 
-  @DomName('SVGFEBlendElement.SVG_FEBLEND_MODE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_FEBLEND_MODE_UNKNOWN = 0;
 
-  @DomName('SVGFEBlendElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFEBlendElement.in2')
-  @DocsEditable()
   final AnimatedString in2;
 
-  @DomName('SVGFEBlendElement.mode')
-  @DocsEditable()
   final AnimatedEnumeration mode;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEBlendElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEBlendElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEBlendElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEBlendElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEBlendElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEColorMatrixElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -844,8 +631,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEColorMatrixElement.SVGFEColorMatrixElement')
-  @DocsEditable()
   factory FEColorMatrixElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix");
   /**
@@ -860,66 +645,38 @@
       SvgElement.isTagSupported('feColorMatrix') &&
       (new SvgElement.tag('feColorMatrix') is FEColorMatrixElement);
 
-  @DomName('SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE')
-  @DocsEditable()
   static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
 
-  @DomName('SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA')
-  @DocsEditable()
   static const int SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
 
-  @DomName('SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX')
-  @DocsEditable()
   static const int SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
 
-  @DomName('SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE')
-  @DocsEditable()
   static const int SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
 
-  @DomName('SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
 
-  @DomName('SVGFEColorMatrixElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFEColorMatrixElement.type')
-  @DocsEditable()
   final AnimatedEnumeration type;
 
-  @DomName('SVGFEColorMatrixElement.values')
-  @DocsEditable()
   final AnimatedNumberList values;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEColorMatrixElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEColorMatrixElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEColorMatrixElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEColorMatrixElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEColorMatrixElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEComponentTransferElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -933,8 +690,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEComponentTransferElement.SVGFEComponentTransferElement')
-  @DocsEditable()
   factory FEComponentTransferElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer");
   /**
@@ -949,38 +704,24 @@
       SvgElement.isTagSupported('feComponentTransfer') &&
       (new SvgElement.tag('feComponentTransfer') is FEComponentTransferElement);
 
-  @DomName('SVGFEComponentTransferElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEComponentTransferElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEComponentTransferElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEComponentTransferElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEComponentTransferElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEComponentTransferElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFECompositeElement')
 @Unstable()
 @Native("SVGFECompositeElement")
 class FECompositeElement extends SvgElement
@@ -996,90 +737,50 @@
    */
   FECompositeElement.created() : super.created();
 
-  @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC')
-  @DocsEditable()
   static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
 
-  @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP')
-  @DocsEditable()
   static const int SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
 
-  @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN')
-  @DocsEditable()
   static const int SVG_FECOMPOSITE_OPERATOR_IN = 2;
 
-  @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT')
-  @DocsEditable()
   static const int SVG_FECOMPOSITE_OPERATOR_OUT = 3;
 
-  @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER')
-  @DocsEditable()
   static const int SVG_FECOMPOSITE_OPERATOR_OVER = 1;
 
-  @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN')
-  @DocsEditable()
   static const int SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
 
-  @DomName('SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR')
-  @DocsEditable()
   static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
 
-  @DomName('SVGFECompositeElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFECompositeElement.in2')
-  @DocsEditable()
   final AnimatedString in2;
 
-  @DomName('SVGFECompositeElement.k1')
-  @DocsEditable()
   final AnimatedNumber k1;
 
-  @DomName('SVGFECompositeElement.k2')
-  @DocsEditable()
   final AnimatedNumber k2;
 
-  @DomName('SVGFECompositeElement.k3')
-  @DocsEditable()
   final AnimatedNumber k3;
 
-  @DomName('SVGFECompositeElement.k4')
-  @DocsEditable()
   final AnimatedNumber k4;
 
-  @DomName('SVGFECompositeElement.operator')
-  @DocsEditable()
   final AnimatedEnumeration operator;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFECompositeElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFECompositeElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFECompositeElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFECompositeElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFECompositeElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEConvolveMatrixElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1093,8 +794,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEConvolveMatrixElement.SVGFEConvolveMatrixElement')
-  @DocsEditable()
   factory FEConvolveMatrixElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix");
   /**
@@ -1109,98 +808,54 @@
       SvgElement.isTagSupported('feConvolveMatrix') &&
       (new SvgElement.tag('feConvolveMatrix') is FEConvolveMatrixElement);
 
-  @DomName('SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE')
-  @DocsEditable()
   static const int SVG_EDGEMODE_DUPLICATE = 1;
 
-  @DomName('SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE')
-  @DocsEditable()
   static const int SVG_EDGEMODE_NONE = 3;
 
-  @DomName('SVGFEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_EDGEMODE_UNKNOWN = 0;
 
-  @DomName('SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP')
-  @DocsEditable()
   static const int SVG_EDGEMODE_WRAP = 2;
 
-  @DomName('SVGFEConvolveMatrixElement.bias')
-  @DocsEditable()
   final AnimatedNumber bias;
 
-  @DomName('SVGFEConvolveMatrixElement.divisor')
-  @DocsEditable()
   final AnimatedNumber divisor;
 
-  @DomName('SVGFEConvolveMatrixElement.edgeMode')
-  @DocsEditable()
   final AnimatedEnumeration edgeMode;
 
-  @DomName('SVGFEConvolveMatrixElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
-  @DocsEditable()
   final AnimatedNumberList kernelMatrix;
 
-  @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
-  @DocsEditable()
   final AnimatedNumber kernelUnitLengthX;
 
-  @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
-  @DocsEditable()
   final AnimatedNumber kernelUnitLengthY;
 
-  @DomName('SVGFEConvolveMatrixElement.orderX')
-  @DocsEditable()
   final AnimatedInteger orderX;
 
-  @DomName('SVGFEConvolveMatrixElement.orderY')
-  @DocsEditable()
   final AnimatedInteger orderY;
 
-  @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
-  @DocsEditable()
   final AnimatedBoolean preserveAlpha;
 
-  @DomName('SVGFEConvolveMatrixElement.targetX')
-  @DocsEditable()
   final AnimatedInteger targetX;
 
-  @DomName('SVGFEConvolveMatrixElement.targetY')
-  @DocsEditable()
   final AnimatedInteger targetY;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEConvolveMatrixElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEConvolveMatrixElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEConvolveMatrixElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEConvolveMatrixElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEConvolveMatrixElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEDiffuseLightingElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1214,8 +869,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEDiffuseLightingElement.SVGFEDiffuseLightingElement')
-  @DocsEditable()
   factory FEDiffuseLightingElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting");
   /**
@@ -1230,54 +883,32 @@
       SvgElement.isTagSupported('feDiffuseLighting') &&
       (new SvgElement.tag('feDiffuseLighting') is FEDiffuseLightingElement);
 
-  @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
-  @DocsEditable()
   final AnimatedNumber diffuseConstant;
 
-  @DomName('SVGFEDiffuseLightingElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
-  @DocsEditable()
   final AnimatedNumber kernelUnitLengthX;
 
-  @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
-  @DocsEditable()
   final AnimatedNumber kernelUnitLengthY;
 
-  @DomName('SVGFEDiffuseLightingElement.surfaceScale')
-  @DocsEditable()
   final AnimatedNumber surfaceScale;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEDiffuseLightingElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEDiffuseLightingElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEDiffuseLightingElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEDiffuseLightingElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEDiffuseLightingElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEDisplacementMapElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1291,8 +922,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEDisplacementMapElement.SVGFEDisplacementMapElement')
-  @DocsEditable()
   factory FEDisplacementMapElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap");
   /**
@@ -1307,74 +936,42 @@
       SvgElement.isTagSupported('feDisplacementMap') &&
       (new SvgElement.tag('feDisplacementMap') is FEDisplacementMapElement);
 
-  @DomName('SVGFEDisplacementMapElement.SVG_CHANNEL_A')
-  @DocsEditable()
   static const int SVG_CHANNEL_A = 4;
 
-  @DomName('SVGFEDisplacementMapElement.SVG_CHANNEL_B')
-  @DocsEditable()
   static const int SVG_CHANNEL_B = 3;
 
-  @DomName('SVGFEDisplacementMapElement.SVG_CHANNEL_G')
-  @DocsEditable()
   static const int SVG_CHANNEL_G = 2;
 
-  @DomName('SVGFEDisplacementMapElement.SVG_CHANNEL_R')
-  @DocsEditable()
   static const int SVG_CHANNEL_R = 1;
 
-  @DomName('SVGFEDisplacementMapElement.SVG_CHANNEL_UNKNOWN')
-  @DocsEditable()
   static const int SVG_CHANNEL_UNKNOWN = 0;
 
-  @DomName('SVGFEDisplacementMapElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFEDisplacementMapElement.in2')
-  @DocsEditable()
   final AnimatedString in2;
 
-  @DomName('SVGFEDisplacementMapElement.scale')
-  @DocsEditable()
   final AnimatedNumber scale;
 
-  @DomName('SVGFEDisplacementMapElement.xChannelSelector')
-  @DocsEditable()
   final AnimatedEnumeration xChannelSelector;
 
-  @DomName('SVGFEDisplacementMapElement.yChannelSelector')
-  @DocsEditable()
   final AnimatedEnumeration yChannelSelector;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEDisplacementMapElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEDisplacementMapElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEDisplacementMapElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEDisplacementMapElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEDisplacementMapElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEDistantLightElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1387,8 +984,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEDistantLightElement.SVGFEDistantLightElement')
-  @DocsEditable()
   factory FEDistantLightElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feDistantLight");
   /**
@@ -1403,20 +998,14 @@
       SvgElement.isTagSupported('feDistantLight') &&
       (new SvgElement.tag('feDistantLight') is FEDistantLightElement);
 
-  @DomName('SVGFEDistantLightElement.azimuth')
-  @DocsEditable()
   final AnimatedNumber azimuth;
 
-  @DomName('SVGFEDistantLightElement.elevation')
-  @DocsEditable()
   final AnimatedNumber elevation;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEFloodElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1430,8 +1019,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEFloodElement.SVGFEFloodElement')
-  @DocsEditable()
   factory FEFloodElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feFlood");
   /**
@@ -1448,32 +1035,20 @@
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEFloodElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEFloodElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEFloodElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEFloodElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEFloodElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEFuncAElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1486,8 +1061,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEFuncAElement.SVGFEFuncAElement')
-  @DocsEditable()
   factory FEFuncAElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feFuncA");
   /**
@@ -1506,8 +1079,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEFuncBElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1520,8 +1091,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEFuncBElement.SVGFEFuncBElement')
-  @DocsEditable()
   factory FEFuncBElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feFuncB");
   /**
@@ -1540,8 +1109,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEFuncGElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1554,8 +1121,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEFuncGElement.SVGFEFuncGElement')
-  @DocsEditable()
   factory FEFuncGElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feFuncG");
   /**
@@ -1574,8 +1139,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEFuncRElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1588,8 +1151,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEFuncRElement.SVGFEFuncRElement')
-  @DocsEditable()
   factory FEFuncRElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feFuncR");
   /**
@@ -1608,8 +1169,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEGaussianBlurElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1623,8 +1182,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEGaussianBlurElement.SVGFEGaussianBlurElement')
-  @DocsEditable()
   factory FEGaussianBlurElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur");
   /**
@@ -1639,50 +1196,30 @@
       SvgElement.isTagSupported('feGaussianBlur') &&
       (new SvgElement.tag('feGaussianBlur') is FEGaussianBlurElement);
 
-  @DomName('SVGFEGaussianBlurElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFEGaussianBlurElement.stdDeviationX')
-  @DocsEditable()
   final AnimatedNumber stdDeviationX;
 
-  @DomName('SVGFEGaussianBlurElement.stdDeviationY')
-  @DocsEditable()
   final AnimatedNumber stdDeviationY;
 
-  @DomName('SVGFEGaussianBlurElement.setStdDeviation')
-  @DocsEditable()
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEGaussianBlurElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEGaussianBlurElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEGaussianBlurElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEGaussianBlurElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEGaussianBlurElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEImageElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1696,8 +1233,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEImageElement.SVGFEImageElement')
-  @DocsEditable()
   factory FEImageElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feImage");
   /**
@@ -1712,44 +1247,28 @@
       SvgElement.isTagSupported('feImage') &&
       (new SvgElement.tag('feImage') is FEImageElement);
 
-  @DomName('SVGFEImageElement.preserveAspectRatio')
-  @DocsEditable()
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEImageElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEImageElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEImageElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEImageElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEImageElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 
   // From SVGURIReference
 
-  @DomName('SVGFEImageElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEMergeElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1763,8 +1282,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEMergeElement.SVGFEMergeElement')
-  @DocsEditable()
   factory FEMergeElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feMerge");
   /**
@@ -1781,32 +1298,20 @@
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEMergeElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEMergeElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEMergeElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEMergeElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEMergeElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEMergeNodeElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1819,8 +1324,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEMergeNodeElement.SVGFEMergeNodeElement')
-  @DocsEditable()
   factory FEMergeNodeElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feMergeNode");
   /**
@@ -1835,16 +1338,12 @@
       SvgElement.isTagSupported('feMergeNode') &&
       (new SvgElement.tag('feMergeNode') is FEMergeNodeElement);
 
-  @DomName('SVGFEMergeNodeElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEMorphologyElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1864,62 +1363,36 @@
    */
   FEMorphologyElement.created() : super.created();
 
-  @DomName('SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE')
-  @DocsEditable()
   static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
 
-  @DomName('SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE')
-  @DocsEditable()
   static const int SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
 
-  @DomName('SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN')
-  @DocsEditable()
   static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
 
-  @DomName('SVGFEMorphologyElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFEMorphologyElement.operator')
-  @DocsEditable()
   final AnimatedEnumeration operator;
 
-  @DomName('SVGFEMorphologyElement.radiusX')
-  @DocsEditable()
   final AnimatedNumber radiusX;
 
-  @DomName('SVGFEMorphologyElement.radiusY')
-  @DocsEditable()
   final AnimatedNumber radiusY;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEMorphologyElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEMorphologyElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEMorphologyElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEMorphologyElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEMorphologyElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEOffsetElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -1933,8 +1406,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEOffsetElement.SVGFEOffsetElement')
-  @DocsEditable()
   factory FEOffsetElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feOffset");
   /**
@@ -1949,46 +1420,28 @@
       SvgElement.isTagSupported('feOffset') &&
       (new SvgElement.tag('feOffset') is FEOffsetElement);
 
-  @DomName('SVGFEOffsetElement.dx')
-  @DocsEditable()
   final AnimatedNumber dx;
 
-  @DomName('SVGFEOffsetElement.dy')
-  @DocsEditable()
   final AnimatedNumber dy;
 
-  @DomName('SVGFEOffsetElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFEOffsetElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFEOffsetElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFEOffsetElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFEOffsetElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFEOffsetElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEPointLightElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -2001,8 +1454,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFEPointLightElement.SVGFEPointLightElement')
-  @DocsEditable()
   factory FEPointLightElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("fePointLight");
   /**
@@ -2017,24 +1468,16 @@
       SvgElement.isTagSupported('fePointLight') &&
       (new SvgElement.tag('fePointLight') is FEPointLightElement);
 
-  @DomName('SVGFEPointLightElement.x')
-  @DocsEditable()
   final AnimatedNumber x;
 
-  @DomName('SVGFEPointLightElement.y')
-  @DocsEditable()
   final AnimatedNumber y;
 
-  @DomName('SVGFEPointLightElement.z')
-  @DocsEditable()
   final AnimatedNumber z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFESpecularLightingElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -2048,8 +1491,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFESpecularLightingElement.SVGFESpecularLightingElement')
-  @DocsEditable()
   factory FESpecularLightingElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting");
   /**
@@ -2064,60 +1505,34 @@
       SvgElement.isTagSupported('feSpecularLighting') &&
       (new SvgElement.tag('feSpecularLighting') is FESpecularLightingElement);
 
-  @DomName('SVGFESpecularLightingElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
-  @DomName('SVGFESpecularLightingElement.kernelUnitLengthX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AnimatedNumber kernelUnitLengthX;
 
-  @DomName('SVGFESpecularLightingElement.kernelUnitLengthY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AnimatedNumber kernelUnitLengthY;
 
-  @DomName('SVGFESpecularLightingElement.specularConstant')
-  @DocsEditable()
   final AnimatedNumber specularConstant;
 
-  @DomName('SVGFESpecularLightingElement.specularExponent')
-  @DocsEditable()
   final AnimatedNumber specularExponent;
 
-  @DomName('SVGFESpecularLightingElement.surfaceScale')
-  @DocsEditable()
   final AnimatedNumber surfaceScale;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFESpecularLightingElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFESpecularLightingElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFESpecularLightingElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFESpecularLightingElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFESpecularLightingElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFESpotLightElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -2130,8 +1545,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFESpotLightElement.SVGFESpotLightElement')
-  @DocsEditable()
   factory FESpotLightElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feSpotLight");
   /**
@@ -2146,44 +1559,26 @@
       SvgElement.isTagSupported('feSpotLight') &&
       (new SvgElement.tag('feSpotLight') is FESpotLightElement);
 
-  @DomName('SVGFESpotLightElement.limitingConeAngle')
-  @DocsEditable()
   final AnimatedNumber limitingConeAngle;
 
-  @DomName('SVGFESpotLightElement.pointsAtX')
-  @DocsEditable()
   final AnimatedNumber pointsAtX;
 
-  @DomName('SVGFESpotLightElement.pointsAtY')
-  @DocsEditable()
   final AnimatedNumber pointsAtY;
 
-  @DomName('SVGFESpotLightElement.pointsAtZ')
-  @DocsEditable()
   final AnimatedNumber pointsAtZ;
 
-  @DomName('SVGFESpotLightElement.specularExponent')
-  @DocsEditable()
   final AnimatedNumber specularExponent;
 
-  @DomName('SVGFESpotLightElement.x')
-  @DocsEditable()
   final AnimatedNumber x;
 
-  @DomName('SVGFESpotLightElement.y')
-  @DocsEditable()
   final AnimatedNumber y;
 
-  @DomName('SVGFESpotLightElement.z')
-  @DocsEditable()
   final AnimatedNumber z;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFETileElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -2197,8 +1592,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFETileElement.SVGFETileElement')
-  @DocsEditable()
   factory FETileElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feTile");
   /**
@@ -2213,38 +1606,24 @@
       SvgElement.isTagSupported('feTile') &&
       (new SvgElement.tag('feTile') is FETileElement);
 
-  @DomName('SVGFETileElement.in1')
-  @DocsEditable()
   final AnimatedString in1;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFETileElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFETileElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFETileElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFETileElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFETileElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFETurbulenceElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -2258,8 +1637,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFETurbulenceElement.SVGFETurbulenceElement')
-  @DocsEditable()
   factory FETurbulenceElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("feTurbulence");
   /**
@@ -2274,82 +1651,46 @@
       SvgElement.isTagSupported('feTurbulence') &&
       (new SvgElement.tag('feTurbulence') is FETurbulenceElement);
 
-  @DomName('SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH')
-  @DocsEditable()
   static const int SVG_STITCHTYPE_NOSTITCH = 2;
 
-  @DomName('SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH')
-  @DocsEditable()
   static const int SVG_STITCHTYPE_STITCH = 1;
 
-  @DomName('SVGFETurbulenceElement.SVG_STITCHTYPE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_STITCHTYPE_UNKNOWN = 0;
 
-  @DomName('SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE')
-  @DocsEditable()
   static const int SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
 
-  @DomName('SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE')
-  @DocsEditable()
   static const int SVG_TURBULENCE_TYPE_TURBULENCE = 2;
 
-  @DomName('SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
 
-  @DomName('SVGFETurbulenceElement.baseFrequencyX')
-  @DocsEditable()
   final AnimatedNumber baseFrequencyX;
 
-  @DomName('SVGFETurbulenceElement.baseFrequencyY')
-  @DocsEditable()
   final AnimatedNumber baseFrequencyY;
 
-  @DomName('SVGFETurbulenceElement.numOctaves')
-  @DocsEditable()
   final AnimatedInteger numOctaves;
 
-  @DomName('SVGFETurbulenceElement.seed')
-  @DocsEditable()
   final AnimatedNumber seed;
 
-  @DomName('SVGFETurbulenceElement.stitchTiles')
-  @DocsEditable()
   final AnimatedEnumeration stitchTiles;
 
-  @DomName('SVGFETurbulenceElement.type')
-  @DocsEditable()
   final AnimatedEnumeration type;
 
   // From SVGFilterPrimitiveStandardAttributes
 
-  @DomName('SVGFETurbulenceElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFETurbulenceElement.result')
-  @DocsEditable()
   final AnimatedString result;
 
-  @DomName('SVGFETurbulenceElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFETurbulenceElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFETurbulenceElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFilterElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -2362,8 +1703,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGFilterElement.SVGFilterElement')
-  @DocsEditable()
   factory FilterElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("filter");
   /**
@@ -2378,42 +1717,26 @@
       SvgElement.isTagSupported('filter') &&
       (new SvgElement.tag('filter') is FilterElement);
 
-  @DomName('SVGFilterElement.filterUnits')
-  @DocsEditable()
   final AnimatedEnumeration filterUnits;
 
-  @DomName('SVGFilterElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGFilterElement.primitiveUnits')
-  @DocsEditable()
   final AnimatedEnumeration primitiveUnits;
 
-  @DomName('SVGFilterElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGFilterElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGFilterElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 
   // From SVGURIReference
 
-  @DomName('SVGFilterElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFilterPrimitiveStandardAttributes')
 @Unstable()
 abstract class FilterPrimitiveStandardAttributes extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2435,8 +1758,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFitToViewBox')
 @Unstable()
 abstract class FitToViewBox extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -2452,8 +1773,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGForeignObjectElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -2465,8 +1784,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGForeignObjectElement.SVGForeignObjectElement')
-  @DocsEditable()
   factory ForeignObjectElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
   /**
@@ -2481,28 +1798,18 @@
       SvgElement.isTagSupported('foreignObject') &&
       (new SvgElement.tag('foreignObject') is ForeignObjectElement);
 
-  @DomName('SVGForeignObjectElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGForeignObjectElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGForeignObjectElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGForeignObjectElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGGElement')
 @Unstable()
 @Native("SVGGElement")
 class GElement extends GraphicsElement {
@@ -2511,8 +1818,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGGElement.SVGGElement')
-  @DocsEditable()
   factory GElement() => _SvgElementFactoryProvider.createSvgElement_tag("g");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -2525,9 +1830,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGGeometryElement')
-@Experimental() // untriaged
 @Native("SVGGeometryElement")
 class GeometryElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
@@ -2541,38 +1843,20 @@
    */
   GeometryElement.created() : super.created();
 
-  @DomName('SVGGeometryElement.pathLength')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AnimatedNumber pathLength;
 
-  @DomName('SVGGeometryElement.getPointAtLength')
-  @DocsEditable()
-  @Experimental() // untriaged
   Point getPointAtLength(num distance) native;
 
-  @DomName('SVGGeometryElement.getTotalLength')
-  @DocsEditable()
-  @Experimental() // untriaged
   double getTotalLength() native;
 
-  @DomName('SVGGeometryElement.isPointInFill')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isPointInFill(Point point) native;
 
-  @DomName('SVGGeometryElement.isPointInStroke')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isPointInStroke(Point point) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGGraphicsElement')
-@Experimental() // untriaged
 @Native("SVGGraphicsElement")
 class GraphicsElement extends SvgElement implements Tests {
   // To suppress missing implicit constructor warnings.
@@ -2586,56 +1870,30 @@
    */
   GraphicsElement.created() : super.created();
 
-  @DomName('SVGGraphicsElement.farthestViewportElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SvgElement farthestViewportElement;
 
-  @DomName('SVGGraphicsElement.nearestViewportElement')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SvgElement nearestViewportElement;
 
-  @DomName('SVGGraphicsElement.transform')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AnimatedTransformList transform;
 
-  @DomName('SVGGraphicsElement.getBBox')
-  @DocsEditable()
-  @Experimental() // untriaged
   Rect getBBox() native;
 
   @JSName('getCTM')
-  @DomName('SVGGraphicsElement.getCTM')
-  @DocsEditable()
-  @Experimental() // untriaged
   Matrix getCtm() native;
 
   @JSName('getScreenCTM')
-  @DomName('SVGGraphicsElement.getScreenCTM')
-  @DocsEditable()
-  @Experimental() // untriaged
   Matrix getScreenCtm() native;
 
   // From SVGTests
 
-  @DomName('SVGGraphicsElement.requiredExtensions')
-  @DocsEditable()
-  @Experimental() // untriaged
   final StringList requiredExtensions;
 
-  @DomName('SVGGraphicsElement.systemLanguage')
-  @DocsEditable()
-  @Experimental() // untriaged
   final StringList systemLanguage;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGImageElement')
 @Unstable()
 @Native("SVGImageElement")
 class ImageElement extends GraphicsElement implements UriReference {
@@ -2644,8 +1902,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGImageElement.SVGImageElement')
-  @DocsEditable()
   factory ImageElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("image");
   /**
@@ -2655,48 +1911,28 @@
    */
   ImageElement.created() : super.created();
 
-  @DomName('SVGImageElement.async')
-  @DocsEditable()
-  @Experimental() // untriaged
   String async;
 
-  @DomName('SVGImageElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGImageElement.preserveAspectRatio')
-  @DocsEditable()
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  @DomName('SVGImageElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGImageElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGImageElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 
-  @DomName('SVGImageElement.decode')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future decode() => promiseToFuture(JS("", "#.decode()", this));
 
   // From SVGURIReference
 
-  @DomName('SVGImageElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGLength')
 @Unstable()
 @Native("SVGLength")
 class Length extends Interceptor {
@@ -2705,80 +1941,44 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_CM')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_CM = 6;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_EMS')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_EMS = 3;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_EXS')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_EXS = 4;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_IN')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_IN = 8;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_MM')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_MM = 7;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_NUMBER')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_NUMBER = 1;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_PC')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_PC = 10;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_PERCENTAGE')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_PERCENTAGE = 2;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_PT')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_PT = 9;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_PX')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_PX = 5;
 
-  @DomName('SVGLength.SVG_LENGTHTYPE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_LENGTHTYPE_UNKNOWN = 0;
 
-  @DomName('SVGLength.unitType')
-  @DocsEditable()
   final int unitType;
 
-  @DomName('SVGLength.value')
-  @DocsEditable()
   num value;
 
-  @DomName('SVGLength.valueAsString')
-  @DocsEditable()
   String valueAsString;
 
-  @DomName('SVGLength.valueInSpecifiedUnits')
-  @DocsEditable()
   num valueInSpecifiedUnits;
 
-  @DomName('SVGLength.convertToSpecifiedUnits')
-  @DocsEditable()
   void convertToSpecifiedUnits(int unitType) native;
 
-  @DomName('SVGLength.newValueSpecifiedUnits')
-  @DocsEditable()
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGLengthList')
 @Unstable()
 @Native("SVGLengthList")
 class LengthList extends Interceptor
@@ -2789,13 +1989,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGLengthList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   int get length => JS("int", "#.length", this);
 
-  @DomName('SVGLengthList.numberOfItems')
-  @DocsEditable()
   final int numberOfItems;
 
   Length operator [](int index) {
@@ -2841,45 +2036,26 @@
   Length elementAt(int index) => this[index];
   // -- end List<Length> mixins.
 
-  @DomName('SVGLengthList.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   void __setter__(int index, Length newItem) native;
 
-  @DomName('SVGLengthList.appendItem')
-  @DocsEditable()
   Length appendItem(Length newItem) native;
 
-  @DomName('SVGLengthList.clear')
-  @DocsEditable()
   void clear() native;
 
-  @DomName('SVGLengthList.getItem')
-  @DocsEditable()
   Length getItem(int index) native;
 
-  @DomName('SVGLengthList.initialize')
-  @DocsEditable()
   Length initialize(Length newItem) native;
 
-  @DomName('SVGLengthList.insertItemBefore')
-  @DocsEditable()
   Length insertItemBefore(Length newItem, int index) native;
 
-  @DomName('SVGLengthList.removeItem')
-  @DocsEditable()
   Length removeItem(int index) native;
 
-  @DomName('SVGLengthList.replaceItem')
-  @DocsEditable()
   Length replaceItem(Length newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGLineElement')
 @Unstable()
 @Native("SVGLineElement")
 class LineElement extends GeometryElement {
@@ -2888,8 +2064,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGLineElement.SVGLineElement')
-  @DocsEditable()
   factory LineElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("line");
   /**
@@ -2899,28 +2073,18 @@
    */
   LineElement.created() : super.created();
 
-  @DomName('SVGLineElement.x1')
-  @DocsEditable()
   final AnimatedLength x1;
 
-  @DomName('SVGLineElement.x2')
-  @DocsEditable()
   final AnimatedLength x2;
 
-  @DomName('SVGLineElement.y1')
-  @DocsEditable()
   final AnimatedLength y1;
 
-  @DomName('SVGLineElement.y2')
-  @DocsEditable()
   final AnimatedLength y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGLinearGradientElement')
 @Unstable()
 @Native("SVGLinearGradientElement")
 class LinearGradientElement extends _GradientElement {
@@ -2929,8 +2093,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGLinearGradientElement.SVGLinearGradientElement')
-  @DocsEditable()
   factory LinearGradientElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
   /**
@@ -2940,28 +2102,18 @@
    */
   LinearGradientElement.created() : super.created();
 
-  @DomName('SVGLinearGradientElement.x1')
-  @DocsEditable()
   final AnimatedLength x1;
 
-  @DomName('SVGLinearGradientElement.x2')
-  @DocsEditable()
   final AnimatedLength x2;
 
-  @DomName('SVGLinearGradientElement.y1')
-  @DocsEditable()
   final AnimatedLength y1;
 
-  @DomName('SVGLinearGradientElement.y2')
-  @DocsEditable()
   final AnimatedLength y2;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGMarkerElement')
 @Unstable()
 @Native("SVGMarkerElement")
 class MarkerElement extends SvgElement implements FitToViewBox {
@@ -2970,8 +2122,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGMarkerElement.SVGMarkerElement')
-  @DocsEditable()
   factory MarkerElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("marker");
   /**
@@ -2981,82 +2131,46 @@
    */
   MarkerElement.created() : super.created();
 
-  @DomName('SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH')
-  @DocsEditable()
   static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
 
-  @DomName('SVGMarkerElement.SVG_MARKERUNITS_UNKNOWN')
-  @DocsEditable()
   static const int SVG_MARKERUNITS_UNKNOWN = 0;
 
-  @DomName('SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE')
-  @DocsEditable()
   static const int SVG_MARKERUNITS_USERSPACEONUSE = 1;
 
-  @DomName('SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE')
-  @DocsEditable()
   static const int SVG_MARKER_ORIENT_ANGLE = 2;
 
-  @DomName('SVGMarkerElement.SVG_MARKER_ORIENT_AUTO')
-  @DocsEditable()
   static const int SVG_MARKER_ORIENT_AUTO = 1;
 
-  @DomName('SVGMarkerElement.SVG_MARKER_ORIENT_UNKNOWN')
-  @DocsEditable()
   static const int SVG_MARKER_ORIENT_UNKNOWN = 0;
 
-  @DomName('SVGMarkerElement.markerHeight')
-  @DocsEditable()
   final AnimatedLength markerHeight;
 
-  @DomName('SVGMarkerElement.markerUnits')
-  @DocsEditable()
   final AnimatedEnumeration markerUnits;
 
-  @DomName('SVGMarkerElement.markerWidth')
-  @DocsEditable()
   final AnimatedLength markerWidth;
 
-  @DomName('SVGMarkerElement.orientAngle')
-  @DocsEditable()
   final AnimatedAngle orientAngle;
 
-  @DomName('SVGMarkerElement.orientType')
-  @DocsEditable()
   final AnimatedEnumeration orientType;
 
-  @DomName('SVGMarkerElement.refX')
-  @DocsEditable()
   final AnimatedLength refX;
 
-  @DomName('SVGMarkerElement.refY')
-  @DocsEditable()
   final AnimatedLength refY;
 
-  @DomName('SVGMarkerElement.setOrientToAngle')
-  @DocsEditable()
   void setOrientToAngle(Angle angle) native;
 
-  @DomName('SVGMarkerElement.setOrientToAuto')
-  @DocsEditable()
   void setOrientToAuto() native;
 
   // From SVGFitToViewBox
 
-  @DomName('SVGMarkerElement.preserveAspectRatio')
-  @DocsEditable()
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  @DomName('SVGMarkerElement.viewBox')
-  @DocsEditable()
   final AnimatedRect viewBox;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGMaskElement')
 @Unstable()
 @Native("SVGMaskElement")
 class MaskElement extends SvgElement implements Tests {
@@ -3065,8 +2179,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGMaskElement.SVGMaskElement')
-  @DocsEditable()
   factory MaskElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("mask");
   /**
@@ -3076,46 +2188,28 @@
    */
   MaskElement.created() : super.created();
 
-  @DomName('SVGMaskElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGMaskElement.maskContentUnits')
-  @DocsEditable()
   final AnimatedEnumeration maskContentUnits;
 
-  @DomName('SVGMaskElement.maskUnits')
-  @DocsEditable()
   final AnimatedEnumeration maskUnits;
 
-  @DomName('SVGMaskElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGMaskElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGMaskElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 
   // From SVGTests
 
-  @DomName('SVGMaskElement.requiredExtensions')
-  @DocsEditable()
   final StringList requiredExtensions;
 
-  @DomName('SVGMaskElement.systemLanguage')
-  @DocsEditable()
   final StringList systemLanguage;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGMatrix')
 @Unstable()
 @Native("SVGMatrix")
 class Matrix extends Interceptor {
@@ -3124,80 +2218,44 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGMatrix.a')
-  @DocsEditable()
   num a;
 
-  @DomName('SVGMatrix.b')
-  @DocsEditable()
   num b;
 
-  @DomName('SVGMatrix.c')
-  @DocsEditable()
   num c;
 
-  @DomName('SVGMatrix.d')
-  @DocsEditable()
   num d;
 
-  @DomName('SVGMatrix.e')
-  @DocsEditable()
   num e;
 
-  @DomName('SVGMatrix.f')
-  @DocsEditable()
   num f;
 
-  @DomName('SVGMatrix.flipX')
-  @DocsEditable()
   Matrix flipX() native;
 
-  @DomName('SVGMatrix.flipY')
-  @DocsEditable()
   Matrix flipY() native;
 
-  @DomName('SVGMatrix.inverse')
-  @DocsEditable()
   Matrix inverse() native;
 
-  @DomName('SVGMatrix.multiply')
-  @DocsEditable()
   Matrix multiply(Matrix secondMatrix) native;
 
-  @DomName('SVGMatrix.rotate')
-  @DocsEditable()
   Matrix rotate(num angle) native;
 
-  @DomName('SVGMatrix.rotateFromVector')
-  @DocsEditable()
   Matrix rotateFromVector(num x, num y) native;
 
-  @DomName('SVGMatrix.scale')
-  @DocsEditable()
   Matrix scale(num scaleFactor) native;
 
-  @DomName('SVGMatrix.scaleNonUniform')
-  @DocsEditable()
   Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native;
 
-  @DomName('SVGMatrix.skewX')
-  @DocsEditable()
   Matrix skewX(num angle) native;
 
-  @DomName('SVGMatrix.skewY')
-  @DocsEditable()
   Matrix skewY(num angle) native;
 
-  @DomName('SVGMatrix.translate')
-  @DocsEditable()
   Matrix translate(num x, num y) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGMetadataElement')
 @Unstable()
 @Native("SVGMetadataElement")
 class MetadataElement extends SvgElement {
@@ -3216,8 +2274,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGNumber')
 @Unstable()
 @Native("SVGNumber")
 class Number extends Interceptor {
@@ -3226,16 +2282,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGNumber.value')
-  @DocsEditable()
   num value;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGNumberList')
 @Unstable()
 @Native("SVGNumberList")
 class NumberList extends Interceptor
@@ -3246,13 +2298,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGNumberList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   int get length => JS("int", "#.length", this);
 
-  @DomName('SVGNumberList.numberOfItems')
-  @DocsEditable()
   final int numberOfItems;
 
   Number operator [](int index) {
@@ -3298,45 +2345,26 @@
   Number elementAt(int index) => this[index];
   // -- end List<Number> mixins.
 
-  @DomName('SVGNumberList.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   void __setter__(int index, Number newItem) native;
 
-  @DomName('SVGNumberList.appendItem')
-  @DocsEditable()
   Number appendItem(Number newItem) native;
 
-  @DomName('SVGNumberList.clear')
-  @DocsEditable()
   void clear() native;
 
-  @DomName('SVGNumberList.getItem')
-  @DocsEditable()
   Number getItem(int index) native;
 
-  @DomName('SVGNumberList.initialize')
-  @DocsEditable()
   Number initialize(Number newItem) native;
 
-  @DomName('SVGNumberList.insertItemBefore')
-  @DocsEditable()
   Number insertItemBefore(Number newItem, int index) native;
 
-  @DomName('SVGNumberList.removeItem')
-  @DocsEditable()
   Number removeItem(int index) native;
 
-  @DomName('SVGNumberList.replaceItem')
-  @DocsEditable()
   Number replaceItem(Number newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGPathElement')
 @Unstable()
 @Native("SVGPathElement")
 class PathElement extends GeometryElement {
@@ -3345,8 +2373,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGPathElement.SVGPathElement')
-  @DocsEditable()
   factory PathElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("path");
   /**
@@ -3360,8 +2386,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGPatternElement')
 @Unstable()
 @Native("SVGPatternElement")
 class PatternElement extends SvgElement
@@ -3371,8 +2395,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGPatternElement.SVGPatternElement')
-  @DocsEditable()
   factory PatternElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("pattern");
   /**
@@ -3382,66 +2404,40 @@
    */
   PatternElement.created() : super.created();
 
-  @DomName('SVGPatternElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGPatternElement.patternContentUnits')
-  @DocsEditable()
   final AnimatedEnumeration patternContentUnits;
 
-  @DomName('SVGPatternElement.patternTransform')
-  @DocsEditable()
   final AnimatedTransformList patternTransform;
 
-  @DomName('SVGPatternElement.patternUnits')
-  @DocsEditable()
   final AnimatedEnumeration patternUnits;
 
-  @DomName('SVGPatternElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGPatternElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGPatternElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 
   // From SVGFitToViewBox
 
-  @DomName('SVGPatternElement.preserveAspectRatio')
-  @DocsEditable()
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  @DomName('SVGPatternElement.viewBox')
-  @DocsEditable()
   final AnimatedRect viewBox;
 
   // From SVGTests
 
-  @DomName('SVGPatternElement.requiredExtensions')
-  @DocsEditable()
   final StringList requiredExtensions;
 
-  @DomName('SVGPatternElement.systemLanguage')
-  @DocsEditable()
   final StringList systemLanguage;
 
   // From SVGURIReference
 
-  @DomName('SVGPatternElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGPoint')
 @Unstable()
 @Native("SVGPoint")
 class Point extends Interceptor {
@@ -3450,24 +2446,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGPoint.x')
-  @DocsEditable()
   num x;
 
-  @DomName('SVGPoint.y')
-  @DocsEditable()
   num y;
 
-  @DomName('SVGPoint.matrixTransform')
-  @DocsEditable()
   Point matrixTransform(Matrix matrix) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGPointList')
 @Unstable()
 @Native("SVGPointList")
 class PointList extends Interceptor {
@@ -3476,54 +2464,30 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGPointList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int length;
 
-  @DomName('SVGPointList.numberOfItems')
-  @DocsEditable()
   final int numberOfItems;
 
-  @DomName('SVGPointList.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   void __setter__(int index, Point newItem) native;
 
-  @DomName('SVGPointList.appendItem')
-  @DocsEditable()
   Point appendItem(Point newItem) native;
 
-  @DomName('SVGPointList.clear')
-  @DocsEditable()
   void clear() native;
 
-  @DomName('SVGPointList.getItem')
-  @DocsEditable()
   Point getItem(int index) native;
 
-  @DomName('SVGPointList.initialize')
-  @DocsEditable()
   Point initialize(Point newItem) native;
 
-  @DomName('SVGPointList.insertItemBefore')
-  @DocsEditable()
   Point insertItemBefore(Point newItem, int index) native;
 
-  @DomName('SVGPointList.removeItem')
-  @DocsEditable()
   Point removeItem(int index) native;
 
-  @DomName('SVGPointList.replaceItem')
-  @DocsEditable()
   Point replaceItem(Point newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGPolygonElement')
 @Unstable()
 @Native("SVGPolygonElement")
 class PolygonElement extends GeometryElement {
@@ -3532,8 +2496,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGPolygonElement.SVGPolygonElement')
-  @DocsEditable()
   factory PolygonElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("polygon");
   /**
@@ -3543,20 +2505,14 @@
    */
   PolygonElement.created() : super.created();
 
-  @DomName('SVGPolygonElement.animatedPoints')
-  @DocsEditable()
   final PointList animatedPoints;
 
-  @DomName('SVGPolygonElement.points')
-  @DocsEditable()
   final PointList points;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGPolylineElement')
 @Unstable()
 @Native("SVGPolylineElement")
 class PolylineElement extends GeometryElement {
@@ -3565,8 +2521,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGPolylineElement.SVGPolylineElement')
-  @DocsEditable()
   factory PolylineElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("polyline");
   /**
@@ -3576,20 +2530,14 @@
    */
   PolylineElement.created() : super.created();
 
-  @DomName('SVGPolylineElement.animatedPoints')
-  @DocsEditable()
   final PointList animatedPoints;
 
-  @DomName('SVGPolylineElement.points')
-  @DocsEditable()
   final PointList points;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGPreserveAspectRatio')
 @Unstable()
 @Native("SVGPreserveAspectRatio")
 class PreserveAspectRatio extends Interceptor {
@@ -3598,76 +2546,42 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET')
-  @DocsEditable()
   static const int SVG_MEETORSLICE_MEET = 1;
 
-  @DomName('SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE')
-  @DocsEditable()
   static const int SVG_MEETORSLICE_SLICE = 2;
 
-  @DomName('SVGPreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_MEETORSLICE_UNKNOWN = 0;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_NONE = 1;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
 
-  @DomName('SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN')
-  @DocsEditable()
   static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
 
-  @DomName('SVGPreserveAspectRatio.align')
-  @DocsEditable()
   int align;
 
-  @DomName('SVGPreserveAspectRatio.meetOrSlice')
-  @DocsEditable()
   int meetOrSlice;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGRadialGradientElement')
 @Unstable()
 @Native("SVGRadialGradientElement")
 class RadialGradientElement extends _GradientElement {
@@ -3676,8 +2590,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGRadialGradientElement.SVGRadialGradientElement')
-  @DocsEditable()
   factory RadialGradientElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
   /**
@@ -3687,36 +2599,22 @@
    */
   RadialGradientElement.created() : super.created();
 
-  @DomName('SVGRadialGradientElement.cx')
-  @DocsEditable()
   final AnimatedLength cx;
 
-  @DomName('SVGRadialGradientElement.cy')
-  @DocsEditable()
   final AnimatedLength cy;
 
-  @DomName('SVGRadialGradientElement.fr')
-  @DocsEditable()
   final AnimatedLength fr;
 
-  @DomName('SVGRadialGradientElement.fx')
-  @DocsEditable()
   final AnimatedLength fx;
 
-  @DomName('SVGRadialGradientElement.fy')
-  @DocsEditable()
   final AnimatedLength fy;
 
-  @DomName('SVGRadialGradientElement.r')
-  @DocsEditable()
   final AnimatedLength r;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGRect')
 @Unstable()
 @Native("SVGRect")
 class Rect extends Interceptor {
@@ -3725,28 +2623,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGRect.height')
-  @DocsEditable()
   num height;
 
-  @DomName('SVGRect.width')
-  @DocsEditable()
   num width;
 
-  @DomName('SVGRect.x')
-  @DocsEditable()
   num x;
 
-  @DomName('SVGRect.y')
-  @DocsEditable()
   num y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGRectElement')
 @Unstable()
 @Native("SVGRectElement")
 class RectElement extends GeometryElement {
@@ -3755,8 +2643,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGRectElement.SVGRectElement')
-  @DocsEditable()
   factory RectElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("rect");
   /**
@@ -3766,36 +2652,22 @@
    */
   RectElement.created() : super.created();
 
-  @DomName('SVGRectElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGRectElement.rx')
-  @DocsEditable()
   final AnimatedLength rx;
 
-  @DomName('SVGRectElement.ry')
-  @DocsEditable()
   final AnimatedLength ry;
 
-  @DomName('SVGRectElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGRectElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGRectElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGScriptElement')
 @Unstable()
 @Native("SVGScriptElement")
 class ScriptElement extends SvgElement implements UriReference {
@@ -3804,8 +2676,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGScriptElement.SVGScriptElement')
-  @DocsEditable()
   factory ScriptElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("script");
   /**
@@ -3815,22 +2685,16 @@
    */
   ScriptElement.created() : super.created();
 
-  @DomName('SVGScriptElement.type')
-  @DocsEditable()
   String type;
 
   // From SVGURIReference
 
-  @DomName('SVGScriptElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGSetElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -3842,8 +2706,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGSetElement.SVGSetElement')
-  @DocsEditable()
   factory SetElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("set");
   /**
@@ -3862,8 +2724,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGStopElement')
 @Unstable()
 @Native("SVGStopElement")
 class StopElement extends SvgElement {
@@ -3872,8 +2732,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGStopElement.SVGStopElement')
-  @DocsEditable()
   factory StopElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("stop");
   /**
@@ -3884,16 +2742,12 @@
   StopElement.created() : super.created();
 
   @JSName('offset')
-  @DomName('SVGStopElement.offset')
-  @DocsEditable()
   final AnimatedNumber gradientOffset;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGStringList')
 @Unstable()
 @Native("SVGStringList")
 class StringList extends Interceptor
@@ -3904,13 +2758,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGStringList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   int get length => JS("int", "#.length", this);
 
-  @DomName('SVGStringList.numberOfItems')
-  @DocsEditable()
   final int numberOfItems;
 
   String operator [](int index) {
@@ -3956,47 +2805,26 @@
   String elementAt(int index) => this[index];
   // -- end List<String> mixins.
 
-  @DomName('SVGStringList.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   void __setter__(int index, String newItem) native;
 
-  @DomName('SVGStringList.appendItem')
-  @DocsEditable()
   String appendItem(String newItem) native;
 
-  @DomName('SVGStringList.clear')
-  @DocsEditable()
   void clear() native;
 
-  @DomName('SVGStringList.getItem')
-  @DocsEditable()
   String getItem(int index) native;
 
-  @DomName('SVGStringList.initialize')
-  @DocsEditable()
   String initialize(String newItem) native;
 
-  @DomName('SVGStringList.insertItemBefore')
-  @DocsEditable()
   String insertItemBefore(String item, int index) native;
 
-  @DomName('SVGStringList.removeItem')
-  @DocsEditable()
   String removeItem(int index) native;
 
-  @DomName('SVGStringList.replaceItem')
-  @DocsEditable()
   String replaceItem(String newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGStyleElement')
-// http://www.w3.org/TR/SVG/types.html#InterfaceSVGStylable
-@Experimental() // nonstandard
 @Native("SVGStyleElement")
 class StyleElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
@@ -4004,8 +2832,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGStyleElement.SVGStyleElement')
-  @DocsEditable()
   factory StyleElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("style");
   /**
@@ -4015,24 +2841,15 @@
    */
   StyleElement.created() : super.created();
 
-  @DomName('SVGStyleElement.disabled')
-  @DocsEditable()
   bool disabled;
 
-  @DomName('SVGStyleElement.media')
-  @DocsEditable()
   String media;
 
-  @DomName('SVGStyleElement.sheet')
-  @DocsEditable()
-  @Experimental() // untriaged
   final StyleSheet sheet;
 
   // Use implementation from Element.
   // final String title;
 
-  @DomName('SVGStyleElement.type')
-  @DocsEditable()
   String type;
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -4068,7 +2885,6 @@
   }
 }
 
-@DomName('SVGElement')
 @Unstable()
 @Native("SVGElement")
 class SvgElement extends Element implements GlobalEventHandlers, NoncedElement {
@@ -4147,18 +2963,15 @@
 
   // Unsupported methods inherited from Element.
 
-  @DomName('Element.insertAdjacentText')
   void insertAdjacentText(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentText on SVG.");
   }
 
-  @DomName('Element.insertAdjacentHTML')
   void insertAdjacentHtml(String where, String text,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     throw new UnsupportedError("Cannot invoke insertAdjacentHtml on SVG.");
   }
 
-  @DomName('Element.insertAdjacentElement')
   Element insertAdjacentElement(String where, Element element) {
     throw new UnsupportedError("Cannot invoke insertAdjacentElement on SVG.");
   }
@@ -4187,345 +3000,174 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGElement.abortEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> abortEvent =
       const EventStreamProvider<Event>('abort');
 
-  @DomName('SVGElement.blurEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> blurEvent =
       const EventStreamProvider<Event>('blur');
 
-  @DomName('SVGElement.canplayEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> canPlayEvent =
       const EventStreamProvider<Event>('canplay');
 
-  @DomName('SVGElement.canplaythroughEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> canPlayThroughEvent =
       const EventStreamProvider<Event>('canplaythrough');
 
-  @DomName('SVGElement.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('SVGElement.clickEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> clickEvent =
       const EventStreamProvider<MouseEvent>('click');
 
-  @DomName('SVGElement.contextmenuEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> contextMenuEvent =
       const EventStreamProvider<MouseEvent>('contextmenu');
 
-  @DomName('SVGElement.dblclickEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> doubleClickEvent =
       const EventStreamProvider<Event>('dblclick');
 
-  @DomName('SVGElement.dragEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragEvent =
       const EventStreamProvider<MouseEvent>('drag');
 
-  @DomName('SVGElement.dragendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragEndEvent =
       const EventStreamProvider<MouseEvent>('dragend');
 
-  @DomName('SVGElement.dragenterEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragEnterEvent =
       const EventStreamProvider<MouseEvent>('dragenter');
 
-  @DomName('SVGElement.dragleaveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragLeaveEvent =
       const EventStreamProvider<MouseEvent>('dragleave');
 
-  @DomName('SVGElement.dragoverEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragOverEvent =
       const EventStreamProvider<MouseEvent>('dragover');
 
-  @DomName('SVGElement.dragstartEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dragStartEvent =
       const EventStreamProvider<MouseEvent>('dragstart');
 
-  @DomName('SVGElement.dropEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> dropEvent =
       const EventStreamProvider<MouseEvent>('drop');
 
-  @DomName('SVGElement.durationchangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> durationChangeEvent =
       const EventStreamProvider<Event>('durationchange');
 
-  @DomName('SVGElement.emptiedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> emptiedEvent =
       const EventStreamProvider<Event>('emptied');
 
-  @DomName('SVGElement.endedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent =
       const EventStreamProvider<Event>('ended');
 
-  @DomName('SVGElement.errorEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent =
       const EventStreamProvider<Event>('error');
 
-  @DomName('SVGElement.focusEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> focusEvent =
       const EventStreamProvider<Event>('focus');
 
-  @DomName('SVGElement.inputEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> inputEvent =
       const EventStreamProvider<Event>('input');
 
-  @DomName('SVGElement.invalidEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> invalidEvent =
       const EventStreamProvider<Event>('invalid');
 
-  @DomName('SVGElement.keydownEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<KeyboardEvent> keyDownEvent =
       const EventStreamProvider<KeyboardEvent>('keydown');
 
-  @DomName('SVGElement.keypressEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<KeyboardEvent> keyPressEvent =
       const EventStreamProvider<KeyboardEvent>('keypress');
 
-  @DomName('SVGElement.keyupEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<KeyboardEvent> keyUpEvent =
       const EventStreamProvider<KeyboardEvent>('keyup');
 
-  @DomName('SVGElement.loadEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadEvent =
       const EventStreamProvider<Event>('load');
 
-  @DomName('SVGElement.loadeddataEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadedDataEvent =
       const EventStreamProvider<Event>('loadeddata');
 
-  @DomName('SVGElement.loadedmetadataEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> loadedMetadataEvent =
       const EventStreamProvider<Event>('loadedmetadata');
 
-  @DomName('SVGElement.mousedownEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseDownEvent =
       const EventStreamProvider<MouseEvent>('mousedown');
 
-  @DomName('SVGElement.mouseenterEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent =
       const EventStreamProvider<MouseEvent>('mouseenter');
 
-  @DomName('SVGElement.mouseleaveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent =
       const EventStreamProvider<MouseEvent>('mouseleave');
 
-  @DomName('SVGElement.mousemoveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseMoveEvent =
       const EventStreamProvider<MouseEvent>('mousemove');
 
-  @DomName('SVGElement.mouseoutEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseOutEvent =
       const EventStreamProvider<MouseEvent>('mouseout');
 
-  @DomName('SVGElement.mouseoverEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseOverEvent =
       const EventStreamProvider<MouseEvent>('mouseover');
 
-  @DomName('SVGElement.mouseupEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseUpEvent =
       const EventStreamProvider<MouseEvent>('mouseup');
 
-  @DomName('SVGElement.mousewheelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const EventStreamProvider<WheelEvent>('mousewheel');
 
-  @DomName('SVGElement.pauseEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> pauseEvent =
       const EventStreamProvider<Event>('pause');
 
-  @DomName('SVGElement.playEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> playEvent =
       const EventStreamProvider<Event>('play');
 
-  @DomName('SVGElement.playingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> playingEvent =
       const EventStreamProvider<Event>('playing');
 
-  @DomName('SVGElement.ratechangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> rateChangeEvent =
       const EventStreamProvider<Event>('ratechange');
 
-  @DomName('SVGElement.resetEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> resetEvent =
       const EventStreamProvider<Event>('reset');
 
-  @DomName('SVGElement.resizeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> resizeEvent =
       const EventStreamProvider<Event>('resize');
 
-  @DomName('SVGElement.scrollEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> scrollEvent =
       const EventStreamProvider<Event>('scroll');
 
-  @DomName('SVGElement.seekedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> seekedEvent =
       const EventStreamProvider<Event>('seeked');
 
-  @DomName('SVGElement.seekingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> seekingEvent =
       const EventStreamProvider<Event>('seeking');
 
-  @DomName('SVGElement.selectEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> selectEvent =
       const EventStreamProvider<Event>('select');
 
-  @DomName('SVGElement.stalledEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> stalledEvent =
       const EventStreamProvider<Event>('stalled');
 
-  @DomName('SVGElement.submitEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> submitEvent =
       const EventStreamProvider<Event>('submit');
 
-  @DomName('SVGElement.suspendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> suspendEvent =
       const EventStreamProvider<Event>('suspend');
 
-  @DomName('SVGElement.timeupdateEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> timeUpdateEvent =
       const EventStreamProvider<Event>('timeupdate');
 
-  @DomName('SVGElement.touchcancelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchCancelEvent =
       const EventStreamProvider<TouchEvent>('touchcancel');
 
-  @DomName('SVGElement.touchendEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchEndEvent =
       const EventStreamProvider<TouchEvent>('touchend');
 
-  @DomName('SVGElement.touchmoveEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchMoveEvent =
       const EventStreamProvider<TouchEvent>('touchmove');
 
-  @DomName('SVGElement.touchstartEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<TouchEvent> touchStartEvent =
       const EventStreamProvider<TouchEvent>('touchstart');
 
-  @DomName('SVGElement.volumechangeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> volumeChangeEvent =
       const EventStreamProvider<Event>('volumechange');
 
-  @DomName('SVGElement.waitingEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> waitingEvent =
       const EventStreamProvider<Event>('waiting');
 
-  @DomName('SVGElement.wheelEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<WheelEvent> wheelEvent =
       const EventStreamProvider<WheelEvent>('wheel');
   /**
@@ -4539,8 +3181,6 @@
   AnimatedString get _svgClassName => JS("AnimatedString", "#.className", this);
 
   @JSName('ownerSVGElement')
-  @DomName('SVGElement.ownerSVGElement')
-  @DocsEditable()
   final SvgSvgElement ownerSvgElement;
 
   // Use implementation from Element.
@@ -4549,326 +3189,143 @@
   // Use implementation from Element.
   // final int tabIndex;
 
-  @DomName('SVGElement.viewportElement')
-  @DocsEditable()
   final SvgElement viewportElement;
 
-  @DomName('SVGElement.blur')
-  @DocsEditable()
-  @Experimental() // untriaged
   void blur() native;
 
-  @DomName('SVGElement.focus')
-  @DocsEditable()
-  @Experimental() // untriaged
   void focus() native;
 
   // From NoncedElement
 
-  @DomName('SVGElement.nonce')
-  @DocsEditable()
-  @Experimental() // untriaged
   String nonce;
 
-  @DomName('SVGElement.onabort')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
-  @DomName('SVGElement.onblur')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
-  @DomName('SVGElement.oncanplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
-  @DomName('SVGElement.oncanplaythrough')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onCanPlayThrough =>
       canPlayThroughEvent.forElement(this);
 
-  @DomName('SVGElement.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onChange => changeEvent.forElement(this);
 
-  @DomName('SVGElement.onclick')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
-  @DomName('SVGElement.oncontextmenu')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onContextMenu =>
       contextMenuEvent.forElement(this);
 
-  @DomName('SVGElement.ondblclick')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
-  @DomName('SVGElement.ondrag')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
-  @DomName('SVGElement.ondragend')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
-  @DomName('SVGElement.ondragenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
-  @DomName('SVGElement.ondragleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
-  @DomName('SVGElement.ondragover')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
-  @DomName('SVGElement.ondragstart')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
-  @DomName('SVGElement.ondrop')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
-  @DomName('SVGElement.ondurationchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onDurationChange =>
       durationChangeEvent.forElement(this);
 
-  @DomName('SVGElement.onemptied')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
-  @DomName('SVGElement.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
-  @DomName('SVGElement.onerror')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
-  @DomName('SVGElement.onfocus')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
-  @DomName('SVGElement.oninput')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onInput => inputEvent.forElement(this);
 
-  @DomName('SVGElement.oninvalid')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
-  @DomName('SVGElement.onkeydown')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
-  @DomName('SVGElement.onkeypress')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
-  @DomName('SVGElement.onkeyup')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
-  @DomName('SVGElement.onload')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
-  @DomName('SVGElement.onloadeddata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
-  @DomName('SVGElement.onloadedmetadata')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onLoadedMetadata =>
       loadedMetadataEvent.forElement(this);
 
-  @DomName('SVGElement.onmousedown')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
 
-  @DomName('SVGElement.onmouseenter')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter =>
       mouseEnterEvent.forElement(this);
 
-  @DomName('SVGElement.onmouseleave')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave =>
       mouseLeaveEvent.forElement(this);
 
-  @DomName('SVGElement.onmousemove')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
-  @DomName('SVGElement.onmouseout')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
-  @DomName('SVGElement.onmouseover')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
-  @DomName('SVGElement.onmouseup')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
-  @DomName('SVGElement.onmousewheel')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<WheelEvent> get onMouseWheel =>
       mouseWheelEvent.forElement(this);
 
-  @DomName('SVGElement.onpause')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
-  @DomName('SVGElement.onplay')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlay => playEvent.forElement(this);
 
-  @DomName('SVGElement.onplaying')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
-  @DomName('SVGElement.onratechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
-  @DomName('SVGElement.onreset')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onReset => resetEvent.forElement(this);
 
-  @DomName('SVGElement.onresize')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
-  @DomName('SVGElement.onscroll')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
-  @DomName('SVGElement.onseeked')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
-  @DomName('SVGElement.onseeking')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
-  @DomName('SVGElement.onselect')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
-  @DomName('SVGElement.onstalled')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
-  @DomName('SVGElement.onsubmit')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
-  @DomName('SVGElement.onsuspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
-  @DomName('SVGElement.ontimeupdate')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
-  @DomName('SVGElement.ontouchcancel')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<TouchEvent> get onTouchCancel =>
       touchCancelEvent.forElement(this);
 
-  @DomName('SVGElement.ontouchend')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
-  @DomName('SVGElement.ontouchmove')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
-  @DomName('SVGElement.ontouchstart')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<TouchEvent> get onTouchStart =>
       touchStartEvent.forElement(this);
 
-  @DomName('SVGElement.onvolumechange')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
-  @DomName('SVGElement.onwaiting')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
-  @DomName('SVGElement.onwheel')
-  @DocsEditable()
-  @Experimental() // untriaged
   ElementStream<WheelEvent> get onWheel => wheelEvent.forElement(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('SVGSVGElement')
 @Unstable()
 @Native("SVGSVGElement")
 class SvgSvgElement extends GraphicsElement
@@ -4891,156 +3348,90 @@
    */
   SvgSvgElement.created() : super.created();
 
-  @DomName('SVGSVGElement.currentScale')
-  @DocsEditable()
   num currentScale;
 
-  @DomName('SVGSVGElement.currentTranslate')
-  @DocsEditable()
   final Point currentTranslate;
 
-  @DomName('SVGSVGElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGSVGElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGSVGElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGSVGElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 
-  @DomName('SVGSVGElement.animationsPaused')
-  @DocsEditable()
   bool animationsPaused() native;
 
-  @DomName('SVGSVGElement.checkEnclosure')
-  @DocsEditable()
   bool checkEnclosure(SvgElement element, Rect rect) native;
 
-  @DomName('SVGSVGElement.checkIntersection')
-  @DocsEditable()
   bool checkIntersection(SvgElement element, Rect rect) native;
 
   @JSName('createSVGAngle')
-  @DomName('SVGSVGElement.createSVGAngle')
-  @DocsEditable()
   Angle createSvgAngle() native;
 
   @JSName('createSVGLength')
-  @DomName('SVGSVGElement.createSVGLength')
-  @DocsEditable()
   Length createSvgLength() native;
 
   @JSName('createSVGMatrix')
-  @DomName('SVGSVGElement.createSVGMatrix')
-  @DocsEditable()
   Matrix createSvgMatrix() native;
 
   @JSName('createSVGNumber')
-  @DomName('SVGSVGElement.createSVGNumber')
-  @DocsEditable()
   Number createSvgNumber() native;
 
   @JSName('createSVGPoint')
-  @DomName('SVGSVGElement.createSVGPoint')
-  @DocsEditable()
   Point createSvgPoint() native;
 
   @JSName('createSVGRect')
-  @DomName('SVGSVGElement.createSVGRect')
-  @DocsEditable()
   Rect createSvgRect() native;
 
   @JSName('createSVGTransform')
-  @DomName('SVGSVGElement.createSVGTransform')
-  @DocsEditable()
   Transform createSvgTransform() native;
 
   @JSName('createSVGTransformFromMatrix')
-  @DomName('SVGSVGElement.createSVGTransformFromMatrix')
-  @DocsEditable()
   Transform createSvgTransformFromMatrix(Matrix matrix) native;
 
-  @DomName('SVGSVGElement.deselectAll')
-  @DocsEditable()
   void deselectAll() native;
 
-  @DomName('SVGSVGElement.forceRedraw')
-  @DocsEditable()
   void forceRedraw() native;
 
-  @DomName('SVGSVGElement.getCurrentTime')
-  @DocsEditable()
   double getCurrentTime() native;
 
-  @DomName('SVGSVGElement.getElementById')
-  @DocsEditable()
   Element getElementById(String elementId) native;
 
-  @DomName('SVGSVGElement.getEnclosureList')
-  @DocsEditable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native;
 
-  @DomName('SVGSVGElement.getIntersectionList')
-  @DocsEditable()
   @Returns('NodeList|Null')
   @Creates('NodeList')
   List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native;
 
-  @DomName('SVGSVGElement.pauseAnimations')
-  @DocsEditable()
   void pauseAnimations() native;
 
-  @DomName('SVGSVGElement.setCurrentTime')
-  @DocsEditable()
   void setCurrentTime(num seconds) native;
 
-  @DomName('SVGSVGElement.suspendRedraw')
-  @DocsEditable()
   int suspendRedraw(int maxWaitMilliseconds) native;
 
-  @DomName('SVGSVGElement.unpauseAnimations')
-  @DocsEditable()
   void unpauseAnimations() native;
 
-  @DomName('SVGSVGElement.unsuspendRedraw')
-  @DocsEditable()
   void unsuspendRedraw(int suspendHandleId) native;
 
-  @DomName('SVGSVGElement.unsuspendRedrawAll')
-  @DocsEditable()
   void unsuspendRedrawAll() native;
 
   // From SVGFitToViewBox
 
-  @DomName('SVGSVGElement.preserveAspectRatio')
-  @DocsEditable()
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  @DomName('SVGSVGElement.viewBox')
-  @DocsEditable()
   final AnimatedRect viewBox;
 
   // From SVGZoomAndPan
 
-  @DomName('SVGSVGElement.zoomAndPan')
-  @DocsEditable()
   int zoomAndPan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGSwitchElement')
 @Unstable()
 @Native("SVGSwitchElement")
 class SwitchElement extends GraphicsElement {
@@ -5049,8 +3440,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGSwitchElement.SVGSwitchElement')
-  @DocsEditable()
   factory SwitchElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("switch");
   /**
@@ -5064,8 +3453,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGSymbolElement')
 @Unstable()
 @Native("SVGSymbolElement")
 class SymbolElement extends SvgElement implements FitToViewBox {
@@ -5074,8 +3461,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGSymbolElement.SVGSymbolElement')
-  @DocsEditable()
   factory SymbolElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("symbol");
   /**
@@ -5087,20 +3472,14 @@
 
   // From SVGFitToViewBox
 
-  @DomName('SVGSymbolElement.preserveAspectRatio')
-  @DocsEditable()
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  @DomName('SVGSymbolElement.viewBox')
-  @DocsEditable()
   final AnimatedRect viewBox;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTSpanElement')
 @Unstable()
 @Native("SVGTSpanElement")
 class TSpanElement extends TextPositioningElement {
@@ -5109,8 +3488,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGTSpanElement.SVGTSpanElement')
-  @DocsEditable()
   factory TSpanElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("tspan");
   /**
@@ -5124,8 +3501,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTests')
 @Unstable()
 abstract class Tests extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -5141,8 +3516,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTextContentElement')
 @Unstable()
 @Native("SVGTextContentElement")
 class TextContentElement extends GraphicsElement {
@@ -5157,68 +3530,38 @@
    */
   TextContentElement.created() : super.created();
 
-  @DomName('SVGTextContentElement.LENGTHADJUST_SPACING')
-  @DocsEditable()
   static const int LENGTHADJUST_SPACING = 1;
 
-  @DomName('SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS')
-  @DocsEditable()
   static const int LENGTHADJUST_SPACINGANDGLYPHS = 2;
 
-  @DomName('SVGTextContentElement.LENGTHADJUST_UNKNOWN')
-  @DocsEditable()
   static const int LENGTHADJUST_UNKNOWN = 0;
 
-  @DomName('SVGTextContentElement.lengthAdjust')
-  @DocsEditable()
   final AnimatedEnumeration lengthAdjust;
 
-  @DomName('SVGTextContentElement.textLength')
-  @DocsEditable()
   final AnimatedLength textLength;
 
-  @DomName('SVGTextContentElement.getCharNumAtPosition')
-  @DocsEditable()
   int getCharNumAtPosition(Point point) native;
 
-  @DomName('SVGTextContentElement.getComputedTextLength')
-  @DocsEditable()
   double getComputedTextLength() native;
 
-  @DomName('SVGTextContentElement.getEndPositionOfChar')
-  @DocsEditable()
   Point getEndPositionOfChar(int charnum) native;
 
-  @DomName('SVGTextContentElement.getExtentOfChar')
-  @DocsEditable()
   Rect getExtentOfChar(int charnum) native;
 
-  @DomName('SVGTextContentElement.getNumberOfChars')
-  @DocsEditable()
   int getNumberOfChars() native;
 
-  @DomName('SVGTextContentElement.getRotationOfChar')
-  @DocsEditable()
   double getRotationOfChar(int charnum) native;
 
-  @DomName('SVGTextContentElement.getStartPositionOfChar')
-  @DocsEditable()
   Point getStartPositionOfChar(int charnum) native;
 
-  @DomName('SVGTextContentElement.getSubStringLength')
-  @DocsEditable()
   double getSubStringLength(int charnum, int nchars) native;
 
-  @DomName('SVGTextContentElement.selectSubString')
-  @DocsEditable()
   void selectSubString(int charnum, int nchars) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTextElement')
 @Unstable()
 @Native("SVGTextElement")
 class TextElement extends TextPositioningElement {
@@ -5227,8 +3570,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGTextElement.SVGTextElement')
-  @DocsEditable()
   factory TextElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("text");
   /**
@@ -5242,8 +3583,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTextPathElement')
 @Unstable()
 @Native("SVGTextPathElement")
 class TextPathElement extends TextContentElement implements UriReference {
@@ -5258,54 +3597,32 @@
    */
   TextPathElement.created() : super.created();
 
-  @DomName('SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN')
-  @DocsEditable()
   static const int TEXTPATH_METHODTYPE_ALIGN = 1;
 
-  @DomName('SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH')
-  @DocsEditable()
   static const int TEXTPATH_METHODTYPE_STRETCH = 2;
 
-  @DomName('SVGTextPathElement.TEXTPATH_METHODTYPE_UNKNOWN')
-  @DocsEditable()
   static const int TEXTPATH_METHODTYPE_UNKNOWN = 0;
 
-  @DomName('SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO')
-  @DocsEditable()
   static const int TEXTPATH_SPACINGTYPE_AUTO = 1;
 
-  @DomName('SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT')
-  @DocsEditable()
   static const int TEXTPATH_SPACINGTYPE_EXACT = 2;
 
-  @DomName('SVGTextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN')
-  @DocsEditable()
   static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
 
-  @DomName('SVGTextPathElement.method')
-  @DocsEditable()
   final AnimatedEnumeration method;
 
-  @DomName('SVGTextPathElement.spacing')
-  @DocsEditable()
   final AnimatedEnumeration spacing;
 
-  @DomName('SVGTextPathElement.startOffset')
-  @DocsEditable()
   final AnimatedLength startOffset;
 
   // From SVGURIReference
 
-  @DomName('SVGTextPathElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTextPositioningElement')
 @Unstable()
 @Native("SVGTextPositioningElement")
 class TextPositioningElement extends TextContentElement {
@@ -5320,32 +3637,20 @@
    */
   TextPositioningElement.created() : super.created();
 
-  @DomName('SVGTextPositioningElement.dx')
-  @DocsEditable()
   final AnimatedLengthList dx;
 
-  @DomName('SVGTextPositioningElement.dy')
-  @DocsEditable()
   final AnimatedLengthList dy;
 
-  @DomName('SVGTextPositioningElement.rotate')
-  @DocsEditable()
   final AnimatedNumberList rotate;
 
-  @DomName('SVGTextPositioningElement.x')
-  @DocsEditable()
   final AnimatedLengthList x;
 
-  @DomName('SVGTextPositioningElement.y')
-  @DocsEditable()
   final AnimatedLengthList y;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTitleElement')
 @Unstable()
 @Native("SVGTitleElement")
 class TitleElement extends SvgElement {
@@ -5354,8 +3659,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGTitleElement.SVGTitleElement')
-  @DocsEditable()
   factory TitleElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("title");
   /**
@@ -5369,8 +3672,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTransform')
 @Unstable()
 @Native("SVGTransform")
 class Transform extends Interceptor {
@@ -5379,76 +3680,42 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGTransform.SVG_TRANSFORM_MATRIX')
-  @DocsEditable()
   static const int SVG_TRANSFORM_MATRIX = 1;
 
-  @DomName('SVGTransform.SVG_TRANSFORM_ROTATE')
-  @DocsEditable()
   static const int SVG_TRANSFORM_ROTATE = 4;
 
-  @DomName('SVGTransform.SVG_TRANSFORM_SCALE')
-  @DocsEditable()
   static const int SVG_TRANSFORM_SCALE = 3;
 
-  @DomName('SVGTransform.SVG_TRANSFORM_SKEWX')
-  @DocsEditable()
   static const int SVG_TRANSFORM_SKEWX = 5;
 
-  @DomName('SVGTransform.SVG_TRANSFORM_SKEWY')
-  @DocsEditable()
   static const int SVG_TRANSFORM_SKEWY = 6;
 
-  @DomName('SVGTransform.SVG_TRANSFORM_TRANSLATE')
-  @DocsEditable()
   static const int SVG_TRANSFORM_TRANSLATE = 2;
 
-  @DomName('SVGTransform.SVG_TRANSFORM_UNKNOWN')
-  @DocsEditable()
   static const int SVG_TRANSFORM_UNKNOWN = 0;
 
-  @DomName('SVGTransform.angle')
-  @DocsEditable()
   final num angle;
 
-  @DomName('SVGTransform.matrix')
-  @DocsEditable()
   final Matrix matrix;
 
-  @DomName('SVGTransform.type')
-  @DocsEditable()
   final int type;
 
-  @DomName('SVGTransform.setMatrix')
-  @DocsEditable()
   void setMatrix(Matrix matrix) native;
 
-  @DomName('SVGTransform.setRotate')
-  @DocsEditable()
   void setRotate(num angle, num cx, num cy) native;
 
-  @DomName('SVGTransform.setScale')
-  @DocsEditable()
   void setScale(num sx, num sy) native;
 
-  @DomName('SVGTransform.setSkewX')
-  @DocsEditable()
   void setSkewX(num angle) native;
 
-  @DomName('SVGTransform.setSkewY')
-  @DocsEditable()
   void setSkewY(num angle) native;
 
-  @DomName('SVGTransform.setTranslate')
-  @DocsEditable()
   void setTranslate(num tx, num ty) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGTransformList')
 @Unstable()
 @Native("SVGTransformList")
 class TransformList extends Interceptor
@@ -5459,13 +3726,8 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGTransformList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   int get length => JS("int", "#.length", this);
 
-  @DomName('SVGTransformList.numberOfItems')
-  @DocsEditable()
   final int numberOfItems;
 
   Transform operator [](int index) {
@@ -5511,54 +3773,31 @@
   Transform elementAt(int index) => this[index];
   // -- end List<Transform> mixins.
 
-  @DomName('SVGTransformList.__setter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   void __setter__(int index, Transform newItem) native;
 
-  @DomName('SVGTransformList.appendItem')
-  @DocsEditable()
   Transform appendItem(Transform newItem) native;
 
-  @DomName('SVGTransformList.clear')
-  @DocsEditable()
   void clear() native;
 
-  @DomName('SVGTransformList.consolidate')
-  @DocsEditable()
   Transform consolidate() native;
 
   @JSName('createSVGTransformFromMatrix')
-  @DomName('SVGTransformList.createSVGTransformFromMatrix')
-  @DocsEditable()
   Transform createSvgTransformFromMatrix(Matrix matrix) native;
 
-  @DomName('SVGTransformList.getItem')
-  @DocsEditable()
   Transform getItem(int index) native;
 
-  @DomName('SVGTransformList.initialize')
-  @DocsEditable()
   Transform initialize(Transform newItem) native;
 
-  @DomName('SVGTransformList.insertItemBefore')
-  @DocsEditable()
   Transform insertItemBefore(Transform newItem, int index) native;
 
-  @DomName('SVGTransformList.removeItem')
-  @DocsEditable()
   Transform removeItem(int index) native;
 
-  @DomName('SVGTransformList.replaceItem')
-  @DocsEditable()
   Transform replaceItem(Transform newItem, int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGUnitTypes')
 @Unstable()
 @Native("SVGUnitTypes")
 class UnitTypes extends Interceptor {
@@ -5567,24 +3806,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX')
-  @DocsEditable()
   static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
 
-  @DomName('SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN')
-  @DocsEditable()
   static const int SVG_UNIT_TYPE_UNKNOWN = 0;
 
-  @DomName('SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE')
-  @DocsEditable()
   static const int SVG_UNIT_TYPE_USERSPACEONUSE = 1;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGURIReference')
 @Unstable()
 abstract class UriReference extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -5598,8 +3829,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGUseElement')
 @Unstable()
 @Native("SVGUseElement")
 class UseElement extends GraphicsElement implements UriReference {
@@ -5608,8 +3837,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGUseElement.SVGUseElement')
-  @DocsEditable()
   factory UseElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("use");
   /**
@@ -5619,34 +3846,22 @@
    */
   UseElement.created() : super.created();
 
-  @DomName('SVGUseElement.height')
-  @DocsEditable()
   final AnimatedLength height;
 
-  @DomName('SVGUseElement.width')
-  @DocsEditable()
   final AnimatedLength width;
 
-  @DomName('SVGUseElement.x')
-  @DocsEditable()
   final AnimatedLength x;
 
-  @DomName('SVGUseElement.y')
-  @DocsEditable()
   final AnimatedLength y;
 
   // From SVGURIReference
 
-  @DomName('SVGUseElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGViewElement')
 @Unstable()
 @Native("SVGViewElement")
 class ViewElement extends SvgElement implements FitToViewBox, ZoomAndPan {
@@ -5655,8 +3870,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGViewElement.SVGViewElement')
-  @DocsEditable()
   factory ViewElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("view");
   /**
@@ -5668,26 +3881,18 @@
 
   // From SVGFitToViewBox
 
-  @DomName('SVGViewElement.preserveAspectRatio')
-  @DocsEditable()
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
-  @DomName('SVGViewElement.viewBox')
-  @DocsEditable()
   final AnimatedRect viewBox;
 
   // From SVGZoomAndPan
 
-  @DomName('SVGViewElement.zoomAndPan')
-  @DocsEditable()
   int zoomAndPan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGZoomAndPan')
 @Unstable()
 abstract class ZoomAndPan extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -5695,16 +3900,10 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE')
-  @DocsEditable()
   static const int SVG_ZOOMANDPAN_DISABLE = 1;
 
-  @DomName('SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY')
-  @DocsEditable()
   static const int SVG_ZOOMANDPAN_MAGNIFY = 2;
 
-  @DomName('SVGZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN')
-  @DocsEditable()
   static const int SVG_ZOOMANDPAN_UNKNOWN = 0;
 
   int zoomAndPan;
@@ -5713,8 +3912,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGGradientElement')
 @Unstable()
 @Native("SVGGradientElement")
 class _GradientElement extends SvgElement implements UriReference {
@@ -5729,46 +3926,28 @@
    */
   _GradientElement.created() : super.created();
 
-  @DomName('SVGGradientElement.SVG_SPREADMETHOD_PAD')
-  @DocsEditable()
   static const int SVG_SPREADMETHOD_PAD = 1;
 
-  @DomName('SVGGradientElement.SVG_SPREADMETHOD_REFLECT')
-  @DocsEditable()
   static const int SVG_SPREADMETHOD_REFLECT = 2;
 
-  @DomName('SVGGradientElement.SVG_SPREADMETHOD_REPEAT')
-  @DocsEditable()
   static const int SVG_SPREADMETHOD_REPEAT = 3;
 
-  @DomName('SVGGradientElement.SVG_SPREADMETHOD_UNKNOWN')
-  @DocsEditable()
   static const int SVG_SPREADMETHOD_UNKNOWN = 0;
 
-  @DomName('SVGGradientElement.gradientTransform')
-  @DocsEditable()
   final AnimatedTransformList gradientTransform;
 
-  @DomName('SVGGradientElement.gradientUnits')
-  @DocsEditable()
   final AnimatedEnumeration gradientUnits;
 
-  @DomName('SVGGradientElement.spreadMethod')
-  @DocsEditable()
   final AnimatedEnumeration spreadMethod;
 
   // From SVGURIReference
 
-  @DomName('SVGGradientElement.href')
-  @DocsEditable()
   final AnimatedString href;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGComponentTransferFunctionElement')
 @Unstable()
 @Native("SVGComponentTransferFunctionElement")
 abstract class _SVGComponentTransferFunctionElement extends SvgElement {
@@ -5787,9 +3966,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGFEDropShadowElement')
-@Experimental() // nonstandard
 @Native("SVGFEDropShadowElement")
 abstract class _SVGFEDropShadowElement extends SvgElement
     implements FilterPrimitiveStandardAttributes {
@@ -5812,8 +3988,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SVGMPathElement')
 @Native("SVGMPathElement")
 abstract class _SVGMPathElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
@@ -5821,8 +3995,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SVGMPathElement.SVGMPathElement')
-  @DocsEditable()
   factory _SVGMPathElement() =>
       _SvgElementFactoryProvider.createSvgElement_tag("mpath");
   /**
diff --git a/sdk/lib/vmservice/running_isolates.dart b/sdk/lib/vmservice/running_isolates.dart
index 1b44ee3..4ef37d1 100644
--- a/sdk/lib/vmservice/running_isolates.dart
+++ b/sdk/lib/vmservice/running_isolates.dart
@@ -59,7 +59,7 @@
       return message.response;
     }
 
-    if (message.method == 'evaluateInFrame') {
+    if (message.method == 'evaluateInFrame' || message.method == 'evaluate') {
       return new _Evaluator(message, isolate, service).run();
     } else {
       return isolate.routeRequest(service, message);
@@ -76,12 +76,18 @@
 
   Future<Response> run() async {
     Response buildScopeResponse = await _buildScope();
-    dynamic responseJson = buildScopeResponse.decodeJson();
+    Map<String, dynamic> responseJson = buildScopeResponse.decodeJson();
+
+    if (responseJson.containsKey('error')) {
+      return new Response.from(encodeCompilationError(
+          _message, responseJson['error']['data']['details']));
+    }
+
     String kernelBase64;
     try {
       kernelBase64 = await _compileExpression(responseJson['result']);
     } catch (e) {
-      return Response.from(encodeCompilationError(_message, e.toString()));
+      return new Response.from(encodeCompilationError(_message, e.toString()));
     }
     return _evaluateCompiledExpression(kernelBase64);
   }
@@ -91,13 +97,12 @@
   VMService _service;
 
   Future<Response> _buildScope() {
+    Map<String, dynamic> params = _setupParams();
+    params['isolateId'] = _message.params['isolateId'];
     Map buildScopeParams = {
       'method': '_buildExpressionEvaluationScope',
       'id': _message.serial,
-      'params': {
-        'isolateId': _message.params['isolateId'],
-        'frameIndex': _message.params['frameIndex'],
-      },
+      'params': params,
     };
     if (_message.params['scope'] != null) {
       buildScopeParams['params']['scope'] = _message.params['scope'];
@@ -173,14 +178,13 @@
 
   Future<Response> _evaluateCompiledExpression(String kernelBase64) {
     if (kernelBase64.isNotEmpty) {
+      Map<String, dynamic> params = _setupParams();
+      params['isolateId'] = _message.params['isolateId'];
+      params['kernelBytes'] = kernelBase64;
       Map runParams = {
         'method': '_evaluateCompiledExpression',
         'id': _message.serial,
-        'params': {
-          'isolateId': _message.params['isolateId'],
-          'frameIndex': _message.params['frameIndex'],
-          'kernelBytes': kernelBase64,
-        },
+        'params': params,
       };
       if (_message.params['scope'] != null) {
         runParams['params']['scope'] = _message.params['scope'];
@@ -193,4 +197,13 @@
       return _isolate.routeRequest(_service, _message);
     }
   }
+
+  Map<String, dynamic> _setupParams() {
+    if (_message.method == 'evaluateInFrame') {
+      return <String, dynamic>{'frameIndex': _message.params['frameIndex']};
+    } else {
+      assert(_message.method == 'evaluate');
+      return <String, dynamic>{'targetId': _message.params['targetId']};
+    }
+  }
 }
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index c12fe76..4ded0e1 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -31,10 +31,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AnalyserNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode
-@Experimental()
 @Native("AnalyserNode,RealtimeAnalyserNode")
 class AnalyserNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -42,8 +38,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AnalyserNode.AnalyserNode')
-  @DocsEditable()
   factory AnalyserNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -56,51 +50,28 @@
   static AnalyserNode _create_2(context) =>
       JS('AnalyserNode', 'new AnalyserNode(#)', context);
 
-  @DomName('AnalyserNode.fftSize')
-  @DocsEditable()
   int fftSize;
 
-  @DomName('AnalyserNode.frequencyBinCount')
-  @DocsEditable()
   final int frequencyBinCount;
 
-  @DomName('AnalyserNode.maxDecibels')
-  @DocsEditable()
   num maxDecibels;
 
-  @DomName('AnalyserNode.minDecibels')
-  @DocsEditable()
   num minDecibels;
 
-  @DomName('AnalyserNode.smoothingTimeConstant')
-  @DocsEditable()
   num smoothingTimeConstant;
 
-  @DomName('AnalyserNode.getByteFrequencyData')
-  @DocsEditable()
   void getByteFrequencyData(Uint8List array) native;
 
-  @DomName('AnalyserNode.getByteTimeDomainData')
-  @DocsEditable()
   void getByteTimeDomainData(Uint8List array) native;
 
-  @DomName('AnalyserNode.getFloatFrequencyData')
-  @DocsEditable()
   void getFloatFrequencyData(Float32List array) native;
 
-  @DomName('AnalyserNode.getFloatTimeDomainData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void getFloatTimeDomainData(Float32List array) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioBuffer')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
-@Experimental()
 @Native("AudioBuffer")
 class AudioBuffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -108,8 +79,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioBuffer.AudioBuffer')
-  @DocsEditable()
   factory AudioBuffer(Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     return AudioBuffer._create_1(options_1);
@@ -117,48 +86,28 @@
   static AudioBuffer _create_1(options) =>
       JS('AudioBuffer', 'new AudioBuffer(#)', options);
 
-  @DomName('AudioBuffer.duration')
-  @DocsEditable()
   final num duration;
 
-  @DomName('AudioBuffer.length')
-  @DocsEditable()
   final int length;
 
-  @DomName('AudioBuffer.numberOfChannels')
-  @DocsEditable()
   final int numberOfChannels;
 
-  @DomName('AudioBuffer.sampleRate')
-  @DocsEditable()
   final num sampleRate;
 
-  @DomName('AudioBuffer.copyFromChannel')
-  @DocsEditable()
-  @Experimental() // untriaged
   void copyFromChannel(Float32List destination, int channelNumber,
       [int startInChannel]) native;
 
-  @DomName('AudioBuffer.copyToChannel')
-  @DocsEditable()
-  @Experimental() // untriaged
   void copyToChannel(Float32List source, int channelNumber,
       [int startInChannel]) native;
 
-  @DomName('AudioBuffer.getChannelData')
-  @DocsEditable()
   Float32List getChannelData(int channelIndex) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioBufferSourceNode')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
-@Experimental()
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
 @Native("AudioBufferSourceNode")
 class AudioBufferSourceNode extends AudioScheduledSourceNode {
   // To suppress missing implicit constructor warnings.
@@ -166,8 +115,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioBufferSourceNode.AudioBufferSourceNode')
-  @DocsEditable()
   factory AudioBufferSourceNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -183,44 +130,26 @@
   static AudioBufferSourceNode _create_2(context) =>
       JS('AudioBufferSourceNode', 'new AudioBufferSourceNode(#)', context);
 
-  @DomName('AudioBufferSourceNode.buffer')
-  @DocsEditable()
   AudioBuffer buffer;
 
-  @DomName('AudioBufferSourceNode.detune')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam detune;
 
-  @DomName('AudioBufferSourceNode.loop')
-  @DocsEditable()
   bool loop;
 
-  @DomName('AudioBufferSourceNode.loopEnd')
-  @DocsEditable()
   num loopEnd;
 
-  @DomName('AudioBufferSourceNode.loopStart')
-  @DocsEditable()
   num loopStart;
 
-  @DomName('AudioBufferSourceNode.playbackRate')
-  @DocsEditable()
   final AudioParam playbackRate;
 
-  @DomName('AudioBufferSourceNode.start')
-  @DocsEditable()
   void start([num when, num grainOffset, num grainDuration]) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('AudioContext')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
-@Experimental()
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
 @Native("AudioContext,webkitAudioContext")
 class AudioContext extends BaseAudioContext {
   // To suppress missing implicit constructor warnings.
@@ -232,32 +161,17 @@
   static bool get supported =>
       JS('bool', '!!(window.AudioContext || window.webkitAudioContext)');
 
-  @DomName('AudioContext.baseLatency')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num baseLatency;
 
-  @DomName('AudioContext.close')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future close() => promiseToFuture(JS("", "#.close()", this));
 
-  @DomName('AudioContext.getOutputTimestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getOutputTimestamp() {
     return convertNativeToDart_Dictionary(_getOutputTimestamp_1());
   }
 
   @JSName('getOutputTimestamp')
-  @DomName('AudioContext.getOutputTimestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getOutputTimestamp_1() native;
 
-  @DomName('AudioContext.suspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future suspend() => promiseToFuture(JS("", "#.suspend()", this));
 
   factory AudioContext() => JS('AudioContext',
@@ -294,13 +208,10 @@
   }
 
   @JSName('decodeAudioData')
-  @DomName('AudioContext.decodeAudioData')
-  @DocsEditable()
   Future _decodeAudioData(ByteBuffer audioData,
       [DecodeSuccessCallback successCallback,
       DecodeErrorCallback errorCallback]) native;
 
-  @DomName('AudioContext.decodeAudioData')
   Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
       [DecodeSuccessCallback successCallback,
       DecodeErrorCallback errorCallback]) {
@@ -325,10 +236,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioDestinationNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioDestinationNode-section
-@Experimental()
 @Native("AudioDestinationNode")
 class AudioDestinationNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -336,18 +243,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioDestinationNode.maxChannelCount')
-  @DocsEditable()
   final int maxChannelCount;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioListener')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioListener-section
-@Experimental()
 @Native("AudioListener")
 class AudioListener extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -355,66 +256,32 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioListener.forwardX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam forwardX;
 
-  @DomName('AudioListener.forwardY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam forwardY;
 
-  @DomName('AudioListener.forwardZ')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam forwardZ;
 
-  @DomName('AudioListener.positionX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam positionX;
 
-  @DomName('AudioListener.positionY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam positionY;
 
-  @DomName('AudioListener.positionZ')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam positionZ;
 
-  @DomName('AudioListener.upX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam upX;
 
-  @DomName('AudioListener.upY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam upY;
 
-  @DomName('AudioListener.upZ')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam upZ;
 
-  @DomName('AudioListener.setOrientation')
-  @DocsEditable()
   void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
 
-  @DomName('AudioListener.setPosition')
-  @DocsEditable()
   void setPosition(num x, num y, num z) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('AudioNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioNode-section
-@Experimental()
 @Native("AudioNode")
 class AudioNode extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -422,45 +289,27 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioNode.channelCount')
-  @DocsEditable()
   int channelCount;
 
-  @DomName('AudioNode.channelCountMode')
-  @DocsEditable()
   String channelCountMode;
 
-  @DomName('AudioNode.channelInterpretation')
-  @DocsEditable()
   String channelInterpretation;
 
-  @DomName('AudioNode.context')
-  @DocsEditable()
   final BaseAudioContext context;
 
-  @DomName('AudioNode.numberOfInputs')
-  @DocsEditable()
   final int numberOfInputs;
 
-  @DomName('AudioNode.numberOfOutputs')
-  @DocsEditable()
   final int numberOfOutputs;
 
   @JSName('connect')
-  @DomName('AudioNode.connect')
-  @DocsEditable()
   AudioNode _connect(destination, [int output, int input]) native;
 
-  @DomName('AudioNode.disconnect')
-  @DocsEditable()
   void disconnect([destination_OR_output, int output, int input]) native;
 
-  @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) {
     _connect(destination, output, input);
   }
 
-  @DomName('AudioNode.connect')
   void connectParam(AudioParam destination, [int output = 0]) {
     _connect(destination, output);
   }
@@ -469,10 +318,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioParam')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioParam
-@Experimental()
 @Native("AudioParam")
 class AudioParam extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -480,49 +325,26 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioParam.defaultValue')
-  @DocsEditable()
   final num defaultValue;
 
-  @DomName('AudioParam.maxValue')
-  @DocsEditable()
   final num maxValue;
 
-  @DomName('AudioParam.minValue')
-  @DocsEditable()
   final num minValue;
 
-  @DomName('AudioParam.value')
-  @DocsEditable()
   num value;
 
-  @DomName('AudioParam.cancelAndHoldAtTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   AudioParam cancelAndHoldAtTime(num startTime) native;
 
-  @DomName('AudioParam.cancelScheduledValues')
-  @DocsEditable()
   AudioParam cancelScheduledValues(num startTime) native;
 
-  @DomName('AudioParam.exponentialRampToValueAtTime')
-  @DocsEditable()
   AudioParam exponentialRampToValueAtTime(num value, num time) native;
 
-  @DomName('AudioParam.linearRampToValueAtTime')
-  @DocsEditable()
   AudioParam linearRampToValueAtTime(num value, num time) native;
 
-  @DomName('AudioParam.setTargetAtTime')
-  @DocsEditable()
   AudioParam setTargetAtTime(num target, num time, num timeConstant) native;
 
-  @DomName('AudioParam.setValueAtTime')
-  @DocsEditable()
   AudioParam setValueAtTime(num value, num time) native;
 
-  @DomName('AudioParam.setValueCurveAtTime')
-  @DocsEditable()
   AudioParam setValueCurveAtTime(List<num> values, num time, num duration)
       native;
 }
@@ -530,9 +352,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioParamMap')
-@Experimental() // untriaged
 @Native("AudioParamMap")
 class AudioParamMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
@@ -601,10 +420,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioProcessingEvent')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent-section
-@Experimental()
 @Native("AudioProcessingEvent")
 class AudioProcessingEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -612,8 +427,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioProcessingEvent.AudioProcessingEvent')
-  @DocsEditable()
   factory AudioProcessingEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return AudioProcessingEvent._create_1(type, eventInitDict_1);
@@ -624,26 +437,16 @@
       type,
       eventInitDict);
 
-  @DomName('AudioProcessingEvent.inputBuffer')
-  @DocsEditable()
   final AudioBuffer inputBuffer;
 
-  @DomName('AudioProcessingEvent.outputBuffer')
-  @DocsEditable()
   final AudioBuffer outputBuffer;
 
-  @DomName('AudioProcessingEvent.playbackTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num playbackTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioScheduledSourceNode')
-@Experimental() // untriaged
 @Native("AudioScheduledSourceNode")
 class AudioScheduledSourceNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -651,35 +454,20 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioScheduledSourceNode.endedEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent =
       const EventStreamProvider<Event>('ended');
 
   @JSName('start')
-  @DomName('AudioScheduledSourceNode.start')
-  @DocsEditable()
-  @Experimental() // untriaged
   void start2([num when]) native;
 
-  @DomName('AudioScheduledSourceNode.stop')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stop([num when]) native;
 
-  @DomName('AudioScheduledSourceNode.onended')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioTrack')
-@Experimental() // untriaged
 @Native("AudioTrack")
 class AudioTrack extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -687,43 +475,22 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioTrack.enabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool enabled;
 
-  @DomName('AudioTrack.id')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String id;
 
-  @DomName('AudioTrack.kind')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String kind;
 
-  @DomName('AudioTrack.label')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String label;
 
-  @DomName('AudioTrack.language')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String language;
 
-  @DomName('AudioTrack.sourceBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   final SourceBuffer sourceBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioTrackList')
-@Experimental() // untriaged
 @Native("AudioTrackList")
 class AudioTrackList extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -731,39 +498,21 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioTrackList.changeEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent =
       const EventStreamProvider<Event>('change');
 
-  @DomName('AudioTrackList.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int length;
 
-  @DomName('AudioTrackList.__getter__')
-  @DocsEditable()
-  @Experimental() // untriaged
   AudioTrack __getter__(int index) native;
 
-  @DomName('AudioTrackList.getTrackById')
-  @DocsEditable()
-  @Experimental() // untriaged
   AudioTrack getTrackById(String id) native;
 
-  @DomName('AudioTrackList.onchange')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<Event> get onChange => changeEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioWorkletGlobalScope')
-@Experimental() // untriaged
 @Native("AudioWorkletGlobalScope")
 class AudioWorkletGlobalScope extends WorkletGlobalScope {
   // To suppress missing implicit constructor warnings.
@@ -771,28 +520,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioWorkletGlobalScope.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num currentTime;
 
-  @DomName('AudioWorkletGlobalScope.sampleRate')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num sampleRate;
 
-  @DomName('AudioWorkletGlobalScope.registerProcessor')
-  @DocsEditable()
-  @Experimental() // untriaged
   void registerProcessor(String name, Object processorConstructor) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioWorkletNode')
-@Experimental() // untriaged
 @Native("AudioWorkletNode")
 class AudioWorkletNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -800,8 +537,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('AudioWorkletNode.AudioWorkletNode')
-  @DocsEditable()
   factory AudioWorkletNode(BaseAudioContext context, String name,
       [Map options]) {
     if (options != null) {
@@ -819,18 +554,12 @@
   static AudioWorkletNode _create_2(context, name) =>
       JS('AudioWorkletNode', 'new AudioWorkletNode(#,#)', context, name);
 
-  @DomName('AudioWorkletNode.parameters')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParamMap parameters;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('AudioWorkletProcessor')
-@Experimental() // untriaged
 @Native("AudioWorkletProcessor")
 class AudioWorkletProcessor extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -842,9 +571,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BaseAudioContext')
-@Experimental() // untriaged
 @Native("BaseAudioContext")
 class BaseAudioContext extends EventTarget {
   // To suppress missing implicit constructor warnings.
@@ -852,124 +578,55 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BaseAudioContext.currentTime')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num currentTime;
 
-  @DomName('BaseAudioContext.destination')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioDestinationNode destination;
 
-  @DomName('BaseAudioContext.listener')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioListener listener;
 
-  @DomName('BaseAudioContext.sampleRate')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num sampleRate;
 
-  @DomName('BaseAudioContext.state')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String state;
 
-  @DomName('BaseAudioContext.createAnalyser')
-  @DocsEditable()
-  @Experimental() // untriaged
   AnalyserNode createAnalyser() native;
 
-  @DomName('BaseAudioContext.createBiquadFilter')
-  @DocsEditable()
-  @Experimental() // untriaged
   BiquadFilterNode createBiquadFilter() native;
 
-  @DomName('BaseAudioContext.createBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   AudioBuffer createBuffer(
       int numberOfChannels, int numberOfFrames, num sampleRate) native;
 
-  @DomName('BaseAudioContext.createBufferSource')
-  @DocsEditable()
-  @Experimental() // untriaged
   AudioBufferSourceNode createBufferSource() native;
 
-  @DomName('BaseAudioContext.createChannelMerger')
-  @DocsEditable()
-  @Experimental() // untriaged
   ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
 
-  @DomName('BaseAudioContext.createChannelSplitter')
-  @DocsEditable()
-  @Experimental() // untriaged
   ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
 
-  @DomName('BaseAudioContext.createConstantSource')
-  @DocsEditable()
-  @Experimental() // untriaged
   ConstantSourceNode createConstantSource() native;
 
-  @DomName('BaseAudioContext.createConvolver')
-  @DocsEditable()
-  @Experimental() // untriaged
   ConvolverNode createConvolver() native;
 
-  @DomName('BaseAudioContext.createDelay')
-  @DocsEditable()
-  @Experimental() // untriaged
   DelayNode createDelay([num maxDelayTime]) native;
 
-  @DomName('BaseAudioContext.createDynamicsCompressor')
-  @DocsEditable()
-  @Experimental() // untriaged
   DynamicsCompressorNode createDynamicsCompressor() native;
 
-  @DomName('BaseAudioContext.createGain')
-  @DocsEditable()
-  @Experimental() // untriaged
   GainNode createGain() native;
 
   @JSName('createIIRFilter')
-  @DomName('BaseAudioContext.createIIRFilter')
-  @DocsEditable()
-  @Experimental() // untriaged
   IirFilterNode createIirFilter(List<num> feedForward, List<num> feedBack)
       native;
 
-  @DomName('BaseAudioContext.createMediaElementSource')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaElementAudioSourceNode createMediaElementSource(
       MediaElement mediaElement) native;
 
-  @DomName('BaseAudioContext.createMediaStreamDestination')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStreamAudioDestinationNode createMediaStreamDestination() native;
 
-  @DomName('BaseAudioContext.createMediaStreamSource')
-  @DocsEditable()
-  @Experimental() // untriaged
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream)
       native;
 
-  @DomName('BaseAudioContext.createOscillator')
-  @DocsEditable()
-  @Experimental() // untriaged
   OscillatorNode createOscillator() native;
 
-  @DomName('BaseAudioContext.createPanner')
-  @DocsEditable()
-  @Experimental() // untriaged
   PannerNode createPanner() native;
 
-  @DomName('BaseAudioContext.createPeriodicWave')
-  @DocsEditable()
-  @Experimental() // untriaged
   PeriodicWave createPeriodicWave(List<num> real, List<num> imag,
       [Map options]) {
     if (options != null) {
@@ -980,57 +637,32 @@
   }
 
   @JSName('createPeriodicWave')
-  @DomName('BaseAudioContext.createPeriodicWave')
-  @DocsEditable()
-  @Experimental() // untriaged
   PeriodicWave _createPeriodicWave_1(List<num> real, List<num> imag, options)
       native;
   @JSName('createPeriodicWave')
-  @DomName('BaseAudioContext.createPeriodicWave')
-  @DocsEditable()
-  @Experimental() // untriaged
   PeriodicWave _createPeriodicWave_2(List<num> real, List<num> imag) native;
 
-  @DomName('BaseAudioContext.createScriptProcessor')
-  @DocsEditable()
-  @Experimental() // untriaged
   ScriptProcessorNode createScriptProcessor(
       [int bufferSize,
       int numberOfInputChannels,
       int numberOfOutputChannels]) native;
 
-  @DomName('BaseAudioContext.createStereoPanner')
-  @DocsEditable()
-  @Experimental() // untriaged
   StereoPannerNode createStereoPanner() native;
 
-  @DomName('BaseAudioContext.createWaveShaper')
-  @DocsEditable()
-  @Experimental() // untriaged
   WaveShaperNode createWaveShaper() native;
 
-  @DomName('BaseAudioContext.decodeAudioData')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
           [DecodeSuccessCallback successCallback,
           DecodeErrorCallback errorCallback]) =>
       promiseToFuture<AudioBuffer>(JS("", "#.decodeAudioData(#, #, #)", this,
           audioData, successCallback, errorCallback));
 
-  @DomName('BaseAudioContext.resume')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future resume() => promiseToFuture(JS("", "#.resume()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('BiquadFilterNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section
-@Experimental()
 @Native("BiquadFilterNode")
 class BiquadFilterNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1038,8 +670,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('BiquadFilterNode.BiquadFilterNode')
-  @DocsEditable()
   factory BiquadFilterNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1052,28 +682,16 @@
   static BiquadFilterNode _create_2(context) =>
       JS('BiquadFilterNode', 'new BiquadFilterNode(#)', context);
 
-  @DomName('BiquadFilterNode.Q')
-  @DocsEditable()
   final AudioParam Q;
 
-  @DomName('BiquadFilterNode.detune')
-  @DocsEditable()
   final AudioParam detune;
 
-  @DomName('BiquadFilterNode.frequency')
-  @DocsEditable()
   final AudioParam frequency;
 
-  @DomName('BiquadFilterNode.gain')
-  @DocsEditable()
   final AudioParam gain;
 
-  @DomName('BiquadFilterNode.type')
-  @DocsEditable()
   String type;
 
-  @DomName('BiquadFilterNode.getFrequencyResponse')
-  @DocsEditable()
   void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse,
       Float32List phaseResponse) native;
 }
@@ -1081,10 +699,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ChannelMergerNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelMergerNode-section
-@Experimental()
 @Native("ChannelMergerNode,AudioChannelMerger")
 class ChannelMergerNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1092,8 +706,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ChannelMergerNode.ChannelMergerNode')
-  @DocsEditable()
   factory ChannelMergerNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1110,10 +722,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ChannelSplitterNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelSplitterNode-section
-@Experimental()
 @Native("ChannelSplitterNode,AudioChannelSplitter")
 class ChannelSplitterNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1121,8 +729,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ChannelSplitterNode.ChannelSplitterNode')
-  @DocsEditable()
   factory ChannelSplitterNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1139,9 +745,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ConstantSourceNode')
-@Experimental() // untriaged
 @Native("ConstantSourceNode")
 class ConstantSourceNode extends AudioScheduledSourceNode {
   // To suppress missing implicit constructor warnings.
@@ -1149,8 +752,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ConstantSourceNode.ConstantSourceNode')
-  @DocsEditable()
   factory ConstantSourceNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1163,19 +764,12 @@
   static ConstantSourceNode _create_2(context) =>
       JS('ConstantSourceNode', 'new ConstantSourceNode(#)', context);
 
-  @DomName('ConstantSourceNode.offset')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam offset;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ConvolverNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ConvolverNode
-@Experimental()
 @Native("ConvolverNode")
 class ConvolverNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1183,8 +777,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ConvolverNode.ConvolverNode')
-  @DocsEditable()
   factory ConvolverNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1197,22 +789,14 @@
   static ConvolverNode _create_2(context) =>
       JS('ConvolverNode', 'new ConvolverNode(#)', context);
 
-  @DomName('ConvolverNode.buffer')
-  @DocsEditable()
   AudioBuffer buffer;
 
-  @DomName('ConvolverNode.normalize')
-  @DocsEditable()
   bool normalize;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DelayNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DelayNode
-@Experimental()
 @Native("DelayNode")
 class DelayNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1220,8 +804,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DelayNode.DelayNode')
-  @DocsEditable()
   factory DelayNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1234,18 +816,12 @@
   static DelayNode _create_2(context) =>
       JS('DelayNode', 'new DelayNode(#)', context);
 
-  @DomName('DelayNode.delayTime')
-  @DocsEditable()
   final AudioParam delayTime;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('DynamicsCompressorNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DynamicsCompressorNode
-@Experimental()
 @Native("DynamicsCompressorNode")
 class DynamicsCompressorNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1253,8 +829,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('DynamicsCompressorNode.DynamicsCompressorNode')
-  @DocsEditable()
   factory DynamicsCompressorNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1270,38 +844,22 @@
   static DynamicsCompressorNode _create_2(context) =>
       JS('DynamicsCompressorNode', 'new DynamicsCompressorNode(#)', context);
 
-  @DomName('DynamicsCompressorNode.attack')
-  @DocsEditable()
   final AudioParam attack;
 
-  @DomName('DynamicsCompressorNode.knee')
-  @DocsEditable()
   final AudioParam knee;
 
-  @DomName('DynamicsCompressorNode.ratio')
-  @DocsEditable()
   final AudioParam ratio;
 
-  @DomName('DynamicsCompressorNode.reduction')
-  @DocsEditable()
   final num reduction;
 
-  @DomName('DynamicsCompressorNode.release')
-  @DocsEditable()
   final AudioParam release;
 
-  @DomName('DynamicsCompressorNode.threshold')
-  @DocsEditable()
   final AudioParam threshold;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('GainNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode
-@Experimental()
 @Native("GainNode,AudioGainNode")
 class GainNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1309,8 +867,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('GainNode.GainNode')
-  @DocsEditable()
   factory GainNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1323,17 +879,12 @@
   static GainNode _create_2(context) =>
       JS('GainNode', 'new GainNode(#)', context);
 
-  @DomName('GainNode.gain')
-  @DocsEditable()
   final AudioParam gain;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('IIRFilterNode')
-@Experimental() // untriaged
 @Native("IIRFilterNode")
 class IirFilterNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1341,8 +892,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('IIRFilterNode.IIRFilterNode')
-  @DocsEditable()
   factory IirFilterNode(BaseAudioContext context, Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     return IirFilterNode._create_1(context, options_1);
@@ -1350,9 +899,6 @@
   static IirFilterNode _create_1(context, options) =>
       JS('IirFilterNode', 'new IIRFilterNode(#,#)', context, options);
 
-  @DomName('IIRFilterNode.getFrequencyResponse')
-  @DocsEditable()
-  @Experimental() // untriaged
   void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse,
       Float32List phaseResponse) native;
 }
@@ -1360,10 +906,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaElementAudioSourceNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode
-@Experimental()
 @Native("MediaElementAudioSourceNode")
 class MediaElementAudioSourceNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1371,8 +913,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaElementAudioSourceNode.MediaElementAudioSourceNode')
-  @DocsEditable()
   factory MediaElementAudioSourceNode(BaseAudioContext context, Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     return MediaElementAudioSourceNode._create_1(context, options_1);
@@ -1383,19 +923,12 @@
       context,
       options);
 
-  @DomName('MediaElementAudioSourceNode.mediaElement')
-  @DocsEditable()
-  @Experimental() // non-standard
   final MediaElement mediaElement;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaStreamAudioDestinationNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioDestinationNode
-@Experimental()
 @Native("MediaStreamAudioDestinationNode")
 class MediaStreamAudioDestinationNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1403,8 +936,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaStreamAudioDestinationNode.MediaStreamAudioDestinationNode')
-  @DocsEditable()
   factory MediaStreamAudioDestinationNode(BaseAudioContext context,
       [Map options]) {
     if (options != null) {
@@ -1423,18 +954,12 @@
       'new MediaStreamAudioDestinationNode(#)',
       context);
 
-  @DomName('MediaStreamAudioDestinationNode.stream')
-  @DocsEditable()
   final MediaStream stream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('MediaStreamAudioSourceNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioSourceNode
-@Experimental()
 @Native("MediaStreamAudioSourceNode")
 class MediaStreamAudioSourceNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1442,8 +967,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('MediaStreamAudioSourceNode.MediaStreamAudioSourceNode')
-  @DocsEditable()
   factory MediaStreamAudioSourceNode(BaseAudioContext context, Map options) {
     var options_1 = convertDartToNative_Dictionary(options);
     return MediaStreamAudioSourceNode._create_1(context, options_1);
@@ -1454,18 +977,12 @@
       context,
       options);
 
-  @DomName('MediaStreamAudioSourceNode.mediaStream')
-  @DocsEditable()
   final MediaStream mediaStream;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OfflineAudioCompletionEvent')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioCompletionEvent-section
-@Experimental()
 @Native("OfflineAudioCompletionEvent")
 class OfflineAudioCompletionEvent extends Event {
   // To suppress missing implicit constructor warnings.
@@ -1473,8 +990,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OfflineAudioCompletionEvent.OfflineAudioCompletionEvent')
-  @DocsEditable()
   factory OfflineAudioCompletionEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return OfflineAudioCompletionEvent._create_1(type, eventInitDict_1);
@@ -1485,18 +1000,12 @@
       type,
       eventInitDict);
 
-  @DomName('OfflineAudioCompletionEvent.renderedBuffer')
-  @DocsEditable()
   final AudioBuffer renderedBuffer;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OfflineAudioContext')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section
-@Experimental()
 @Native("OfflineAudioContext")
 class OfflineAudioContext extends BaseAudioContext {
   // To suppress missing implicit constructor warnings.
@@ -1504,8 +1013,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OfflineAudioContext.OfflineAudioContext')
-  @DocsEditable()
   factory OfflineAudioContext(numberOfChannels_OR_options,
       [int numberOfFrames, num sampleRate]) {
     if ((sampleRate is num) &&
@@ -1532,21 +1039,12 @@
       'new OfflineAudioContext(#)',
       numberOfChannels_OR_options);
 
-  @DomName('OfflineAudioContext.length')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int length;
 
-  @DomName('OfflineAudioContext.startRendering')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future<AudioBuffer> startRendering() =>
       promiseToFuture<AudioBuffer>(JS("", "#.startRendering()", this));
 
   @JSName('suspend')
-  @DomName('OfflineAudioContext.suspend')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future suspendFor(num suspendTime) =>
       promiseToFuture(JS("", "#.suspendFor(#)", this, suspendTime));
 }
@@ -1554,10 +1052,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OscillatorNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-OscillatorNode
-@Experimental()
 @Native("OscillatorNode,Oscillator")
 class OscillatorNode extends AudioScheduledSourceNode {
   // To suppress missing implicit constructor warnings.
@@ -1565,8 +1059,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OscillatorNode.OscillatorNode')
-  @DocsEditable()
   factory OscillatorNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1579,31 +1071,18 @@
   static OscillatorNode _create_2(context) =>
       JS('OscillatorNode', 'new OscillatorNode(#)', context);
 
-  @DomName('OscillatorNode.detune')
-  @DocsEditable()
   final AudioParam detune;
 
-  @DomName('OscillatorNode.frequency')
-  @DocsEditable()
   final AudioParam frequency;
 
-  @DomName('OscillatorNode.type')
-  @DocsEditable()
   String type;
 
-  @DomName('OscillatorNode.setPeriodicWave')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setPeriodicWave(PeriodicWave periodicWave) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PannerNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#PannerNode
-@Experimental()
 @Native("PannerNode,AudioPannerNode,webkitAudioPannerNode")
 class PannerNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1611,8 +1090,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PannerNode.PannerNode')
-  @DocsEditable()
   factory PannerNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1625,83 +1102,42 @@
   static PannerNode _create_2(context) =>
       JS('PannerNode', 'new PannerNode(#)', context);
 
-  @DomName('PannerNode.coneInnerAngle')
-  @DocsEditable()
   num coneInnerAngle;
 
-  @DomName('PannerNode.coneOuterAngle')
-  @DocsEditable()
   num coneOuterAngle;
 
-  @DomName('PannerNode.coneOuterGain')
-  @DocsEditable()
   num coneOuterGain;
 
-  @DomName('PannerNode.distanceModel')
-  @DocsEditable()
   String distanceModel;
 
-  @DomName('PannerNode.maxDistance')
-  @DocsEditable()
   num maxDistance;
 
-  @DomName('PannerNode.orientationX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam orientationX;
 
-  @DomName('PannerNode.orientationY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam orientationY;
 
-  @DomName('PannerNode.orientationZ')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam orientationZ;
 
-  @DomName('PannerNode.panningModel')
-  @DocsEditable()
   String panningModel;
 
-  @DomName('PannerNode.positionX')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam positionX;
 
-  @DomName('PannerNode.positionY')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam positionY;
 
-  @DomName('PannerNode.positionZ')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam positionZ;
 
-  @DomName('PannerNode.refDistance')
-  @DocsEditable()
   num refDistance;
 
-  @DomName('PannerNode.rolloffFactor')
-  @DocsEditable()
   num rolloffFactor;
 
-  @DomName('PannerNode.setOrientation')
-  @DocsEditable()
   void setOrientation(num x, num y, num z) native;
 
-  @DomName('PannerNode.setPosition')
-  @DocsEditable()
   void setPosition(num x, num y, num z) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('PeriodicWave')
-@Experimental() // untriaged
 @Native("PeriodicWave")
 class PeriodicWave extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1709,8 +1145,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('PeriodicWave.PeriodicWave')
-  @DocsEditable()
   factory PeriodicWave(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1727,10 +1161,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ScriptProcessorNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ScriptProcessorNode
-@Experimental()
 @Native("ScriptProcessorNode,JavaScriptAudioNode")
 class ScriptProcessorNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1744,19 +1174,11 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('ScriptProcessorNode.audioprocessEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const EventStreamProvider<AudioProcessingEvent> audioProcessEvent =
       const EventStreamProvider<AudioProcessingEvent>('audioprocess');
 
-  @DomName('ScriptProcessorNode.bufferSize')
-  @DocsEditable()
   final int bufferSize;
 
-  @DomName('ScriptProcessorNode.setEventListener')
-  @DocsEditable()
-  @Experimental() // untriaged
   void setEventListener(EventListener eventListener) native;
 
   /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
@@ -1767,9 +1189,6 @@
    * the soft-real-time properties which which these events are fired and can
    * be processed.
    */
-  @DomName('ScriptProcessorNode.onaudioprocess')
-  @DocsEditable()
-  @Experimental() // untriaged
   Stream<AudioProcessingEvent> get onAudioProcess =>
       audioProcessEvent.forTarget(this);
 }
@@ -1777,9 +1196,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('StereoPannerNode')
-@Experimental() // untriaged
 @Native("StereoPannerNode")
 class StereoPannerNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1787,8 +1203,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('StereoPannerNode.StereoPannerNode')
-  @DocsEditable()
   factory StereoPannerNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1801,19 +1215,12 @@
   static StereoPannerNode _create_2(context) =>
       JS('StereoPannerNode', 'new StereoPannerNode(#)', context);
 
-  @DomName('StereoPannerNode.pan')
-  @DocsEditable()
-  @Experimental() // untriaged
   final AudioParam pan;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WaveShaperNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode
-@Experimental()
 @Native("WaveShaperNode")
 class WaveShaperNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
@@ -1821,8 +1228,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WaveShaperNode.WaveShaperNode')
-  @DocsEditable()
   factory WaveShaperNode(BaseAudioContext context, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
@@ -1835,11 +1240,7 @@
   static WaveShaperNode _create_2(context) =>
       JS('WaveShaperNode', 'new WaveShaperNode(#)', context);
 
-  @DomName('WaveShaperNode.curve')
-  @DocsEditable()
   Float32List curve;
 
-  @DomName('WaveShaperNode.oversample')
-  @DocsEditable()
   String oversample;
 }
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index b3d8ba3..80e36b1 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -20,343 +20,10 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:web_gl library.
 
-// 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.
-
-const int ACTIVE_ATTRIBUTES = RenderingContext.ACTIVE_ATTRIBUTES;
-const int ACTIVE_TEXTURE = RenderingContext.ACTIVE_TEXTURE;
-const int ACTIVE_UNIFORMS = RenderingContext.ACTIVE_UNIFORMS;
-const int ALIASED_LINE_WIDTH_RANGE = RenderingContext.ALIASED_LINE_WIDTH_RANGE;
-const int ALIASED_POINT_SIZE_RANGE = RenderingContext.ALIASED_POINT_SIZE_RANGE;
-const int ALPHA = RenderingContext.ALPHA;
-const int ALPHA_BITS = RenderingContext.ALPHA_BITS;
-const int ALWAYS = RenderingContext.ALWAYS;
-const int ARRAY_BUFFER = RenderingContext.ARRAY_BUFFER;
-const int ARRAY_BUFFER_BINDING = RenderingContext.ARRAY_BUFFER_BINDING;
-const int ATTACHED_SHADERS = RenderingContext.ATTACHED_SHADERS;
-const int BACK = RenderingContext.BACK;
-const int BLEND = RenderingContext.BLEND;
-const int BLEND_COLOR = RenderingContext.BLEND_COLOR;
-const int BLEND_DST_ALPHA = RenderingContext.BLEND_DST_ALPHA;
-const int BLEND_DST_RGB = RenderingContext.BLEND_DST_RGB;
-const int BLEND_EQUATION = RenderingContext.BLEND_EQUATION;
-const int BLEND_EQUATION_ALPHA = RenderingContext.BLEND_EQUATION_ALPHA;
-const int BLEND_EQUATION_RGB = RenderingContext.BLEND_EQUATION_RGB;
-const int BLEND_SRC_ALPHA = RenderingContext.BLEND_SRC_ALPHA;
-const int BLEND_SRC_RGB = RenderingContext.BLEND_SRC_RGB;
-const int BLUE_BITS = RenderingContext.BLUE_BITS;
-const int BOOL = RenderingContext.BOOL;
-const int BOOL_VEC2 = RenderingContext.BOOL_VEC2;
-const int BOOL_VEC3 = RenderingContext.BOOL_VEC3;
-const int BOOL_VEC4 = RenderingContext.BOOL_VEC4;
-const int BROWSER_DEFAULT_WEBGL = RenderingContext.BROWSER_DEFAULT_WEBGL;
-const int BUFFER_SIZE = RenderingContext.BUFFER_SIZE;
-const int BUFFER_USAGE = RenderingContext.BUFFER_USAGE;
-const int BYTE = RenderingContext.BYTE;
-const int CCW = RenderingContext.CCW;
-const int CLAMP_TO_EDGE = RenderingContext.CLAMP_TO_EDGE;
-const int COLOR_ATTACHMENT0 = RenderingContext.COLOR_ATTACHMENT0;
-const int COLOR_BUFFER_BIT = RenderingContext.COLOR_BUFFER_BIT;
-const int COLOR_CLEAR_VALUE = RenderingContext.COLOR_CLEAR_VALUE;
-const int COLOR_WRITEMASK = RenderingContext.COLOR_WRITEMASK;
-const int COMPILE_STATUS = RenderingContext.COMPILE_STATUS;
-const int COMPRESSED_TEXTURE_FORMATS =
-    RenderingContext.COMPRESSED_TEXTURE_FORMATS;
-const int CONSTANT_ALPHA = RenderingContext.CONSTANT_ALPHA;
-const int CONSTANT_COLOR = RenderingContext.CONSTANT_COLOR;
-const int CONTEXT_LOST_WEBGL = RenderingContext.CONTEXT_LOST_WEBGL;
-const int CULL_FACE = RenderingContext.CULL_FACE;
-const int CULL_FACE_MODE = RenderingContext.CULL_FACE_MODE;
-const int CURRENT_PROGRAM = RenderingContext.CURRENT_PROGRAM;
-const int CURRENT_VERTEX_ATTRIB = RenderingContext.CURRENT_VERTEX_ATTRIB;
-const int CW = RenderingContext.CW;
-const int DECR = RenderingContext.DECR;
-const int DECR_WRAP = RenderingContext.DECR_WRAP;
-const int DELETE_STATUS = RenderingContext.DELETE_STATUS;
-const int DEPTH_ATTACHMENT = RenderingContext.DEPTH_ATTACHMENT;
-const int DEPTH_BITS = RenderingContext.DEPTH_BITS;
-const int DEPTH_BUFFER_BIT = RenderingContext.DEPTH_BUFFER_BIT;
-const int DEPTH_CLEAR_VALUE = RenderingContext.DEPTH_CLEAR_VALUE;
-const int DEPTH_COMPONENT = RenderingContext.DEPTH_COMPONENT;
-const int DEPTH_COMPONENT16 = RenderingContext.DEPTH_COMPONENT16;
-const int DEPTH_FUNC = RenderingContext.DEPTH_FUNC;
-const int DEPTH_RANGE = RenderingContext.DEPTH_RANGE;
-const int DEPTH_STENCIL = RenderingContext.DEPTH_STENCIL;
-const int DEPTH_STENCIL_ATTACHMENT = RenderingContext.DEPTH_STENCIL_ATTACHMENT;
-const int DEPTH_TEST = RenderingContext.DEPTH_TEST;
-const int DEPTH_WRITEMASK = RenderingContext.DEPTH_WRITEMASK;
-const int DITHER = RenderingContext.DITHER;
-const int DONT_CARE = RenderingContext.DONT_CARE;
-const int DST_ALPHA = RenderingContext.DST_ALPHA;
-const int DST_COLOR = RenderingContext.DST_COLOR;
-const int DYNAMIC_DRAW = RenderingContext.DYNAMIC_DRAW;
-const int ELEMENT_ARRAY_BUFFER = RenderingContext.ELEMENT_ARRAY_BUFFER;
-const int ELEMENT_ARRAY_BUFFER_BINDING =
-    RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
-const int EQUAL = RenderingContext.EQUAL;
-const int FASTEST = RenderingContext.FASTEST;
-const int FLOAT = RenderingContext.FLOAT;
-const int FLOAT_MAT2 = RenderingContext.FLOAT_MAT2;
-const int FLOAT_MAT3 = RenderingContext.FLOAT_MAT3;
-const int FLOAT_MAT4 = RenderingContext.FLOAT_MAT4;
-const int FLOAT_VEC2 = RenderingContext.FLOAT_VEC2;
-const int FLOAT_VEC3 = RenderingContext.FLOAT_VEC3;
-const int FLOAT_VEC4 = RenderingContext.FLOAT_VEC4;
-const int FRAGMENT_SHADER = RenderingContext.FRAGMENT_SHADER;
-const int FRAMEBUFFER = RenderingContext.FRAMEBUFFER;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
-const int FRAMEBUFFER_BINDING = RenderingContext.FRAMEBUFFER_BINDING;
-const int FRAMEBUFFER_COMPLETE = RenderingContext.FRAMEBUFFER_COMPLETE;
-const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT =
-    RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
-const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS =
-    RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT =
-    RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
-const int FRAMEBUFFER_UNSUPPORTED = RenderingContext.FRAMEBUFFER_UNSUPPORTED;
-const int FRONT = RenderingContext.FRONT;
-const int FRONT_AND_BACK = RenderingContext.FRONT_AND_BACK;
-const int FRONT_FACE = RenderingContext.FRONT_FACE;
-const int FUNC_ADD = RenderingContext.FUNC_ADD;
-const int FUNC_REVERSE_SUBTRACT = RenderingContext.FUNC_REVERSE_SUBTRACT;
-const int FUNC_SUBTRACT = RenderingContext.FUNC_SUBTRACT;
-const int GENERATE_MIPMAP_HINT = RenderingContext.GENERATE_MIPMAP_HINT;
-const int GEQUAL = RenderingContext.GEQUAL;
-const int GREATER = RenderingContext.GREATER;
-const int GREEN_BITS = RenderingContext.GREEN_BITS;
-const int HALF_FLOAT_OES = OesTextureHalfFloat.HALF_FLOAT_OES;
-const int HIGH_FLOAT = RenderingContext.HIGH_FLOAT;
-const int HIGH_INT = RenderingContext.HIGH_INT;
-const int INCR = RenderingContext.INCR;
-const int INCR_WRAP = RenderingContext.INCR_WRAP;
-const int INT = RenderingContext.INT;
-const int INT_VEC2 = RenderingContext.INT_VEC2;
-const int INT_VEC3 = RenderingContext.INT_VEC3;
-const int INT_VEC4 = RenderingContext.INT_VEC4;
-const int INVALID_ENUM = RenderingContext.INVALID_ENUM;
-const int INVALID_FRAMEBUFFER_OPERATION =
-    RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
-const int INVALID_OPERATION = RenderingContext.INVALID_OPERATION;
-const int INVALID_VALUE = RenderingContext.INVALID_VALUE;
-const int INVERT = RenderingContext.INVERT;
-const int KEEP = RenderingContext.KEEP;
-const int LEQUAL = RenderingContext.LEQUAL;
-const int LESS = RenderingContext.LESS;
-const int LINEAR = RenderingContext.LINEAR;
-const int LINEAR_MIPMAP_LINEAR = RenderingContext.LINEAR_MIPMAP_LINEAR;
-const int LINEAR_MIPMAP_NEAREST = RenderingContext.LINEAR_MIPMAP_NEAREST;
-const int LINES = RenderingContext.LINES;
-const int LINE_LOOP = RenderingContext.LINE_LOOP;
-const int LINE_STRIP = RenderingContext.LINE_STRIP;
-const int LINE_WIDTH = RenderingContext.LINE_WIDTH;
-const int LINK_STATUS = RenderingContext.LINK_STATUS;
-const int LOW_FLOAT = RenderingContext.LOW_FLOAT;
-const int LOW_INT = RenderingContext.LOW_INT;
-const int LUMINANCE = RenderingContext.LUMINANCE;
-const int LUMINANCE_ALPHA = RenderingContext.LUMINANCE_ALPHA;
-const int MAX_COMBINED_TEXTURE_IMAGE_UNITS =
-    RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
-const int MAX_CUBE_MAP_TEXTURE_SIZE =
-    RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
-const int MAX_FRAGMENT_UNIFORM_VECTORS =
-    RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
-const int MAX_RENDERBUFFER_SIZE = RenderingContext.MAX_RENDERBUFFER_SIZE;
-const int MAX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
-const int MAX_TEXTURE_SIZE = RenderingContext.MAX_TEXTURE_SIZE;
-const int MAX_VARYING_VECTORS = RenderingContext.MAX_VARYING_VECTORS;
-const int MAX_VERTEX_ATTRIBS = RenderingContext.MAX_VERTEX_ATTRIBS;
-const int MAX_VERTEX_TEXTURE_IMAGE_UNITS =
-    RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
-const int MAX_VERTEX_UNIFORM_VECTORS =
-    RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
-const int MAX_VIEWPORT_DIMS = RenderingContext.MAX_VIEWPORT_DIMS;
-const int MEDIUM_FLOAT = RenderingContext.MEDIUM_FLOAT;
-const int MEDIUM_INT = RenderingContext.MEDIUM_INT;
-const int MIRRORED_REPEAT = RenderingContext.MIRRORED_REPEAT;
-const int NEAREST = RenderingContext.NEAREST;
-const int NEAREST_MIPMAP_LINEAR = RenderingContext.NEAREST_MIPMAP_LINEAR;
-const int NEAREST_MIPMAP_NEAREST = RenderingContext.NEAREST_MIPMAP_NEAREST;
-const int NEVER = RenderingContext.NEVER;
-const int NICEST = RenderingContext.NICEST;
-const int NONE = RenderingContext.NONE;
-const int NOTEQUAL = RenderingContext.NOTEQUAL;
-const int NO_ERROR = RenderingContext.NO_ERROR;
-const int ONE = RenderingContext.ONE;
-const int ONE_MINUS_CONSTANT_ALPHA = RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
-const int ONE_MINUS_CONSTANT_COLOR = RenderingContext.ONE_MINUS_CONSTANT_COLOR;
-const int ONE_MINUS_DST_ALPHA = RenderingContext.ONE_MINUS_DST_ALPHA;
-const int ONE_MINUS_DST_COLOR = RenderingContext.ONE_MINUS_DST_COLOR;
-const int ONE_MINUS_SRC_ALPHA = RenderingContext.ONE_MINUS_SRC_ALPHA;
-const int ONE_MINUS_SRC_COLOR = RenderingContext.ONE_MINUS_SRC_COLOR;
-const int OUT_OF_MEMORY = RenderingContext.OUT_OF_MEMORY;
-const int PACK_ALIGNMENT = RenderingContext.PACK_ALIGNMENT;
-const int POINTS = RenderingContext.POINTS;
-const int POLYGON_OFFSET_FACTOR = RenderingContext.POLYGON_OFFSET_FACTOR;
-const int POLYGON_OFFSET_FILL = RenderingContext.POLYGON_OFFSET_FILL;
-const int POLYGON_OFFSET_UNITS = RenderingContext.POLYGON_OFFSET_UNITS;
-const int RED_BITS = RenderingContext.RED_BITS;
-const int RENDERBUFFER = RenderingContext.RENDERBUFFER;
-const int RENDERBUFFER_ALPHA_SIZE = RenderingContext.RENDERBUFFER_ALPHA_SIZE;
-const int RENDERBUFFER_BINDING = RenderingContext.RENDERBUFFER_BINDING;
-const int RENDERBUFFER_BLUE_SIZE = RenderingContext.RENDERBUFFER_BLUE_SIZE;
-const int RENDERBUFFER_DEPTH_SIZE = RenderingContext.RENDERBUFFER_DEPTH_SIZE;
-const int RENDERBUFFER_GREEN_SIZE = RenderingContext.RENDERBUFFER_GREEN_SIZE;
-const int RENDERBUFFER_HEIGHT = RenderingContext.RENDERBUFFER_HEIGHT;
-const int RENDERBUFFER_INTERNAL_FORMAT =
-    RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
-const int RENDERBUFFER_RED_SIZE = RenderingContext.RENDERBUFFER_RED_SIZE;
-const int RENDERBUFFER_STENCIL_SIZE =
-    RenderingContext.RENDERBUFFER_STENCIL_SIZE;
-const int RENDERBUFFER_WIDTH = RenderingContext.RENDERBUFFER_WIDTH;
-const int RENDERER = RenderingContext.RENDERER;
-const int REPEAT = RenderingContext.REPEAT;
-const int REPLACE = RenderingContext.REPLACE;
-const int RGB = RenderingContext.RGB;
-const int RGB565 = RenderingContext.RGB565;
-const int RGB5_A1 = RenderingContext.RGB5_A1;
-const int RGBA = RenderingContext.RGBA;
-const int RGBA4 = RenderingContext.RGBA4;
-const int SAMPLER_2D = RenderingContext.SAMPLER_2D;
-const int SAMPLER_CUBE = RenderingContext.SAMPLER_CUBE;
-const int SAMPLES = RenderingContext.SAMPLES;
-const int SAMPLE_ALPHA_TO_COVERAGE = RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
-const int SAMPLE_BUFFERS = RenderingContext.SAMPLE_BUFFERS;
-const int SAMPLE_COVERAGE = RenderingContext.SAMPLE_COVERAGE;
-const int SAMPLE_COVERAGE_INVERT = RenderingContext.SAMPLE_COVERAGE_INVERT;
-const int SAMPLE_COVERAGE_VALUE = RenderingContext.SAMPLE_COVERAGE_VALUE;
-const int SCISSOR_BOX = RenderingContext.SCISSOR_BOX;
-const int SCISSOR_TEST = RenderingContext.SCISSOR_TEST;
-const int SHADER_TYPE = RenderingContext.SHADER_TYPE;
-const int SHADING_LANGUAGE_VERSION = RenderingContext.SHADING_LANGUAGE_VERSION;
-const int SHORT = RenderingContext.SHORT;
-const int SRC_ALPHA = RenderingContext.SRC_ALPHA;
-const int SRC_ALPHA_SATURATE = RenderingContext.SRC_ALPHA_SATURATE;
-const int SRC_COLOR = RenderingContext.SRC_COLOR;
-const int STATIC_DRAW = RenderingContext.STATIC_DRAW;
-const int STENCIL_ATTACHMENT = RenderingContext.STENCIL_ATTACHMENT;
-const int STENCIL_BACK_FAIL = RenderingContext.STENCIL_BACK_FAIL;
-const int STENCIL_BACK_FUNC = RenderingContext.STENCIL_BACK_FUNC;
-const int STENCIL_BACK_PASS_DEPTH_FAIL =
-    RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
-const int STENCIL_BACK_PASS_DEPTH_PASS =
-    RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
-const int STENCIL_BACK_REF = RenderingContext.STENCIL_BACK_REF;
-const int STENCIL_BACK_VALUE_MASK = RenderingContext.STENCIL_BACK_VALUE_MASK;
-const int STENCIL_BACK_WRITEMASK = RenderingContext.STENCIL_BACK_WRITEMASK;
-const int STENCIL_BITS = RenderingContext.STENCIL_BITS;
-const int STENCIL_BUFFER_BIT = RenderingContext.STENCIL_BUFFER_BIT;
-const int STENCIL_CLEAR_VALUE = RenderingContext.STENCIL_CLEAR_VALUE;
-const int STENCIL_FAIL = RenderingContext.STENCIL_FAIL;
-const int STENCIL_FUNC = RenderingContext.STENCIL_FUNC;
-const int STENCIL_INDEX8 = RenderingContext.STENCIL_INDEX8;
-const int STENCIL_PASS_DEPTH_FAIL = RenderingContext.STENCIL_PASS_DEPTH_FAIL;
-const int STENCIL_PASS_DEPTH_PASS = RenderingContext.STENCIL_PASS_DEPTH_PASS;
-const int STENCIL_REF = RenderingContext.STENCIL_REF;
-const int STENCIL_TEST = RenderingContext.STENCIL_TEST;
-const int STENCIL_VALUE_MASK = RenderingContext.STENCIL_VALUE_MASK;
-const int STENCIL_WRITEMASK = RenderingContext.STENCIL_WRITEMASK;
-const int STREAM_DRAW = RenderingContext.STREAM_DRAW;
-const int SUBPIXEL_BITS = RenderingContext.SUBPIXEL_BITS;
-const int TEXTURE = RenderingContext.TEXTURE;
-const int TEXTURE0 = RenderingContext.TEXTURE0;
-const int TEXTURE1 = RenderingContext.TEXTURE1;
-const int TEXTURE10 = RenderingContext.TEXTURE10;
-const int TEXTURE11 = RenderingContext.TEXTURE11;
-const int TEXTURE12 = RenderingContext.TEXTURE12;
-const int TEXTURE13 = RenderingContext.TEXTURE13;
-const int TEXTURE14 = RenderingContext.TEXTURE14;
-const int TEXTURE15 = RenderingContext.TEXTURE15;
-const int TEXTURE16 = RenderingContext.TEXTURE16;
-const int TEXTURE17 = RenderingContext.TEXTURE17;
-const int TEXTURE18 = RenderingContext.TEXTURE18;
-const int TEXTURE19 = RenderingContext.TEXTURE19;
-const int TEXTURE2 = RenderingContext.TEXTURE2;
-const int TEXTURE20 = RenderingContext.TEXTURE20;
-const int TEXTURE21 = RenderingContext.TEXTURE21;
-const int TEXTURE22 = RenderingContext.TEXTURE22;
-const int TEXTURE23 = RenderingContext.TEXTURE23;
-const int TEXTURE24 = RenderingContext.TEXTURE24;
-const int TEXTURE25 = RenderingContext.TEXTURE25;
-const int TEXTURE26 = RenderingContext.TEXTURE26;
-const int TEXTURE27 = RenderingContext.TEXTURE27;
-const int TEXTURE28 = RenderingContext.TEXTURE28;
-const int TEXTURE29 = RenderingContext.TEXTURE29;
-const int TEXTURE3 = RenderingContext.TEXTURE3;
-const int TEXTURE30 = RenderingContext.TEXTURE30;
-const int TEXTURE31 = RenderingContext.TEXTURE31;
-const int TEXTURE4 = RenderingContext.TEXTURE4;
-const int TEXTURE5 = RenderingContext.TEXTURE5;
-const int TEXTURE6 = RenderingContext.TEXTURE6;
-const int TEXTURE7 = RenderingContext.TEXTURE7;
-const int TEXTURE8 = RenderingContext.TEXTURE8;
-const int TEXTURE9 = RenderingContext.TEXTURE9;
-const int TEXTURE_2D = RenderingContext.TEXTURE_2D;
-const int TEXTURE_BINDING_2D = RenderingContext.TEXTURE_BINDING_2D;
-const int TEXTURE_BINDING_CUBE_MAP = RenderingContext.TEXTURE_BINDING_CUBE_MAP;
-const int TEXTURE_CUBE_MAP = RenderingContext.TEXTURE_CUBE_MAP;
-const int TEXTURE_CUBE_MAP_NEGATIVE_X =
-    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Y =
-    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Z =
-    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
-const int TEXTURE_CUBE_MAP_POSITIVE_X =
-    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
-const int TEXTURE_CUBE_MAP_POSITIVE_Y =
-    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
-const int TEXTURE_CUBE_MAP_POSITIVE_Z =
-    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
-const int TEXTURE_MAG_FILTER = RenderingContext.TEXTURE_MAG_FILTER;
-const int TEXTURE_MIN_FILTER = RenderingContext.TEXTURE_MIN_FILTER;
-const int TEXTURE_WRAP_S = RenderingContext.TEXTURE_WRAP_S;
-const int TEXTURE_WRAP_T = RenderingContext.TEXTURE_WRAP_T;
-const int TRIANGLES = RenderingContext.TRIANGLES;
-const int TRIANGLE_FAN = RenderingContext.TRIANGLE_FAN;
-const int TRIANGLE_STRIP = RenderingContext.TRIANGLE_STRIP;
-const int UNPACK_ALIGNMENT = RenderingContext.UNPACK_ALIGNMENT;
-const int UNPACK_COLORSPACE_CONVERSION_WEBGL =
-    RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
-const int UNPACK_FLIP_Y_WEBGL = RenderingContext.UNPACK_FLIP_Y_WEBGL;
-const int UNPACK_PREMULTIPLY_ALPHA_WEBGL =
-    RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
-const int UNSIGNED_BYTE = RenderingContext.UNSIGNED_BYTE;
-const int UNSIGNED_INT = RenderingContext.UNSIGNED_INT;
-const int UNSIGNED_SHORT = RenderingContext.UNSIGNED_SHORT;
-const int UNSIGNED_SHORT_4_4_4_4 = RenderingContext.UNSIGNED_SHORT_4_4_4_4;
-const int UNSIGNED_SHORT_5_5_5_1 = RenderingContext.UNSIGNED_SHORT_5_5_5_1;
-const int UNSIGNED_SHORT_5_6_5 = RenderingContext.UNSIGNED_SHORT_5_6_5;
-const int VALIDATE_STATUS = RenderingContext.VALIDATE_STATUS;
-const int VENDOR = RenderingContext.VENDOR;
-const int VERSION = RenderingContext.VERSION;
-const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
-const int VERTEX_ATTRIB_ARRAY_ENABLED =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
-const int VERTEX_ATTRIB_ARRAY_NORMALIZED =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
-const int VERTEX_ATTRIB_ARRAY_POINTER =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
-const int VERTEX_ATTRIB_ARRAY_SIZE = RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
-const int VERTEX_ATTRIB_ARRAY_STRIDE =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
-const int VERTEX_ATTRIB_ARRAY_TYPE = RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
-const int VERTEX_SHADER = RenderingContext.VERTEX_SHADER;
-const int VIEWPORT = RenderingContext.VIEWPORT;
-const int ZERO = RenderingContext.ZERO;
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLActiveInfo')
 @Unstable()
 @Native("WebGLActiveInfo")
 class ActiveInfo extends Interceptor {
@@ -365,25 +32,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLActiveInfo.name')
-  @DocsEditable()
   final String name;
 
-  @DomName('WebGLActiveInfo.size')
-  @DocsEditable()
   final int size;
 
-  @DomName('WebGLActiveInfo.type')
-  @DocsEditable()
   final int type;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('ANGLEInstancedArrays')
-@Experimental() // untriaged
 @Native("ANGLEInstancedArrays,ANGLE_instanced_arrays")
 class AngleInstancedArrays extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -391,37 +49,23 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('ANGLEInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 0x88FE;
 
   @JSName('drawArraysInstancedANGLE')
-  @DomName('ANGLEInstancedArrays.drawArraysInstancedANGLE')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawArraysInstancedAngle(int mode, int first, int count, int primcount)
       native;
 
   @JSName('drawElementsInstancedANGLE')
-  @DomName('ANGLEInstancedArrays.drawElementsInstancedANGLE')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawElementsInstancedAngle(
       int mode, int count, int type, int offset, int primcount) native;
 
   @JSName('vertexAttribDivisorANGLE')
-  @DomName('ANGLEInstancedArrays.vertexAttribDivisorANGLE')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribDivisorAngle(int index, int divisor) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLBuffer')
 @Unstable()
 @Native("WebGLBuffer")
 class Buffer extends Interceptor {
@@ -434,9 +78,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCanvas')
-@Experimental() // untriaged
 @Native("WebGLCanvas")
 class Canvas extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -445,13 +86,9 @@
   }
 
   @JSName('canvas')
-  @DomName('WebGLCanvas.canvas')
-  @DocsEditable()
   final CanvasElement canvas;
 
   @JSName('canvas')
-  @DomName('WebGLCanvas.offscreenCanvas')
-  @DocsEditable()
   final OffscreenCanvas offscreenCanvas;
 }
 
@@ -459,9 +96,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLColorBufferFloat')
-@Experimental() // untriaged
 @Native("WebGLColorBufferFloat")
 class ColorBufferFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -473,9 +107,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCompressedTextureASTC')
-@Experimental() // untriaged
 @Native("WebGLCompressedTextureASTC")
 class CompressedTextureAstc extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -483,154 +114,66 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_10x10_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_10x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_10x6_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_10x8_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_12x10_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_12x12_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_4x4_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_5x4_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_5x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_6x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_6x6_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_8x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_8x6_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_RGBA_ASTC_8x8_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6;
 
-  @DomName('WebGLCompressedTextureASTC.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCompressedTextureATC')
-// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_atc/
-@Experimental()
 @Native("WebGLCompressedTextureATC,WEBGL_compressed_texture_atc")
 class CompressedTextureAtc extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -638,26 +181,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL')
-  @DocsEditable()
   static const int COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93;
 
-  @DomName(
-      'WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL')
-  @DocsEditable()
   static const int COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87EE;
 
-  @DomName('WebGLCompressedTextureATC.COMPRESSED_RGB_ATC_WEBGL')
-  @DocsEditable()
   static const int COMPRESSED_RGB_ATC_WEBGL = 0x8C92;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCompressedTextureETC1')
-@Experimental() // untriaged
 @Native("WebGLCompressedTextureETC1,WEBGL_compressed_texture_etc1")
 class CompressedTextureETC1 extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -665,18 +198,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLCompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGB_ETC1_WEBGL = 0x8D64;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCompressedTextureETC')
-@Experimental() // untriaged
 @Native("WebGLCompressedTextureETC")
 class CompressedTextureEtc extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -684,65 +211,30 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_R11_EAC')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_R11_EAC = 0x9270;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_RG11_EAC')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RG11_EAC = 0x9272;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_RGB8_ETC2')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGB8_ETC2 = 0x9274;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_RGBA8_ETC2_EAC')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_RGBA8_ETC2_EAC = 0x9278;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_SIGNED_R11_EAC')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SIGNED_R11_EAC = 0x9271;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_SIGNED_RG11_EAC')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SIGNED_RG11_EAC = 0x9273;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279;
 
-  @DomName('WebGLCompressedTextureETC.COMPRESSED_SRGB8_ETC2')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_ETC2 = 0x9275;
 
-  @DomName(
-      'WebGLCompressedTextureETC.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCompressedTexturePVRTC')
-// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/
-@Experimental() // experimental
 @Native("WebGLCompressedTexturePVRTC,WEBGL_compressed_texture_pvrtc")
 class CompressedTexturePvrtc extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -750,30 +242,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG')
-  @DocsEditable()
   static const int COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;
 
-  @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG')
-  @DocsEditable()
   static const int COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;
 
-  @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGB_PVRTC_2BPPV1_IMG')
-  @DocsEditable()
   static const int COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01;
 
-  @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGB_PVRTC_4BPPV1_IMG')
-  @DocsEditable()
   static const int COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCompressedTextureS3TC')
-// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/
-@Experimental() // experimental
 @Native("WebGLCompressedTextureS3TC,WEBGL_compressed_texture_s3tc")
 class CompressedTextureS3TC extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -781,29 +261,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT')
-  @DocsEditable()
   static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
 
-  @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT')
-  @DocsEditable()
   static const int COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;
 
-  @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT')
-  @DocsEditable()
   static const int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
 
-  @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT')
-  @DocsEditable()
   static const int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLCompressedTextureS3TCsRGB')
-@Experimental() // untriaged
 @Native("WebGLCompressedTextureS3TCsRGB")
 class CompressedTextureS3TCsRgb extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -811,32 +280,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D;
 
-  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E;
 
-  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F;
 
-  @DomName('WebGLCompressedTextureS3TCsRGB.COMPRESSED_SRGB_S3TC_DXT1_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLContextEvent')
 @Unstable()
 @Native("WebGLContextEvent")
 class ContextEvent extends Event {
@@ -845,8 +300,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLContextEvent.WebGLContextEvent')
-  @DocsEditable()
   factory ContextEvent(String type, [Map eventInit]) {
     if (eventInit != null) {
       var eventInit_1 = convertDartToNative_Dictionary(eventInit);
@@ -859,18 +312,12 @@
   static ContextEvent _create_2(type) =>
       JS('ContextEvent', 'new WebGLContextEvent(#)', type);
 
-  @DomName('WebGLContextEvent.statusMessage')
-  @DocsEditable()
   final String statusMessage;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLDebugRendererInfo')
-// http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/
-@Experimental() // experimental
 @Native("WebGLDebugRendererInfo,WEBGL_debug_renderer_info")
 class DebugRendererInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -878,22 +325,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLDebugRendererInfo.UNMASKED_RENDERER_WEBGL')
-  @DocsEditable()
   static const int UNMASKED_RENDERER_WEBGL = 0x9246;
 
-  @DomName('WebGLDebugRendererInfo.UNMASKED_VENDOR_WEBGL')
-  @DocsEditable()
   static const int UNMASKED_VENDOR_WEBGL = 0x9245;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLDebugShaders')
-// http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_shaders/
-@Experimental() // experimental
 @Native("WebGLDebugShaders,WEBGL_debug_shaders")
 class DebugShaders extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -901,18 +340,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLDebugShaders.getTranslatedShaderSource')
-  @DocsEditable()
   String getTranslatedShaderSource(Shader shader) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLDepthTexture')
-// http://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/
-@Experimental() // experimental
 @Native("WebGLDepthTexture,WEBGL_depth_texture")
 class DepthTexture extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -920,18 +353,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLDepthTexture.UNSIGNED_INT_24_8_WEBGL')
-  @DocsEditable()
   static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLDrawBuffers')
-// http://www.khronos.org/registry/webgl/specs/latest/
-@Experimental() // stable
 @Native("WebGLDrawBuffers,WEBGL_draw_buffers")
 class DrawBuffers extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -939,154 +366,13 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT0_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT0_WEBGL = 0x8CE0;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT10_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT10_WEBGL = 0x8CEA;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT11_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT11_WEBGL = 0x8CEB;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT12_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT12_WEBGL = 0x8CEC;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT13_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT13_WEBGL = 0x8CED;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT14_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT14_WEBGL = 0x8CEE;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT15_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT15_WEBGL = 0x8CEF;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT1_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT1_WEBGL = 0x8CE1;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT2_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT2_WEBGL = 0x8CE2;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT3_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT3_WEBGL = 0x8CE3;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT4_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT4_WEBGL = 0x8CE4;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT5_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT5_WEBGL = 0x8CE5;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT6_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT6_WEBGL = 0x8CE6;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT7_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT7_WEBGL = 0x8CE7;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT8_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT8_WEBGL = 0x8CE8;
-
-  @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT9_WEBGL')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT9_WEBGL = 0x8CE9;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER0_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER0_WEBGL = 0x8825;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER10_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER10_WEBGL = 0x882F;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER11_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER11_WEBGL = 0x8830;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER12_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER12_WEBGL = 0x8831;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER13_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER13_WEBGL = 0x8832;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER14_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER14_WEBGL = 0x8833;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER15_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER15_WEBGL = 0x8834;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER1_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER1_WEBGL = 0x8826;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER2_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER2_WEBGL = 0x8827;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER3_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER3_WEBGL = 0x8828;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER4_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER4_WEBGL = 0x8829;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER5_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER5_WEBGL = 0x882A;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER6_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER6_WEBGL = 0x882B;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER7_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER7_WEBGL = 0x882C;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER8_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER8_WEBGL = 0x882D;
-
-  @DomName('WebGLDrawBuffers.DRAW_BUFFER9_WEBGL')
-  @DocsEditable()
-  static const int DRAW_BUFFER9_WEBGL = 0x882E;
-
-  @DomName('WebGLDrawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL')
-  @DocsEditable()
-  static const int MAX_COLOR_ATTACHMENTS_WEBGL = 0x8CDF;
-
-  @DomName('WebGLDrawBuffers.MAX_DRAW_BUFFERS_WEBGL')
-  @DocsEditable()
-  static const int MAX_DRAW_BUFFERS_WEBGL = 0x8824;
-
   @JSName('drawBuffersWEBGL')
-  @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
-  @DocsEditable()
   void drawBuffersWebgl(List<int> buffers) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTsRGB')
-@Experimental() // untriaged
 @Native("EXTsRGB,EXT_sRGB")
 class EXTsRgb extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1094,33 +380,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('EXTsRGB.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210;
 
-  @DomName('EXTsRGB.SRGB8_ALPHA8_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int SRGB8_ALPHA8_EXT = 0x8C43;
 
-  @DomName('EXTsRGB.SRGB_ALPHA_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int SRGB_ALPHA_EXT = 0x8C42;
 
-  @DomName('EXTsRGB.SRGB_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int SRGB_EXT = 0x8C40;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTBlendMinMax')
-@Experimental() // untriaged
 @Native("EXTBlendMinMax,EXT_blend_minmax")
 class ExtBlendMinMax extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1128,23 +399,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('EXTBlendMinMax.MAX_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int MAX_EXT = 0x8008;
 
-  @DomName('EXTBlendMinMax.MIN_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int MIN_EXT = 0x8007;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTColorBufferFloat')
-@Experimental() // untriaged
 @Native("EXTColorBufferFloat")
 class ExtColorBufferFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1156,9 +418,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTColorBufferHalfFloat')
-@Experimental() // untriaged
 @Native("EXTColorBufferHalfFloat")
 class ExtColorBufferHalfFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1170,9 +429,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTDisjointTimerQuery')
-@Experimental() // untriaged
 @Native("EXTDisjointTimerQuery")
 class ExtDisjointTimerQuery extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1180,96 +436,48 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('EXTDisjointTimerQuery.CURRENT_QUERY_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int CURRENT_QUERY_EXT = 0x8865;
 
-  @DomName('EXTDisjointTimerQuery.GPU_DISJOINT_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int GPU_DISJOINT_EXT = 0x8FBB;
 
-  @DomName('EXTDisjointTimerQuery.QUERY_COUNTER_BITS_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int QUERY_COUNTER_BITS_EXT = 0x8864;
 
-  @DomName('EXTDisjointTimerQuery.QUERY_RESULT_AVAILABLE_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int QUERY_RESULT_AVAILABLE_EXT = 0x8867;
 
-  @DomName('EXTDisjointTimerQuery.QUERY_RESULT_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int QUERY_RESULT_EXT = 0x8866;
 
-  @DomName('EXTDisjointTimerQuery.TIMESTAMP_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int TIMESTAMP_EXT = 0x8E28;
 
-  @DomName('EXTDisjointTimerQuery.TIME_ELAPSED_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int TIME_ELAPSED_EXT = 0x88BF;
 
   @JSName('beginQueryEXT')
-  @DomName('EXTDisjointTimerQuery.beginQueryEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   void beginQueryExt(int target, TimerQueryExt query) native;
 
   @JSName('createQueryEXT')
-  @DomName('EXTDisjointTimerQuery.createQueryEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   TimerQueryExt createQueryExt() native;
 
   @JSName('deleteQueryEXT')
-  @DomName('EXTDisjointTimerQuery.deleteQueryEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteQueryExt(TimerQueryExt query) native;
 
   @JSName('endQueryEXT')
-  @DomName('EXTDisjointTimerQuery.endQueryEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   void endQueryExt(int target) native;
 
   @JSName('getQueryEXT')
-  @DomName('EXTDisjointTimerQuery.getQueryEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getQueryExt(int target, int pname) native;
 
   @JSName('getQueryObjectEXT')
-  @DomName('EXTDisjointTimerQuery.getQueryObjectEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getQueryObjectExt(TimerQueryExt query, int pname) native;
 
   @JSName('isQueryEXT')
-  @DomName('EXTDisjointTimerQuery.isQueryEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isQueryExt(TimerQueryExt query) native;
 
   @JSName('queryCounterEXT')
-  @DomName('EXTDisjointTimerQuery.queryCounterEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   void queryCounterExt(TimerQueryExt query, int target) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTDisjointTimerQueryWebGL2')
-@Experimental() // untriaged
 @Native("EXTDisjointTimerQueryWebGL2")
 class ExtDisjointTimerQueryWebGL2 extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1277,40 +485,21 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('EXTDisjointTimerQueryWebGL2.GPU_DISJOINT_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int GPU_DISJOINT_EXT = 0x8FBB;
 
-  @DomName('EXTDisjointTimerQueryWebGL2.QUERY_COUNTER_BITS_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int QUERY_COUNTER_BITS_EXT = 0x8864;
 
-  @DomName('EXTDisjointTimerQueryWebGL2.TIMESTAMP_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int TIMESTAMP_EXT = 0x8E28;
 
-  @DomName('EXTDisjointTimerQueryWebGL2.TIME_ELAPSED_EXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   static const int TIME_ELAPSED_EXT = 0x88BF;
 
   @JSName('queryCounterEXT')
-  @DomName('EXTDisjointTimerQueryWebGL2.queryCounterEXT')
-  @DocsEditable()
-  @Experimental() // untriaged
   void queryCounterExt(Query query, int target) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTFragDepth')
-// http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/
-@Experimental()
 @Native("EXTFragDepth,EXT_frag_depth")
 class ExtFragDepth extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1322,9 +511,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTShaderTextureLOD')
-@Experimental() // untriaged
 @Native("EXTShaderTextureLOD,EXT_shader_texture_lod")
 class ExtShaderTextureLod extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1336,10 +522,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('EXTTextureFilterAnisotropic')
-// http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/
-@Experimental()
 @Native("EXTTextureFilterAnisotropic,EXT_texture_filter_anisotropic")
 class ExtTextureFilterAnisotropic extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1347,20 +529,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('EXTTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT')
-  @DocsEditable()
   static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
 
-  @DomName('EXTTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT')
-  @DocsEditable()
   static const int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLFramebuffer')
 @Unstable()
 @Native("WebGLFramebuffer")
 class Framebuffer extends Interceptor {
@@ -1373,9 +549,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLGetBufferSubDataAsync')
-@Experimental() // untriaged
 @Native("WebGLGetBufferSubDataAsync")
 class GetBufferSubDataAsync extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1383,9 +556,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLGetBufferSubDataAsync.getBufferSubDataAsync')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future getBufferSubDataAsync(int target, int srcByteOffset, TypedData dstData,
           [int dstOffset, int length]) =>
       promiseToFuture(JS("", "#.getBufferSubDataAsync(#, #, #, #, #)", this,
@@ -1395,10 +565,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLLoseContext')
-// http://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/
-@Experimental()
 @Native("WebGLLoseContext,WebGLExtensionLoseContext,WEBGL_lose_context")
 class LoseContext extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1406,22 +572,14 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLLoseContext.loseContext')
-  @DocsEditable()
   void loseContext() native;
 
-  @DomName('WebGLLoseContext.restoreContext')
-  @DocsEditable()
   void restoreContext() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OESElementIndexUint')
-// http://www.khronos.org/registry/webgl/extensions/OES_element_index_uint/
-@Experimental() // experimental
 @Native("OESElementIndexUint,OES_element_index_uint")
 class OesElementIndexUint extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1433,10 +591,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OESStandardDerivatives')
-// http://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/
-@Experimental() // experimental
 @Native("OESStandardDerivatives,OES_standard_derivatives")
 class OesStandardDerivatives extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1444,18 +598,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OESStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES')
-  @DocsEditable()
   static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OESTextureFloat')
-// http://www.khronos.org/registry/webgl/extensions/OES_texture_float/
-@Experimental() // experimental
 @Native("OESTextureFloat,OES_texture_float")
 class OesTextureFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1467,10 +615,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OESTextureFloatLinear')
-// http://www.khronos.org/registry/webgl/extensions/OES_texture_float_linear/
-@Experimental()
 @Native("OESTextureFloatLinear,OES_texture_float_linear")
 class OesTextureFloatLinear extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1482,10 +626,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OESTextureHalfFloat')
-// http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/
-@Experimental() // experimental
 @Native("OESTextureHalfFloat,OES_texture_half_float")
 class OesTextureHalfFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1493,18 +633,12 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
-  @DocsEditable()
   static const int HALF_FLOAT_OES = 0x8D61;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OESTextureHalfFloatLinear')
-// http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float_linear/
-@Experimental()
 @Native("OESTextureHalfFloatLinear,OES_texture_half_float_linear")
 class OesTextureHalfFloatLinear extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1516,10 +650,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('OESVertexArrayObject')
-// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
-@Experimental() // experimental
 @Native("OESVertexArrayObject,OES_vertex_array_object")
 class OesVertexArrayObject extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1527,36 +657,24 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('OESVertexArrayObject.VERTEX_ARRAY_BINDING_OES')
-  @DocsEditable()
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
 
   @JSName('bindVertexArrayOES')
-  @DomName('OESVertexArrayObject.bindVertexArrayOES')
-  @DocsEditable()
   void bindVertexArray(VertexArrayObjectOes arrayObject) native;
 
   @JSName('createVertexArrayOES')
-  @DomName('OESVertexArrayObject.createVertexArrayOES')
-  @DocsEditable()
   VertexArrayObjectOes createVertexArray() native;
 
   @JSName('deleteVertexArrayOES')
-  @DomName('OESVertexArrayObject.deleteVertexArrayOES')
-  @DocsEditable()
   void deleteVertexArray(VertexArrayObjectOes arrayObject) native;
 
   @JSName('isVertexArrayOES')
-  @DomName('OESVertexArrayObject.isVertexArrayOES')
-  @DocsEditable()
   bool isVertexArray(VertexArrayObjectOes arrayObject) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLProgram')
 @Unstable()
 @Native("WebGLProgram")
 class Program extends Interceptor {
@@ -1569,9 +687,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLQuery')
-@Experimental() // untriaged
 @Native("WebGLQuery")
 class Query extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -1583,8 +698,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLRenderbuffer')
 @Unstable()
 @Native("WebGLRenderbuffer")
 class Renderbuffer extends Interceptor {
@@ -1597,10 +710,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DomName('WebGLRenderingContext')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
-@Experimental()
 @Unstable()
 @Native("WebGLRenderingContext")
 class RenderingContext extends Interceptor implements CanvasRenderingContext {
@@ -1612,1661 +723,259 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.WebGLRenderingContext)');
 
-  @DomName('WebGLRenderingContext.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
   final CanvasElement canvas;
 
-  @DomName('WebGLRenderingContext.ACTIVE_ATTRIBUTES')
-  @DocsEditable()
-  static const int ACTIVE_ATTRIBUTES = 0x8B89;
-
-  @DomName('WebGLRenderingContext.ACTIVE_TEXTURE')
-  @DocsEditable()
-  static const int ACTIVE_TEXTURE = 0x84E0;
-
-  @DomName('WebGLRenderingContext.ACTIVE_UNIFORMS')
-  @DocsEditable()
-  static const int ACTIVE_UNIFORMS = 0x8B86;
-
-  @DomName('WebGLRenderingContext.ALIASED_LINE_WIDTH_RANGE')
-  @DocsEditable()
-  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
-
-  @DomName('WebGLRenderingContext.ALIASED_POINT_SIZE_RANGE')
-  @DocsEditable()
-  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
-
-  @DomName('WebGLRenderingContext.ALPHA')
-  @DocsEditable()
-  static const int ALPHA = 0x1906;
-
-  @DomName('WebGLRenderingContext.ALPHA_BITS')
-  @DocsEditable()
-  static const int ALPHA_BITS = 0x0D55;
-
-  @DomName('WebGLRenderingContext.ALWAYS')
-  @DocsEditable()
-  static const int ALWAYS = 0x0207;
-
-  @DomName('WebGLRenderingContext.ARRAY_BUFFER')
-  @DocsEditable()
-  static const int ARRAY_BUFFER = 0x8892;
-
-  @DomName('WebGLRenderingContext.ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int ARRAY_BUFFER_BINDING = 0x8894;
-
-  @DomName('WebGLRenderingContext.ATTACHED_SHADERS')
-  @DocsEditable()
-  static const int ATTACHED_SHADERS = 0x8B85;
-
-  @DomName('WebGLRenderingContext.BACK')
-  @DocsEditable()
-  static const int BACK = 0x0405;
-
-  @DomName('WebGLRenderingContext.BLEND')
-  @DocsEditable()
-  static const int BLEND = 0x0BE2;
-
-  @DomName('WebGLRenderingContext.BLEND_COLOR')
-  @DocsEditable()
-  static const int BLEND_COLOR = 0x8005;
-
-  @DomName('WebGLRenderingContext.BLEND_DST_ALPHA')
-  @DocsEditable()
-  static const int BLEND_DST_ALPHA = 0x80CA;
-
-  @DomName('WebGLRenderingContext.BLEND_DST_RGB')
-  @DocsEditable()
-  static const int BLEND_DST_RGB = 0x80C8;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION')
-  @DocsEditable()
-  static const int BLEND_EQUATION = 0x8009;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION_ALPHA')
-  @DocsEditable()
-  static const int BLEND_EQUATION_ALPHA = 0x883D;
-
-  @DomName('WebGLRenderingContext.BLEND_EQUATION_RGB')
-  @DocsEditable()
-  static const int BLEND_EQUATION_RGB = 0x8009;
-
-  @DomName('WebGLRenderingContext.BLEND_SRC_ALPHA')
-  @DocsEditable()
-  static const int BLEND_SRC_ALPHA = 0x80CB;
-
-  @DomName('WebGLRenderingContext.BLEND_SRC_RGB')
-  @DocsEditable()
-  static const int BLEND_SRC_RGB = 0x80C9;
-
-  @DomName('WebGLRenderingContext.BLUE_BITS')
-  @DocsEditable()
-  static const int BLUE_BITS = 0x0D54;
-
-  @DomName('WebGLRenderingContext.BOOL')
-  @DocsEditable()
-  static const int BOOL = 0x8B56;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC2')
-  @DocsEditable()
-  static const int BOOL_VEC2 = 0x8B57;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC3')
-  @DocsEditable()
-  static const int BOOL_VEC3 = 0x8B58;
-
-  @DomName('WebGLRenderingContext.BOOL_VEC4')
-  @DocsEditable()
-  static const int BOOL_VEC4 = 0x8B59;
-
-  @DomName('WebGLRenderingContext.BROWSER_DEFAULT_WEBGL')
-  @DocsEditable()
-  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
-
-  @DomName('WebGLRenderingContext.BUFFER_SIZE')
-  @DocsEditable()
-  static const int BUFFER_SIZE = 0x8764;
-
-  @DomName('WebGLRenderingContext.BUFFER_USAGE')
-  @DocsEditable()
-  static const int BUFFER_USAGE = 0x8765;
-
-  @DomName('WebGLRenderingContext.BYTE')
-  @DocsEditable()
-  static const int BYTE = 0x1400;
-
-  @DomName('WebGLRenderingContext.CCW')
-  @DocsEditable()
-  static const int CCW = 0x0901;
-
-  @DomName('WebGLRenderingContext.CLAMP_TO_EDGE')
-  @DocsEditable()
-  static const int CLAMP_TO_EDGE = 0x812F;
-
-  @DomName('WebGLRenderingContext.COLOR_ATTACHMENT0')
-  @DocsEditable()
-  static const int COLOR_ATTACHMENT0 = 0x8CE0;
-
-  @DomName('WebGLRenderingContext.COLOR_BUFFER_BIT')
-  @DocsEditable()
-  static const int COLOR_BUFFER_BIT = 0x00004000;
-
-  @DomName('WebGLRenderingContext.COLOR_CLEAR_VALUE')
-  @DocsEditable()
-  static const int COLOR_CLEAR_VALUE = 0x0C22;
-
-  @DomName('WebGLRenderingContext.COLOR_WRITEMASK')
-  @DocsEditable()
-  static const int COLOR_WRITEMASK = 0x0C23;
-
-  @DomName('WebGLRenderingContext.COMPILE_STATUS')
-  @DocsEditable()
-  static const int COMPILE_STATUS = 0x8B81;
-
-  @DomName('WebGLRenderingContext.COMPRESSED_TEXTURE_FORMATS')
-  @DocsEditable()
-  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
-
-  @DomName('WebGLRenderingContext.CONSTANT_ALPHA')
-  @DocsEditable()
-  static const int CONSTANT_ALPHA = 0x8003;
-
-  @DomName('WebGLRenderingContext.CONSTANT_COLOR')
-  @DocsEditable()
-  static const int CONSTANT_COLOR = 0x8001;
-
-  @DomName('WebGLRenderingContext.CONTEXT_LOST_WEBGL')
-  @DocsEditable()
-  static const int CONTEXT_LOST_WEBGL = 0x9242;
-
-  @DomName('WebGLRenderingContext.CULL_FACE')
-  @DocsEditable()
-  static const int CULL_FACE = 0x0B44;
-
-  @DomName('WebGLRenderingContext.CULL_FACE_MODE')
-  @DocsEditable()
-  static const int CULL_FACE_MODE = 0x0B45;
-
-  @DomName('WebGLRenderingContext.CURRENT_PROGRAM')
-  @DocsEditable()
-  static const int CURRENT_PROGRAM = 0x8B8D;
-
-  @DomName('WebGLRenderingContext.CURRENT_VERTEX_ATTRIB')
-  @DocsEditable()
-  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
-
-  @DomName('WebGLRenderingContext.CW')
-  @DocsEditable()
-  static const int CW = 0x0900;
-
-  @DomName('WebGLRenderingContext.DECR')
-  @DocsEditable()
-  static const int DECR = 0x1E03;
-
-  @DomName('WebGLRenderingContext.DECR_WRAP')
-  @DocsEditable()
-  static const int DECR_WRAP = 0x8508;
-
-  @DomName('WebGLRenderingContext.DELETE_STATUS')
-  @DocsEditable()
-  static const int DELETE_STATUS = 0x8B80;
-
-  @DomName('WebGLRenderingContext.DEPTH_ATTACHMENT')
-  @DocsEditable()
-  static const int DEPTH_ATTACHMENT = 0x8D00;
-
-  @DomName('WebGLRenderingContext.DEPTH_BITS')
-  @DocsEditable()
-  static const int DEPTH_BITS = 0x0D56;
-
-  @DomName('WebGLRenderingContext.DEPTH_BUFFER_BIT')
-  @DocsEditable()
-  static const int DEPTH_BUFFER_BIT = 0x00000100;
-
-  @DomName('WebGLRenderingContext.DEPTH_CLEAR_VALUE')
-  @DocsEditable()
-  static const int DEPTH_CLEAR_VALUE = 0x0B73;
-
-  @DomName('WebGLRenderingContext.DEPTH_COMPONENT')
-  @DocsEditable()
-  static const int DEPTH_COMPONENT = 0x1902;
-
-  @DomName('WebGLRenderingContext.DEPTH_COMPONENT16')
-  @DocsEditable()
-  static const int DEPTH_COMPONENT16 = 0x81A5;
-
-  @DomName('WebGLRenderingContext.DEPTH_FUNC')
-  @DocsEditable()
-  static const int DEPTH_FUNC = 0x0B74;
-
-  @DomName('WebGLRenderingContext.DEPTH_RANGE')
-  @DocsEditable()
-  static const int DEPTH_RANGE = 0x0B70;
-
-  @DomName('WebGLRenderingContext.DEPTH_STENCIL')
-  @DocsEditable()
-  static const int DEPTH_STENCIL = 0x84F9;
-
-  @DomName('WebGLRenderingContext.DEPTH_STENCIL_ATTACHMENT')
-  @DocsEditable()
-  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
-
-  @DomName('WebGLRenderingContext.DEPTH_TEST')
-  @DocsEditable()
-  static const int DEPTH_TEST = 0x0B71;
-
-  @DomName('WebGLRenderingContext.DEPTH_WRITEMASK')
-  @DocsEditable()
-  static const int DEPTH_WRITEMASK = 0x0B72;
-
-  @DomName('WebGLRenderingContext.DITHER')
-  @DocsEditable()
-  static const int DITHER = 0x0BD0;
-
-  @DomName('WebGLRenderingContext.DONT_CARE')
-  @DocsEditable()
-  static const int DONT_CARE = 0x1100;
-
-  @DomName('WebGLRenderingContext.DST_ALPHA')
-  @DocsEditable()
-  static const int DST_ALPHA = 0x0304;
-
-  @DomName('WebGLRenderingContext.DST_COLOR')
-  @DocsEditable()
-  static const int DST_COLOR = 0x0306;
-
-  @DomName('WebGLRenderingContext.DYNAMIC_DRAW')
-  @DocsEditable()
-  static const int DYNAMIC_DRAW = 0x88E8;
-
-  @DomName('WebGLRenderingContext.ELEMENT_ARRAY_BUFFER')
-  @DocsEditable()
-  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
-
-  @DomName('WebGLRenderingContext.ELEMENT_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
-
-  @DomName('WebGLRenderingContext.EQUAL')
-  @DocsEditable()
-  static const int EQUAL = 0x0202;
-
-  @DomName('WebGLRenderingContext.FASTEST')
-  @DocsEditable()
-  static const int FASTEST = 0x1101;
-
-  @DomName('WebGLRenderingContext.FLOAT')
-  @DocsEditable()
-  static const int FLOAT = 0x1406;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT2')
-  @DocsEditable()
-  static const int FLOAT_MAT2 = 0x8B5A;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT3')
-  @DocsEditable()
-  static const int FLOAT_MAT3 = 0x8B5B;
-
-  @DomName('WebGLRenderingContext.FLOAT_MAT4')
-  @DocsEditable()
-  static const int FLOAT_MAT4 = 0x8B5C;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC2')
-  @DocsEditable()
-  static const int FLOAT_VEC2 = 0x8B50;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC3')
-  @DocsEditable()
-  static const int FLOAT_VEC3 = 0x8B51;
-
-  @DomName('WebGLRenderingContext.FLOAT_VEC4')
-  @DocsEditable()
-  static const int FLOAT_VEC4 = 0x8B52;
-
-  @DomName('WebGLRenderingContext.FRAGMENT_SHADER')
-  @DocsEditable()
-  static const int FRAGMENT_SHADER = 0x8B30;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER')
-  @DocsEditable()
-  static const int FRAMEBUFFER = 0x8D40;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
-  @DocsEditable()
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_BINDING')
-  @DocsEditable()
-  static const int FRAMEBUFFER_BINDING = 0x8CA6;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_COMPLETE')
-  @DocsEditable()
-  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
-  @DocsEditable()
-  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
-
-  @DomName('WebGLRenderingContext.FRAMEBUFFER_UNSUPPORTED')
-  @DocsEditable()
-  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
-
-  @DomName('WebGLRenderingContext.FRONT')
-  @DocsEditable()
-  static const int FRONT = 0x0404;
-
-  @DomName('WebGLRenderingContext.FRONT_AND_BACK')
-  @DocsEditable()
-  static const int FRONT_AND_BACK = 0x0408;
-
-  @DomName('WebGLRenderingContext.FRONT_FACE')
-  @DocsEditable()
-  static const int FRONT_FACE = 0x0B46;
-
-  @DomName('WebGLRenderingContext.FUNC_ADD')
-  @DocsEditable()
-  static const int FUNC_ADD = 0x8006;
-
-  @DomName('WebGLRenderingContext.FUNC_REVERSE_SUBTRACT')
-  @DocsEditable()
-  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
-
-  @DomName('WebGLRenderingContext.FUNC_SUBTRACT')
-  @DocsEditable()
-  static const int FUNC_SUBTRACT = 0x800A;
-
-  @DomName('WebGLRenderingContext.GENERATE_MIPMAP_HINT')
-  @DocsEditable()
-  static const int GENERATE_MIPMAP_HINT = 0x8192;
-
-  @DomName('WebGLRenderingContext.GEQUAL')
-  @DocsEditable()
-  static const int GEQUAL = 0x0206;
-
-  @DomName('WebGLRenderingContext.GREATER')
-  @DocsEditable()
-  static const int GREATER = 0x0204;
-
-  @DomName('WebGLRenderingContext.GREEN_BITS')
-  @DocsEditable()
-  static const int GREEN_BITS = 0x0D53;
-
-  @DomName('WebGLRenderingContext.HIGH_FLOAT')
-  @DocsEditable()
-  static const int HIGH_FLOAT = 0x8DF2;
-
-  @DomName('WebGLRenderingContext.HIGH_INT')
-  @DocsEditable()
-  static const int HIGH_INT = 0x8DF5;
-
-  @DomName('WebGLRenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
-
-  @DomName('WebGLRenderingContext.IMPLEMENTATION_COLOR_READ_TYPE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
-
-  @DomName('WebGLRenderingContext.INCR')
-  @DocsEditable()
-  static const int INCR = 0x1E02;
-
-  @DomName('WebGLRenderingContext.INCR_WRAP')
-  @DocsEditable()
-  static const int INCR_WRAP = 0x8507;
-
-  @DomName('WebGLRenderingContext.INT')
-  @DocsEditable()
-  static const int INT = 0x1404;
-
-  @DomName('WebGLRenderingContext.INT_VEC2')
-  @DocsEditable()
-  static const int INT_VEC2 = 0x8B53;
-
-  @DomName('WebGLRenderingContext.INT_VEC3')
-  @DocsEditable()
-  static const int INT_VEC3 = 0x8B54;
-
-  @DomName('WebGLRenderingContext.INT_VEC4')
-  @DocsEditable()
-  static const int INT_VEC4 = 0x8B55;
-
-  @DomName('WebGLRenderingContext.INVALID_ENUM')
-  @DocsEditable()
-  static const int INVALID_ENUM = 0x0500;
-
-  @DomName('WebGLRenderingContext.INVALID_FRAMEBUFFER_OPERATION')
-  @DocsEditable()
-  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
-
-  @DomName('WebGLRenderingContext.INVALID_OPERATION')
-  @DocsEditable()
-  static const int INVALID_OPERATION = 0x0502;
-
-  @DomName('WebGLRenderingContext.INVALID_VALUE')
-  @DocsEditable()
-  static const int INVALID_VALUE = 0x0501;
-
-  @DomName('WebGLRenderingContext.INVERT')
-  @DocsEditable()
-  static const int INVERT = 0x150A;
-
-  @DomName('WebGLRenderingContext.KEEP')
-  @DocsEditable()
-  static const int KEEP = 0x1E00;
-
-  @DomName('WebGLRenderingContext.LEQUAL')
-  @DocsEditable()
-  static const int LEQUAL = 0x0203;
-
-  @DomName('WebGLRenderingContext.LESS')
-  @DocsEditable()
-  static const int LESS = 0x0201;
-
-  @DomName('WebGLRenderingContext.LINEAR')
-  @DocsEditable()
-  static const int LINEAR = 0x2601;
-
-  @DomName('WebGLRenderingContext.LINEAR_MIPMAP_LINEAR')
-  @DocsEditable()
-  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
-
-  @DomName('WebGLRenderingContext.LINEAR_MIPMAP_NEAREST')
-  @DocsEditable()
-  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
-
-  @DomName('WebGLRenderingContext.LINES')
-  @DocsEditable()
-  static const int LINES = 0x0001;
-
-  @DomName('WebGLRenderingContext.LINE_LOOP')
-  @DocsEditable()
-  static const int LINE_LOOP = 0x0002;
-
-  @DomName('WebGLRenderingContext.LINE_STRIP')
-  @DocsEditable()
-  static const int LINE_STRIP = 0x0003;
-
-  @DomName('WebGLRenderingContext.LINE_WIDTH')
-  @DocsEditable()
-  static const int LINE_WIDTH = 0x0B21;
-
-  @DomName('WebGLRenderingContext.LINK_STATUS')
-  @DocsEditable()
-  static const int LINK_STATUS = 0x8B82;
-
-  @DomName('WebGLRenderingContext.LOW_FLOAT')
-  @DocsEditable()
-  static const int LOW_FLOAT = 0x8DF0;
-
-  @DomName('WebGLRenderingContext.LOW_INT')
-  @DocsEditable()
-  static const int LOW_INT = 0x8DF3;
-
-  @DomName('WebGLRenderingContext.LUMINANCE')
-  @DocsEditable()
-  static const int LUMINANCE = 0x1909;
-
-  @DomName('WebGLRenderingContext.LUMINANCE_ALPHA')
-  @DocsEditable()
-  static const int LUMINANCE_ALPHA = 0x190A;
-
-  @DomName('WebGLRenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
-
-  @DomName('WebGLRenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE')
-  @DocsEditable()
-  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
-
-  @DomName('WebGLRenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS')
-  @DocsEditable()
-  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
-
-  @DomName('WebGLRenderingContext.MAX_RENDERBUFFER_SIZE')
-  @DocsEditable()
-  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
-
-  @DomName('WebGLRenderingContext.MAX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
-
-  @DomName('WebGLRenderingContext.MAX_TEXTURE_SIZE')
-  @DocsEditable()
-  static const int MAX_TEXTURE_SIZE = 0x0D33;
-
-  @DomName('WebGLRenderingContext.MAX_VARYING_VECTORS')
-  @DocsEditable()
-  static const int MAX_VARYING_VECTORS = 0x8DFC;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_ATTRIBS')
-  @DocsEditable()
-  static const int MAX_VERTEX_ATTRIBS = 0x8869;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
-
-  @DomName('WebGLRenderingContext.MAX_VERTEX_UNIFORM_VECTORS')
-  @DocsEditable()
-  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
-
-  @DomName('WebGLRenderingContext.MAX_VIEWPORT_DIMS')
-  @DocsEditable()
-  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
-
-  @DomName('WebGLRenderingContext.MEDIUM_FLOAT')
-  @DocsEditable()
-  static const int MEDIUM_FLOAT = 0x8DF1;
-
-  @DomName('WebGLRenderingContext.MEDIUM_INT')
-  @DocsEditable()
-  static const int MEDIUM_INT = 0x8DF4;
-
-  @DomName('WebGLRenderingContext.MIRRORED_REPEAT')
-  @DocsEditable()
-  static const int MIRRORED_REPEAT = 0x8370;
-
-  @DomName('WebGLRenderingContext.NEAREST')
-  @DocsEditable()
-  static const int NEAREST = 0x2600;
-
-  @DomName('WebGLRenderingContext.NEAREST_MIPMAP_LINEAR')
-  @DocsEditable()
-  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
-
-  @DomName('WebGLRenderingContext.NEAREST_MIPMAP_NEAREST')
-  @DocsEditable()
-  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
-
-  @DomName('WebGLRenderingContext.NEVER')
-  @DocsEditable()
-  static const int NEVER = 0x0200;
-
-  @DomName('WebGLRenderingContext.NICEST')
-  @DocsEditable()
-  static const int NICEST = 0x1102;
-
-  @DomName('WebGLRenderingContext.NONE')
-  @DocsEditable()
-  static const int NONE = 0;
-
-  @DomName('WebGLRenderingContext.NOTEQUAL')
-  @DocsEditable()
-  static const int NOTEQUAL = 0x0205;
-
-  @DomName('WebGLRenderingContext.NO_ERROR')
-  @DocsEditable()
-  static const int NO_ERROR = 0;
-
-  @DomName('WebGLRenderingContext.ONE')
-  @DocsEditable()
-  static const int ONE = 1;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_CONSTANT_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_CONSTANT_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_DST_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_DST_ALPHA = 0x0305;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_DST_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_DST_COLOR = 0x0307;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_SRC_ALPHA')
-  @DocsEditable()
-  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
-
-  @DomName('WebGLRenderingContext.ONE_MINUS_SRC_COLOR')
-  @DocsEditable()
-  static const int ONE_MINUS_SRC_COLOR = 0x0301;
-
-  @DomName('WebGLRenderingContext.OUT_OF_MEMORY')
-  @DocsEditable()
-  static const int OUT_OF_MEMORY = 0x0505;
-
-  @DomName('WebGLRenderingContext.PACK_ALIGNMENT')
-  @DocsEditable()
-  static const int PACK_ALIGNMENT = 0x0D05;
-
-  @DomName('WebGLRenderingContext.POINTS')
-  @DocsEditable()
-  static const int POINTS = 0x0000;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_FACTOR')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_FACTOR = 0x8038;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_FILL')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_FILL = 0x8037;
-
-  @DomName('WebGLRenderingContext.POLYGON_OFFSET_UNITS')
-  @DocsEditable()
-  static const int POLYGON_OFFSET_UNITS = 0x2A00;
-
-  @DomName('WebGLRenderingContext.RED_BITS')
-  @DocsEditable()
-  static const int RED_BITS = 0x0D52;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER')
-  @DocsEditable()
-  static const int RENDERBUFFER = 0x8D41;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_ALPHA_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_BINDING')
-  @DocsEditable()
-  static const int RENDERBUFFER_BINDING = 0x8CA7;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_BLUE_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_DEPTH_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_GREEN_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_HEIGHT')
-  @DocsEditable()
-  static const int RENDERBUFFER_HEIGHT = 0x8D43;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_INTERNAL_FORMAT')
-  @DocsEditable()
-  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_RED_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_STENCIL_SIZE')
-  @DocsEditable()
-  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
-
-  @DomName('WebGLRenderingContext.RENDERBUFFER_WIDTH')
-  @DocsEditable()
-  static const int RENDERBUFFER_WIDTH = 0x8D42;
-
-  @DomName('WebGLRenderingContext.RENDERER')
-  @DocsEditable()
-  static const int RENDERER = 0x1F01;
-
-  @DomName('WebGLRenderingContext.REPEAT')
-  @DocsEditable()
-  static const int REPEAT = 0x2901;
-
-  @DomName('WebGLRenderingContext.REPLACE')
-  @DocsEditable()
-  static const int REPLACE = 0x1E01;
-
-  @DomName('WebGLRenderingContext.RGB')
-  @DocsEditable()
-  static const int RGB = 0x1907;
-
-  @DomName('WebGLRenderingContext.RGB565')
-  @DocsEditable()
-  static const int RGB565 = 0x8D62;
-
-  @DomName('WebGLRenderingContext.RGB5_A1')
-  @DocsEditable()
-  static const int RGB5_A1 = 0x8057;
-
-  @DomName('WebGLRenderingContext.RGBA')
-  @DocsEditable()
-  static const int RGBA = 0x1908;
-
-  @DomName('WebGLRenderingContext.RGBA4')
-  @DocsEditable()
-  static const int RGBA4 = 0x8056;
-
-  @DomName('WebGLRenderingContext.SAMPLER_2D')
-  @DocsEditable()
-  static const int SAMPLER_2D = 0x8B5E;
-
-  @DomName('WebGLRenderingContext.SAMPLER_CUBE')
-  @DocsEditable()
-  static const int SAMPLER_CUBE = 0x8B60;
-
-  @DomName('WebGLRenderingContext.SAMPLES')
-  @DocsEditable()
-  static const int SAMPLES = 0x80A9;
-
-  @DomName('WebGLRenderingContext.SAMPLE_ALPHA_TO_COVERAGE')
-  @DocsEditable()
-  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
-
-  @DomName('WebGLRenderingContext.SAMPLE_BUFFERS')
-  @DocsEditable()
-  static const int SAMPLE_BUFFERS = 0x80A8;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE = 0x80A0;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE_INVERT')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
-
-  @DomName('WebGLRenderingContext.SAMPLE_COVERAGE_VALUE')
-  @DocsEditable()
-  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
-
-  @DomName('WebGLRenderingContext.SCISSOR_BOX')
-  @DocsEditable()
-  static const int SCISSOR_BOX = 0x0C10;
-
-  @DomName('WebGLRenderingContext.SCISSOR_TEST')
-  @DocsEditable()
-  static const int SCISSOR_TEST = 0x0C11;
-
-  @DomName('WebGLRenderingContext.SHADER_TYPE')
-  @DocsEditable()
-  static const int SHADER_TYPE = 0x8B4F;
-
-  @DomName('WebGLRenderingContext.SHADING_LANGUAGE_VERSION')
-  @DocsEditable()
-  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
-
-  @DomName('WebGLRenderingContext.SHORT')
-  @DocsEditable()
-  static const int SHORT = 0x1402;
-
-  @DomName('WebGLRenderingContext.SRC_ALPHA')
-  @DocsEditable()
-  static const int SRC_ALPHA = 0x0302;
-
-  @DomName('WebGLRenderingContext.SRC_ALPHA_SATURATE')
-  @DocsEditable()
-  static const int SRC_ALPHA_SATURATE = 0x0308;
-
-  @DomName('WebGLRenderingContext.SRC_COLOR')
-  @DocsEditable()
-  static const int SRC_COLOR = 0x0300;
-
-  @DomName('WebGLRenderingContext.STATIC_DRAW')
-  @DocsEditable()
-  static const int STATIC_DRAW = 0x88E4;
-
-  @DomName('WebGLRenderingContext.STENCIL_ATTACHMENT')
-  @DocsEditable()
-  static const int STENCIL_ATTACHMENT = 0x8D20;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_FAIL')
-  @DocsEditable()
-  static const int STENCIL_BACK_FAIL = 0x8801;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_FUNC')
-  @DocsEditable()
-  static const int STENCIL_BACK_FUNC = 0x8800;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_PASS')
-  @DocsEditable()
-  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_REF')
-  @DocsEditable()
-  static const int STENCIL_BACK_REF = 0x8CA3;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_VALUE_MASK')
-  @DocsEditable()
-  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
-
-  @DomName('WebGLRenderingContext.STENCIL_BACK_WRITEMASK')
-  @DocsEditable()
-  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
-
-  @DomName('WebGLRenderingContext.STENCIL_BITS')
-  @DocsEditable()
-  static const int STENCIL_BITS = 0x0D57;
-
-  @DomName('WebGLRenderingContext.STENCIL_BUFFER_BIT')
-  @DocsEditable()
-  static const int STENCIL_BUFFER_BIT = 0x00000400;
-
-  @DomName('WebGLRenderingContext.STENCIL_CLEAR_VALUE')
-  @DocsEditable()
-  static const int STENCIL_CLEAR_VALUE = 0x0B91;
-
-  @DomName('WebGLRenderingContext.STENCIL_FAIL')
-  @DocsEditable()
-  static const int STENCIL_FAIL = 0x0B94;
-
-  @DomName('WebGLRenderingContext.STENCIL_FUNC')
-  @DocsEditable()
-  static const int STENCIL_FUNC = 0x0B92;
-
-  @DomName('WebGLRenderingContext.STENCIL_INDEX8')
-  @DocsEditable()
-  static const int STENCIL_INDEX8 = 0x8D48;
-
-  @DomName('WebGLRenderingContext.STENCIL_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
-
-  @DomName('WebGLRenderingContext.STENCIL_PASS_DEPTH_PASS')
-  @DocsEditable()
-  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
-
-  @DomName('WebGLRenderingContext.STENCIL_REF')
-  @DocsEditable()
-  static const int STENCIL_REF = 0x0B97;
-
-  @DomName('WebGLRenderingContext.STENCIL_TEST')
-  @DocsEditable()
-  static const int STENCIL_TEST = 0x0B90;
-
-  @DomName('WebGLRenderingContext.STENCIL_VALUE_MASK')
-  @DocsEditable()
-  static const int STENCIL_VALUE_MASK = 0x0B93;
-
-  @DomName('WebGLRenderingContext.STENCIL_WRITEMASK')
-  @DocsEditable()
-  static const int STENCIL_WRITEMASK = 0x0B98;
-
-  @DomName('WebGLRenderingContext.STREAM_DRAW')
-  @DocsEditable()
-  static const int STREAM_DRAW = 0x88E0;
-
-  @DomName('WebGLRenderingContext.SUBPIXEL_BITS')
-  @DocsEditable()
-  static const int SUBPIXEL_BITS = 0x0D50;
-
-  @DomName('WebGLRenderingContext.TEXTURE')
-  @DocsEditable()
-  static const int TEXTURE = 0x1702;
-
-  @DomName('WebGLRenderingContext.TEXTURE0')
-  @DocsEditable()
-  static const int TEXTURE0 = 0x84C0;
-
-  @DomName('WebGLRenderingContext.TEXTURE1')
-  @DocsEditable()
-  static const int TEXTURE1 = 0x84C1;
-
-  @DomName('WebGLRenderingContext.TEXTURE10')
-  @DocsEditable()
-  static const int TEXTURE10 = 0x84CA;
-
-  @DomName('WebGLRenderingContext.TEXTURE11')
-  @DocsEditable()
-  static const int TEXTURE11 = 0x84CB;
-
-  @DomName('WebGLRenderingContext.TEXTURE12')
-  @DocsEditable()
-  static const int TEXTURE12 = 0x84CC;
-
-  @DomName('WebGLRenderingContext.TEXTURE13')
-  @DocsEditable()
-  static const int TEXTURE13 = 0x84CD;
-
-  @DomName('WebGLRenderingContext.TEXTURE14')
-  @DocsEditable()
-  static const int TEXTURE14 = 0x84CE;
-
-  @DomName('WebGLRenderingContext.TEXTURE15')
-  @DocsEditable()
-  static const int TEXTURE15 = 0x84CF;
-
-  @DomName('WebGLRenderingContext.TEXTURE16')
-  @DocsEditable()
-  static const int TEXTURE16 = 0x84D0;
-
-  @DomName('WebGLRenderingContext.TEXTURE17')
-  @DocsEditable()
-  static const int TEXTURE17 = 0x84D1;
-
-  @DomName('WebGLRenderingContext.TEXTURE18')
-  @DocsEditable()
-  static const int TEXTURE18 = 0x84D2;
-
-  @DomName('WebGLRenderingContext.TEXTURE19')
-  @DocsEditable()
-  static const int TEXTURE19 = 0x84D3;
-
-  @DomName('WebGLRenderingContext.TEXTURE2')
-  @DocsEditable()
-  static const int TEXTURE2 = 0x84C2;
-
-  @DomName('WebGLRenderingContext.TEXTURE20')
-  @DocsEditable()
-  static const int TEXTURE20 = 0x84D4;
-
-  @DomName('WebGLRenderingContext.TEXTURE21')
-  @DocsEditable()
-  static const int TEXTURE21 = 0x84D5;
-
-  @DomName('WebGLRenderingContext.TEXTURE22')
-  @DocsEditable()
-  static const int TEXTURE22 = 0x84D6;
-
-  @DomName('WebGLRenderingContext.TEXTURE23')
-  @DocsEditable()
-  static const int TEXTURE23 = 0x84D7;
-
-  @DomName('WebGLRenderingContext.TEXTURE24')
-  @DocsEditable()
-  static const int TEXTURE24 = 0x84D8;
-
-  @DomName('WebGLRenderingContext.TEXTURE25')
-  @DocsEditable()
-  static const int TEXTURE25 = 0x84D9;
-
-  @DomName('WebGLRenderingContext.TEXTURE26')
-  @DocsEditable()
-  static const int TEXTURE26 = 0x84DA;
-
-  @DomName('WebGLRenderingContext.TEXTURE27')
-  @DocsEditable()
-  static const int TEXTURE27 = 0x84DB;
-
-  @DomName('WebGLRenderingContext.TEXTURE28')
-  @DocsEditable()
-  static const int TEXTURE28 = 0x84DC;
-
-  @DomName('WebGLRenderingContext.TEXTURE29')
-  @DocsEditable()
-  static const int TEXTURE29 = 0x84DD;
-
-  @DomName('WebGLRenderingContext.TEXTURE3')
-  @DocsEditable()
-  static const int TEXTURE3 = 0x84C3;
-
-  @DomName('WebGLRenderingContext.TEXTURE30')
-  @DocsEditable()
-  static const int TEXTURE30 = 0x84DE;
-
-  @DomName('WebGLRenderingContext.TEXTURE31')
-  @DocsEditable()
-  static const int TEXTURE31 = 0x84DF;
-
-  @DomName('WebGLRenderingContext.TEXTURE4')
-  @DocsEditable()
-  static const int TEXTURE4 = 0x84C4;
-
-  @DomName('WebGLRenderingContext.TEXTURE5')
-  @DocsEditable()
-  static const int TEXTURE5 = 0x84C5;
-
-  @DomName('WebGLRenderingContext.TEXTURE6')
-  @DocsEditable()
-  static const int TEXTURE6 = 0x84C6;
-
-  @DomName('WebGLRenderingContext.TEXTURE7')
-  @DocsEditable()
-  static const int TEXTURE7 = 0x84C7;
-
-  @DomName('WebGLRenderingContext.TEXTURE8')
-  @DocsEditable()
-  static const int TEXTURE8 = 0x84C8;
-
-  @DomName('WebGLRenderingContext.TEXTURE9')
-  @DocsEditable()
-  static const int TEXTURE9 = 0x84C9;
-
-  @DomName('WebGLRenderingContext.TEXTURE_2D')
-  @DocsEditable()
-  static const int TEXTURE_2D = 0x0DE1;
-
-  @DomName('WebGLRenderingContext.TEXTURE_BINDING_2D')
-  @DocsEditable()
-  static const int TEXTURE_BINDING_2D = 0x8069;
-
-  @DomName('WebGLRenderingContext.TEXTURE_BINDING_CUBE_MAP')
-  @DocsEditable()
-  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP = 0x8513;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
-
-  @DomName('WebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z')
-  @DocsEditable()
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
-
-  @DomName('WebGLRenderingContext.TEXTURE_MAG_FILTER')
-  @DocsEditable()
-  static const int TEXTURE_MAG_FILTER = 0x2800;
-
-  @DomName('WebGLRenderingContext.TEXTURE_MIN_FILTER')
-  @DocsEditable()
-  static const int TEXTURE_MIN_FILTER = 0x2801;
-
-  @DomName('WebGLRenderingContext.TEXTURE_WRAP_S')
-  @DocsEditable()
-  static const int TEXTURE_WRAP_S = 0x2802;
-
-  @DomName('WebGLRenderingContext.TEXTURE_WRAP_T')
-  @DocsEditable()
-  static const int TEXTURE_WRAP_T = 0x2803;
-
-  @DomName('WebGLRenderingContext.TRIANGLES')
-  @DocsEditable()
-  static const int TRIANGLES = 0x0004;
-
-  @DomName('WebGLRenderingContext.TRIANGLE_FAN')
-  @DocsEditable()
-  static const int TRIANGLE_FAN = 0x0006;
-
-  @DomName('WebGLRenderingContext.TRIANGLE_STRIP')
-  @DocsEditable()
-  static const int TRIANGLE_STRIP = 0x0005;
-
-  @DomName('WebGLRenderingContext.UNPACK_ALIGNMENT')
-  @DocsEditable()
-  static const int UNPACK_ALIGNMENT = 0x0CF5;
-
-  @DomName('WebGLRenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
-
-  @DomName('WebGLRenderingContext.UNPACK_FLIP_Y_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
-
-  @DomName('WebGLRenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
-  @DocsEditable()
-  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_BYTE')
-  @DocsEditable()
-  static const int UNSIGNED_BYTE = 0x1401;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_INT')
-  @DocsEditable()
-  static const int UNSIGNED_INT = 0x1405;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT = 0x1403;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_4_4_4_4')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_5_5_5_1')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
-
-  @DomName('WebGLRenderingContext.UNSIGNED_SHORT_5_6_5')
-  @DocsEditable()
-  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
-
-  @DomName('WebGLRenderingContext.VALIDATE_STATUS')
-  @DocsEditable()
-  static const int VALIDATE_STATUS = 0x8B83;
-
-  @DomName('WebGLRenderingContext.VENDOR')
-  @DocsEditable()
-  static const int VENDOR = 0x1F00;
-
-  @DomName('WebGLRenderingContext.VERSION')
-  @DocsEditable()
-  static const int VERSION = 0x1F02;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_POINTER')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_SIZE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
-
-  @DomName('WebGLRenderingContext.VERTEX_ATTRIB_ARRAY_TYPE')
-  @DocsEditable()
-  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
-
-  @DomName('WebGLRenderingContext.VERTEX_SHADER')
-  @DocsEditable()
-  static const int VERTEX_SHADER = 0x8B31;
-
-  @DomName('WebGLRenderingContext.VIEWPORT')
-  @DocsEditable()
-  static const int VIEWPORT = 0x0BA2;
-
-  @DomName('WebGLRenderingContext.ZERO')
-  @DocsEditable()
-  static const int ZERO = 0;
-
   // From WebGLRenderingContextBase
 
-  @DomName('WebGLRenderingContext.drawingBufferHeight')
-  @DocsEditable()
   final int drawingBufferHeight;
 
-  @DomName('WebGLRenderingContext.drawingBufferWidth')
-  @DocsEditable()
   final int drawingBufferWidth;
 
-  @DomName('WebGLRenderingContext.activeTexture')
-  @DocsEditable()
   void activeTexture(int texture) native;
 
-  @DomName('WebGLRenderingContext.attachShader')
-  @DocsEditable()
   void attachShader(Program program, Shader shader) native;
 
-  @DomName('WebGLRenderingContext.bindAttribLocation')
-  @DocsEditable()
   void bindAttribLocation(Program program, int index, String name) native;
 
-  @DomName('WebGLRenderingContext.bindBuffer')
-  @DocsEditable()
   void bindBuffer(int target, Buffer buffer) native;
 
-  @DomName('WebGLRenderingContext.bindFramebuffer')
-  @DocsEditable()
   void bindFramebuffer(int target, Framebuffer framebuffer) native;
 
-  @DomName('WebGLRenderingContext.bindRenderbuffer')
-  @DocsEditable()
   void bindRenderbuffer(int target, Renderbuffer renderbuffer) native;
 
-  @DomName('WebGLRenderingContext.bindTexture')
-  @DocsEditable()
   void bindTexture(int target, Texture texture) native;
 
-  @DomName('WebGLRenderingContext.blendColor')
-  @DocsEditable()
   void blendColor(num red, num green, num blue, num alpha) native;
 
-  @DomName('WebGLRenderingContext.blendEquation')
-  @DocsEditable()
   void blendEquation(int mode) native;
 
-  @DomName('WebGLRenderingContext.blendEquationSeparate')
-  @DocsEditable()
   void blendEquationSeparate(int modeRGB, int modeAlpha) native;
 
-  @DomName('WebGLRenderingContext.blendFunc')
-  @DocsEditable()
   void blendFunc(int sfactor, int dfactor) native;
 
-  @DomName('WebGLRenderingContext.blendFuncSeparate')
-  @DocsEditable()
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha)
       native;
 
-  @DomName('WebGLRenderingContext.bufferData')
-  @DocsEditable()
   void bufferData(int target, data_OR_size, int usage) native;
 
-  @DomName('WebGLRenderingContext.bufferSubData')
-  @DocsEditable()
   void bufferSubData(int target, int offset, data) native;
 
-  @DomName('WebGLRenderingContext.checkFramebufferStatus')
-  @DocsEditable()
   int checkFramebufferStatus(int target) native;
 
-  @DomName('WebGLRenderingContext.clear')
-  @DocsEditable()
   void clear(int mask) native;
 
-  @DomName('WebGLRenderingContext.clearColor')
-  @DocsEditable()
   void clearColor(num red, num green, num blue, num alpha) native;
 
-  @DomName('WebGLRenderingContext.clearDepth')
-  @DocsEditable()
   void clearDepth(num depth) native;
 
-  @DomName('WebGLRenderingContext.clearStencil')
-  @DocsEditable()
   void clearStencil(int s) native;
 
-  @DomName('WebGLRenderingContext.colorMask')
-  @DocsEditable()
   void colorMask(bool red, bool green, bool blue, bool alpha) native;
 
-  @DomName('WebGLRenderingContext.commit')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
-  @DomName('WebGLRenderingContext.compileShader')
-  @DocsEditable()
   void compileShader(Shader shader) native;
 
-  @DomName('WebGLRenderingContext.compressedTexImage2D')
-  @DocsEditable()
   void compressedTexImage2D(int target, int level, int internalformat,
       int width, int height, int border, TypedData data) native;
 
-  @DomName('WebGLRenderingContext.compressedTexSubImage2D')
-  @DocsEditable()
   void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset,
       int width, int height, int format, TypedData data) native;
 
-  @DomName('WebGLRenderingContext.copyTexImage2D')
-  @DocsEditable()
   void copyTexImage2D(int target, int level, int internalformat, int x, int y,
       int width, int height, int border) native;
 
-  @DomName('WebGLRenderingContext.copyTexSubImage2D')
-  @DocsEditable()
   void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x,
       int y, int width, int height) native;
 
-  @DomName('WebGLRenderingContext.createBuffer')
-  @DocsEditable()
   Buffer createBuffer() native;
 
-  @DomName('WebGLRenderingContext.createFramebuffer')
-  @DocsEditable()
   Framebuffer createFramebuffer() native;
 
-  @DomName('WebGLRenderingContext.createProgram')
-  @DocsEditable()
   Program createProgram() native;
 
-  @DomName('WebGLRenderingContext.createRenderbuffer')
-  @DocsEditable()
   Renderbuffer createRenderbuffer() native;
 
-  @DomName('WebGLRenderingContext.createShader')
-  @DocsEditable()
   Shader createShader(int type) native;
 
-  @DomName('WebGLRenderingContext.createTexture')
-  @DocsEditable()
   Texture createTexture() native;
 
-  @DomName('WebGLRenderingContext.cullFace')
-  @DocsEditable()
   void cullFace(int mode) native;
 
-  @DomName('WebGLRenderingContext.deleteBuffer')
-  @DocsEditable()
   void deleteBuffer(Buffer buffer) native;
 
-  @DomName('WebGLRenderingContext.deleteFramebuffer')
-  @DocsEditable()
   void deleteFramebuffer(Framebuffer framebuffer) native;
 
-  @DomName('WebGLRenderingContext.deleteProgram')
-  @DocsEditable()
   void deleteProgram(Program program) native;
 
-  @DomName('WebGLRenderingContext.deleteRenderbuffer')
-  @DocsEditable()
   void deleteRenderbuffer(Renderbuffer renderbuffer) native;
 
-  @DomName('WebGLRenderingContext.deleteShader')
-  @DocsEditable()
   void deleteShader(Shader shader) native;
 
-  @DomName('WebGLRenderingContext.deleteTexture')
-  @DocsEditable()
   void deleteTexture(Texture texture) native;
 
-  @DomName('WebGLRenderingContext.depthFunc')
-  @DocsEditable()
   void depthFunc(int func) native;
 
-  @DomName('WebGLRenderingContext.depthMask')
-  @DocsEditable()
   void depthMask(bool flag) native;
 
-  @DomName('WebGLRenderingContext.depthRange')
-  @DocsEditable()
   void depthRange(num zNear, num zFar) native;
 
-  @DomName('WebGLRenderingContext.detachShader')
-  @DocsEditable()
   void detachShader(Program program, Shader shader) native;
 
-  @DomName('WebGLRenderingContext.disable')
-  @DocsEditable()
   void disable(int cap) native;
 
-  @DomName('WebGLRenderingContext.disableVertexAttribArray')
-  @DocsEditable()
   void disableVertexAttribArray(int index) native;
 
-  @DomName('WebGLRenderingContext.drawArrays')
-  @DocsEditable()
   void drawArrays(int mode, int first, int count) native;
 
-  @DomName('WebGLRenderingContext.drawElements')
-  @DocsEditable()
   void drawElements(int mode, int count, int type, int offset) native;
 
-  @DomName('WebGLRenderingContext.enable')
-  @DocsEditable()
   void enable(int cap) native;
 
-  @DomName('WebGLRenderingContext.enableVertexAttribArray')
-  @DocsEditable()
   void enableVertexAttribArray(int index) native;
 
-  @DomName('WebGLRenderingContext.finish')
-  @DocsEditable()
   void finish() native;
 
-  @DomName('WebGLRenderingContext.flush')
-  @DocsEditable()
   void flush() native;
 
-  @DomName('WebGLRenderingContext.framebufferRenderbuffer')
-  @DocsEditable()
   void framebufferRenderbuffer(int target, int attachment,
       int renderbuffertarget, Renderbuffer renderbuffer) native;
 
-  @DomName('WebGLRenderingContext.framebufferTexture2D')
-  @DocsEditable()
   void framebufferTexture2D(int target, int attachment, int textarget,
       Texture texture, int level) native;
 
-  @DomName('WebGLRenderingContext.frontFace')
-  @DocsEditable()
   void frontFace(int mode) native;
 
-  @DomName('WebGLRenderingContext.generateMipmap')
-  @DocsEditable()
   void generateMipmap(int target) native;
 
-  @DomName('WebGLRenderingContext.getActiveAttrib')
-  @DocsEditable()
   ActiveInfo getActiveAttrib(Program program, int index) native;
 
-  @DomName('WebGLRenderingContext.getActiveUniform')
-  @DocsEditable()
   ActiveInfo getActiveUniform(Program program, int index) native;
 
-  @DomName('WebGLRenderingContext.getAttachedShaders')
-  @DocsEditable()
   List<Shader> getAttachedShaders(Program program) native;
 
-  @DomName('WebGLRenderingContext.getAttribLocation')
-  @DocsEditable()
   int getAttribLocation(Program program, String name) native;
 
-  @DomName('WebGLRenderingContext.getBufferParameter')
-  @DocsEditable()
   @Creates('int|Null')
   @Returns('int|Null')
   Object getBufferParameter(int target, int pname) native;
 
-  @DomName('WebGLRenderingContext.getContextAttributes')
-  @DocsEditable()
   @Creates('ContextAttributes|Null')
   Map getContextAttributes() {
     return convertNativeToDart_Dictionary(_getContextAttributes_1());
   }
 
   @JSName('getContextAttributes')
-  @DomName('WebGLRenderingContext.getContextAttributes')
-  @DocsEditable()
   @Creates('ContextAttributes|Null')
   _getContextAttributes_1() native;
 
-  @DomName('WebGLRenderingContext.getError')
-  @DocsEditable()
   int getError() native;
 
-  @DomName('WebGLRenderingContext.getExtension')
-  @DocsEditable()
   Object getExtension(String name) native;
 
-  @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
-  @DocsEditable()
   @Creates('int|Renderbuffer|Texture|Null')
   @Returns('int|Renderbuffer|Texture|Null')
   Object getFramebufferAttachmentParameter(
       int target, int attachment, int pname) native;
 
-  @DomName('WebGLRenderingContext.getParameter')
-  @DocsEditable()
   @Creates(
       'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List|Framebuffer|Renderbuffer|Texture')
   @Returns(
       'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List|Framebuffer|Renderbuffer|Texture')
   Object getParameter(int pname) native;
 
-  @DomName('WebGLRenderingContext.getProgramInfoLog')
-  @DocsEditable()
   String getProgramInfoLog(Program program) native;
 
-  @DomName('WebGLRenderingContext.getProgramParameter')
-  @DocsEditable()
   @Creates('int|bool|Null')
   @Returns('int|bool|Null')
   Object getProgramParameter(Program program, int pname) native;
 
-  @DomName('WebGLRenderingContext.getRenderbufferParameter')
-  @DocsEditable()
   @Creates('int|Null')
   @Returns('int|Null')
   Object getRenderbufferParameter(int target, int pname) native;
 
-  @DomName('WebGLRenderingContext.getShaderInfoLog')
-  @DocsEditable()
   String getShaderInfoLog(Shader shader) native;
 
-  @DomName('WebGLRenderingContext.getShaderParameter')
-  @DocsEditable()
   @Creates('int|bool|Null')
   @Returns('int|bool|Null')
   Object getShaderParameter(Shader shader, int pname) native;
 
-  @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
-  @DocsEditable()
   ShaderPrecisionFormat getShaderPrecisionFormat(
       int shadertype, int precisiontype) native;
 
-  @DomName('WebGLRenderingContext.getShaderSource')
-  @DocsEditable()
   String getShaderSource(Shader shader) native;
 
-  @DomName('WebGLRenderingContext.getSupportedExtensions')
-  @DocsEditable()
   List<String> getSupportedExtensions() native;
 
-  @DomName('WebGLRenderingContext.getTexParameter')
-  @DocsEditable()
   @Creates('int|Null')
   @Returns('int|Null')
   Object getTexParameter(int target, int pname) native;
 
-  @DomName('WebGLRenderingContext.getUniform')
-  @DocsEditable()
   @Creates(
       'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List')
   @Returns(
       'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List')
   Object getUniform(Program program, UniformLocation location) native;
 
-  @DomName('WebGLRenderingContext.getUniformLocation')
-  @DocsEditable()
   UniformLocation getUniformLocation(Program program, String name) native;
 
-  @DomName('WebGLRenderingContext.getVertexAttrib')
-  @DocsEditable()
   @Creates('Null|num|bool|NativeFloat32List|Buffer')
   @Returns('Null|num|bool|NativeFloat32List|Buffer')
   Object getVertexAttrib(int index, int pname) native;
 
-  @DomName('WebGLRenderingContext.getVertexAttribOffset')
-  @DocsEditable()
   int getVertexAttribOffset(int index, int pname) native;
 
-  @DomName('WebGLRenderingContext.hint')
-  @DocsEditable()
   void hint(int target, int mode) native;
 
-  @DomName('WebGLRenderingContext.isBuffer')
-  @DocsEditable()
   bool isBuffer(Buffer buffer) native;
 
-  @DomName('WebGLRenderingContext.isContextLost')
-  @DocsEditable()
   bool isContextLost() native;
 
-  @DomName('WebGLRenderingContext.isEnabled')
-  @DocsEditable()
   bool isEnabled(int cap) native;
 
-  @DomName('WebGLRenderingContext.isFramebuffer')
-  @DocsEditable()
   bool isFramebuffer(Framebuffer framebuffer) native;
 
-  @DomName('WebGLRenderingContext.isProgram')
-  @DocsEditable()
   bool isProgram(Program program) native;
 
-  @DomName('WebGLRenderingContext.isRenderbuffer')
-  @DocsEditable()
   bool isRenderbuffer(Renderbuffer renderbuffer) native;
 
-  @DomName('WebGLRenderingContext.isShader')
-  @DocsEditable()
   bool isShader(Shader shader) native;
 
-  @DomName('WebGLRenderingContext.isTexture')
-  @DocsEditable()
   bool isTexture(Texture texture) native;
 
-  @DomName('WebGLRenderingContext.lineWidth')
-  @DocsEditable()
   void lineWidth(num width) native;
 
-  @DomName('WebGLRenderingContext.linkProgram')
-  @DocsEditable()
   void linkProgram(Program program) native;
 
-  @DomName('WebGLRenderingContext.pixelStorei')
-  @DocsEditable()
   void pixelStorei(int pname, int param) native;
 
-  @DomName('WebGLRenderingContext.polygonOffset')
-  @DocsEditable()
   void polygonOffset(num factor, num units) native;
 
   @JSName('readPixels')
-  @DomName('WebGLRenderingContext.readPixels')
-  @DocsEditable()
   void _readPixels(int x, int y, int width, int height, int format, int type,
       TypedData pixels) native;
 
-  @DomName('WebGLRenderingContext.renderbufferStorage')
-  @DocsEditable()
   void renderbufferStorage(
       int target, int internalformat, int width, int height) native;
 
-  @DomName('WebGLRenderingContext.sampleCoverage')
-  @DocsEditable()
   void sampleCoverage(num value, bool invert) native;
 
-  @DomName('WebGLRenderingContext.scissor')
-  @DocsEditable()
   void scissor(int x, int y, int width, int height) native;
 
-  @DomName('WebGLRenderingContext.shaderSource')
-  @DocsEditable()
   void shaderSource(Shader shader, String string) native;
 
-  @DomName('WebGLRenderingContext.stencilFunc')
-  @DocsEditable()
   void stencilFunc(int func, int ref, int mask) native;
 
-  @DomName('WebGLRenderingContext.stencilFuncSeparate')
-  @DocsEditable()
   void stencilFuncSeparate(int face, int func, int ref, int mask) native;
 
-  @DomName('WebGLRenderingContext.stencilMask')
-  @DocsEditable()
   void stencilMask(int mask) native;
 
-  @DomName('WebGLRenderingContext.stencilMaskSeparate')
-  @DocsEditable()
   void stencilMaskSeparate(int face, int mask) native;
 
-  @DomName('WebGLRenderingContext.stencilOp')
-  @DocsEditable()
   void stencilOp(int fail, int zfail, int zpass) native;
 
-  @DomName('WebGLRenderingContext.stencilOpSeparate')
-  @DocsEditable()
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
 
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
   void texImage2D(
       int target,
       int level,
@@ -3362,46 +1071,28 @@
   }
 
   @JSName('texImage2D')
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
   void _texImage2D_1(target, level, internalformat, width, height, int border,
       format, type, TypedData pixels) native;
   @JSName('texImage2D')
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
   void _texImage2D_2(target, level, internalformat, format, type, pixels)
       native;
   @JSName('texImage2D')
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
   void _texImage2D_3(
       target, level, internalformat, format, type, ImageElement image) native;
   @JSName('texImage2D')
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
   void _texImage2D_4(
       target, level, internalformat, format, type, CanvasElement canvas) native;
   @JSName('texImage2D')
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
   void _texImage2D_5(
       target, level, internalformat, format, type, VideoElement video) native;
   @JSName('texImage2D')
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
   void _texImage2D_6(
       target, level, internalformat, format, type, ImageBitmap bitmap) native;
 
-  @DomName('WebGLRenderingContext.texParameterf')
-  @DocsEditable()
   void texParameterf(int target, int pname, num param) native;
 
-  @DomName('WebGLRenderingContext.texParameteri')
-  @DocsEditable()
   void texParameteri(int target, int pname, int param) native;
 
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
   void texSubImage2D(
       int target,
       int level,
@@ -3495,163 +1186,87 @@
   }
 
   @JSName('texSubImage2D')
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
   void _texSubImage2D_1(target, level, xoffset, yoffset, width, height,
       int format, type, TypedData pixels) native;
   @JSName('texSubImage2D')
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
   void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels)
       native;
   @JSName('texSubImage2D')
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
   void _texSubImage2D_3(
       target, level, xoffset, yoffset, format, type, ImageElement image) native;
   @JSName('texSubImage2D')
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
   void _texSubImage2D_4(target, level, xoffset, yoffset, format, type,
       CanvasElement canvas) native;
   @JSName('texSubImage2D')
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
   void _texSubImage2D_5(
       target, level, xoffset, yoffset, format, type, VideoElement video) native;
   @JSName('texSubImage2D')
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
   void _texSubImage2D_6(
       target, level, xoffset, yoffset, format, type, ImageBitmap bitmap) native;
 
-  @DomName('WebGLRenderingContext.uniform1f')
-  @DocsEditable()
   void uniform1f(UniformLocation location, num x) native;
 
-  @DomName('WebGLRenderingContext.uniform1fv')
-  @DocsEditable()
   void uniform1fv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniform1i')
-  @DocsEditable()
   void uniform1i(UniformLocation location, int x) native;
 
-  @DomName('WebGLRenderingContext.uniform1iv')
-  @DocsEditable()
   void uniform1iv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniform2f')
-  @DocsEditable()
   void uniform2f(UniformLocation location, num x, num y) native;
 
-  @DomName('WebGLRenderingContext.uniform2fv')
-  @DocsEditable()
   void uniform2fv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniform2i')
-  @DocsEditable()
   void uniform2i(UniformLocation location, int x, int y) native;
 
-  @DomName('WebGLRenderingContext.uniform2iv')
-  @DocsEditable()
   void uniform2iv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniform3f')
-  @DocsEditable()
   void uniform3f(UniformLocation location, num x, num y, num z) native;
 
-  @DomName('WebGLRenderingContext.uniform3fv')
-  @DocsEditable()
   void uniform3fv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniform3i')
-  @DocsEditable()
   void uniform3i(UniformLocation location, int x, int y, int z) native;
 
-  @DomName('WebGLRenderingContext.uniform3iv')
-  @DocsEditable()
   void uniform3iv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniform4f')
-  @DocsEditable()
   void uniform4f(UniformLocation location, num x, num y, num z, num w) native;
 
-  @DomName('WebGLRenderingContext.uniform4fv')
-  @DocsEditable()
   void uniform4fv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniform4i')
-  @DocsEditable()
   void uniform4i(UniformLocation location, int x, int y, int z, int w) native;
 
-  @DomName('WebGLRenderingContext.uniform4iv')
-  @DocsEditable()
   void uniform4iv(UniformLocation location, v) native;
 
-  @DomName('WebGLRenderingContext.uniformMatrix2fv')
-  @DocsEditable()
   void uniformMatrix2fv(UniformLocation location, bool transpose, array) native;
 
-  @DomName('WebGLRenderingContext.uniformMatrix3fv')
-  @DocsEditable()
   void uniformMatrix3fv(UniformLocation location, bool transpose, array) native;
 
-  @DomName('WebGLRenderingContext.uniformMatrix4fv')
-  @DocsEditable()
   void uniformMatrix4fv(UniformLocation location, bool transpose, array) native;
 
-  @DomName('WebGLRenderingContext.useProgram')
-  @DocsEditable()
   void useProgram(Program program) native;
 
-  @DomName('WebGLRenderingContext.validateProgram')
-  @DocsEditable()
   void validateProgram(Program program) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib1f')
-  @DocsEditable()
   void vertexAttrib1f(int indx, num x) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib1fv')
-  @DocsEditable()
   void vertexAttrib1fv(int indx, values) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib2f')
-  @DocsEditable()
   void vertexAttrib2f(int indx, num x, num y) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib2fv')
-  @DocsEditable()
   void vertexAttrib2fv(int indx, values) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib3f')
-  @DocsEditable()
   void vertexAttrib3f(int indx, num x, num y, num z) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib3fv')
-  @DocsEditable()
   void vertexAttrib3fv(int indx, values) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib4f')
-  @DocsEditable()
   void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
 
-  @DomName('WebGLRenderingContext.vertexAttrib4fv')
-  @DocsEditable()
   void vertexAttrib4fv(int indx, values) native;
 
-  @DomName('WebGLRenderingContext.vertexAttribPointer')
-  @DocsEditable()
   void vertexAttribPointer(int indx, int size, int type, bool normalized,
       int stride, int offset) native;
 
-  @DomName('WebGLRenderingContext.viewport')
-  @DocsEditable()
   void viewport(int x, int y, int width, int height) native;
 
-  @DomName('WebGLRenderingContext.readPixels')
-  @DocsEditable()
   void readPixels(int x, int y, int width, int height, int format, int type,
       TypedData pixels) {
     _readPixels(x, y, width, height, format, type, pixels);
@@ -3737,9 +1352,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGL2RenderingContext')
-@Experimental() // untriaged
 @Native("WebGL2RenderingContext")
 class RenderingContext2 extends Interceptor
     implements _WebGL2RenderingContextBase, _WebGLRenderingContextBase {
@@ -3748,1603 +1360,62 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGL2RenderingContext.canvas')
-  @DocsEditable()
-  @Experimental() // untriaged
   final Canvas canvas;
 
-  @DomName('WebGL2RenderingContext.ACTIVE_ATTRIBUTES')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ACTIVE_ATTRIBUTES = 0x8B89;
-
-  @DomName('WebGL2RenderingContext.ACTIVE_TEXTURE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ACTIVE_TEXTURE = 0x84E0;
-
-  @DomName('WebGL2RenderingContext.ACTIVE_UNIFORMS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ACTIVE_UNIFORMS = 0x8B86;
-
-  @DomName('WebGL2RenderingContext.ALIASED_LINE_WIDTH_RANGE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
-
-  @DomName('WebGL2RenderingContext.ALIASED_POINT_SIZE_RANGE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
-
-  @DomName('WebGL2RenderingContext.ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ALPHA = 0x1906;
-
-  @DomName('WebGL2RenderingContext.ALPHA_BITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ALPHA_BITS = 0x0D55;
-
-  @DomName('WebGL2RenderingContext.ALWAYS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ALWAYS = 0x0207;
-
-  @DomName('WebGL2RenderingContext.ARRAY_BUFFER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ARRAY_BUFFER = 0x8892;
-
-  @DomName('WebGL2RenderingContext.ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ARRAY_BUFFER_BINDING = 0x8894;
-
-  @DomName('WebGL2RenderingContext.ATTACHED_SHADERS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ATTACHED_SHADERS = 0x8B85;
-
-  @DomName('WebGL2RenderingContext.BACK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BACK = 0x0405;
-
-  @DomName('WebGL2RenderingContext.BLEND')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND = 0x0BE2;
-
-  @DomName('WebGL2RenderingContext.BLEND_COLOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_COLOR = 0x8005;
-
-  @DomName('WebGL2RenderingContext.BLEND_DST_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_DST_ALPHA = 0x80CA;
-
-  @DomName('WebGL2RenderingContext.BLEND_DST_RGB')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_DST_RGB = 0x80C8;
-
-  @DomName('WebGL2RenderingContext.BLEND_EQUATION')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_EQUATION = 0x8009;
-
-  @DomName('WebGL2RenderingContext.BLEND_EQUATION_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_EQUATION_ALPHA = 0x883D;
-
-  @DomName('WebGL2RenderingContext.BLEND_EQUATION_RGB')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_EQUATION_RGB = 0x8009;
-
-  @DomName('WebGL2RenderingContext.BLEND_SRC_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_SRC_ALPHA = 0x80CB;
-
-  @DomName('WebGL2RenderingContext.BLEND_SRC_RGB')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLEND_SRC_RGB = 0x80C9;
-
-  @DomName('WebGL2RenderingContext.BLUE_BITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BLUE_BITS = 0x0D54;
-
-  @DomName('WebGL2RenderingContext.BOOL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BOOL = 0x8B56;
-
-  @DomName('WebGL2RenderingContext.BOOL_VEC2')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BOOL_VEC2 = 0x8B57;
-
-  @DomName('WebGL2RenderingContext.BOOL_VEC3')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BOOL_VEC3 = 0x8B58;
-
-  @DomName('WebGL2RenderingContext.BOOL_VEC4')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BOOL_VEC4 = 0x8B59;
-
-  @DomName('WebGL2RenderingContext.BROWSER_DEFAULT_WEBGL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
-
-  @DomName('WebGL2RenderingContext.BUFFER_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BUFFER_SIZE = 0x8764;
-
-  @DomName('WebGL2RenderingContext.BUFFER_USAGE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BUFFER_USAGE = 0x8765;
-
-  @DomName('WebGL2RenderingContext.BYTE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int BYTE = 0x1400;
-
-  @DomName('WebGL2RenderingContext.CCW')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CCW = 0x0901;
-
-  @DomName('WebGL2RenderingContext.CLAMP_TO_EDGE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CLAMP_TO_EDGE = 0x812F;
-
-  @DomName('WebGL2RenderingContext.COLOR_ATTACHMENT0')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int COLOR_ATTACHMENT0 = 0x8CE0;
-
-  @DomName('WebGL2RenderingContext.COLOR_BUFFER_BIT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int COLOR_BUFFER_BIT = 0x00004000;
-
-  @DomName('WebGL2RenderingContext.COLOR_CLEAR_VALUE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int COLOR_CLEAR_VALUE = 0x0C22;
-
-  @DomName('WebGL2RenderingContext.COLOR_WRITEMASK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int COLOR_WRITEMASK = 0x0C23;
-
-  @DomName('WebGL2RenderingContext.COMPILE_STATUS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int COMPILE_STATUS = 0x8B81;
-
-  @DomName('WebGL2RenderingContext.COMPRESSED_TEXTURE_FORMATS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
-
-  @DomName('WebGL2RenderingContext.CONSTANT_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CONSTANT_ALPHA = 0x8003;
-
-  @DomName('WebGL2RenderingContext.CONSTANT_COLOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CONSTANT_COLOR = 0x8001;
-
-  @DomName('WebGL2RenderingContext.CONTEXT_LOST_WEBGL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CONTEXT_LOST_WEBGL = 0x9242;
-
-  @DomName('WebGL2RenderingContext.CULL_FACE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CULL_FACE = 0x0B44;
-
-  @DomName('WebGL2RenderingContext.CULL_FACE_MODE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CULL_FACE_MODE = 0x0B45;
-
-  @DomName('WebGL2RenderingContext.CURRENT_PROGRAM')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CURRENT_PROGRAM = 0x8B8D;
-
-  @DomName('WebGL2RenderingContext.CURRENT_VERTEX_ATTRIB')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
-
-  @DomName('WebGL2RenderingContext.CW')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int CW = 0x0900;
-
-  @DomName('WebGL2RenderingContext.DECR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DECR = 0x1E03;
-
-  @DomName('WebGL2RenderingContext.DECR_WRAP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DECR_WRAP = 0x8508;
-
-  @DomName('WebGL2RenderingContext.DELETE_STATUS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DELETE_STATUS = 0x8B80;
-
-  @DomName('WebGL2RenderingContext.DEPTH_ATTACHMENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_ATTACHMENT = 0x8D00;
-
-  @DomName('WebGL2RenderingContext.DEPTH_BITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_BITS = 0x0D56;
-
-  @DomName('WebGL2RenderingContext.DEPTH_BUFFER_BIT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_BUFFER_BIT = 0x00000100;
-
-  @DomName('WebGL2RenderingContext.DEPTH_CLEAR_VALUE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_CLEAR_VALUE = 0x0B73;
-
-  @DomName('WebGL2RenderingContext.DEPTH_COMPONENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_COMPONENT = 0x1902;
-
-  @DomName('WebGL2RenderingContext.DEPTH_COMPONENT16')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_COMPONENT16 = 0x81A5;
-
-  @DomName('WebGL2RenderingContext.DEPTH_FUNC')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_FUNC = 0x0B74;
-
-  @DomName('WebGL2RenderingContext.DEPTH_RANGE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_RANGE = 0x0B70;
-
-  @DomName('WebGL2RenderingContext.DEPTH_STENCIL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_STENCIL = 0x84F9;
-
-  @DomName('WebGL2RenderingContext.DEPTH_STENCIL_ATTACHMENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
-
-  @DomName('WebGL2RenderingContext.DEPTH_TEST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_TEST = 0x0B71;
-
-  @DomName('WebGL2RenderingContext.DEPTH_WRITEMASK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DEPTH_WRITEMASK = 0x0B72;
-
-  @DomName('WebGL2RenderingContext.DITHER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DITHER = 0x0BD0;
-
-  @DomName('WebGL2RenderingContext.DONT_CARE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DONT_CARE = 0x1100;
-
-  @DomName('WebGL2RenderingContext.DST_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DST_ALPHA = 0x0304;
-
-  @DomName('WebGL2RenderingContext.DST_COLOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DST_COLOR = 0x0306;
-
-  @DomName('WebGL2RenderingContext.DYNAMIC_DRAW')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int DYNAMIC_DRAW = 0x88E8;
-
-  @DomName('WebGL2RenderingContext.ELEMENT_ARRAY_BUFFER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
-
-  @DomName('WebGL2RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
-
-  @DomName('WebGL2RenderingContext.EQUAL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int EQUAL = 0x0202;
-
-  @DomName('WebGL2RenderingContext.FASTEST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FASTEST = 0x1101;
-
-  @DomName('WebGL2RenderingContext.FLOAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FLOAT = 0x1406;
-
-  @DomName('WebGL2RenderingContext.FLOAT_MAT2')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FLOAT_MAT2 = 0x8B5A;
-
-  @DomName('WebGL2RenderingContext.FLOAT_MAT3')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FLOAT_MAT3 = 0x8B5B;
-
-  @DomName('WebGL2RenderingContext.FLOAT_MAT4')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FLOAT_MAT4 = 0x8B5C;
-
-  @DomName('WebGL2RenderingContext.FLOAT_VEC2')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FLOAT_VEC2 = 0x8B50;
-
-  @DomName('WebGL2RenderingContext.FLOAT_VEC3')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FLOAT_VEC3 = 0x8B51;
-
-  @DomName('WebGL2RenderingContext.FLOAT_VEC4')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FLOAT_VEC4 = 0x8B52;
-
-  @DomName('WebGL2RenderingContext.FRAGMENT_SHADER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAGMENT_SHADER = 0x8B30;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER = 0x8D40;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
-
-  @DomName(
-      'WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_BINDING')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_BINDING = 0x8CA6;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_COMPLETE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
-
-  @DomName('WebGL2RenderingContext.FRAMEBUFFER_UNSUPPORTED')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
-
-  @DomName('WebGL2RenderingContext.FRONT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRONT = 0x0404;
-
-  @DomName('WebGL2RenderingContext.FRONT_AND_BACK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRONT_AND_BACK = 0x0408;
-
-  @DomName('WebGL2RenderingContext.FRONT_FACE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FRONT_FACE = 0x0B46;
-
-  @DomName('WebGL2RenderingContext.FUNC_ADD')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FUNC_ADD = 0x8006;
-
-  @DomName('WebGL2RenderingContext.FUNC_REVERSE_SUBTRACT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
-
-  @DomName('WebGL2RenderingContext.FUNC_SUBTRACT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int FUNC_SUBTRACT = 0x800A;
-
-  @DomName('WebGL2RenderingContext.GENERATE_MIPMAP_HINT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int GENERATE_MIPMAP_HINT = 0x8192;
-
-  @DomName('WebGL2RenderingContext.GEQUAL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int GEQUAL = 0x0206;
-
-  @DomName('WebGL2RenderingContext.GREATER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int GREATER = 0x0204;
-
-  @DomName('WebGL2RenderingContext.GREEN_BITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int GREEN_BITS = 0x0D53;
-
-  @DomName('WebGL2RenderingContext.HIGH_FLOAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int HIGH_FLOAT = 0x8DF2;
-
-  @DomName('WebGL2RenderingContext.HIGH_INT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int HIGH_INT = 0x8DF5;
-
-  @DomName('WebGL2RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
-
-  @DomName('WebGL2RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
-
-  @DomName('WebGL2RenderingContext.INCR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INCR = 0x1E02;
-
-  @DomName('WebGL2RenderingContext.INCR_WRAP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INCR_WRAP = 0x8507;
-
-  @DomName('WebGL2RenderingContext.INT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INT = 0x1404;
-
-  @DomName('WebGL2RenderingContext.INT_VEC2')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INT_VEC2 = 0x8B53;
-
-  @DomName('WebGL2RenderingContext.INT_VEC3')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INT_VEC3 = 0x8B54;
-
-  @DomName('WebGL2RenderingContext.INT_VEC4')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INT_VEC4 = 0x8B55;
-
-  @DomName('WebGL2RenderingContext.INVALID_ENUM')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INVALID_ENUM = 0x0500;
-
-  @DomName('WebGL2RenderingContext.INVALID_FRAMEBUFFER_OPERATION')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
-
-  @DomName('WebGL2RenderingContext.INVALID_OPERATION')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INVALID_OPERATION = 0x0502;
-
-  @DomName('WebGL2RenderingContext.INVALID_VALUE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INVALID_VALUE = 0x0501;
-
-  @DomName('WebGL2RenderingContext.INVERT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int INVERT = 0x150A;
-
-  @DomName('WebGL2RenderingContext.KEEP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int KEEP = 0x1E00;
-
-  @DomName('WebGL2RenderingContext.LEQUAL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LEQUAL = 0x0203;
-
-  @DomName('WebGL2RenderingContext.LESS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LESS = 0x0201;
-
-  @DomName('WebGL2RenderingContext.LINEAR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINEAR = 0x2601;
-
-  @DomName('WebGL2RenderingContext.LINEAR_MIPMAP_LINEAR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
-
-  @DomName('WebGL2RenderingContext.LINEAR_MIPMAP_NEAREST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
-
-  @DomName('WebGL2RenderingContext.LINES')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINES = 0x0001;
-
-  @DomName('WebGL2RenderingContext.LINE_LOOP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINE_LOOP = 0x0002;
-
-  @DomName('WebGL2RenderingContext.LINE_STRIP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINE_STRIP = 0x0003;
-
-  @DomName('WebGL2RenderingContext.LINE_WIDTH')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINE_WIDTH = 0x0B21;
-
-  @DomName('WebGL2RenderingContext.LINK_STATUS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LINK_STATUS = 0x8B82;
-
-  @DomName('WebGL2RenderingContext.LOW_FLOAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LOW_FLOAT = 0x8DF0;
-
-  @DomName('WebGL2RenderingContext.LOW_INT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LOW_INT = 0x8DF3;
-
-  @DomName('WebGL2RenderingContext.LUMINANCE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LUMINANCE = 0x1909;
-
-  @DomName('WebGL2RenderingContext.LUMINANCE_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int LUMINANCE_ALPHA = 0x190A;
-
-  @DomName('WebGL2RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
-
-  @DomName('WebGL2RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
-
-  @DomName('WebGL2RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
-
-  @DomName('WebGL2RenderingContext.MAX_RENDERBUFFER_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
-
-  @DomName('WebGL2RenderingContext.MAX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
-
-  @DomName('WebGL2RenderingContext.MAX_TEXTURE_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_TEXTURE_SIZE = 0x0D33;
-
-  @DomName('WebGL2RenderingContext.MAX_VARYING_VECTORS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_VARYING_VECTORS = 0x8DFC;
-
-  @DomName('WebGL2RenderingContext.MAX_VERTEX_ATTRIBS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_VERTEX_ATTRIBS = 0x8869;
-
-  @DomName('WebGL2RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
-
-  @DomName('WebGL2RenderingContext.MAX_VERTEX_UNIFORM_VECTORS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
-
-  @DomName('WebGL2RenderingContext.MAX_VIEWPORT_DIMS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
-
-  @DomName('WebGL2RenderingContext.MEDIUM_FLOAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MEDIUM_FLOAT = 0x8DF1;
-
-  @DomName('WebGL2RenderingContext.MEDIUM_INT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MEDIUM_INT = 0x8DF4;
-
-  @DomName('WebGL2RenderingContext.MIRRORED_REPEAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int MIRRORED_REPEAT = 0x8370;
-
-  @DomName('WebGL2RenderingContext.NEAREST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NEAREST = 0x2600;
-
-  @DomName('WebGL2RenderingContext.NEAREST_MIPMAP_LINEAR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
-
-  @DomName('WebGL2RenderingContext.NEAREST_MIPMAP_NEAREST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
-
-  @DomName('WebGL2RenderingContext.NEVER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NEVER = 0x0200;
-
-  @DomName('WebGL2RenderingContext.NICEST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NICEST = 0x1102;
-
-  @DomName('WebGL2RenderingContext.NONE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NONE = 0;
-
-  @DomName('WebGL2RenderingContext.NOTEQUAL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NOTEQUAL = 0x0205;
-
-  @DomName('WebGL2RenderingContext.NO_ERROR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int NO_ERROR = 0;
-
-  @DomName('WebGL2RenderingContext.ONE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ONE = 1;
-
-  @DomName('WebGL2RenderingContext.ONE_MINUS_CONSTANT_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
-
-  @DomName('WebGL2RenderingContext.ONE_MINUS_CONSTANT_COLOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
-
-  @DomName('WebGL2RenderingContext.ONE_MINUS_DST_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ONE_MINUS_DST_ALPHA = 0x0305;
-
-  @DomName('WebGL2RenderingContext.ONE_MINUS_DST_COLOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ONE_MINUS_DST_COLOR = 0x0307;
-
-  @DomName('WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
-
-  @DomName('WebGL2RenderingContext.ONE_MINUS_SRC_COLOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ONE_MINUS_SRC_COLOR = 0x0301;
-
-  @DomName('WebGL2RenderingContext.OUT_OF_MEMORY')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int OUT_OF_MEMORY = 0x0505;
-
-  @DomName('WebGL2RenderingContext.PACK_ALIGNMENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int PACK_ALIGNMENT = 0x0D05;
-
-  @DomName('WebGL2RenderingContext.POINTS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int POINTS = 0x0000;
-
-  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_FACTOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int POLYGON_OFFSET_FACTOR = 0x8038;
-
-  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_FILL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int POLYGON_OFFSET_FILL = 0x8037;
-
-  @DomName('WebGL2RenderingContext.POLYGON_OFFSET_UNITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int POLYGON_OFFSET_UNITS = 0x2A00;
-
-  @DomName('WebGL2RenderingContext.RED_BITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RED_BITS = 0x0D52;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER = 0x8D41;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_ALPHA_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_BINDING')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_BINDING = 0x8CA7;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_BLUE_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_DEPTH_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_GREEN_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_HEIGHT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_HEIGHT = 0x8D43;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_INTERNAL_FORMAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_RED_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_STENCIL_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
-
-  @DomName('WebGL2RenderingContext.RENDERBUFFER_WIDTH')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERBUFFER_WIDTH = 0x8D42;
-
-  @DomName('WebGL2RenderingContext.RENDERER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RENDERER = 0x1F01;
-
-  @DomName('WebGL2RenderingContext.REPEAT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int REPEAT = 0x2901;
-
-  @DomName('WebGL2RenderingContext.REPLACE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int REPLACE = 0x1E01;
-
-  @DomName('WebGL2RenderingContext.RGB')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RGB = 0x1907;
-
-  @DomName('WebGL2RenderingContext.RGB565')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RGB565 = 0x8D62;
-
-  @DomName('WebGL2RenderingContext.RGB5_A1')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RGB5_A1 = 0x8057;
-
-  @DomName('WebGL2RenderingContext.RGBA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RGBA = 0x1908;
-
-  @DomName('WebGL2RenderingContext.RGBA4')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int RGBA4 = 0x8056;
-
-  @DomName('WebGL2RenderingContext.SAMPLER_2D')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLER_2D = 0x8B5E;
-
-  @DomName('WebGL2RenderingContext.SAMPLER_CUBE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLER_CUBE = 0x8B60;
-
-  @DomName('WebGL2RenderingContext.SAMPLES')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLES = 0x80A9;
-
-  @DomName('WebGL2RenderingContext.SAMPLE_ALPHA_TO_COVERAGE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
-
-  @DomName('WebGL2RenderingContext.SAMPLE_BUFFERS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLE_BUFFERS = 0x80A8;
-
-  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLE_COVERAGE = 0x80A0;
-
-  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE_INVERT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
-
-  @DomName('WebGL2RenderingContext.SAMPLE_COVERAGE_VALUE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
-
-  @DomName('WebGL2RenderingContext.SCISSOR_BOX')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SCISSOR_BOX = 0x0C10;
-
-  @DomName('WebGL2RenderingContext.SCISSOR_TEST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SCISSOR_TEST = 0x0C11;
-
-  @DomName('WebGL2RenderingContext.SHADER_TYPE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SHADER_TYPE = 0x8B4F;
-
-  @DomName('WebGL2RenderingContext.SHADING_LANGUAGE_VERSION')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
-
-  @DomName('WebGL2RenderingContext.SHORT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SHORT = 0x1402;
-
-  @DomName('WebGL2RenderingContext.SRC_ALPHA')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SRC_ALPHA = 0x0302;
-
-  @DomName('WebGL2RenderingContext.SRC_ALPHA_SATURATE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SRC_ALPHA_SATURATE = 0x0308;
-
-  @DomName('WebGL2RenderingContext.SRC_COLOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SRC_COLOR = 0x0300;
-
-  @DomName('WebGL2RenderingContext.STATIC_DRAW')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STATIC_DRAW = 0x88E4;
-
-  @DomName('WebGL2RenderingContext.STENCIL_ATTACHMENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_ATTACHMENT = 0x8D20;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BACK_FAIL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BACK_FAIL = 0x8801;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BACK_FUNC')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BACK_FUNC = 0x8800;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BACK_REF')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BACK_REF = 0x8CA3;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BACK_VALUE_MASK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BACK_WRITEMASK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BITS = 0x0D57;
-
-  @DomName('WebGL2RenderingContext.STENCIL_BUFFER_BIT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_BUFFER_BIT = 0x00000400;
-
-  @DomName('WebGL2RenderingContext.STENCIL_CLEAR_VALUE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_CLEAR_VALUE = 0x0B91;
-
-  @DomName('WebGL2RenderingContext.STENCIL_FAIL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_FAIL = 0x0B94;
-
-  @DomName('WebGL2RenderingContext.STENCIL_FUNC')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_FUNC = 0x0B92;
-
-  @DomName('WebGL2RenderingContext.STENCIL_INDEX8')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_INDEX8 = 0x8D48;
-
-  @DomName('WebGL2RenderingContext.STENCIL_PASS_DEPTH_FAIL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
-
-  @DomName('WebGL2RenderingContext.STENCIL_PASS_DEPTH_PASS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
-
-  @DomName('WebGL2RenderingContext.STENCIL_REF')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_REF = 0x0B97;
-
-  @DomName('WebGL2RenderingContext.STENCIL_TEST')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_TEST = 0x0B90;
-
-  @DomName('WebGL2RenderingContext.STENCIL_VALUE_MASK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_VALUE_MASK = 0x0B93;
-
-  @DomName('WebGL2RenderingContext.STENCIL_WRITEMASK')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STENCIL_WRITEMASK = 0x0B98;
-
-  @DomName('WebGL2RenderingContext.STREAM_DRAW')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int STREAM_DRAW = 0x88E0;
-
-  @DomName('WebGL2RenderingContext.SUBPIXEL_BITS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int SUBPIXEL_BITS = 0x0D50;
-
-  @DomName('WebGL2RenderingContext.TEXTURE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE = 0x1702;
-
-  @DomName('WebGL2RenderingContext.TEXTURE0')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE0 = 0x84C0;
-
-  @DomName('WebGL2RenderingContext.TEXTURE1')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE1 = 0x84C1;
-
-  @DomName('WebGL2RenderingContext.TEXTURE10')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE10 = 0x84CA;
-
-  @DomName('WebGL2RenderingContext.TEXTURE11')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE11 = 0x84CB;
-
-  @DomName('WebGL2RenderingContext.TEXTURE12')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE12 = 0x84CC;
-
-  @DomName('WebGL2RenderingContext.TEXTURE13')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE13 = 0x84CD;
-
-  @DomName('WebGL2RenderingContext.TEXTURE14')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE14 = 0x84CE;
-
-  @DomName('WebGL2RenderingContext.TEXTURE15')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE15 = 0x84CF;
-
-  @DomName('WebGL2RenderingContext.TEXTURE16')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE16 = 0x84D0;
-
-  @DomName('WebGL2RenderingContext.TEXTURE17')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE17 = 0x84D1;
-
-  @DomName('WebGL2RenderingContext.TEXTURE18')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE18 = 0x84D2;
-
-  @DomName('WebGL2RenderingContext.TEXTURE19')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE19 = 0x84D3;
-
-  @DomName('WebGL2RenderingContext.TEXTURE2')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE2 = 0x84C2;
-
-  @DomName('WebGL2RenderingContext.TEXTURE20')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE20 = 0x84D4;
-
-  @DomName('WebGL2RenderingContext.TEXTURE21')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE21 = 0x84D5;
-
-  @DomName('WebGL2RenderingContext.TEXTURE22')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE22 = 0x84D6;
-
-  @DomName('WebGL2RenderingContext.TEXTURE23')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE23 = 0x84D7;
-
-  @DomName('WebGL2RenderingContext.TEXTURE24')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE24 = 0x84D8;
-
-  @DomName('WebGL2RenderingContext.TEXTURE25')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE25 = 0x84D9;
-
-  @DomName('WebGL2RenderingContext.TEXTURE26')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE26 = 0x84DA;
-
-  @DomName('WebGL2RenderingContext.TEXTURE27')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE27 = 0x84DB;
-
-  @DomName('WebGL2RenderingContext.TEXTURE28')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE28 = 0x84DC;
-
-  @DomName('WebGL2RenderingContext.TEXTURE29')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE29 = 0x84DD;
-
-  @DomName('WebGL2RenderingContext.TEXTURE3')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE3 = 0x84C3;
-
-  @DomName('WebGL2RenderingContext.TEXTURE30')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE30 = 0x84DE;
-
-  @DomName('WebGL2RenderingContext.TEXTURE31')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE31 = 0x84DF;
-
-  @DomName('WebGL2RenderingContext.TEXTURE4')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE4 = 0x84C4;
-
-  @DomName('WebGL2RenderingContext.TEXTURE5')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE5 = 0x84C5;
-
-  @DomName('WebGL2RenderingContext.TEXTURE6')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE6 = 0x84C6;
-
-  @DomName('WebGL2RenderingContext.TEXTURE7')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE7 = 0x84C7;
-
-  @DomName('WebGL2RenderingContext.TEXTURE8')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE8 = 0x84C8;
-
-  @DomName('WebGL2RenderingContext.TEXTURE9')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE9 = 0x84C9;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_2D')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_2D = 0x0DE1;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_BINDING_2D')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_BINDING_2D = 0x8069;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_BINDING_CUBE_MAP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_CUBE_MAP = 0x8513;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_MAG_FILTER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_MAG_FILTER = 0x2800;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_MIN_FILTER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_MIN_FILTER = 0x2801;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_WRAP_S')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_WRAP_S = 0x2802;
-
-  @DomName('WebGL2RenderingContext.TEXTURE_WRAP_T')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TEXTURE_WRAP_T = 0x2803;
-
-  @DomName('WebGL2RenderingContext.TRIANGLES')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TRIANGLES = 0x0004;
-
-  @DomName('WebGL2RenderingContext.TRIANGLE_FAN')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TRIANGLE_FAN = 0x0006;
-
-  @DomName('WebGL2RenderingContext.TRIANGLE_STRIP')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int TRIANGLE_STRIP = 0x0005;
-
-  @DomName('WebGL2RenderingContext.UNPACK_ALIGNMENT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNPACK_ALIGNMENT = 0x0CF5;
-
-  @DomName('WebGL2RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
-
-  @DomName('WebGL2RenderingContext.UNPACK_FLIP_Y_WEBGL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
-
-  @DomName('WebGL2RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
-
-  @DomName('WebGL2RenderingContext.UNSIGNED_BYTE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNSIGNED_BYTE = 0x1401;
-
-  @DomName('WebGL2RenderingContext.UNSIGNED_INT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNSIGNED_INT = 0x1405;
-
-  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNSIGNED_SHORT = 0x1403;
-
-  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_4_4_4_4')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
-
-  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_5_5_5_1')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
-
-  @DomName('WebGL2RenderingContext.UNSIGNED_SHORT_5_6_5')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
-
-  @DomName('WebGL2RenderingContext.VALIDATE_STATUS')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VALIDATE_STATUS = 0x8B83;
-
-  @DomName('WebGL2RenderingContext.VENDOR')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VENDOR = 0x1F00;
-
-  @DomName('WebGL2RenderingContext.VERSION')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERSION = 0x1F02;
-
-  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
-
-  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
-
-  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
-
-  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
-
-  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
-
-  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
-
-  @DomName('WebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
-
-  @DomName('WebGL2RenderingContext.VERTEX_SHADER')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VERTEX_SHADER = 0x8B31;
-
-  @DomName('WebGL2RenderingContext.VIEWPORT')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int VIEWPORT = 0x0BA2;
-
-  @DomName('WebGL2RenderingContext.ZERO')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const int ZERO = 0;
-
   // From WebGL2RenderingContextBase
 
-  @DomName('WebGL2RenderingContext.beginQuery')
-  @DocsEditable()
-  @Experimental() // untriaged
   void beginQuery(int target, Query query) native;
 
-  @DomName('WebGL2RenderingContext.beginTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   void beginTransformFeedback(int primitiveMode) native;
 
-  @DomName('WebGL2RenderingContext.bindBufferBase')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindBufferBase(int target, int index, Buffer buffer) native;
 
-  @DomName('WebGL2RenderingContext.bindBufferRange')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindBufferRange(
       int target, int index, Buffer buffer, int offset, int size) native;
 
-  @DomName('WebGL2RenderingContext.bindSampler')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindSampler(int unit, Sampler sampler) native;
 
-  @DomName('WebGL2RenderingContext.bindTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindTransformFeedback(int target, TransformFeedback feedback) native;
 
-  @DomName('WebGL2RenderingContext.bindVertexArray')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindVertexArray(VertexArrayObject vertexArray) native;
 
-  @DomName('WebGL2RenderingContext.blitFramebuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0,
       int dstY0, int dstX1, int dstY1, int mask, int filter) native;
 
   @JSName('bufferData')
-  @DomName('WebGL2RenderingContext.bufferData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bufferData2(int target, TypedData srcData, int usage, int srcOffset,
       [int length]) native;
 
   @JSName('bufferSubData')
-  @DomName('WebGL2RenderingContext.bufferSubData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bufferSubData2(
       int target, int dstByteOffset, TypedData srcData, int srcOffset,
       [int length]) native;
 
-  @DomName('WebGL2RenderingContext.clearBufferfi')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearBufferfi(int buffer, int drawbuffer, num depth, int stencil) native;
 
-  @DomName('WebGL2RenderingContext.clearBufferfv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearBufferfv(int buffer, int drawbuffer, value, [int srcOffset]) native;
 
-  @DomName('WebGL2RenderingContext.clearBufferiv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearBufferiv(int buffer, int drawbuffer, value, [int srcOffset]) native;
 
-  @DomName('WebGL2RenderingContext.clearBufferuiv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearBufferuiv(int buffer, int drawbuffer, value, [int srcOffset])
       native;
 
-  @DomName('WebGL2RenderingContext.clientWaitSync')
-  @DocsEditable()
-  @Experimental() // untriaged
   int clientWaitSync(Sync sync, int flags, int timeout) native;
 
   @JSName('compressedTexImage2D')
-  @DomName('WebGL2RenderingContext.compressedTexImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexImage2D2(int target, int level, int internalformat,
       int width, int height, int border, TypedData data, int srcOffset,
       [int srcLengthOverride]) native;
 
   @JSName('compressedTexImage2D')
-  @DomName('WebGL2RenderingContext.compressedTexImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexImage2D3(int target, int level, int internalformat,
       int width, int height, int border, int imageSize, int offset) native;
 
-  @DomName('WebGL2RenderingContext.compressedTexImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexImage3D(int target, int level, int internalformat,
       int width, int height, int depth, int border, TypedData data,
       [int srcOffset, int srcLengthOverride]) native;
 
   @JSName('compressedTexImage3D')
-  @DomName('WebGL2RenderingContext.compressedTexImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexImage3D2(
       int target,
       int level,
@@ -5357,31 +1428,19 @@
       int offset) native;
 
   @JSName('compressedTexSubImage2D')
-  @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexSubImage2D2(int target, int level, int xoffset, int yoffset,
       int width, int height, int format, TypedData data, int srcOffset,
       [int srcLengthOverride]) native;
 
   @JSName('compressedTexSubImage2D')
-  @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexSubImage2D3(int target, int level, int xoffset, int yoffset,
       int width, int height, int format, int imageSize, int offset) native;
 
-  @DomName('WebGL2RenderingContext.compressedTexSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexSubImage3D(int target, int level, int xoffset, int yoffset,
       int zoffset, int width, int height, int depth, int format, TypedData data,
       [int srcOffset, int srcLengthOverride]) native;
 
   @JSName('compressedTexSubImage3D')
-  @DomName('WebGL2RenderingContext.compressedTexSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexSubImage3D2(
       int target,
       int level,
@@ -5395,269 +1454,122 @@
       int imageSize,
       int offset) native;
 
-  @DomName('WebGL2RenderingContext.copyBufferSubData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void copyBufferSubData(int readTarget, int writeTarget, int readOffset,
       int writeOffset, int size) native;
 
-  @DomName('WebGL2RenderingContext.copyTexSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void copyTexSubImage3D(int target, int level, int xoffset, int yoffset,
       int zoffset, int x, int y, int width, int height) native;
 
-  @DomName('WebGL2RenderingContext.createQuery')
-  @DocsEditable()
-  @Experimental() // untriaged
   Query createQuery() native;
 
-  @DomName('WebGL2RenderingContext.createSampler')
-  @DocsEditable()
-  @Experimental() // untriaged
   Sampler createSampler() native;
 
-  @DomName('WebGL2RenderingContext.createTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   TransformFeedback createTransformFeedback() native;
 
-  @DomName('WebGL2RenderingContext.createVertexArray')
-  @DocsEditable()
-  @Experimental() // untriaged
   VertexArrayObject createVertexArray() native;
 
-  @DomName('WebGL2RenderingContext.deleteQuery')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteQuery(Query query) native;
 
-  @DomName('WebGL2RenderingContext.deleteSampler')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteSampler(Sampler sampler) native;
 
-  @DomName('WebGL2RenderingContext.deleteSync')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteSync(Sync sync) native;
 
-  @DomName('WebGL2RenderingContext.deleteTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteTransformFeedback(TransformFeedback feedback) native;
 
-  @DomName('WebGL2RenderingContext.deleteVertexArray')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteVertexArray(VertexArrayObject vertexArray) native;
 
-  @DomName('WebGL2RenderingContext.drawArraysInstanced')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawArraysInstanced(int mode, int first, int count, int instanceCount)
       native;
 
-  @DomName('WebGL2RenderingContext.drawBuffers')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawBuffers(List<int> buffers) native;
 
-  @DomName('WebGL2RenderingContext.drawElementsInstanced')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawElementsInstanced(
       int mode, int count, int type, int offset, int instanceCount) native;
 
-  @DomName('WebGL2RenderingContext.drawRangeElements')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawRangeElements(
       int mode, int start, int end, int count, int type, int offset) native;
 
-  @DomName('WebGL2RenderingContext.endQuery')
-  @DocsEditable()
-  @Experimental() // untriaged
   void endQuery(int target) native;
 
-  @DomName('WebGL2RenderingContext.endTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   void endTransformFeedback() native;
 
-  @DomName('WebGL2RenderingContext.fenceSync')
-  @DocsEditable()
-  @Experimental() // untriaged
   Sync fenceSync(int condition, int flags) native;
 
-  @DomName('WebGL2RenderingContext.framebufferTextureLayer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void framebufferTextureLayer(
       int target, int attachment, Texture texture, int level, int layer) native;
 
-  @DomName('WebGL2RenderingContext.getActiveUniformBlockName')
-  @DocsEditable()
-  @Experimental() // untriaged
   String getActiveUniformBlockName(Program program, int uniformBlockIndex)
       native;
 
-  @DomName('WebGL2RenderingContext.getActiveUniformBlockParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getActiveUniformBlockParameter(
       Program program, int uniformBlockIndex, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getActiveUniforms')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getActiveUniforms(Program program, List<int> uniformIndices, int pname)
       native;
 
-  @DomName('WebGL2RenderingContext.getBufferSubData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void getBufferSubData(int target, int srcByteOffset, TypedData dstData,
       [int dstOffset, int length]) native;
 
-  @DomName('WebGL2RenderingContext.getFragDataLocation')
-  @DocsEditable()
-  @Experimental() // untriaged
   int getFragDataLocation(Program program, String name) native;
 
-  @DomName('WebGL2RenderingContext.getIndexedParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getIndexedParameter(int target, int index) native;
 
-  @DomName('WebGL2RenderingContext.getInternalformatParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getInternalformatParameter(int target, int internalformat, int pname)
       native;
 
-  @DomName('WebGL2RenderingContext.getQuery')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getQuery(int target, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getQueryParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getQueryParameter(Query query, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getSamplerParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getSamplerParameter(Sampler sampler, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getSyncParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getSyncParameter(Sync sync, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getTransformFeedbackVarying')
-  @DocsEditable()
-  @Experimental() // untriaged
   ActiveInfo getTransformFeedbackVarying(Program program, int index) native;
 
-  @DomName('WebGL2RenderingContext.getUniformBlockIndex')
-  @DocsEditable()
-  @Experimental() // untriaged
   int getUniformBlockIndex(Program program, String uniformBlockName) native;
 
-  @DomName('WebGL2RenderingContext.getUniformIndices')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<int> getUniformIndices(Program program, List<String> uniformNames) {
     List uniformNames_1 = convertDartToNative_StringArray(uniformNames);
     return _getUniformIndices_1(program, uniformNames_1);
   }
 
   @JSName('getUniformIndices')
-  @DomName('WebGL2RenderingContext.getUniformIndices')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<int> _getUniformIndices_1(Program program, List uniformNames) native;
 
-  @DomName('WebGL2RenderingContext.invalidateFramebuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void invalidateFramebuffer(int target, List<int> attachments) native;
 
-  @DomName('WebGL2RenderingContext.invalidateSubFramebuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void invalidateSubFramebuffer(int target, List<int> attachments, int x, int y,
       int width, int height) native;
 
-  @DomName('WebGL2RenderingContext.isQuery')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isQuery(Query query) native;
 
-  @DomName('WebGL2RenderingContext.isSampler')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isSampler(Sampler sampler) native;
 
-  @DomName('WebGL2RenderingContext.isSync')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isSync(Sync sync) native;
 
-  @DomName('WebGL2RenderingContext.isTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isTransformFeedback(TransformFeedback feedback) native;
 
-  @DomName('WebGL2RenderingContext.isVertexArray')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isVertexArray(VertexArrayObject vertexArray) native;
 
-  @DomName('WebGL2RenderingContext.pauseTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   void pauseTransformFeedback() native;
 
-  @DomName('WebGL2RenderingContext.readBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void readBuffer(int mode) native;
 
   @JSName('readPixels')
-  @DomName('WebGL2RenderingContext.readPixels')
-  @DocsEditable()
-  @Experimental() // untriaged
   void readPixels2(int x, int y, int width, int height, int format, int type,
       dstData_OR_offset,
       [int offset]) native;
 
-  @DomName('WebGL2RenderingContext.renderbufferStorageMultisample')
-  @DocsEditable()
-  @Experimental() // untriaged
   void renderbufferStorageMultisample(int target, int samples,
       int internalformat, int width, int height) native;
 
-  @DomName('WebGL2RenderingContext.resumeTransformFeedback')
-  @DocsEditable()
-  @Experimental() // untriaged
   void resumeTransformFeedback() native;
 
-  @DomName('WebGL2RenderingContext.samplerParameterf')
-  @DocsEditable()
-  @Experimental() // untriaged
   void samplerParameterf(Sampler sampler, int pname, num param) native;
 
-  @DomName('WebGL2RenderingContext.samplerParameteri')
-  @DocsEditable()
-  @Experimental() // untriaged
   void samplerParameteri(Sampler sampler, int pname, int param) native;
 
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texImage2D2(
       int target,
       int level,
@@ -5773,51 +1685,27 @@
   }
 
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D2_1(target, level, internalformat, width, height, border,
       format, type, int offset) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D2_2(target, level, internalformat, width, height, border,
       format, type, data) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D2_3(target, level, internalformat, width, height, border,
       format, type, ImageElement image) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D2_4(target, level, internalformat, width, height, border,
       format, type, CanvasElement canvas) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D2_5(target, level, internalformat, width, height, border,
       format, type, VideoElement video) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D2_6(target, level, internalformat, width, height, border,
       format, type, ImageBitmap bitmap) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D2_7(target, level, internalformat, width, height, border,
       format, type, TypedData srcData, srcOffset) native;
 
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texImage3D(
       int target,
       int level,
@@ -5958,69 +1846,36 @@
   }
 
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_1(target, level, internalformat, width, height, depth,
       border, format, type, int offset) native;
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_2(target, level, internalformat, width, height, depth,
       border, format, type, data) native;
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_3(target, level, internalformat, width, height, depth,
       border, format, type, ImageElement image) native;
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_4(target, level, internalformat, width, height, depth,
       border, format, type, CanvasElement canvas) native;
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_5(target, level, internalformat, width, height, depth,
       border, format, type, VideoElement video) native;
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_6(target, level, internalformat, width, height, depth,
       border, format, type, ImageBitmap bitmap) native;
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_7(target, level, internalformat, width, height, depth,
       border, format, type, TypedData pixels) native;
   @JSName('texImage3D')
-  @DomName('WebGL2RenderingContext.texImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage3D_8(target, level, internalformat, width, height, depth,
       border, format, type, TypedData pixels, srcOffset) native;
 
-  @DomName('WebGL2RenderingContext.texStorage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texStorage2D(
       int target, int levels, int internalformat, int width, int height) native;
 
-  @DomName('WebGL2RenderingContext.texStorage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texStorage3D(int target, int levels, int internalformat, int width,
       int height, int depth) native;
 
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texSubImage2D2(
       int target,
       int level,
@@ -6136,51 +1991,27 @@
   }
 
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D2_1(target, level, xoffset, yoffset, width, height, format,
       type, int offset) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D2_2(target, level, xoffset, yoffset, width, height, format,
       type, data) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D2_3(target, level, xoffset, yoffset, width, height, format,
       type, ImageElement image) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D2_4(target, level, xoffset, yoffset, width, height, format,
       type, CanvasElement canvas) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D2_5(target, level, xoffset, yoffset, width, height, format,
       type, VideoElement video) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D2_6(target, level, xoffset, yoffset, width, height, format,
       type, ImageBitmap bitmap) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D2_7(target, level, xoffset, yoffset, width, height, format,
       type, TypedData srcData, srcOffset) native;
 
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texSubImage3D(
       int target,
       int level,
@@ -6327,57 +2158,30 @@
   }
 
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_1(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, int offset) native;
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_2(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, data) native;
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_3(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, ImageElement image) native;
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_4(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, CanvasElement canvas) native;
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_5(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, VideoElement video) native;
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_6(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, ImageBitmap bitmap) native;
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_7(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, TypedData pixels) native;
   @JSName('texSubImage3D')
-  @DomName('WebGL2RenderingContext.texSubImage3D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage3D_8(target, level, xoffset, yoffset, zoffset, width, height,
       depth, format, type, TypedData pixels, srcOffset) native;
 
-  @DomName('WebGL2RenderingContext.transformFeedbackVaryings')
-  @DocsEditable()
-  @Experimental() // untriaged
   void transformFeedbackVaryings(
       Program program, List<String> varyings, int bufferMode) {
     List varyings_1 = convertDartToNative_StringArray(varyings);
@@ -6386,760 +2190,340 @@
   }
 
   @JSName('transformFeedbackVaryings')
-  @DomName('WebGL2RenderingContext.transformFeedbackVaryings')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _transformFeedbackVaryings_1(Program program, List varyings, bufferMode)
       native;
 
   @JSName('uniform1fv')
-  @DomName('WebGL2RenderingContext.uniform1fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1fv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
   @JSName('uniform1iv')
-  @DomName('WebGL2RenderingContext.uniform1iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1iv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
-  @DomName('WebGL2RenderingContext.uniform1ui')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1ui(UniformLocation location, int v0) native;
 
-  @DomName('WebGL2RenderingContext.uniform1uiv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1uiv(UniformLocation location, v, [int srcOffset, int srcLength])
       native;
 
   @JSName('uniform2fv')
-  @DomName('WebGL2RenderingContext.uniform2fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2fv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
   @JSName('uniform2iv')
-  @DomName('WebGL2RenderingContext.uniform2iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2iv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
-  @DomName('WebGL2RenderingContext.uniform2ui')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2ui(UniformLocation location, int v0, int v1) native;
 
-  @DomName('WebGL2RenderingContext.uniform2uiv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2uiv(UniformLocation location, v, [int srcOffset, int srcLength])
       native;
 
   @JSName('uniform3fv')
-  @DomName('WebGL2RenderingContext.uniform3fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3fv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
   @JSName('uniform3iv')
-  @DomName('WebGL2RenderingContext.uniform3iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3iv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
-  @DomName('WebGL2RenderingContext.uniform3ui')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3ui(UniformLocation location, int v0, int v1, int v2) native;
 
-  @DomName('WebGL2RenderingContext.uniform3uiv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3uiv(UniformLocation location, v, [int srcOffset, int srcLength])
       native;
 
   @JSName('uniform4fv')
-  @DomName('WebGL2RenderingContext.uniform4fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4fv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
   @JSName('uniform4iv')
-  @DomName('WebGL2RenderingContext.uniform4iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4iv2(UniformLocation location, v, int srcOffset, [int srcLength])
       native;
 
-  @DomName('WebGL2RenderingContext.uniform4ui')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4ui(UniformLocation location, int v0, int v1, int v2, int v3)
       native;
 
-  @DomName('WebGL2RenderingContext.uniform4uiv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4uiv(UniformLocation location, v, [int srcOffset, int srcLength])
       native;
 
-  @DomName('WebGL2RenderingContext.uniformBlockBinding')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformBlockBinding(
       Program program, int uniformBlockIndex, int uniformBlockBinding) native;
 
   @JSName('uniformMatrix2fv')
-  @DomName('WebGL2RenderingContext.uniformMatrix2fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix2fv2(
       UniformLocation location, bool transpose, array, int srcOffset,
       [int srcLength]) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix2x3fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix2x3fv(UniformLocation location, bool transpose, value,
       [int srcOffset, int srcLength]) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix2x4fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix2x4fv(UniformLocation location, bool transpose, value,
       [int srcOffset, int srcLength]) native;
 
   @JSName('uniformMatrix3fv')
-  @DomName('WebGL2RenderingContext.uniformMatrix3fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix3fv2(
       UniformLocation location, bool transpose, array, int srcOffset,
       [int srcLength]) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix3x2fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix3x2fv(UniformLocation location, bool transpose, value,
       [int srcOffset, int srcLength]) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix3x4fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix3x4fv(UniformLocation location, bool transpose, value,
       [int srcOffset, int srcLength]) native;
 
   @JSName('uniformMatrix4fv')
-  @DomName('WebGL2RenderingContext.uniformMatrix4fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix4fv2(
       UniformLocation location, bool transpose, array, int srcOffset,
       [int srcLength]) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix4x2fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix4x2fv(UniformLocation location, bool transpose, value,
       [int srcOffset, int srcLength]) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix4x3fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix4x3fv(UniformLocation location, bool transpose, value,
       [int srcOffset, int srcLength]) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttribDivisor')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribDivisor(int index, int divisor) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttribI4i')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribI4i(int index, int x, int y, int z, int w) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttribI4iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribI4iv(int index, v) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttribI4ui')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribI4ui(int index, int x, int y, int z, int w) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttribI4uiv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribI4uiv(int index, v) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttribIPointer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribIPointer(
       int index, int size, int type, int stride, int offset) native;
 
-  @DomName('WebGL2RenderingContext.waitSync')
-  @DocsEditable()
-  @Experimental() // untriaged
   void waitSync(Sync sync, int flags, int timeout) native;
 
   // From WebGLRenderingContextBase
 
-  @DomName('WebGL2RenderingContext.drawingBufferHeight')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int drawingBufferHeight;
 
-  @DomName('WebGL2RenderingContext.drawingBufferWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int drawingBufferWidth;
 
-  @DomName('WebGL2RenderingContext.activeTexture')
-  @DocsEditable()
-  @Experimental() // untriaged
   void activeTexture(int texture) native;
 
-  @DomName('WebGL2RenderingContext.attachShader')
-  @DocsEditable()
-  @Experimental() // untriaged
   void attachShader(Program program, Shader shader) native;
 
-  @DomName('WebGL2RenderingContext.bindAttribLocation')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindAttribLocation(Program program, int index, String name) native;
 
-  @DomName('WebGL2RenderingContext.bindBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindBuffer(int target, Buffer buffer) native;
 
-  @DomName('WebGL2RenderingContext.bindFramebuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindFramebuffer(int target, Framebuffer framebuffer) native;
 
-  @DomName('WebGL2RenderingContext.bindRenderbuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindRenderbuffer(int target, Renderbuffer renderbuffer) native;
 
-  @DomName('WebGL2RenderingContext.bindTexture')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bindTexture(int target, Texture texture) native;
 
-  @DomName('WebGL2RenderingContext.blendColor')
-  @DocsEditable()
-  @Experimental() // untriaged
   void blendColor(num red, num green, num blue, num alpha) native;
 
-  @DomName('WebGL2RenderingContext.blendEquation')
-  @DocsEditable()
-  @Experimental() // untriaged
   void blendEquation(int mode) native;
 
-  @DomName('WebGL2RenderingContext.blendEquationSeparate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void blendEquationSeparate(int modeRGB, int modeAlpha) native;
 
-  @DomName('WebGL2RenderingContext.blendFunc')
-  @DocsEditable()
-  @Experimental() // untriaged
   void blendFunc(int sfactor, int dfactor) native;
 
-  @DomName('WebGL2RenderingContext.blendFuncSeparate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha)
       native;
 
-  @DomName('WebGL2RenderingContext.bufferData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bufferData(int target, data_OR_size, int usage) native;
 
-  @DomName('WebGL2RenderingContext.bufferSubData')
-  @DocsEditable()
-  @Experimental() // untriaged
   void bufferSubData(int target, int offset, data) native;
 
-  @DomName('WebGL2RenderingContext.checkFramebufferStatus')
-  @DocsEditable()
-  @Experimental() // untriaged
   int checkFramebufferStatus(int target) native;
 
-  @DomName('WebGL2RenderingContext.clear')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clear(int mask) native;
 
-  @DomName('WebGL2RenderingContext.clearColor')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearColor(num red, num green, num blue, num alpha) native;
 
-  @DomName('WebGL2RenderingContext.clearDepth')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearDepth(num depth) native;
 
-  @DomName('WebGL2RenderingContext.clearStencil')
-  @DocsEditable()
-  @Experimental() // untriaged
   void clearStencil(int s) native;
 
-  @DomName('WebGL2RenderingContext.colorMask')
-  @DocsEditable()
-  @Experimental() // untriaged
   void colorMask(bool red, bool green, bool blue, bool alpha) native;
 
-  @DomName('WebGL2RenderingContext.commit')
-  @DocsEditable()
-  @Experimental() // untriaged
   Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
-  @DomName('WebGL2RenderingContext.compileShader')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compileShader(Shader shader) native;
 
-  @DomName('WebGL2RenderingContext.compressedTexImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexImage2D(int target, int level, int internalformat,
       int width, int height, int border, TypedData data) native;
 
-  @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset,
       int width, int height, int format, TypedData data) native;
 
-  @DomName('WebGL2RenderingContext.copyTexImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void copyTexImage2D(int target, int level, int internalformat, int x, int y,
       int width, int height, int border) native;
 
-  @DomName('WebGL2RenderingContext.copyTexSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x,
       int y, int width, int height) native;
 
-  @DomName('WebGL2RenderingContext.createBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   Buffer createBuffer() native;
 
-  @DomName('WebGL2RenderingContext.createFramebuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   Framebuffer createFramebuffer() native;
 
-  @DomName('WebGL2RenderingContext.createProgram')
-  @DocsEditable()
-  @Experimental() // untriaged
   Program createProgram() native;
 
-  @DomName('WebGL2RenderingContext.createRenderbuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   Renderbuffer createRenderbuffer() native;
 
-  @DomName('WebGL2RenderingContext.createShader')
-  @DocsEditable()
-  @Experimental() // untriaged
   Shader createShader(int type) native;
 
-  @DomName('WebGL2RenderingContext.createTexture')
-  @DocsEditable()
-  @Experimental() // untriaged
   Texture createTexture() native;
 
-  @DomName('WebGL2RenderingContext.cullFace')
-  @DocsEditable()
-  @Experimental() // untriaged
   void cullFace(int mode) native;
 
-  @DomName('WebGL2RenderingContext.deleteBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteBuffer(Buffer buffer) native;
 
-  @DomName('WebGL2RenderingContext.deleteFramebuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteFramebuffer(Framebuffer framebuffer) native;
 
-  @DomName('WebGL2RenderingContext.deleteProgram')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteProgram(Program program) native;
 
-  @DomName('WebGL2RenderingContext.deleteRenderbuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteRenderbuffer(Renderbuffer renderbuffer) native;
 
-  @DomName('WebGL2RenderingContext.deleteShader')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteShader(Shader shader) native;
 
-  @DomName('WebGL2RenderingContext.deleteTexture')
-  @DocsEditable()
-  @Experimental() // untriaged
   void deleteTexture(Texture texture) native;
 
-  @DomName('WebGL2RenderingContext.depthFunc')
-  @DocsEditable()
-  @Experimental() // untriaged
   void depthFunc(int func) native;
 
-  @DomName('WebGL2RenderingContext.depthMask')
-  @DocsEditable()
-  @Experimental() // untriaged
   void depthMask(bool flag) native;
 
-  @DomName('WebGL2RenderingContext.depthRange')
-  @DocsEditable()
-  @Experimental() // untriaged
   void depthRange(num zNear, num zFar) native;
 
-  @DomName('WebGL2RenderingContext.detachShader')
-  @DocsEditable()
-  @Experimental() // untriaged
   void detachShader(Program program, Shader shader) native;
 
-  @DomName('WebGL2RenderingContext.disable')
-  @DocsEditable()
-  @Experimental() // untriaged
   void disable(int cap) native;
 
-  @DomName('WebGL2RenderingContext.disableVertexAttribArray')
-  @DocsEditable()
-  @Experimental() // untriaged
   void disableVertexAttribArray(int index) native;
 
-  @DomName('WebGL2RenderingContext.drawArrays')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawArrays(int mode, int first, int count) native;
 
-  @DomName('WebGL2RenderingContext.drawElements')
-  @DocsEditable()
-  @Experimental() // untriaged
   void drawElements(int mode, int count, int type, int offset) native;
 
-  @DomName('WebGL2RenderingContext.enable')
-  @DocsEditable()
-  @Experimental() // untriaged
   void enable(int cap) native;
 
-  @DomName('WebGL2RenderingContext.enableVertexAttribArray')
-  @DocsEditable()
-  @Experimental() // untriaged
   void enableVertexAttribArray(int index) native;
 
-  @DomName('WebGL2RenderingContext.finish')
-  @DocsEditable()
-  @Experimental() // untriaged
   void finish() native;
 
-  @DomName('WebGL2RenderingContext.flush')
-  @DocsEditable()
-  @Experimental() // untriaged
   void flush() native;
 
-  @DomName('WebGL2RenderingContext.framebufferRenderbuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void framebufferRenderbuffer(int target, int attachment,
       int renderbuffertarget, Renderbuffer renderbuffer) native;
 
-  @DomName('WebGL2RenderingContext.framebufferTexture2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void framebufferTexture2D(int target, int attachment, int textarget,
       Texture texture, int level) native;
 
-  @DomName('WebGL2RenderingContext.frontFace')
-  @DocsEditable()
-  @Experimental() // untriaged
   void frontFace(int mode) native;
 
-  @DomName('WebGL2RenderingContext.generateMipmap')
-  @DocsEditable()
-  @Experimental() // untriaged
   void generateMipmap(int target) native;
 
-  @DomName('WebGL2RenderingContext.getActiveAttrib')
-  @DocsEditable()
-  @Experimental() // untriaged
   ActiveInfo getActiveAttrib(Program program, int index) native;
 
-  @DomName('WebGL2RenderingContext.getActiveUniform')
-  @DocsEditable()
-  @Experimental() // untriaged
   ActiveInfo getActiveUniform(Program program, int index) native;
 
-  @DomName('WebGL2RenderingContext.getAttachedShaders')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<Shader> getAttachedShaders(Program program) native;
 
-  @DomName('WebGL2RenderingContext.getAttribLocation')
-  @DocsEditable()
-  @Experimental() // untriaged
   int getAttribLocation(Program program, String name) native;
 
-  @DomName('WebGL2RenderingContext.getBufferParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getBufferParameter(int target, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getContextAttributes')
-  @DocsEditable()
-  @Experimental() // untriaged
   Map getContextAttributes() {
     return convertNativeToDart_Dictionary(_getContextAttributes_1());
   }
 
   @JSName('getContextAttributes')
-  @DomName('WebGL2RenderingContext.getContextAttributes')
-  @DocsEditable()
-  @Experimental() // untriaged
   _getContextAttributes_1() native;
 
-  @DomName('WebGL2RenderingContext.getError')
-  @DocsEditable()
-  @Experimental() // untriaged
   int getError() native;
 
-  @DomName('WebGL2RenderingContext.getExtension')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getExtension(String name) native;
 
-  @DomName('WebGL2RenderingContext.getFramebufferAttachmentParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getFramebufferAttachmentParameter(
       int target, int attachment, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getParameter(int pname) native;
 
-  @DomName('WebGL2RenderingContext.getProgramInfoLog')
-  @DocsEditable()
-  @Experimental() // untriaged
   String getProgramInfoLog(Program program) native;
 
-  @DomName('WebGL2RenderingContext.getProgramParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getProgramParameter(Program program, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getRenderbufferParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getRenderbufferParameter(int target, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getShaderInfoLog')
-  @DocsEditable()
-  @Experimental() // untriaged
   String getShaderInfoLog(Shader shader) native;
 
-  @DomName('WebGL2RenderingContext.getShaderParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getShaderParameter(Shader shader, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getShaderPrecisionFormat')
-  @DocsEditable()
-  @Experimental() // untriaged
   ShaderPrecisionFormat getShaderPrecisionFormat(
       int shadertype, int precisiontype) native;
 
-  @DomName('WebGL2RenderingContext.getShaderSource')
-  @DocsEditable()
-  @Experimental() // untriaged
   String getShaderSource(Shader shader) native;
 
-  @DomName('WebGL2RenderingContext.getSupportedExtensions')
-  @DocsEditable()
-  @Experimental() // untriaged
   List<String> getSupportedExtensions() native;
 
-  @DomName('WebGL2RenderingContext.getTexParameter')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getTexParameter(int target, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getUniform')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getUniform(Program program, UniformLocation location) native;
 
-  @DomName('WebGL2RenderingContext.getUniformLocation')
-  @DocsEditable()
-  @Experimental() // untriaged
   UniformLocation getUniformLocation(Program program, String name) native;
 
-  @DomName('WebGL2RenderingContext.getVertexAttrib')
-  @DocsEditable()
-  @Experimental() // untriaged
   Object getVertexAttrib(int index, int pname) native;
 
-  @DomName('WebGL2RenderingContext.getVertexAttribOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
   int getVertexAttribOffset(int index, int pname) native;
 
-  @DomName('WebGL2RenderingContext.hint')
-  @DocsEditable()
-  @Experimental() // untriaged
   void hint(int target, int mode) native;
 
-  @DomName('WebGL2RenderingContext.isBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isBuffer(Buffer buffer) native;
 
-  @DomName('WebGL2RenderingContext.isContextLost')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isContextLost() native;
 
-  @DomName('WebGL2RenderingContext.isEnabled')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isEnabled(int cap) native;
 
-  @DomName('WebGL2RenderingContext.isFramebuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isFramebuffer(Framebuffer framebuffer) native;
 
-  @DomName('WebGL2RenderingContext.isProgram')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isProgram(Program program) native;
 
-  @DomName('WebGL2RenderingContext.isRenderbuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isRenderbuffer(Renderbuffer renderbuffer) native;
 
-  @DomName('WebGL2RenderingContext.isShader')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isShader(Shader shader) native;
 
-  @DomName('WebGL2RenderingContext.isTexture')
-  @DocsEditable()
-  @Experimental() // untriaged
   bool isTexture(Texture texture) native;
 
-  @DomName('WebGL2RenderingContext.lineWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   void lineWidth(num width) native;
 
-  @DomName('WebGL2RenderingContext.linkProgram')
-  @DocsEditable()
-  @Experimental() // untriaged
   void linkProgram(Program program) native;
 
-  @DomName('WebGL2RenderingContext.pixelStorei')
-  @DocsEditable()
-  @Experimental() // untriaged
   void pixelStorei(int pname, int param) native;
 
-  @DomName('WebGL2RenderingContext.polygonOffset')
-  @DocsEditable()
-  @Experimental() // untriaged
   void polygonOffset(num factor, num units) native;
 
   @JSName('readPixels')
-  @DomName('WebGL2RenderingContext.readPixels')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _readPixels(int x, int y, int width, int height, int format, int type,
       TypedData pixels) native;
 
-  @DomName('WebGL2RenderingContext.renderbufferStorage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void renderbufferStorage(
       int target, int internalformat, int width, int height) native;
 
-  @DomName('WebGL2RenderingContext.sampleCoverage')
-  @DocsEditable()
-  @Experimental() // untriaged
   void sampleCoverage(num value, bool invert) native;
 
-  @DomName('WebGL2RenderingContext.scissor')
-  @DocsEditable()
-  @Experimental() // untriaged
   void scissor(int x, int y, int width, int height) native;
 
-  @DomName('WebGL2RenderingContext.shaderSource')
-  @DocsEditable()
-  @Experimental() // untriaged
   void shaderSource(Shader shader, String string) native;
 
-  @DomName('WebGL2RenderingContext.stencilFunc')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stencilFunc(int func, int ref, int mask) native;
 
-  @DomName('WebGL2RenderingContext.stencilFuncSeparate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stencilFuncSeparate(int face, int func, int ref, int mask) native;
 
-  @DomName('WebGL2RenderingContext.stencilMask')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stencilMask(int mask) native;
 
-  @DomName('WebGL2RenderingContext.stencilMaskSeparate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stencilMaskSeparate(int face, int mask) native;
 
-  @DomName('WebGL2RenderingContext.stencilOp')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stencilOp(int fail, int zfail, int zpass) native;
 
-  @DomName('WebGL2RenderingContext.stencilOpSeparate')
-  @DocsEditable()
-  @Experimental() // untriaged
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
 
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texImage2D(
       int target,
       int level,
@@ -7235,55 +2619,28 @@
   }
 
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D_1(target, level, internalformat, width, height, int border,
       format, type, TypedData pixels) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D_2(target, level, internalformat, format, type, pixels)
       native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D_3(
       target, level, internalformat, format, type, ImageElement image) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D_4(
       target, level, internalformat, format, type, CanvasElement canvas) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D_5(
       target, level, internalformat, format, type, VideoElement video) native;
   @JSName('texImage2D')
-  @DomName('WebGL2RenderingContext.texImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texImage2D_6(
       target, level, internalformat, format, type, ImageBitmap bitmap) native;
 
-  @DomName('WebGL2RenderingContext.texParameterf')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texParameterf(int target, int pname, num param) native;
 
-  @DomName('WebGL2RenderingContext.texParameteri')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texParameteri(int target, int pname, int param) native;
 
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void texSubImage2D(
       int target,
       int level,
@@ -7377,200 +2734,87 @@
   }
 
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D_1(target, level, xoffset, yoffset, width, height,
       int format, type, TypedData pixels) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels)
       native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D_3(
       target, level, xoffset, yoffset, format, type, ImageElement image) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D_4(target, level, xoffset, yoffset, format, type,
       CanvasElement canvas) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D_5(
       target, level, xoffset, yoffset, format, type, VideoElement video) native;
   @JSName('texSubImage2D')
-  @DomName('WebGL2RenderingContext.texSubImage2D')
-  @DocsEditable()
-  @Experimental() // untriaged
   void _texSubImage2D_6(
       target, level, xoffset, yoffset, format, type, ImageBitmap bitmap) native;
 
-  @DomName('WebGL2RenderingContext.uniform1f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1f(UniformLocation location, num x) native;
 
-  @DomName('WebGL2RenderingContext.uniform1fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1fv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniform1i')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1i(UniformLocation location, int x) native;
 
-  @DomName('WebGL2RenderingContext.uniform1iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform1iv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniform2f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2f(UniformLocation location, num x, num y) native;
 
-  @DomName('WebGL2RenderingContext.uniform2fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2fv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniform2i')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2i(UniformLocation location, int x, int y) native;
 
-  @DomName('WebGL2RenderingContext.uniform2iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform2iv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniform3f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3f(UniformLocation location, num x, num y, num z) native;
 
-  @DomName('WebGL2RenderingContext.uniform3fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3fv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniform3i')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3i(UniformLocation location, int x, int y, int z) native;
 
-  @DomName('WebGL2RenderingContext.uniform3iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform3iv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniform4f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4f(UniformLocation location, num x, num y, num z, num w) native;
 
-  @DomName('WebGL2RenderingContext.uniform4fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4fv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniform4i')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4i(UniformLocation location, int x, int y, int z, int w) native;
 
-  @DomName('WebGL2RenderingContext.uniform4iv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniform4iv(UniformLocation location, v) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix2fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix2fv(UniformLocation location, bool transpose, array) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix3fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix3fv(UniformLocation location, bool transpose, array) native;
 
-  @DomName('WebGL2RenderingContext.uniformMatrix4fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void uniformMatrix4fv(UniformLocation location, bool transpose, array) native;
 
-  @DomName('WebGL2RenderingContext.useProgram')
-  @DocsEditable()
-  @Experimental() // untriaged
   void useProgram(Program program) native;
 
-  @DomName('WebGL2RenderingContext.validateProgram')
-  @DocsEditable()
-  @Experimental() // untriaged
   void validateProgram(Program program) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib1f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib1f(int indx, num x) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib1fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib1fv(int indx, values) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib2f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib2f(int indx, num x, num y) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib2fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib2fv(int indx, values) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib3f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib3f(int indx, num x, num y, num z) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib3fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib3fv(int indx, values) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib4f')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttrib4fv')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttrib4fv(int indx, values) native;
 
-  @DomName('WebGL2RenderingContext.vertexAttribPointer')
-  @DocsEditable()
-  @Experimental() // untriaged
   void vertexAttribPointer(int indx, int size, int type, bool normalized,
       int stride, int offset) native;
 
-  @DomName('WebGL2RenderingContext.viewport')
-  @DocsEditable()
-  @Experimental() // untriaged
   void viewport(int x, int y, int width, int height) native;
 
-  @DomName('WebGLRenderingContext2.readPixels')
-  @DocsEditable()
   void readPixels(int x, int y, int width, int height, int format, int type,
       TypedData pixels) {
     _readPixels(x, y, width, height, format, type, pixels);
@@ -7581,9 +2825,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLSampler')
-@Experimental() // untriaged
 @Native("WebGLSampler")
 class Sampler extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7595,8 +2836,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLShader')
 @Native("WebGLShader")
 class Shader extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7608,8 +2847,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLShaderPrecisionFormat')
 @Native("WebGLShaderPrecisionFormat")
 class ShaderPrecisionFormat extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7617,25 +2854,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLShaderPrecisionFormat.precision')
-  @DocsEditable()
   final int precision;
 
-  @DomName('WebGLShaderPrecisionFormat.rangeMax')
-  @DocsEditable()
   final int rangeMax;
 
-  @DomName('WebGLShaderPrecisionFormat.rangeMin')
-  @DocsEditable()
   final int rangeMin;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLSync')
-@Experimental() // untriaged
 @Native("WebGLSync")
 class Sync extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7647,8 +2875,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLTexture')
 @Native("WebGLTexture")
 class Texture extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7656,33 +2882,18 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('WebGLTexture.lastUploadedVideoFrameWasSkipped')
-  @DocsEditable()
-  @Experimental() // untriaged
   final bool lastUploadedVideoFrameWasSkipped;
 
-  @DomName('WebGLTexture.lastUploadedVideoHeight')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int lastUploadedVideoHeight;
 
-  @DomName('WebGLTexture.lastUploadedVideoTimestamp')
-  @DocsEditable()
-  @Experimental() // untriaged
   final num lastUploadedVideoTimestamp;
 
-  @DomName('WebGLTexture.lastUploadedVideoWidth')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int lastUploadedVideoWidth;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLTimerQueryEXT')
-@Experimental() // untriaged
 @Native("WebGLTimerQueryEXT")
 class TimerQueryExt extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7694,9 +2905,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLTransformFeedback')
-@Experimental() // untriaged
 @Native("WebGLTransformFeedback")
 class TransformFeedback extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7708,8 +2916,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLUniformLocation')
 @Native("WebGLUniformLocation")
 class UniformLocation extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7721,9 +2927,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLVertexArrayObject')
-@Experimental() // untriaged
 @Native("WebGLVertexArrayObject")
 class VertexArrayObject extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7735,10 +2938,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLVertexArrayObjectOES')
-// http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
-@Experimental() // experimental
 @Native("WebGLVertexArrayObjectOES")
 class VertexArrayObjectOes extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -7746,13 +2945,1213 @@
     throw new UnsupportedError("Not supported");
   }
 }
+// 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.
+
+/// Amalgamation of the WebGL constants from the IDL interfaces in
+/// WebGLRenderingContextBase, WebGL2RenderingContextBase, & WebGLDrawBuffers.
+/// Because the RenderingContextBase interfaces are hidden they would be
+/// replicated in more than one class (e.g., RenderingContext and
+/// RenderingContext2) to prevent that duplication these 600+ constants are
+/// defined in one abstract class (WebGL).
+@Native("WebGL")
+abstract class WebGL {
+  // To suppress missing implicit constructor warnings.
+  factory WebGL._() {
+    throw new UnsupportedError("Not supported");
+  }
+
+  static const int ACTIVE_ATTRIBUTES = 0x8B89;
+
+  static const int ACTIVE_TEXTURE = 0x84E0;
+
+  static const int ACTIVE_UNIFORMS = 0x8B86;
+
+  static const int ACTIVE_UNIFORM_BLOCKS = 0x8A36;
+
+  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
+
+  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
+
+  static const int ALPHA = 0x1906;
+
+  static const int ALPHA_BITS = 0x0D55;
+
+  static const int ALREADY_SIGNALED = 0x911A;
+
+  static const int ALWAYS = 0x0207;
+
+  static const int ANY_SAMPLES_PASSED = 0x8C2F;
+
+  static const int ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A;
+
+  static const int ARRAY_BUFFER = 0x8892;
+
+  static const int ARRAY_BUFFER_BINDING = 0x8894;
+
+  static const int ATTACHED_SHADERS = 0x8B85;
+
+  static const int BACK = 0x0405;
+
+  static const int BLEND = 0x0BE2;
+
+  static const int BLEND_COLOR = 0x8005;
+
+  static const int BLEND_DST_ALPHA = 0x80CA;
+
+  static const int BLEND_DST_RGB = 0x80C8;
+
+  static const int BLEND_EQUATION = 0x8009;
+
+  static const int BLEND_EQUATION_ALPHA = 0x883D;
+
+  static const int BLEND_EQUATION_RGB = 0x8009;
+
+  static const int BLEND_SRC_ALPHA = 0x80CB;
+
+  static const int BLEND_SRC_RGB = 0x80C9;
+
+  static const int BLUE_BITS = 0x0D54;
+
+  static const int BOOL = 0x8B56;
+
+  static const int BOOL_VEC2 = 0x8B57;
+
+  static const int BOOL_VEC3 = 0x8B58;
+
+  static const int BOOL_VEC4 = 0x8B59;
+
+  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
+
+  static const int BUFFER_SIZE = 0x8764;
+
+  static const int BUFFER_USAGE = 0x8765;
+
+  static const int BYTE = 0x1400;
+
+  static const int CCW = 0x0901;
+
+  static const int CLAMP_TO_EDGE = 0x812F;
+
+  static const int COLOR = 0x1800;
+
+  static const int COLOR_ATTACHMENT0 = 0x8CE0;
+
+  static const int COLOR_ATTACHMENT0_WEBGL = 0x8CE0;
+
+  static const int COLOR_ATTACHMENT1 = 0x8CE1;
+
+  static const int COLOR_ATTACHMENT10 = 0x8CEA;
+
+  static const int COLOR_ATTACHMENT10_WEBGL = 0x8CEA;
+
+  static const int COLOR_ATTACHMENT11 = 0x8CEB;
+
+  static const int COLOR_ATTACHMENT11_WEBGL = 0x8CEB;
+
+  static const int COLOR_ATTACHMENT12 = 0x8CEC;
+
+  static const int COLOR_ATTACHMENT12_WEBGL = 0x8CEC;
+
+  static const int COLOR_ATTACHMENT13 = 0x8CED;
+
+  static const int COLOR_ATTACHMENT13_WEBGL = 0x8CED;
+
+  static const int COLOR_ATTACHMENT14 = 0x8CEE;
+
+  static const int COLOR_ATTACHMENT14_WEBGL = 0x8CEE;
+
+  static const int COLOR_ATTACHMENT15 = 0x8CEF;
+
+  static const int COLOR_ATTACHMENT15_WEBGL = 0x8CEF;
+
+  static const int COLOR_ATTACHMENT1_WEBGL = 0x8CE1;
+
+  static const int COLOR_ATTACHMENT2 = 0x8CE2;
+
+  static const int COLOR_ATTACHMENT2_WEBGL = 0x8CE2;
+
+  static const int COLOR_ATTACHMENT3 = 0x8CE3;
+
+  static const int COLOR_ATTACHMENT3_WEBGL = 0x8CE3;
+
+  static const int COLOR_ATTACHMENT4 = 0x8CE4;
+
+  static const int COLOR_ATTACHMENT4_WEBGL = 0x8CE4;
+
+  static const int COLOR_ATTACHMENT5 = 0x8CE5;
+
+  static const int COLOR_ATTACHMENT5_WEBGL = 0x8CE5;
+
+  static const int COLOR_ATTACHMENT6 = 0x8CE6;
+
+  static const int COLOR_ATTACHMENT6_WEBGL = 0x8CE6;
+
+  static const int COLOR_ATTACHMENT7 = 0x8CE7;
+
+  static const int COLOR_ATTACHMENT7_WEBGL = 0x8CE7;
+
+  static const int COLOR_ATTACHMENT8 = 0x8CE8;
+
+  static const int COLOR_ATTACHMENT8_WEBGL = 0x8CE8;
+
+  static const int COLOR_ATTACHMENT9 = 0x8CE9;
+
+  static const int COLOR_ATTACHMENT9_WEBGL = 0x8CE9;
+
+  static const int COLOR_BUFFER_BIT = 0x00004000;
+
+  static const int COLOR_CLEAR_VALUE = 0x0C22;
+
+  static const int COLOR_WRITEMASK = 0x0C23;
+
+  static const int COMPARE_REF_TO_TEXTURE = 0x884E;
+
+  static const int COMPILE_STATUS = 0x8B81;
+
+  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
+
+  static const int CONDITION_SATISFIED = 0x911C;
+
+  static const int CONSTANT_ALPHA = 0x8003;
+
+  static const int CONSTANT_COLOR = 0x8001;
+
+  static const int CONTEXT_LOST_WEBGL = 0x9242;
+
+  static const int COPY_READ_BUFFER = 0x8F36;
+
+  static const int COPY_READ_BUFFER_BINDING = 0x8F36;
+
+  static const int COPY_WRITE_BUFFER = 0x8F37;
+
+  static const int COPY_WRITE_BUFFER_BINDING = 0x8F37;
+
+  static const int CULL_FACE = 0x0B44;
+
+  static const int CULL_FACE_MODE = 0x0B45;
+
+  static const int CURRENT_PROGRAM = 0x8B8D;
+
+  static const int CURRENT_QUERY = 0x8865;
+
+  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
+
+  static const int CW = 0x0900;
+
+  static const int DECR = 0x1E03;
+
+  static const int DECR_WRAP = 0x8508;
+
+  static const int DELETE_STATUS = 0x8B80;
+
+  static const int DEPTH = 0x1801;
+
+  static const int DEPTH24_STENCIL8 = 0x88F0;
+
+  static const int DEPTH32F_STENCIL8 = 0x8CAD;
+
+  static const int DEPTH_ATTACHMENT = 0x8D00;
+
+  static const int DEPTH_BITS = 0x0D56;
+
+  static const int DEPTH_BUFFER_BIT = 0x00000100;
+
+  static const int DEPTH_CLEAR_VALUE = 0x0B73;
+
+  static const int DEPTH_COMPONENT = 0x1902;
+
+  static const int DEPTH_COMPONENT16 = 0x81A5;
+
+  static const int DEPTH_COMPONENT24 = 0x81A6;
+
+  static const int DEPTH_COMPONENT32F = 0x8CAC;
+
+  static const int DEPTH_FUNC = 0x0B74;
+
+  static const int DEPTH_RANGE = 0x0B70;
+
+  static const int DEPTH_STENCIL = 0x84F9;
+
+  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
+
+  static const int DEPTH_TEST = 0x0B71;
+
+  static const int DEPTH_WRITEMASK = 0x0B72;
+
+  static const int DITHER = 0x0BD0;
+
+  static const int DONT_CARE = 0x1100;
+
+  static const int DRAW_BUFFER0 = 0x8825;
+
+  static const int DRAW_BUFFER0_WEBGL = 0x8825;
+
+  static const int DRAW_BUFFER1 = 0x8826;
+
+  static const int DRAW_BUFFER10 = 0x882F;
+
+  static const int DRAW_BUFFER10_WEBGL = 0x882F;
+
+  static const int DRAW_BUFFER11 = 0x8830;
+
+  static const int DRAW_BUFFER11_WEBGL = 0x8830;
+
+  static const int DRAW_BUFFER12 = 0x8831;
+
+  static const int DRAW_BUFFER12_WEBGL = 0x8831;
+
+  static const int DRAW_BUFFER13 = 0x8832;
+
+  static const int DRAW_BUFFER13_WEBGL = 0x8832;
+
+  static const int DRAW_BUFFER14 = 0x8833;
+
+  static const int DRAW_BUFFER14_WEBGL = 0x8833;
+
+  static const int DRAW_BUFFER15 = 0x8834;
+
+  static const int DRAW_BUFFER15_WEBGL = 0x8834;
+
+  static const int DRAW_BUFFER1_WEBGL = 0x8826;
+
+  static const int DRAW_BUFFER2 = 0x8827;
+
+  static const int DRAW_BUFFER2_WEBGL = 0x8827;
+
+  static const int DRAW_BUFFER3 = 0x8828;
+
+  static const int DRAW_BUFFER3_WEBGL = 0x8828;
+
+  static const int DRAW_BUFFER4 = 0x8829;
+
+  static const int DRAW_BUFFER4_WEBGL = 0x8829;
+
+  static const int DRAW_BUFFER5 = 0x882A;
+
+  static const int DRAW_BUFFER5_WEBGL = 0x882A;
+
+  static const int DRAW_BUFFER6 = 0x882B;
+
+  static const int DRAW_BUFFER6_WEBGL = 0x882B;
+
+  static const int DRAW_BUFFER7 = 0x882C;
+
+  static const int DRAW_BUFFER7_WEBGL = 0x882C;
+
+  static const int DRAW_BUFFER8 = 0x882D;
+
+  static const int DRAW_BUFFER8_WEBGL = 0x882D;
+
+  static const int DRAW_BUFFER9 = 0x882E;
+
+  static const int DRAW_BUFFER9_WEBGL = 0x882E;
+
+  static const int DRAW_FRAMEBUFFER = 0x8CA9;
+
+  static const int DRAW_FRAMEBUFFER_BINDING = 0x8CA6;
+
+  static const int DST_ALPHA = 0x0304;
+
+  static const int DST_COLOR = 0x0306;
+
+  static const int DYNAMIC_COPY = 0x88EA;
+
+  static const int DYNAMIC_DRAW = 0x88E8;
+
+  static const int DYNAMIC_READ = 0x88E9;
+
+  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
+
+  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
+
+  static const int EQUAL = 0x0202;
+
+  static const int FASTEST = 0x1101;
+
+  static const int FLOAT = 0x1406;
+
+  static const int FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD;
+
+  static const int FLOAT_MAT2 = 0x8B5A;
+
+  static const int FLOAT_MAT2x3 = 0x8B65;
+
+  static const int FLOAT_MAT2x4 = 0x8B66;
+
+  static const int FLOAT_MAT3 = 0x8B5B;
+
+  static const int FLOAT_MAT3x2 = 0x8B67;
+
+  static const int FLOAT_MAT3x4 = 0x8B68;
+
+  static const int FLOAT_MAT4 = 0x8B5C;
+
+  static const int FLOAT_MAT4x2 = 0x8B69;
+
+  static const int FLOAT_MAT4x3 = 0x8B6A;
+
+  static const int FLOAT_VEC2 = 0x8B50;
+
+  static const int FLOAT_VEC3 = 0x8B51;
+
+  static const int FLOAT_VEC4 = 0x8B52;
+
+  static const int FRAGMENT_SHADER = 0x8B30;
+
+  static const int FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B;
+
+  static const int FRAMEBUFFER = 0x8D40;
+
+  static const int FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;
+
+  static const int FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;
+
+  static const int FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;
+
+  static const int FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;
+
+  static const int FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;
+
+  static const int FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;
+
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
+
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
+
+  static const int FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;
+
+  static const int FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;
+
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4;
+
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
+
+  static const int FRAMEBUFFER_BINDING = 0x8CA6;
+
+  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
+
+  static const int FRAMEBUFFER_DEFAULT = 0x8218;
+
+  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
+
+  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
+
+  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+
+  static const int FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56;
+
+  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
+
+  static const int FRONT = 0x0404;
+
+  static const int FRONT_AND_BACK = 0x0408;
+
+  static const int FRONT_FACE = 0x0B46;
+
+  static const int FUNC_ADD = 0x8006;
+
+  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
+
+  static const int FUNC_SUBTRACT = 0x800A;
+
+  static const int GENERATE_MIPMAP_HINT = 0x8192;
+
+  static const int GEQUAL = 0x0206;
+
+  static const int GREATER = 0x0204;
+
+  static const int GREEN_BITS = 0x0D53;
+
+  static const int HALF_FLOAT = 0x140B;
+
+  static const int HIGH_FLOAT = 0x8DF2;
+
+  static const int HIGH_INT = 0x8DF5;
+
+  static const int IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
+
+  static const int IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
+
+  static const int INCR = 0x1E02;
+
+  static const int INCR_WRAP = 0x8507;
+
+  static const int INT = 0x1404;
+
+  static const int INTERLEAVED_ATTRIBS = 0x8C8C;
+
+  static const int INT_2_10_10_10_REV = 0x8D9F;
+
+  static const int INT_SAMPLER_2D = 0x8DCA;
+
+  static const int INT_SAMPLER_2D_ARRAY = 0x8DCF;
+
+  static const int INT_SAMPLER_3D = 0x8DCB;
+
+  static const int INT_SAMPLER_CUBE = 0x8DCC;
+
+  static const int INT_VEC2 = 0x8B53;
+
+  static const int INT_VEC3 = 0x8B54;
+
+  static const int INT_VEC4 = 0x8B55;
+
+  static const int INVALID_ENUM = 0x0500;
+
+  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
+
+  static const int INVALID_INDEX = 0xFFFFFFFF;
+
+  static const int INVALID_OPERATION = 0x0502;
+
+  static const int INVALID_VALUE = 0x0501;
+
+  static const int INVERT = 0x150A;
+
+  static const int KEEP = 0x1E00;
+
+  static const int LEQUAL = 0x0203;
+
+  static const int LESS = 0x0201;
+
+  static const int LINEAR = 0x2601;
+
+  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
+
+  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
+
+  static const int LINES = 0x0001;
+
+  static const int LINE_LOOP = 0x0002;
+
+  static const int LINE_STRIP = 0x0003;
+
+  static const int LINE_WIDTH = 0x0B21;
+
+  static const int LINK_STATUS = 0x8B82;
+
+  static const int LOW_FLOAT = 0x8DF0;
+
+  static const int LOW_INT = 0x8DF3;
+
+  static const int LUMINANCE = 0x1909;
+
+  static const int LUMINANCE_ALPHA = 0x190A;
+
+  static const int MAX = 0x8008;
+
+  static const int MAX_3D_TEXTURE_SIZE = 0x8073;
+
+  static const int MAX_ARRAY_TEXTURE_LAYERS = 0x88FF;
+
+  static const int MAX_CLIENT_WAIT_TIMEOUT_WEBGL = 0x9247;
+
+  static const int MAX_COLOR_ATTACHMENTS = 0x8CDF;
+
+  static const int MAX_COLOR_ATTACHMENTS_WEBGL = 0x8CDF;
+
+  static const int MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33;
+
+  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+
+  static const int MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E;
+
+  static const int MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31;
+
+  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
+
+  static const int MAX_DRAW_BUFFERS = 0x8824;
+
+  static const int MAX_DRAW_BUFFERS_WEBGL = 0x8824;
+
+  static const int MAX_ELEMENTS_INDICES = 0x80E9;
+
+  static const int MAX_ELEMENTS_VERTICES = 0x80E8;
+
+  static const int MAX_ELEMENT_INDEX = 0x8D6B;
+
+  static const int MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125;
+
+  static const int MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D;
+
+  static const int MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49;
+
+  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
+
+  static const int MAX_PROGRAM_TEXEL_OFFSET = 0x8905;
+
+  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
+
+  static const int MAX_SAMPLES = 0x8D57;
+
+  static const int MAX_SERVER_WAIT_TIMEOUT = 0x9111;
+
+  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
+
+  static const int MAX_TEXTURE_LOD_BIAS = 0x84FD;
+
+  static const int MAX_TEXTURE_SIZE = 0x0D33;
+
+  static const int MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A;
+
+  static const int MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B;
+
+  static const int MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80;
+
+  static const int MAX_UNIFORM_BLOCK_SIZE = 0x8A30;
+
+  static const int MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F;
+
+  static const int MAX_VARYING_COMPONENTS = 0x8B4B;
+
+  static const int MAX_VARYING_VECTORS = 0x8DFC;
+
+  static const int MAX_VERTEX_ATTRIBS = 0x8869;
+
+  static const int MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122;
+
+  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
+
+  static const int MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B;
+
+  static const int MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A;
+
+  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
+
+  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
+
+  static const int MEDIUM_FLOAT = 0x8DF1;
+
+  static const int MEDIUM_INT = 0x8DF4;
+
+  static const int MIN = 0x8007;
+
+  static const int MIN_PROGRAM_TEXEL_OFFSET = 0x8904;
+
+  static const int MIRRORED_REPEAT = 0x8370;
+
+  static const int NEAREST = 0x2600;
+
+  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
+
+  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
+
+  static const int NEVER = 0x0200;
+
+  static const int NICEST = 0x1102;
+
+  static const int NONE = 0;
+
+  static const int NOTEQUAL = 0x0205;
+
+  static const int NO_ERROR = 0;
+
+  static const int OBJECT_TYPE = 0x9112;
+
+  static const int ONE = 1;
+
+  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
+
+  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
+
+  static const int ONE_MINUS_DST_ALPHA = 0x0305;
+
+  static const int ONE_MINUS_DST_COLOR = 0x0307;
+
+  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
+
+  static const int ONE_MINUS_SRC_COLOR = 0x0301;
+
+  static const int OUT_OF_MEMORY = 0x0505;
+
+  static const int PACK_ALIGNMENT = 0x0D05;
+
+  static const int PACK_ROW_LENGTH = 0x0D02;
+
+  static const int PACK_SKIP_PIXELS = 0x0D04;
+
+  static const int PACK_SKIP_ROWS = 0x0D03;
+
+  static const int PIXEL_PACK_BUFFER = 0x88EB;
+
+  static const int PIXEL_PACK_BUFFER_BINDING = 0x88ED;
+
+  static const int PIXEL_UNPACK_BUFFER = 0x88EC;
+
+  static const int PIXEL_UNPACK_BUFFER_BINDING = 0x88EF;
+
+  static const int POINTS = 0x0000;
+
+  static const int POLYGON_OFFSET_FACTOR = 0x8038;
+
+  static const int POLYGON_OFFSET_FILL = 0x8037;
+
+  static const int POLYGON_OFFSET_UNITS = 0x2A00;
+
+  static const int QUERY_RESULT = 0x8866;
+
+  static const int QUERY_RESULT_AVAILABLE = 0x8867;
+
+  static const int R11F_G11F_B10F = 0x8C3A;
+
+  static const int R16F = 0x822D;
+
+  static const int R16I = 0x8233;
+
+  static const int R16UI = 0x8234;
+
+  static const int R32F = 0x822E;
+
+  static const int R32I = 0x8235;
+
+  static const int R32UI = 0x8236;
+
+  static const int R8 = 0x8229;
+
+  static const int R8I = 0x8231;
+
+  static const int R8UI = 0x8232;
+
+  static const int R8_SNORM = 0x8F94;
+
+  static const int RASTERIZER_DISCARD = 0x8C89;
+
+  static const int READ_BUFFER = 0x0C02;
+
+  static const int READ_FRAMEBUFFER = 0x8CA8;
+
+  static const int READ_FRAMEBUFFER_BINDING = 0x8CAA;
+
+  static const int RED = 0x1903;
+
+  static const int RED_BITS = 0x0D52;
+
+  static const int RED_INTEGER = 0x8D94;
+
+  static const int RENDERBUFFER = 0x8D41;
+
+  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
+
+  static const int RENDERBUFFER_BINDING = 0x8CA7;
+
+  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
+
+  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
+
+  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
+
+  static const int RENDERBUFFER_HEIGHT = 0x8D43;
+
+  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
+
+  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
+
+  static const int RENDERBUFFER_SAMPLES = 0x8CAB;
+
+  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
+
+  static const int RENDERBUFFER_WIDTH = 0x8D42;
+
+  static const int RENDERER = 0x1F01;
+
+  static const int REPEAT = 0x2901;
+
+  static const int REPLACE = 0x1E01;
+
+  static const int RG = 0x8227;
+
+  static const int RG16F = 0x822F;
+
+  static const int RG16I = 0x8239;
+
+  static const int RG16UI = 0x823A;
+
+  static const int RG32F = 0x8230;
+
+  static const int RG32I = 0x823B;
+
+  static const int RG32UI = 0x823C;
+
+  static const int RG8 = 0x822B;
+
+  static const int RG8I = 0x8237;
+
+  static const int RG8UI = 0x8238;
+
+  static const int RG8_SNORM = 0x8F95;
+
+  static const int RGB = 0x1907;
+
+  static const int RGB10_A2 = 0x8059;
+
+  static const int RGB10_A2UI = 0x906F;
+
+  static const int RGB16F = 0x881B;
+
+  static const int RGB16I = 0x8D89;
+
+  static const int RGB16UI = 0x8D77;
+
+  static const int RGB32F = 0x8815;
+
+  static const int RGB32I = 0x8D83;
+
+  static const int RGB32UI = 0x8D71;
+
+  static const int RGB565 = 0x8D62;
+
+  static const int RGB5_A1 = 0x8057;
+
+  static const int RGB8 = 0x8051;
+
+  static const int RGB8I = 0x8D8F;
+
+  static const int RGB8UI = 0x8D7D;
+
+  static const int RGB8_SNORM = 0x8F96;
+
+  static const int RGB9_E5 = 0x8C3D;
+
+  static const int RGBA = 0x1908;
+
+  static const int RGBA16F = 0x881A;
+
+  static const int RGBA16I = 0x8D88;
+
+  static const int RGBA16UI = 0x8D76;
+
+  static const int RGBA32F = 0x8814;
+
+  static const int RGBA32I = 0x8D82;
+
+  static const int RGBA32UI = 0x8D70;
+
+  static const int RGBA4 = 0x8056;
+
+  static const int RGBA8 = 0x8058;
+
+  static const int RGBA8I = 0x8D8E;
+
+  static const int RGBA8UI = 0x8D7C;
+
+  static const int RGBA8_SNORM = 0x8F97;
+
+  static const int RGBA_INTEGER = 0x8D99;
+
+  static const int RGB_INTEGER = 0x8D98;
+
+  static const int RG_INTEGER = 0x8228;
+
+  static const int SAMPLER_2D = 0x8B5E;
+
+  static const int SAMPLER_2D_ARRAY = 0x8DC1;
+
+  static const int SAMPLER_2D_ARRAY_SHADOW = 0x8DC4;
+
+  static const int SAMPLER_2D_SHADOW = 0x8B62;
+
+  static const int SAMPLER_3D = 0x8B5F;
+
+  static const int SAMPLER_BINDING = 0x8919;
+
+  static const int SAMPLER_CUBE = 0x8B60;
+
+  static const int SAMPLER_CUBE_SHADOW = 0x8DC5;
+
+  static const int SAMPLES = 0x80A9;
+
+  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
+
+  static const int SAMPLE_BUFFERS = 0x80A8;
+
+  static const int SAMPLE_COVERAGE = 0x80A0;
+
+  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
+
+  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
+
+  static const int SCISSOR_BOX = 0x0C10;
+
+  static const int SCISSOR_TEST = 0x0C11;
+
+  static const int SEPARATE_ATTRIBS = 0x8C8D;
+
+  static const int SHADER_TYPE = 0x8B4F;
+
+  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
+
+  static const int SHORT = 0x1402;
+
+  static const int SIGNALED = 0x9119;
+
+  static const int SIGNED_NORMALIZED = 0x8F9C;
+
+  static const int SRC_ALPHA = 0x0302;
+
+  static const int SRC_ALPHA_SATURATE = 0x0308;
+
+  static const int SRC_COLOR = 0x0300;
+
+  static const int SRGB = 0x8C40;
+
+  static const int SRGB8 = 0x8C41;
+
+  static const int SRGB8_ALPHA8 = 0x8C43;
+
+  static const int STATIC_COPY = 0x88E6;
+
+  static const int STATIC_DRAW = 0x88E4;
+
+  static const int STATIC_READ = 0x88E5;
+
+  static const int STENCIL = 0x1802;
+
+  static const int STENCIL_ATTACHMENT = 0x8D20;
+
+  static const int STENCIL_BACK_FAIL = 0x8801;
+
+  static const int STENCIL_BACK_FUNC = 0x8800;
+
+  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
+
+  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
+
+  static const int STENCIL_BACK_REF = 0x8CA3;
+
+  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
+
+  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
+
+  static const int STENCIL_BITS = 0x0D57;
+
+  static const int STENCIL_BUFFER_BIT = 0x00000400;
+
+  static const int STENCIL_CLEAR_VALUE = 0x0B91;
+
+  static const int STENCIL_FAIL = 0x0B94;
+
+  static const int STENCIL_FUNC = 0x0B92;
+
+  static const int STENCIL_INDEX8 = 0x8D48;
+
+  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
+
+  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
+
+  static const int STENCIL_REF = 0x0B97;
+
+  static const int STENCIL_TEST = 0x0B90;
+
+  static const int STENCIL_VALUE_MASK = 0x0B93;
+
+  static const int STENCIL_WRITEMASK = 0x0B98;
+
+  static const int STREAM_COPY = 0x88E2;
+
+  static const int STREAM_DRAW = 0x88E0;
+
+  static const int STREAM_READ = 0x88E1;
+
+  static const int SUBPIXEL_BITS = 0x0D50;
+
+  static const int SYNC_CONDITION = 0x9113;
+
+  static const int SYNC_FENCE = 0x9116;
+
+  static const int SYNC_FLAGS = 0x9115;
+
+  static const int SYNC_FLUSH_COMMANDS_BIT = 0x00000001;
+
+  static const int SYNC_GPU_COMMANDS_COMPLETE = 0x9117;
+
+  static const int SYNC_STATUS = 0x9114;
+
+  static const int TEXTURE = 0x1702;
+
+  static const int TEXTURE0 = 0x84C0;
+
+  static const int TEXTURE1 = 0x84C1;
+
+  static const int TEXTURE10 = 0x84CA;
+
+  static const int TEXTURE11 = 0x84CB;
+
+  static const int TEXTURE12 = 0x84CC;
+
+  static const int TEXTURE13 = 0x84CD;
+
+  static const int TEXTURE14 = 0x84CE;
+
+  static const int TEXTURE15 = 0x84CF;
+
+  static const int TEXTURE16 = 0x84D0;
+
+  static const int TEXTURE17 = 0x84D1;
+
+  static const int TEXTURE18 = 0x84D2;
+
+  static const int TEXTURE19 = 0x84D3;
+
+  static const int TEXTURE2 = 0x84C2;
+
+  static const int TEXTURE20 = 0x84D4;
+
+  static const int TEXTURE21 = 0x84D5;
+
+  static const int TEXTURE22 = 0x84D6;
+
+  static const int TEXTURE23 = 0x84D7;
+
+  static const int TEXTURE24 = 0x84D8;
+
+  static const int TEXTURE25 = 0x84D9;
+
+  static const int TEXTURE26 = 0x84DA;
+
+  static const int TEXTURE27 = 0x84DB;
+
+  static const int TEXTURE28 = 0x84DC;
+
+  static const int TEXTURE29 = 0x84DD;
+
+  static const int TEXTURE3 = 0x84C3;
+
+  static const int TEXTURE30 = 0x84DE;
+
+  static const int TEXTURE31 = 0x84DF;
+
+  static const int TEXTURE4 = 0x84C4;
+
+  static const int TEXTURE5 = 0x84C5;
+
+  static const int TEXTURE6 = 0x84C6;
+
+  static const int TEXTURE7 = 0x84C7;
+
+  static const int TEXTURE8 = 0x84C8;
+
+  static const int TEXTURE9 = 0x84C9;
+
+  static const int TEXTURE_2D = 0x0DE1;
+
+  static const int TEXTURE_2D_ARRAY = 0x8C1A;
+
+  static const int TEXTURE_3D = 0x806F;
+
+  static const int TEXTURE_BASE_LEVEL = 0x813C;
+
+  static const int TEXTURE_BINDING_2D = 0x8069;
+
+  static const int TEXTURE_BINDING_2D_ARRAY = 0x8C1D;
+
+  static const int TEXTURE_BINDING_3D = 0x806A;
+
+  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
+
+  static const int TEXTURE_COMPARE_FUNC = 0x884D;
+
+  static const int TEXTURE_COMPARE_MODE = 0x884C;
+
+  static const int TEXTURE_CUBE_MAP = 0x8513;
+
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+
+  static const int TEXTURE_IMMUTABLE_FORMAT = 0x912F;
+
+  static const int TEXTURE_IMMUTABLE_LEVELS = 0x82DF;
+
+  static const int TEXTURE_MAG_FILTER = 0x2800;
+
+  static const int TEXTURE_MAX_LEVEL = 0x813D;
+
+  static const int TEXTURE_MAX_LOD = 0x813B;
+
+  static const int TEXTURE_MIN_FILTER = 0x2801;
+
+  static const int TEXTURE_MIN_LOD = 0x813A;
+
+  static const int TEXTURE_WRAP_R = 0x8072;
+
+  static const int TEXTURE_WRAP_S = 0x2802;
+
+  static const int TEXTURE_WRAP_T = 0x2803;
+
+  static const int TIMEOUT_EXPIRED = 0x911B;
+
+  static const int TIMEOUT_IGNORED = -1;
+
+  static const int TRANSFORM_FEEDBACK = 0x8E22;
+
+  static const int TRANSFORM_FEEDBACK_ACTIVE = 0x8E24;
+
+  static const int TRANSFORM_FEEDBACK_BINDING = 0x8E25;
+
+  static const int TRANSFORM_FEEDBACK_BUFFER = 0x8C8E;
+
+  static const int TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F;
+
+  static const int TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F;
+
+  static const int TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85;
+
+  static const int TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84;
+
+  static const int TRANSFORM_FEEDBACK_PAUSED = 0x8E23;
+
+  static const int TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88;
+
+  static const int TRANSFORM_FEEDBACK_VARYINGS = 0x8C83;
+
+  static const int TRIANGLES = 0x0004;
+
+  static const int TRIANGLE_FAN = 0x0006;
+
+  static const int TRIANGLE_STRIP = 0x0005;
+
+  static const int UNIFORM_ARRAY_STRIDE = 0x8A3C;
+
+  static const int UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42;
+
+  static const int UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43;
+
+  static const int UNIFORM_BLOCK_BINDING = 0x8A3F;
+
+  static const int UNIFORM_BLOCK_DATA_SIZE = 0x8A40;
+
+  static const int UNIFORM_BLOCK_INDEX = 0x8A3A;
+
+  static const int UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46;
+
+  static const int UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44;
+
+  static const int UNIFORM_BUFFER = 0x8A11;
+
+  static const int UNIFORM_BUFFER_BINDING = 0x8A28;
+
+  static const int UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34;
+
+  static const int UNIFORM_BUFFER_SIZE = 0x8A2A;
+
+  static const int UNIFORM_BUFFER_START = 0x8A29;
+
+  static const int UNIFORM_IS_ROW_MAJOR = 0x8A3E;
+
+  static const int UNIFORM_MATRIX_STRIDE = 0x8A3D;
+
+  static const int UNIFORM_OFFSET = 0x8A3B;
+
+  static const int UNIFORM_SIZE = 0x8A38;
+
+  static const int UNIFORM_TYPE = 0x8A37;
+
+  static const int UNPACK_ALIGNMENT = 0x0CF5;
+
+  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+
+  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
+
+  static const int UNPACK_IMAGE_HEIGHT = 0x806E;
+
+  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
+
+  static const int UNPACK_ROW_LENGTH = 0x0CF2;
+
+  static const int UNPACK_SKIP_IMAGES = 0x806D;
+
+  static const int UNPACK_SKIP_PIXELS = 0x0CF4;
+
+  static const int UNPACK_SKIP_ROWS = 0x0CF3;
+
+  static const int UNSIGNALED = 0x9118;
+
+  static const int UNSIGNED_BYTE = 0x1401;
+
+  static const int UNSIGNED_INT = 0x1405;
+
+  static const int UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B;
+
+  static const int UNSIGNED_INT_24_8 = 0x84FA;
+
+  static const int UNSIGNED_INT_2_10_10_10_REV = 0x8368;
+
+  static const int UNSIGNED_INT_5_9_9_9_REV = 0x8C3E;
+
+  static const int UNSIGNED_INT_SAMPLER_2D = 0x8DD2;
+
+  static const int UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7;
+
+  static const int UNSIGNED_INT_SAMPLER_3D = 0x8DD3;
+
+  static const int UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4;
+
+  static const int UNSIGNED_INT_VEC2 = 0x8DC6;
+
+  static const int UNSIGNED_INT_VEC3 = 0x8DC7;
+
+  static const int UNSIGNED_INT_VEC4 = 0x8DC8;
+
+  static const int UNSIGNED_NORMALIZED = 0x8C17;
+
+  static const int UNSIGNED_SHORT = 0x1403;
+
+  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
+
+  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
+
+  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
+
+  static const int VALIDATE_STATUS = 0x8B83;
+
+  static const int VENDOR = 0x1F00;
+
+  static const int VERSION = 0x1F02;
+
+  static const int VERTEX_ARRAY_BINDING = 0x85B5;
+
+  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+  static const int VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE;
+
+  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
+
+  static const int VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD;
+
+  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
+
+  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
+
+  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
+
+  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
+
+  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
+
+  static const int VERTEX_SHADER = 0x8B31;
+
+  static const int VIEWPORT = 0x0BA2;
+
+  static const int WAIT_FAILED = 0x911D;
+
+  static const int ZERO = 0;
+}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGL2RenderingContextBase')
-@Experimental() // untriaged
 @Native("WebGL2RenderingContextBase")
 abstract class _WebGL2RenderingContextBase extends Interceptor
     implements _WebGLRenderingContextBase {
@@ -7767,9 +4166,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('WebGLRenderingContextBase')
-@Experimental() // untriaged
 abstract class _WebGLRenderingContextBase extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory _WebGLRenderingContextBase._() {
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 633ebe5..cce7a93 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -38,9 +38,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('SQLStatementCallback')
-// http://www.w3.org/TR/webdatabase/#sqlstatementcallback
-@Experimental() // deprecated
 typedef void SqlStatementCallback(
     SqlTransaction transaction, SqlResultSet resultSet);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -49,9 +46,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('SQLStatementErrorCallback')
-// http://www.w3.org/TR/webdatabase/#sqlstatementerrorcallback
-@Experimental() // deprecated
 typedef void SqlStatementErrorCallback(
     SqlTransaction transaction, SqlError error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -60,9 +54,6 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('SQLTransactionCallback')
-// http://www.w3.org/TR/webdatabase/#sqltransactioncallback
-@Experimental() // deprecated
 typedef void SqlTransactionCallback(SqlTransaction transaction);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -70,21 +61,13 @@
 
 // WARNING: Do not edit - generated code.
 
-@DomName('SQLTransactionErrorCallback')
-// http://www.w3.org/TR/webdatabase/#sqltransactionerrorcallback
-@Experimental() // deprecated
 typedef void SqlTransactionErrorCallback(SqlError error);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('Database')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/webdatabase/#asynchronous-database-api
-@Experimental() // deprecated
 @Native("Database")
 class SqlDatabase extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -95,8 +78,6 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.openDatabase)');
 
-  @DomName('Database.version')
-  @DocsEditable()
   final String version;
 
   /**
@@ -113,28 +94,20 @@
    *
    * * [Database.changeVersion](http://www.w3.org/TR/webdatabase/#dom-database-changeversion) from W3C.
    */
-  @DomName('Database.changeVersion')
-  @DocsEditable()
   void changeVersion(String oldVersion, String newVersion,
       [SqlTransactionCallback callback,
       SqlTransactionErrorCallback errorCallback,
       VoidCallback successCallback]) native;
 
-  @DomName('Database.readTransaction')
-  @DocsEditable()
   void readTransaction(SqlTransactionCallback callback,
       [SqlTransactionErrorCallback errorCallback,
       VoidCallback successCallback]) native;
 
-  @DomName('Database.transaction')
-  @DocsEditable()
   void transaction(SqlTransactionCallback callback,
       [SqlTransactionErrorCallback errorCallback,
       VoidCallback successCallback]) native;
 
   @JSName('transaction')
-  @DomName('Database.transaction')
-  @DocsEditable()
   Future<SqlTransaction> transaction_future() {
     var completer = new Completer<SqlTransaction>();
     transaction((value) {
@@ -150,10 +123,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SQLError')
-// http://www.w3.org/TR/webdatabase/#sqlerror
-@Experimental() // deprecated
 @Native("SQLError")
 class SqlError extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -161,54 +130,30 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SQLError.CONSTRAINT_ERR')
-  @DocsEditable()
   static const int CONSTRAINT_ERR = 6;
 
-  @DomName('SQLError.DATABASE_ERR')
-  @DocsEditable()
   static const int DATABASE_ERR = 1;
 
-  @DomName('SQLError.QUOTA_ERR')
-  @DocsEditable()
   static const int QUOTA_ERR = 4;
 
-  @DomName('SQLError.SYNTAX_ERR')
-  @DocsEditable()
   static const int SYNTAX_ERR = 5;
 
-  @DomName('SQLError.TIMEOUT_ERR')
-  @DocsEditable()
   static const int TIMEOUT_ERR = 7;
 
-  @DomName('SQLError.TOO_LARGE_ERR')
-  @DocsEditable()
   static const int TOO_LARGE_ERR = 3;
 
-  @DomName('SQLError.UNKNOWN_ERR')
-  @DocsEditable()
   static const int UNKNOWN_ERR = 0;
 
-  @DomName('SQLError.VERSION_ERR')
-  @DocsEditable()
   static const int VERSION_ERR = 2;
 
-  @DomName('SQLError.code')
-  @DocsEditable()
   final int code;
 
-  @DomName('SQLError.message')
-  @DocsEditable()
   final String message;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SQLResultSet')
-// http://www.w3.org/TR/webdatabase/#sqlresultset
-@Experimental() // deprecated
 @Native("SQLResultSet")
 class SqlResultSet extends Interceptor {
   // To suppress missing implicit constructor warnings.
@@ -216,26 +161,16 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SQLResultSet.insertId')
-  @DocsEditable()
   final int insertId;
 
-  @DomName('SQLResultSet.rows')
-  @DocsEditable()
   final SqlResultSetRowList rows;
 
-  @DomName('SQLResultSet.rowsAffected')
-  @DocsEditable()
   final int rowsAffected;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SQLResultSetRowList')
-// http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist
-@Experimental() // deprecated
 @Native("SQLResultSetRowList")
 class SqlResultSetRowList extends Interceptor
     with ListMixin<Map>, ImmutableListMixin<Map>
@@ -245,8 +180,6 @@
     throw new UnsupportedError("Not supported");
   }
 
-  @DomName('SQLResultSetRowList.length')
-  @DocsEditable()
   int get length => JS("int", "#.length", this);
 
   Map operator [](int index) {
@@ -292,26 +225,19 @@
   Map elementAt(int index) => this[index];
   // -- end List<Map> mixins.
 
-  @DomName('SQLResultSetRowList.item')
-  @DocsEditable()
   Map item(int index) {
     return convertNativeToDart_Dictionary(_item_1(index));
   }
 
   @JSName('item')
-  @DomName('SQLResultSetRowList.item')
-  @DocsEditable()
   _item_1(index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@DocsEditable()
-@DomName('SQLTransaction')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
 // http://www.w3.org/TR/webdatabase/#sqltransaction
 @deprecated // deprecated
 @Native("SQLTransaction")
@@ -322,16 +248,12 @@
   }
 
   @JSName('executeSql')
-  @DomName('SQLTransaction.executeSql')
-  @DocsEditable()
   void _executeSql(String sqlStatement,
       [List arguments,
       SqlStatementCallback callback,
       SqlStatementErrorCallback errorCallback]) native;
 
   @JSName('executeSql')
-  @DomName('SQLTransaction.executeSql')
-  @DocsEditable()
   Future<SqlResultSet> executeSql(String sqlStatement, [List arguments]) {
     var completer = new Completer<SqlResultSet>();
     _executeSql(sqlStatement, arguments, (transaction, resultSet) {
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index e85002f..750ea6a 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -76,6 +76,7 @@
 LayoutTests/fast/canvas/fillText-shadow_t01: RuntimeError # See issue 143
 LayoutTests/fast/css/content/content-quotes-01_t01: Pass, RuntimeError
 LayoutTests/fast/css/font-face-cache-bug_t01: Pass, RuntimeError
+LayoutTests/fast/css/font-shorthand-mix-inherit_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/fontfaceset-loadingdone_t01: Pass, RuntimeError
 LayoutTests/fast/css/misplaced-charset_t01: RuntimeError # See issue 143
 LayoutTests/fast/css/pseudo-empty-dynamic-empty_t01: RuntimeError # See issue 143
@@ -118,6 +119,7 @@
 LayoutTests/fast/table/fixed-table-with-percent-width-inside-extra-large-div_t01: Pass, RuntimeError
 LayoutTests/fast/table/hittest-tablecell-right-edge_t01: Skip # https://github.com/dart-lang/sdk/issues/28873
 LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: Skip # https://github.com/dart-lang/sdk/issues/28873
+LayoutTests/fast/table/resize-table-cell_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: Skip # https://github.com/dart-lang/sdk/issues/28873
 LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: Skip # https://github.com/dart-lang/sdk/issues/28873
 LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: Skip # https://github.com/dart-lang/sdk/issues/28873
@@ -183,6 +185,7 @@
 LibTest/core/int/operator_truncating_division_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
 LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
 LibTest/html/Element/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
+LibTest/html/Element/mouseEnterEvent_A01_t01: Pass, RuntimeError # Please triage this failure
 LibTest/html/Element/queryAll_A01_t01: RuntimeError # See issue 143
 LibTest/html/Element/query_A01_t01: RuntimeError # See issue 143
 LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
@@ -1484,7 +1487,6 @@
 [ $compiler == dart2js && $runtime == d8 && $fasta ]
 LayoutTests/*: SkipByDesign
 LibTest/html/*: SkipByDesign
-LibTest/html/Element/mouseEnterEvent_A01_t01: RuntimeError
 WebPlatformTest/*: SkipByDesign
 
 [ $compiler == dart2js && $runtime != d8 && $runtime != drt && $checked ]
@@ -2491,7 +2493,6 @@
 LayoutTests/fast/css/focus-display-block-inline_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-insert-link_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-property-priority_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/font-shorthand-mix-inherit_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/fontface-properties_t01: RuntimeError # Uses FontFace class, not defined for this browser.
 LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError # Please triage this failure
@@ -3655,9 +3656,7 @@
 Language/Classes/Constructors/Factories/return_wrong_type_t02: Pass, Slow # Issue 25940
 LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/device-aspect-ratio_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/media-rule-screenDepthPerComponent_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/submit-form-attributes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/media/color-does-not-include-alpha_t01: RuntimeError # Issue 31161
 LayoutTests/fast/media/media-query-list_t01: Pass, RuntimeError # Issue 32257
@@ -4913,7 +4912,6 @@
 LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/table/resize-table-binding-cell_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/table/resize-table-cell_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError # Please triage this failure
@@ -6998,14 +6996,12 @@
 Language/Expressions/Assignment/no_such_method_t09: RuntimeError
 Language/Expressions/Constants/bitwise_operators_t05: MissingCompileTimeError
 Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/exception_t01: MissingCompileTimeError # Larger than 64 bit int
 Language/Expressions/Constants/exception_t02: Pass
 Language/Expressions/Constants/literal_number_t01: CompileTimeError # Larger than 64 bit int
 Language/Expressions/Constants/logical_expression_t04: MissingCompileTimeError
 Language/Expressions/Constants/math_operators_t01: CompileTimeError # Larger than 64 bit int
 Language/Expressions/Constants/math_operators_t06: CompileTimeError # Larger than 64 bit int
 Language/Expressions/Function_Invocation/Unqualified_Invocation/instance_context_invocation_t04: Crash
-Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError
 Language/Expressions/Method_Invocation/Ordinary_Invocation/evaluation_t08: RuntimeError
 Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t02: Crash
 Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t05: RuntimeError
@@ -7050,7 +7046,6 @@
 LayoutTests/fast/canvas/rgba-parsing_t01: Pass, RuntimeError
 LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
 LibTest/core/double/isInfinite_A01_t03: CompileTimeError # Larger than 64 bit int
-LibTest/core/double/operator_GE_A01_t02: RuntimeError # WontFix: Not representable in JS.
 LibTest/core/int/abs_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/ceil_A01_t01: CompileTimeError # Larger than 64 bit int
@@ -7103,7 +7098,6 @@
 LibTest/html/Window/requestFileSystem_A01_t01: Crash
 LibTest/html/Window/requestFileSystem_A01_t02: Crash
 LibTest/html/Window/requestFileSystem_A02_t01: Crash
-LibTest/math/pow_A09_t01: RuntimeError # WontFix: Not representable in JS.
 LibTest/math/pow_A10_t01: CompileTimeError # Larger than 64 bit int
 WebPlatformTest/html/semantics/embedded-content/the-audio-element/audio_constructor_t01: RuntimeError
 
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 3ff64e2..ac31e6c 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -188,9 +188,6 @@
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19 issue 673, These tests take too much memory (300 MB) for our 1 GB test machine co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
 LibTest/core/List/List_class_A01_t02: Skip # co19 issue 673, These tests take too much memory (300 MB) for our 1 GB test machine co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
 
-[ $arch != arm64 && $arch != simarm64 && $arch != simdbc && $arch != simdbc64 && $arch != x64 && ($runtime == dart_precompiled || $runtime == vm) ]
-LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
-
 [ $arch == ia32 && $mode == release && $runtime == vm && $system == linux ]
 service/dev_fs_spawn_test: Pass, Fail # Issue 28411
 
@@ -244,9 +241,6 @@
 LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # Timeout
 LibTest/core/Uri/Uri_A06_t03: Skip # Timeout
 
-[ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
-Language/Expressions/Function_Invocation/async_invokation_t02: RuntimeError # sync-async is on by default.
-
 [ $compiler == app_jit || $compiler == precompiler ]
 Language/Mixins/Mixin_Application/error_t01: Pass
 Language/Mixins/Mixin_Application/error_t02: Pass
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index 2b0cbfb..40bbeb5 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
@@ -56,8 +57,8 @@
 }
 
 runTest() async {
-  CompilationResult result =
-      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: MEMORY_SOURCE_FILES, options: [Flags.noPreviewDart2]);
   Compiler compiler = result.compiler;
   JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
   Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
diff --git a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
index 2c2b74d..b7ecdeb 100644
--- a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
+++ b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
@@ -33,9 +33,9 @@
 main() {
   asyncTest(() async {
     print('--test from kernel------------------------------------------------');
-    await runTest([]);
+    await runTest([Flags.noPreviewDart2]);
     print('--test from kernel (trust-type-annotations)-----------------------');
-    await runTest([Flags.trustTypeAnnotations]);
+    await runTest([Flags.noPreviewDart2, Flags.trustTypeAnnotations]);
     print('--test from kernel (strong mode)----------------------------------');
     await runTest([Flags.strongMode]);
     print('--test from kernel (strong mode, omit-implicit.checks)------------');
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
index 076929c..b8282c5 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
@@ -51,7 +51,7 @@
 
 void main() {
   runTest() async {
-    var options = [Flags.trustTypeAnnotations];
+    var options = [Flags.noPreviewDart2, Flags.trustTypeAnnotations];
     var result = await runCompiler(
         memorySourceFiles: {'main.dart': TEST}, options: options);
     var compiler = result.compiler;
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index d0fabb9..df85ea4 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -49,7 +49,11 @@
     void check(String generatedEntry),
     bool returnAll: false}) async {
   OutputCollector outputCollector = returnAll ? new OutputCollector() : null;
-  List<String> options = <String>[Flags.disableTypeInference];
+  // TODO(sigmund): use strong-mode.
+  List<String> options = <String>[
+    Flags.noPreviewDart2,
+    Flags.disableTypeInference
+  ];
   if (enableTypeAssertions) {
     options.add(Flags.enableCheckedMode);
   }
@@ -101,7 +105,7 @@
     int expectedWarnings}) async {
   OutputCollector outputCollector = new OutputCollector();
   DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
-  List<String> options = <String>[];
+  List<String> options = <String>[Flags.noPreviewDart2];
   if (disableInlining) {
     options.add(Flags.disableInlining);
   }
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 1360b6c..a79f3a6 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -38,7 +38,6 @@
 show_package_warnings_test: RuntimeError # missing errors from the FE
 sourcemaps/d2js_validity_test: RuntimeError # Issue 33072
 sourcemaps/deferred_d2js_validity_test: RuntimeError # Issue 33072
-sourcemaps/pub_build_validity_test: Pass, RuntimeError # Investigate: passes locally, but only fails in bots.
 sourcemaps/source_mapping_invokes_test: Pass, Slow
 sourcemaps/source_mapping_operators_test: Pass, Slow
 sourcemaps/source_mapping_test: Pass, Slow
@@ -51,7 +50,6 @@
 end_to_end/exit_code_test: Pass, Slow
 in_user_code_test: Pass, Slow
 show_package_warnings_test: Pass, Slow
-sourcemaps/source_map_pub_build_validity_test: Pass, Slow
 
 [ $system == linux ]
 dart2js_batch2_test: Pass, RuntimeError # Issue 29021
@@ -65,7 +63,6 @@
 jsinterop/world_test: Pass, Slow
 kernel/visitor_test: Pass, Slow
 output_type_test: Pass, Slow
-sourcemaps/source_map_pub_build_validity_test: Pass, Slow
 sourcemaps/stacktrace_test: Pass, Slow
 uri_retention_test: Pass, Slow
 
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 45cab1b..a077442 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -577,7 +577,7 @@
       print('--skipped for kernel--------------------------------------------');
     } else {
       print('--from kernel---------------------------------------------------');
-      List<String> options = []..addAll(testOptions);
+      List<String> options = [Flags.noPreviewDart2]..addAll(testOptions);
       if (trustTypeAnnotations) {
         options.add(Flags.trustTypeAnnotations);
       }
@@ -628,8 +628,11 @@
         print('--skipped for kernel (strong mode, omit-implicit-checks)------');
       } else {
         print('--from kernel (strong mode, omit-implicit-checks)-------------');
-        List<String> options = [Flags.strongMode, Flags.omitImplicitChecks]
-          ..addAll(testOptions);
+        List<String> options = [
+          Flags.strongMode,
+          Flags.omitImplicitChecks,
+          Flags.laxRuntimeTypeToString
+        ]..addAll(testOptions);
         MemberAnnotations<IdValue> annotations = expectedMaps[omitMarker];
         CompiledData compiledData2 = await computeData(
             entryPoint, memorySourceFiles, computeFromKernel,
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index 0cdad7d..b42f560 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -49,8 +49,8 @@
   }
 
   options = new List<String>.from(options);
-  if (strongMode) {
-    options.add(Flags.strongMode);
+  if (!strongMode) {
+    options.add(Flags.noPreviewDart2);
   }
   if (trustTypeAnnotations) {
     options.add(Flags.trustTypeAnnotations);
diff --git a/tests/compiler/dart2js/helpers/element_lookup.dart b/tests/compiler/dart2js/helpers/element_lookup.dart
index 6d24abe..4823c94 100644
--- a/tests/compiler/dart2js/helpers/element_lookup.dart
+++ b/tests/compiler/dart2js/helpers/element_lookup.dart
@@ -22,12 +22,14 @@
 }
 
 MemberEntity findClassMember(
-    JClosedWorld closedWorld, String className, String memberName) {
+    JClosedWorld closedWorld, String className, String memberName,
+    {bool required: true}) {
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   ClassEntity cls = findClass(closedWorld, className);
   assert(cls != null, "Class '$className' not found.");
   MemberEntity member = elementEnvironment.lookupClassMember(cls, memberName);
-  assert(member != null, "Member '$memberName' not found in $cls.");
+  assert(
+      !required || member != null, "Member '$memberName' not found in $cls.");
   return member;
 }
 
diff --git a/tests/compiler/dart2js/impact/data/runtime_type_strong.dart b/tests/compiler/dart2js/impact/data/runtime_type_strong.dart
new file mode 100644
index 0000000..621b451
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/runtime_type_strong.dart
@@ -0,0 +1,463 @@
+// 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.
+
+/*element: Class1a.:static=[Object.(0)]*/
+class Class1a<T> {
+  /*element: Class1a.==:
+   dynamic=[==,runtimeType],
+   runtimeType=[equals:Class1a<Class1a.T>/dynamic]
+  */
+  bool operator ==(other) {
+    return runtimeType == other.runtimeType;
+  }
+}
+
+/*element: Class1b.:static=[Class1a.(0)]*/
+class Class1b<T> extends Class1a<T> {
+  /*element: Class1b.==:
+   dynamic=[==,runtimeType],
+   runtimeType=[equals:dynamic/Class1b<Class1b.T>]
+  */
+  bool operator ==(other) {
+    return other.runtimeType == runtimeType;
+  }
+}
+
+/*element: Class1c.:static=[Object.(0)]*/
+class Class1c<T> implements Class1a<T> {
+  /*element: Class1c.==:
+   dynamic=[==,runtimeType],
+   runtimeType=[equals:Class1c<Class1c.T>/dynamic],
+   type=[inst:JSNull]
+  */
+  bool operator ==(other) {
+    return runtimeType == other?.runtimeType;
+  }
+}
+
+/*element: Class1d.:static=[Object.(0)]*/
+class Class1d<T> implements Class1a<T> {
+  /*element: Class1d.==:
+   dynamic=[==,runtimeType],
+   runtimeType=[equals:dynamic/Class1d<Class1d.T>],
+   type=[inst:JSNull]
+  */
+  bool operator ==(other) {
+    return other?.runtimeType == runtimeType;
+  }
+}
+
+/*element: Class2.:static=[Object.(0)]*/
+class Class2<T> {}
+
+/*element: Class3.:static=[Object.(0)]*/
+class Class3 {
+  /*element: Class3.field:type=[inst:JSNull]*/
+  var field;
+}
+
+/*element: Class4.:static=[Object.(0)]*/
+class Class4 {}
+
+/*element: toString1:
+ dynamic=[runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  S,
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSString,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString1(Class2<int> c) => '${c.runtimeType}';
+
+/*element: toString2:
+ dynamic=[==,runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  S,
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSString,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString2(Class2<int> c) => '${c?.runtimeType}';
+
+/*element: toString3:
+ dynamic=[runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString3(Class2<int> c) => c.runtimeType.toString();
+
+/*element: toString4:
+ dynamic=[==,runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString4(Class2<int> c) => c.runtimeType?.toString();
+
+/*element: toString5:
+ dynamic=[==,runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString5(Class2<int> c) => c?.runtimeType?.toString();
+
+/*element: toString6:
+ dynamic=[==,runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString6(Class2<int> c) => c?.runtimeType.toString();
+
+/*element: unknown:
+ dynamic=[runtimeType],
+ runtimeType=[unknown:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+unknown(Class2<int> c) => c.runtimeType;
+
+/*element: equals1:
+ dynamic=[==,runtimeType],
+ runtimeType=[equals:Class1a<int>/Class1d<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class1a<int>,
+  param:Class1d<int>]
+*/
+equals1(Class1a<int> a, Class1d<int> b) => a?.runtimeType == b?.runtimeType;
+
+/*element: almostEquals1:
+ dynamic=[==,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals1(Class3 a) => a.runtimeType == null;
+
+/*element: almostEquals2:
+ dynamic=[==,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals2(Class3 a) => a?.runtimeType == null;
+
+/*element: almostEquals3:
+ dynamic=[==,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals3(Class3 a) => null == a.runtimeType;
+
+/*element: almostEquals4:
+ dynamic=[==,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals4(Class3 a) => null == a?.runtimeType;
+
+/*element: almostEquals5:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,param:Class3]
+*/
+almostEquals5(Class3 a) => a.runtimeType == a.field;
+
+/*element: almostEquals6:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals6(Class3 a) => a?.runtimeType == a.field;
+
+/*element: almostEquals7:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals7(Class3 a) => a.runtimeType == a?.field;
+
+/*element: almostEquals8:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals8(Class3 a) => a?.runtimeType == a?.field;
+
+/*element: almostEquals9:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,param:Class3]
+*/
+almostEquals9(Class3 a) => a.field == a.runtimeType;
+
+/*element: almostEquals10:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals10(Class3 a) => a?.field == a.runtimeType;
+
+/*element: almostEquals11:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals11(Class3 a) => a.field == a?.runtimeType;
+
+/*element: almostEquals12:
+ dynamic=[==,field,runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals12(Class3 a) => a?.field == a?.runtimeType;
+
+/*element: almostToString1:
+ dynamic=[runtimeType,toString],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,param:Class3]
+*/
+almostToString1(Class3 a) => a.runtimeType.toString;
+
+/*element: almostToString2:
+ dynamic=[==,runtimeType,toString],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostToString2(Class3 a) => a?.runtimeType?.toString;
+
+/*element: almostToString3:
+ dynamic=[noSuchMethod(1),runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostToString3(Class3 a) => a.runtimeType.noSuchMethod(null);
+
+/*element: almostToString4:
+ dynamic=[==,noSuchMethod(1),runtimeType],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostToString4(Class3 a) => a?.runtimeType.noSuchMethod(null);
+
+/*element: notEquals1:
+ dynamic=[==,runtimeType],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,param:Class3,param:Class4]
+*/
+notEquals1(Class3 a, Class4 b) => a.runtimeType != b.runtimeType;
+
+/*element: notEquals2:
+ dynamic=[==,runtimeType],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
+*/
+notEquals2(Class3 a, Class4 b) => a?.runtimeType != b.runtimeType;
+
+/*element: notEquals3:
+ dynamic=[==,runtimeType],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
+*/
+notEquals3(Class3 a, Class4 b) => a.runtimeType != b?.runtimeType;
+
+/*element: notEquals4:
+ dynamic=[==,runtimeType],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
+*/
+notEquals4(Class3 a, Class4 b) => a?.runtimeType != b?.runtimeType;
+
+/*element: main:
+ dynamic=[==],
+ static=[
+  Class1a.(0),
+  Class1b.(0),
+  Class1c.(0),
+  Class1d.(0),
+  Class2.(0),
+  Class3.(0),
+  Class4.(0),
+  almostEquals1(1),
+  almostEquals10(1),
+  almostEquals11(1),
+  almostEquals12(1),
+  almostEquals2(1),
+  almostEquals3(1),
+  almostEquals4(1),
+  almostEquals5(1),
+  almostEquals6(1),
+  almostEquals7(1),
+  almostEquals8(1),
+  almostEquals9(1),
+  almostToString1(1),
+  almostToString2(1),
+  almostToString3(1),
+  almostToString4(1),
+  assertIsSubtype,
+  equals1(2),
+  notEquals1(2),
+  notEquals2(2),
+  notEquals3(2),
+  notEquals4(2),
+  print(1),
+  throwTypeError,
+  toString1(1),
+  toString2(1),
+  toString3(1),
+  toString4(1),
+  toString5(1),
+  toString6(1),
+  unknown(1)]
+*/
+main() {
+  Class1a<int> c1a = new Class1a<int>();
+  Class1b<int> c1b = new Class1b<int>();
+  Class1c<int> c1c = new Class1c<int>();
+  Class1d<int> c1d = new Class1d<int>();
+  Class2<int> c2 = new Class2<int>();
+  Class3 c3 = new Class3();
+  Class4 c4 = new Class4();
+  print(c1a == c1b);
+  print(c1a == c1c);
+  print(c1a == c1d);
+  print(c1a == c2);
+  toString1(c2);
+  toString2(c2);
+  toString3(c2);
+  toString4(c2);
+  toString5(c2);
+  toString6(c2);
+  unknown(c2);
+  equals1(c1a, c1d);
+  almostEquals1(c3);
+  almostEquals2(c3);
+  almostEquals3(c3);
+  almostEquals4(c3);
+  almostEquals5(c3);
+  almostEquals6(c3);
+  almostEquals7(c3);
+  almostEquals8(c3);
+  almostEquals9(c3);
+  almostEquals10(c3);
+  almostEquals11(c3);
+  almostEquals12(c3);
+  almostToString1(c3);
+  almostToString2(c3);
+  almostToString3(c3);
+  almostToString4(c3);
+  notEquals1(c3, c4);
+  notEquals2(c3, c4);
+  notEquals3(c3, c4);
+  notEquals4(c3, c4);
+}
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index 7dd7401..dcf0e1d 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -4,13 +4,15 @@
 
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common/resolution.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/frontend_strategy.dart';
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
-import 'package:compiler/src/universe/world_impact.dart';
+import 'package:compiler/src/universe/feature.dart';
 import 'package:compiler/src/universe/use.dart';
+import 'package:compiler/src/universe/world_impact.dart';
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
 
@@ -28,6 +30,7 @@
   static const String staticUse = 'static';
   static const String dynamicUse = 'dynamic';
   static const String constantUse = 'constant';
+  static const String runtimeTypeUse = 'runtimeType';
 }
 
 /// Compute type inference data for [member] from kernel based inference.
@@ -61,6 +64,13 @@
   for (ConstantUse use in impact.constantUses) {
     features.addElement(Tags.constantUse, use.shortText);
   }
+  if (impact is TransformedWorldImpact &&
+      impact.worldImpact is ResolutionImpact) {
+    ResolutionImpact resolutionImpact = impact.worldImpact;
+    for (RuntimeTypeUse use in resolutionImpact.runtimeTypeUses) {
+      features.addElement(Tags.runtimeTypeUse, use.shortText);
+    }
+  }
   Id id = computeEntityId(definition.node);
   actualMap[id] = new ActualData(new IdValue(id, features.getText()),
       computeSourceSpanFromTreeNode(definition.node), member);
diff --git a/tests/compiler/dart2js/inference/data/no_such_method1.dart b/tests/compiler/dart2js/inference/data/no_such_method1.dart
index b4a1774..146ea37 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method1.dart
@@ -10,7 +10,8 @@
 
 /*element: B.:[exact=B]*/
 class B extends A {
-  foo();
+  /*strong.element: B.foo:[exact=JSUInt31]*/
+  /*strong.invoke: [subclass=B]*/ foo();
 }
 
 /*element: C.:[exact=C]*/
diff --git a/tests/compiler/dart2js/inference/list_tracer_test.dart b/tests/compiler/dart2js/inference/list_tracer_test.dart
index 8ee4567..24dcb84 100644
--- a/tests/compiler/dart2js/inference/list_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:expect/expect.dart';
 
@@ -208,7 +209,9 @@
 
 doTest(String allocation, {bool nullify}) async {
   String source = generateTest(allocation);
-  var result = await runCompiler(memorySourceFiles: {'main.dart': source});
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': source},
+      options: [Flags.noPreviewDart2]);
   Expect.isTrue(result.isSuccess);
   var compiler = result.compiler;
   var typesInferrer = compiler.globalInference.typesInferrerInternal;
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index 0db1d83..df01c26 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -30,9 +30,9 @@
 main() async {
   asyncTest(() async {
     print('--test Dart 1 ----------------------------------------------------');
-    await runTest([], trust: false);
+    await runTest([Flags.noPreviewDart2], trust: false);
     print('--test Dart 1 --trust-type-annotations ---------------------------');
-    await runTest([Flags.trustTypeAnnotations]);
+    await runTest([Flags.noPreviewDart2, Flags.trustTypeAnnotations]);
     print('--test Dart 2 ----------------------------------------------------');
     await runTest([Flags.strongMode], trust: false);
     print('--test Dart 2 --omit-implicit-checks -----------------------------');
diff --git a/tests/compiler/dart2js/inference/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
index e383eab..e30eaa8 100644
--- a/tests/compiler/dart2js/inference/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
@@ -227,7 +228,9 @@
 doTest(String allocation,
     {String keyElementName, String valueElementName}) async {
   String source = generateTest(allocation);
-  var result = await runCompiler(memorySourceFiles: {'main.dart': source});
+  var result = await runCompiler(
+      memorySourceFiles: {'main.dart': source},
+      options: [Flags.noPreviewDart2]);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   TypeMask keyType, valueType;
diff --git a/tests/compiler/dart2js/inference/type_combination_test.dart b/tests/compiler/dart2js/inference/type_combination_test.dart
index 23702fd..4304c1a 100644
--- a/tests/compiler/dart2js/inference/type_combination_test.dart
+++ b/tests/compiler/dart2js/inference/type_combination_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -745,8 +746,9 @@
 }
 
 runTests() async {
-  CompilationResult result = await runCompiler(memorySourceFiles: {
-    'main.dart': r'''
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: {
+        'main.dart': r'''
     import 'dart:collection';
     class AList<E> extends ListBase<E> {}
     main() {
@@ -755,7 +757,9 @@
       print('${const []}${const {}}${(){}}${new AList()}');
     }
     '''
-  }, beforeRun: (compiler) => compiler.stopAfterTypeInference = true);
+      },
+      beforeRun: (compiler) => compiler.stopAfterTypeInference = true,
+      options: [Flags.noPreviewDart2]);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index c47be24..cb9cf2c 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
@@ -18,7 +19,7 @@
 void main() {
   asyncTest(() async {
     print('--test from kernel------------------------------------------------');
-    await testClasses([]);
+    await testClasses([Flags.noPreviewDart2]);
     print('--test from kernel (strong mode)----------------------------------');
     // TODO(johnniwinther): Update the test to be strong mode compliant.
     //await testClasses([Flags.strongMode]);
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index af328ef..f91acf6 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -601,7 +601,7 @@
         local() {}
       }
       """,
-      options: strongMode ? [Flags.strongMode] : [],
+      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2],
       testBackendWorld: true);
   JClosedWorld world = env.jClosedWorld;
 
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index e014671..885bb45 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -153,6 +153,10 @@
     const ConstantData('-(1)', 'IntConstant(-1)'),
     const ConstantData('1 == 2', 'BoolConstant(false)'),
     const ConstantData('1 != 2', 'BoolConstant(true)'),
+    const ConstantData('1 / 0', 'DoubleConstant(Infinity)'),
+    const ConstantData('0 / 0', 'DoubleConstant(NaN)'),
+    const ConstantData('1 << 0', 'IntConstant(1)'),
+    const ConstantData('1 >> 0', 'IntConstant(1)'),
     const ConstantData('"foo".length', 'IntConstant(3)'),
     const ConstantData('identical(0, 1)', 'BoolConstant(false)'),
     const ConstantData('"a" "b"', 'StringConstant("ab")'),
@@ -419,6 +423,18 @@
         expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_INT_TYPE),
     const ConstantData('0 << string', 'NonConstant',
         expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_INT_TYPE),
+    const ConstantData('1 ~/ 0', 'NonConstant',
+        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
+    const ConstantData('1 ~/ 0.0', 'NonConstant',
+        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
+    const ConstantData('1 % 0', 'NonConstant',
+        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
+    const ConstantData('1 % 0.0', 'NonConstant',
+        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
+    const ConstantData('1 << -1', 'NonConstant',
+        expectedErrors: MessageKind.INVALID_CONSTANT_SHIFT),
+    const ConstantData('1 >> -1', 'NonConstant',
+        expectedErrors: MessageKind.INVALID_CONSTANT_SHIFT),
     const ConstantData('null[0]', 'NonConstant',
         expectedErrors: MessageKind.INVALID_CONSTANT_INDEX),
     const ConstantData('const bool.fromEnvironment(0)', 'NonConstant',
@@ -655,7 +671,8 @@
   if (!skipKernelList.contains(data.name) && !data.strongModeOnly) {
     print(
         '--test kernel-------------------------------------------------------');
-    await runTest([], (Compiler compiler, FieldEntity field) {
+    await runTest([Flags.noPreviewDart2],
+        (Compiler compiler, FieldEntity field) {
       KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
       KernelToElementMap elementMap = frontendStrategy.elementMap;
       return new KernelEvaluationEnvironment(elementMap, null, field,
diff --git a/tests/compiler/dart2js/model/constant_expression_test.dart b/tests/compiler/dart2js/model/constant_expression_test.dart
index ae5ec8a..901f962 100644
--- a/tests/compiler/dart2js/model/constant_expression_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_test.dart
@@ -355,7 +355,7 @@
   String source = sb.toString();
   CompilationResult result = await runCompiler(
       memorySourceFiles: {'main.dart': source},
-      options: strongMode ? [Flags.strongMode] : []);
+      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
   Compiler compiler = result.compiler;
   var elementEnvironment = compiler.frontendStrategy.elementEnvironment;
 
diff --git a/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart b/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
new file mode 100644
index 0000000..7519cdd
--- /dev/null
+++ b/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
@@ -0,0 +1,180 @@
+// 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:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/types.dart';
+import 'package:compiler/src/world.dart';
+import 'package:expect/expect.dart';
+import '../helpers/element_lookup.dart';
+import '../memory_compiler.dart';
+
+const String source = '''
+abstract class I<T> {
+  T method();
+}
+
+class A<T> implements I<T> {
+  noSuchMethod(_) => null;
+}
+
+class B<T> extends I<T> {
+  noSuchMethod(_) => null;
+}
+
+abstract class C1<T> implements I<T> {
+}
+
+class C2<T> extends C1<T> {
+  noSuchMethod(_) => null;
+}
+
+abstract class D1<T> implements I<T> {
+}
+
+abstract class D2<T> extends D1<T> {
+  noSuchMethod(_) => null;
+}
+
+class D3<T> extends D2<T> {
+}
+
+class E1<T> {
+  T method() => null;
+}
+
+abstract class E2<T> implements I<T> {
+  noSuchMethod(_) => null;
+}
+
+class E3<T> extends E1<T> with E2<T> {
+}
+
+class F1<T> {
+  T method() => null;
+}
+
+class F2<T> implements I<T> {
+  noSuchMethod(_) => null;
+}
+
+class F3<T> extends F1<T> with F2<T> {
+}
+
+abstract class G1<T> {
+  T method();
+}
+
+abstract class G2<T> implements I<T> {
+  noSuchMethod(_) => null;
+}
+
+class G3<T> extends G1<T> with G2<T> {
+}
+
+abstract class H1<T> {
+  T method();
+}
+
+abstract class H2<T> implements I<T> {
+  noSuchMethod(_) => null;
+}
+
+class H3<T> extends H1<T> with H2<T> {
+  method() => null;
+}
+
+main() {
+  new A();
+  new B();
+  new C2();
+  new D3();
+  new E1();
+  new E3();
+  new F1();
+  new F2();
+  new F3();
+  new G3();
+  new H3();
+}
+''';
+
+main() {
+  asyncTest(() async {
+    CompilationResult result = await runCompiler(
+        memorySourceFiles: {'main.dart': source}, options: [Flags.strongMode]);
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+
+    void check(String className,
+        {bool hasMethod, bool isAbstract: false, String declaringClass}) {
+      MemberEntity member =
+          findClassMember(closedWorld, className, 'method', required: false);
+      if (hasMethod) {
+        Expect.isNotNull(
+            member, "Missing member 'method' in class '$className'.");
+        Expect.equals(isAbstract, member.isAbstract,
+            "Unexpected abstract-ness on method $member.");
+        ClassEntity cls = findClass(closedWorld, declaringClass);
+        if (cls != member.enclosingClass) {
+          print("Unexpected declaring class $member. "
+              "Found ${member.enclosingClass}, expected $cls.");
+        }
+        Expect.equals(
+            cls,
+            member.enclosingClass,
+            "Unexpected declaring class $member. "
+            "Found ${member.enclosingClass}, expected $cls.");
+        DartType type;
+        if (member.isFunction) {
+          type =
+              closedWorld.elementEnvironment.getFunctionType(member).returnType;
+        } else if (member.isGetter) {
+          type =
+              closedWorld.elementEnvironment.getFunctionType(member).returnType;
+        } else if (member.isSetter) {
+          type = closedWorld.elementEnvironment
+              .getFunctionType(member)
+              .parameterTypes
+              .first;
+        }
+        Expect.isTrue(type is TypeVariableType,
+            "Unexpected member type for $member: $type");
+        TypeVariableType typeVariable = type;
+        Expect.equals(
+            cls,
+            typeVariable.element.typeDeclaration,
+            "Unexpected type declaration for $typeVariable for $member. "
+            "Expected $cls, found ${typeVariable.element.typeDeclaration}.");
+      } else {
+        Expect.isNull(member,
+            "Unexpected member 'method' in class '$className': $member.");
+      }
+    }
+
+    check('I', hasMethod: true, isAbstract: true, declaringClass: 'I');
+    check('A', hasMethod: true, declaringClass: 'A');
+    check('B', hasMethod: true, declaringClass: 'B');
+    check('C1', hasMethod: false);
+    check('C2', hasMethod: true, declaringClass: 'C2');
+    check('D1', hasMethod: false);
+    check('D2', hasMethod: false);
+    check('D3', hasMethod: true, declaringClass: 'D3');
+    check('E1', hasMethod: true, declaringClass: 'E1');
+    check('E2', hasMethod: false);
+    check('E3', hasMethod: true, declaringClass: 'E1');
+    check('F1', hasMethod: true, declaringClass: 'F1');
+    check('F2', hasMethod: true, declaringClass: 'F2');
+    check('F3', hasMethod: true, declaringClass: 'F1');
+    check('G1', hasMethod: true, isAbstract: true, declaringClass: 'G1');
+    check('G2', hasMethod: false);
+    check('G3', hasMethod: true, declaringClass: 'G3');
+    check('H1', hasMethod: true, isAbstract: true, declaringClass: 'H1');
+    check('H2', hasMethod: false);
+    check('H3', hasMethod: true, declaringClass: 'H3');
+  });
+}
diff --git a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
index 59a8afd7..4a360c9 100644
--- a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
@@ -140,7 +140,7 @@
   r = new R(); // Create R after call.
 }
 '''
-  }, options: strongMode ? [Flags.strongMode] : []);
+  }, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
 
diff --git a/tests/compiler/dart2js/model/strong_mode_impact_test.dart b/tests/compiler/dart2js/model/strong_mode_impact_test.dart
index 10400b8..908e142 100644
--- a/tests/compiler/dart2js/model/strong_mode_impact_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_impact_test.dart
@@ -93,7 +93,7 @@
   ImpactCacheDeleter.retainCachesForTesting = true;
   CompilationResult result = await runCompiler(
       memorySourceFiles: {'main.dart': source},
-      options: strongMode ? [Flags.strongMode] : []);
+      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
 
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index 7a44b77..3f761876 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_test.dart
@@ -59,7 +59,9 @@
       // TODO(johnniwinther): Inheritance with different type arguments is
       // currently not supported by the implementation.
       class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {}
-      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """,
+      options:
+          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -311,7 +313,9 @@
         int m4(V v, U u) => null;
         void m5(V v, int i) => null;
       }
-      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """,
+      options:
+          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -361,14 +365,14 @@
 Future testFunctionSubtyping({bool strongMode}) async {
   await TypeEnvironment
       .create(createMethods(functionTypesData),
-          options: strongMode ? [Flags.strongMode] : [])
+          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then(functionSubtypingHelper);
 }
 
 Future testTypedefSubtyping({bool strongMode}) async {
   await TypeEnvironment
       .create(createTypedefs(functionTypesData),
-          options: strongMode ? [Flags.strongMode] : [])
+          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then(functionSubtypingHelper);
 }
 
@@ -447,14 +451,14 @@
 Future testFunctionSubtypingOptional({bool strongMode}) async {
   await TypeEnvironment
       .create(createMethods(optionalFunctionTypesData),
-          options: strongMode ? [Flags.strongMode] : [])
+          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingOptionalHelper(env, strongMode));
 }
 
 Future testTypedefSubtypingOptional({bool strongMode}) async {
   await TypeEnvironment
       .create(createTypedefs(optionalFunctionTypesData),
-          options: strongMode ? [Flags.strongMode] : [])
+          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingOptionalHelper(env, strongMode));
 }
 
@@ -521,14 +525,14 @@
 Future testFunctionSubtypingNamed({bool strongMode}) async {
   await TypeEnvironment
       .create(createMethods(namedFunctionTypesData),
-          options: strongMode ? [Flags.strongMode] : [])
+          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingNamedHelper(env, strongMode));
 }
 
 Future testTypedefSubtypingNamed({bool strongMode}) async {
   await TypeEnvironment
       .create(createTypedefs(namedFunctionTypesData),
-          options: strongMode ? [Flags.strongMode] : [])
+          options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingNamedHelper(env, strongMode));
 }
 
@@ -580,7 +584,9 @@
       class H<T extends S, S extends T> {}
       class I<T extends S, S extends U, U extends T> {}
       class J<T extends S, S extends U, U extends S> {}
-      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """,
+      options:
+          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -804,7 +810,9 @@
       takeInt(int o) => null;
       takeVoid(void o) => null;
       takeObject(Object o) => null;
-      """, options: strongMode ? [Flags.strongMode] : []).then((env) {
+      """,
+      options:
+          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       Expect.equals(expectSubtype, env.isSubtype(T, S), '$T <: $S');
       if (expectSubtype) {
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index c48b5bb..fd5e963 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -51,7 +51,7 @@
         new F();
         new G();
       }
-      """, options: strongMode ? [Flags.strongMode] : []);
+      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
   KClosedWorld world = env.kClosedWorld;
 
   ClassEntity A = env.getElement("A");
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 68c216b..5cd35d2 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/call_structure.dart';
@@ -47,7 +48,9 @@
     testMode = '$instantiated';
 
     var env = await TypeEnvironment.create(CLASSES,
-        mainSource: main.toString(), testBackendWorld: true);
+        mainSource: main.toString(),
+        testBackendWorld: true,
+        options: [Flags.noPreviewDart2]);
     foo = new Selector.call(const PublicName('foo'), CallStructure.NO_ARGS);
     bar = new Selector.call(const PublicName('bar'), CallStructure.NO_ARGS);
     baz = new Selector.call(const PublicName('baz'), CallStructure.NO_ARGS);
diff --git a/tests/compiler/dart2js/no_such_method_enabled_test.dart b/tests/compiler/dart2js/no_such_method_enabled_test.dart
index f16b55b..f89588f 100644
--- a/tests/compiler/dart2js/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/no_such_method_enabled_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
@@ -209,8 +210,9 @@
     for (NoSuchMethodTest test in TESTS) {
       print('---- testing -------------------------------------------------');
       print(test.code);
-      CompilationResult result =
-          await runCompiler(memorySourceFiles: {'main.dart': test.code});
+      CompilationResult result = await runCompiler(
+          memorySourceFiles: {'main.dart': test.code},
+          options: [Flags.noPreviewDart2]);
       Compiler compiler = result.compiler;
       checkTest(compiler, test);
     }
diff --git a/tests/compiler/dart2js/rti/data/generic_creation.dart b/tests/compiler/dart2js/rti/data/generic_creation.dart
index 56adaeb..d2bb3be 100644
--- a/tests/compiler/dart2js/rti/data/generic_creation.dart
+++ b/tests/compiler/dart2js/rti/data/generic_creation.dart
@@ -5,29 +5,42 @@
 import "package:expect/expect.dart";
 
 /*class: A:needsArgs*/
-/*element: A.:needsSignature*/
+/*kernel.element: A.:needsSignature*/
+/*!kernel.element: A.:*/
 class A<X, Y, Z> {
-  /*element: A.shift:needsSignature*/
+  /*kernel.element: A.shift:needsSignature*/
+  /*!kernel.element: A.shift:*/
   shift() => new A<Z, X, Y>();
-  /*element: A.swap:needsSignature*/
+
+  /*kernel.element: A.swap:needsSignature*/
+  /*!kernel.element: A.swap:*/
   swap() => new A<Z, Y, X>();
-  /*element: A.first:needsSignature*/
+
+  /*kernel.element: A.first:needsSignature*/
+  /*!kernel.element: A.first:*/
   first() => new A<X, X, X>();
-  /*element: A.last:needsSignature*/
+
+  /*kernel.element: A.last:needsSignature*/
+  /*!kernel.element: A.last:*/
   last() => new A<Z, Z, Z>();
-  /*element: A.wrap:needsSignature*/
+
+  /*kernel.element: A.wrap:needsSignature*/
+  /*!kernel.element: A.wrap:*/
   wrap() => new A<A<X, X, X>, A<Y, Y, Y>, A<Z, Z, Z>>();
 }
 
-/*element: B.:needsSignature*/
+/*kernel.element: B.:needsSignature*/
+/*!kernel.element: B.:*/
 class B extends A<U, V, W> {}
 
 /*class: C:needsArgs*/
-/*element: C.:needsSignature*/
+/*kernel.element: C.:needsSignature*/
+/*!kernel.element: C.:*/
 class C<T> extends A<U, T, W> {}
 
 /*class: D:needsArgs*/
-/*element: D.:needsSignature*/
+/*kernel.element: D.:needsSignature*/
+/*!kernel.element: D.:*/
 class D<X, Y, Z> extends A<Y, Z, X> {}
 
 class U {}
@@ -36,10 +49,12 @@
 
 class W {}
 
-/*element: sameType:needsSignature*/
+/*kernel.element: sameType:needsSignature*/
+/*!kernel.element: sameType:*/
 sameType(a, b) => Expect.equals(a.runtimeType, b.runtimeType);
 
-/*element: main:needsSignature*/
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
 main() {
   A a = new A<U, V, W>();
   sameType(new A<W, U, V>(), a.shift());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
new file mode 100644
index 0000000..a591ef6
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  /*needsSignature*/
+  local1a() {}
+
+  /*needsSignature*/
+  local1b() {}
+
+  /*needsSignature*/
+  local2(int i, String s) => i;
+
+  Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+  Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+  new Class();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
new file mode 100644
index 0000000..5958d4a
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
@@ -0,0 +1,34 @@
+// 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:expect/expect.dart';
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  /*kernel.needsSignature*/
+  /*!kernel.needsArgs,needsSignature*/
+  T local1a<T>() => null;
+
+  /*kernel.needsSignature*/
+  /*!kernel.needsArgs,needsSignature*/
+  T local1b<T>() => null;
+
+  /*kernel.needsSignature*/
+  /*strong.direct,explicit=[local2.T],needsArgs,needsSignature*/
+  /*omit.needsArgs,needsSignature*/
+  T local2<T>(T t, String s) => t;
+
+  Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+  Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+  new Class();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
new file mode 100644
index 0000000..74d0adb
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
@@ -0,0 +1,47 @@
+// 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:expect/expect.dart';
+
+String method() => null;
+
+/*!strong.class: Class1:needsArgs*/
+/*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+
+  /*kernel.element: Class1.method:needsSignature*/
+  /*!kernel.element: Class1.method:*/
+  method() {
+    /*needsSignature*/
+    T local1a() => null;
+
+    /*needsSignature*/
+    T local1b() => null;
+
+    /*needsSignature*/
+    T local2(T t, String s) => t;
+
+    Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+    Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+    Expect.isFalse(local1a.runtimeType == method.runtimeType);
+  }
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  new Class1<int>().method();
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
new file mode 100644
index 0000000..456b5db
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
@@ -0,0 +1,46 @@
+// 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:expect/expect.dart';
+
+/*kernel.class: Class1:needsArgs*/
+/*!kernel.class: Class1:*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+
+  // TODO(johnniwinther): Currently only methods that use class type variables
+  // in their signature are marked as 'needs signature'. Change this to mark
+  // all methods that need to support access to their function type at runtime.
+  /*kernel.element: Class1.method1a:needsSignature*/
+  /*!kernel.element: Class1.method1a:*/
+  method1a() => null;
+
+  /*kernel.element: Class1.method1b:needsSignature*/
+  /*!kernel.element: Class1.method1b:*/
+  method1b() => null;
+
+  /*kernel.element: Class1.method2:needsSignature*/
+  /*!kernel.element: Class1.method2:*/
+  method2(t, s) => t;
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
new file mode 100644
index 0000000..28c000f
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
@@ -0,0 +1,43 @@
+// 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:expect/expect.dart';
+
+/*!strong.class: Class1:needsArgs*/
+/*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+
+  /*kernel.element: Class1.method1a:needsSignature*/
+  /*!kernel.element: Class1.method1a:needsSignature*/
+  T method1a() => null;
+
+  /*kernel.element: Class1.method1b:needsSignature*/
+  /*!kernel.element: Class1.method1b:needsSignature*/
+  T method1b() => null;
+
+  /*kernel.element: Class1.method2:needsSignature*/
+  /*!kernel.element: Class1.method2:needsSignature*/
+  T method2(T t, String s) => t;
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
new file mode 100644
index 0000000..b8771d8
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
@@ -0,0 +1,33 @@
+// 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:expect/expect.dart';
+
+/*kernel.element: method1a:needsSignature*/
+/*!kernel.element: method1a:*/
+method1a() => null;
+
+/*kernel.element: method1b:needsSignature*/
+/*!kernel.element: method1b:*/
+method1b() => null;
+
+/*kernel.element: method2:needsSignature*/
+/*!kernel.element: method2:*/
+method2(t, s) => t;
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
+  Expect.isFalse(method1a.runtimeType == method2.runtimeType);
+  new Class<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
new file mode 100644
index 0000000..b3ff672
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
@@ -0,0 +1,34 @@
+// 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:expect/expect.dart';
+
+/*kernel.element: method1a:needsSignature*/
+/*!kernel.element: method1a:needsArgs*/
+T method1a<T>() => null;
+
+/*kernel.element: method1b:needsSignature*/
+/*!kernel.element: method1b:needsArgs*/
+T method1b<T>() => null;
+
+/*kernel.element: method2:needsSignature*/
+/*strong.element: method2:direct,explicit=[method2.T],needsArgs*/
+/*omit.element: method2:needsArgs*/
+T method2<T>(T t, String s) => t;
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
+  Expect.isFalse(method1a.runtimeType == method2.runtimeType);
+  new Class<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
new file mode 100644
index 0000000..9c4ebae
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
@@ -0,0 +1,44 @@
+// 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:expect/expect.dart';
+
+/*kernel.class: Class1:needsArgs*/
+/*!kernel.class: Class1:*/
+class Class1<S> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+
+  /*kernel.element: Class1.method1a:needsSignature*/
+  /*!kernel.element: Class1.method1a:needsArgs*/
+  T method1a<T>() => null;
+
+  /*kernel.element: Class1.method1b:needsSignature*/
+  /*!kernel.element: Class1.method1b:needsArgs*/
+  T method1b<T>() => null;
+
+  /*kernel.element: Class1.method2:needsSignature*/
+  /*strong.element: Class1.method2:direct,explicit=[method2.T],needsArgs*/
+  /*omit.element: Class1.method2:needsArgs*/
+  T method2<T>(T t, String s) => t;
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
new file mode 100644
index 0000000..9d67301
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  /*!omit.needsSignature*/
+  /*omit.*/
+  local1() {}
+
+  /*!omit.needsSignature*/
+  /*omit.*/
+  local2(int i, String s) => i;
+
+  print('${local1.runtimeType}');
+  local2(0, '');
+  new Class();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
new file mode 100644
index 0000000..034011c
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
@@ -0,0 +1,29 @@
+// 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.
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  /*kernel.needsSignature*/
+  /*strong.needsArgs,needsSignature*/
+  /*omit.*/
+  local1<T>() {}
+
+  /*kernel.needsSignature*/
+  /*strong.needsArgs,needsSignature,selectors=[Selector(call, call, arity=2, types=1)]*/
+  /*omit.*/
+  local2<T>(t, s) => t;
+
+  print('${local1.runtimeType}');
+  local2(0, '');
+  new Class();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
new file mode 100644
index 0000000..69f305d
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
@@ -0,0 +1,31 @@
+// 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.
+
+/*!omit.class: Class1:needsArgs*/
+/*omit.class: Class1:*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+
+  /*!omit.element: Class1.method:needsSignature*/
+  /*omit.element: Class1.method:*/
+  T method() => null;
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1<int> cls1 = new Class1<int>();
+  print(cls1.method.runtimeType.toString());
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
new file mode 100644
index 0000000..ca9f34b
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Class1:*/
+class Class1 {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+
+  /*kernel.element: Class1.method:needsSignature*/
+  /*strong.element: Class1.method:needsArgs*/
+  /*omit.element: Class1.method:*/
+  T method<T>() => null;
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1 cls1 = new Class1();
+  print(cls1.method.runtimeType.toString());
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
new file mode 100644
index 0000000..25274f4
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: method1:needsSignature*/
+/*!kernel.element: method1:*/
+method1() {}
+
+/*kernel.element: method2:needsSignature*/
+/*!kernel.element: method2:*/
+method2(int i, String s) => i;
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  print('${method1.runtimeType}');
+  method2(0, '');
+  new Class();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
new file mode 100644
index 0000000..6a1ae66
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
@@ -0,0 +1,29 @@
+// 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.
+
+/*kernel.class: Class:needsArgs*/
+/*!kernel.class: Class:*/
+class Class<T> {
+  /*kernel.element: Class.:needsSignature*/
+  /*!kernel.element: Class.:*/
+  Class();
+}
+
+/*kernel.element: method1:needsSignature*/
+/*strong.element: method1:needsArgs*/
+/*omit.element: method1:*/
+method1<T>() {}
+
+/*kernel.element: method2:needsSignature*/
+/*strong.element: method2:needsArgs*/
+/*omit.element: method2:*/
+method2<T>(t, s) => t;
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  print('${method1.runtimeType}');
+  method2(0, '');
+  new Class();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
new file mode 100644
index 0000000..06a762f
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
@@ -0,0 +1,57 @@
+// 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:expect/expect.dart';
+
+/*class: Class1a:needsArgs*/
+class Class1a<T> {
+  /*kernel.element: Class1a.:needsSignature*/
+  /*!kernel.element: Class1a.:*/
+  Class1a();
+
+  /*kernel.element: Class1a.==:needsSignature*/
+  /*!kernel.element: Class1a.==:*/
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return runtimeType == other.runtimeType;
+  }
+}
+
+/*class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a<T> {
+  /*kernel.element: Class1b.:needsSignature*/
+  /*!kernel.element: Class1b.:*/
+  Class1b();
+}
+
+// TODO(johnniwinther): Specialize handling of `this.runtimeType` to exclude
+// this class.
+/*class: Class1c:needsArgs*/
+class Class1c<T> implements Class1a<T> {
+  /*kernel.element: Class1c.:needsSignature*/
+  /*!kernel.element: Class1c.:*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
new file mode 100644
index 0000000..19554c5
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
@@ -0,0 +1,57 @@
+// 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:expect/expect.dart';
+
+/*class: Class1a:needsArgs*/
+class Class1a<T> {
+  /*kernel.element: Class1a.:needsSignature*/
+  /*!kernel.element: Class1a.:*/
+  Class1a();
+
+  /*kernel.element: Class1a.==:needsSignature*/
+  /*!kernel.element: Class1a.==:*/
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return other.runtimeType == runtimeType;
+  }
+}
+
+/*class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a<T> {
+  /*kernel.element: Class1b.:needsSignature*/
+  /*!kernel.element: Class1b.:*/
+  Class1b();
+}
+
+// TODO(johnniwinther): Specialize handling of `this.runtimeType` to exclude
+// this class.
+/*class: Class1c:needsArgs*/
+class Class1c<T> implements Class1a<T> {
+  /*kernel.element: Class1c.:needsSignature*/
+  /*!kernel.element: Class1c.:*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
new file mode 100644
index 0000000..913cc57
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
@@ -0,0 +1,57 @@
+// 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:expect/expect.dart';
+
+/*class: Class1a:needsArgs*/
+class Class1a<T> {
+  /*kernel.element: Class1a.:needsSignature*/
+  /*!kernel.element: Class1a.:*/
+  Class1a();
+
+  /*kernel.element: Class1a.==:needsSignature*/
+  /*!kernel.element: Class1a.==:*/
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return runtimeType == other?.runtimeType;
+  }
+}
+
+/*class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a<T> {
+  /*kernel.element: Class1b.:needsSignature*/
+  /*!kernel.element: Class1b.:*/
+  Class1b();
+}
+
+// TODO(johnniwinther): Specialize handling of `this.runtimeType` to exclude
+// this class.
+/*class: Class1c:needsArgs*/
+class Class1c<T> implements Class1a<T> {
+  /*kernel.element: Class1c.:needsSignature*/
+  /*!kernel.element: Class1c.:*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
new file mode 100644
index 0000000..7993bcd
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
@@ -0,0 +1,57 @@
+// 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:expect/expect.dart';
+
+/*class: Class1a:needsArgs*/
+class Class1a<T> {
+  /*kernel.element: Class1a.:needsSignature*/
+  /*!kernel.element: Class1a.:*/
+  Class1a();
+
+  /*kernel.element: Class1a.==:needsSignature*/
+  /*!kernel.element: Class1a.==:*/
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return other?.runtimeType == runtimeType;
+  }
+}
+
+/*class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a<T> {
+  /*kernel.element: Class1b.:needsSignature*/
+  /*!kernel.element: Class1b.:*/
+  Class1b();
+}
+
+// TODO(johnniwinther): Specialize handling of `this.runtimeType` to exclude
+// this class.
+/*class: Class1c:needsArgs*/
+class Class1c<T> implements Class1a<T> {
+  /*kernel.element: Class1c.:needsSignature*/
+  /*!kernel.element: Class1c.:*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1_strong.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1_strong.dart
new file mode 100644
index 0000000..657513e
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1_strong.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: global#instantiate1:needsArgs*/
+
+main() {
+  /*strong.direct,explicit=[id.T],needsArgs,needsInst=[<int>],needsSignature*/
+  T id<T>(T t, String s) => t;
+  int Function(int, String s) x = id;
+  print("${x.runtimeType}");
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2_strong.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2_strong.dart
new file mode 100644
index 0000000..2db3273
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2_strong.dart
@@ -0,0 +1,13 @@
+// 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.
+
+/*element: global#instantiate1:needsArgs*/
+
+/*strong.element: id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
+T id<T>(T t, String s) => t;
+
+main() {
+  int Function(int, String s) x = id;
+  print("${x.runtimeType}");
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3_strong.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3_strong.dart
new file mode 100644
index 0000000..cb51e1b
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3_strong.dart
@@ -0,0 +1,15 @@
+// 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.
+
+/*element: global#instantiate1:needsArgs*/
+
+class Class {
+  /*strong.element: Class.id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
+  T id<T>(T t, String s) => t;
+}
+
+main() {
+  int Function(int, String s) x = new Class().id;
+  print("${x.runtimeType}");
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
new file mode 100644
index 0000000..edf0fb3
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
@@ -0,0 +1,37 @@
+// 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.
+
+/*!omit.class: Class1:*/
+/*omit.class: Class1:*/
+class Class1 {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*!omit.class: Class3:needsArgs*/
+/*omit.class: Class3:*/
+class Class3<T> implements Class1 {
+  /*kernel.element: Class3.:needsSignature*/
+  /*!kernel.element: Class3.:*/
+  Class3();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1 cls1 = new Class1();
+  print(cls1.runtimeType.toString());
+  new Class2<int>();
+  Class1 cls3 = new Class3<int>();
+  print(cls3.runtimeType.toString());
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
new file mode 100644
index 0000000..7c3ca11
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*!omit.class: Class1:needsArgs*/
+/*omit.class: Class1:*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1<int> cls1 = new Class1<int>();
+  print('${cls1.runtimeType}');
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
new file mode 100644
index 0000000..02503de
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*!omit.class: Class1:needsArgs*/
+/*omit.class: Class1:*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1<int> cls1 = new Class1<int>();
+  print(cls1.runtimeType?.toString());
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
new file mode 100644
index 0000000..221554c
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*!omit.class: Class1:needsArgs*/
+/*omit.class: Class1:*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1<int> cls1 = new Class1<int>();
+  print(cls1?.runtimeType?.toString());
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
new file mode 100644
index 0000000..f68c923
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*!omit.class: Class1:needsArgs*/
+/*omit.class: Class1:*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1<int> cls1 = new Class1<int>();
+  print('${cls1?.runtimeType}');
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
new file mode 100644
index 0000000..6ca7b43
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*!omit.class: Class1:needsArgs*/
+/*omit.class: Class1:*/
+class Class1<T> {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+}
+
+/*!omit.class: Class2:needsArgs*/
+/*omit.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  dynamic cls1 = new Class1<int>();
+  print('${cls1.runtimeType}');
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
new file mode 100644
index 0000000..edf0fb3
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
@@ -0,0 +1,37 @@
+// 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.
+
+/*!omit.class: Class1:*/
+/*omit.class: Class1:*/
+class Class1 {
+  /*kernel.element: Class1.:needsSignature*/
+  /*!kernel.element: Class1.:*/
+  Class1();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*!kernel.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  /*!kernel.element: Class2.:*/
+  Class2();
+}
+
+/*!omit.class: Class3:needsArgs*/
+/*omit.class: Class3:*/
+class Class3<T> implements Class1 {
+  /*kernel.element: Class3.:needsSignature*/
+  /*!kernel.element: Class3.:*/
+  Class3();
+}
+
+/*kernel.element: main:needsSignature*/
+/*!kernel.element: main:*/
+main() {
+  Class1 cls1 = new Class1();
+  print(cls1.runtimeType.toString());
+  new Class2<int>();
+  Class1 cls3 = new Class3<int>();
+  print(cls3.runtimeType.toString());
+}
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index a199849..cd7fab0 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -57,9 +57,13 @@
 
 main() {
   runTest() async {
-    CompilationResult result = await runCompiler(
-        memorySourceFiles: {'main.dart': code},
-        options: [Flags.disableRtiOptimization, Flags.disableInlining]);
+    CompilationResult result = await runCompiler(memorySourceFiles: {
+      'main.dart': code
+    }, options: [
+      Flags.noPreviewDart2,
+      Flags.disableRtiOptimization,
+      Flags.disableInlining
+    ]);
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
diff --git a/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart b/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart
index 7b56dde..faa845a 100644
--- a/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart
+++ b/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart
@@ -5,12 +5,12 @@
 import 'package:expect/expect.dart';
 import 'package:meta/dart2js.dart';
 
-/*class: C:checks=[],instance,typeArgument*/
+/*class: C:checkedInstance,checks=[],instance,typeArgument*/
 class C {
   call(int i) {}
 }
 
-/*class: D:checks=[],instance,typeArgument*/
+/*class: D:checkedInstance,checks=[],instance,typeArgument*/
 class D {
   call(double i) {}
 }
diff --git a/tests/compiler/dart2js/rti/emission/list.dart b/tests/compiler/dart2js/rti/emission/list.dart
index 5be9f09..997bd49 100644
--- a/tests/compiler/dart2js/rti/emission/list.dart
+++ b/tests/compiler/dart2js/rti/emission/list.dart
@@ -9,10 +9,12 @@
 
 /*class: global#Iterable:checkedInstance*/
 
-/*class: A:checkedTypeArgument,checks=[],typeArgument*/
+/*kernel.class: A:checkedTypeArgument,checks=[],typeArgument*/
+/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
 class A {}
 
-/*class: B:checks=[],typeArgument*/
+/*kernel.class: B:checks=[],typeArgument*/
+/*strong.class: B:checkedInstance,checks=[],typeArgument*/
 class B {}
 
 @noInline
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart
new file mode 100644
index 0000000..da4456d
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  /*checks=[],functionType,instance*/
+  T id<T>(T t) => t;
+  int Function(int) x = id;
+  print("${x.runtimeType}");
+}
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2_strong.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2_strong.dart
new file mode 100644
index 0000000..2847c31
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2_strong.dart
@@ -0,0 +1,10 @@
+// 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.
+
+T id<T>(T t) => t;
+
+main() {
+  int Function(int) x = id;
+  print("${x.runtimeType}");
+}
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3_strong.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3_strong.dart
new file mode 100644
index 0000000..df259f2
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3_strong.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*class: Class:checks=[],instance*/
+class Class {
+  T id<T>(T t) => t;
+}
+
+main() {
+  int Function(int) x = new Class().id;
+  print("${x.runtimeType}");
+}
diff --git a/tests/compiler/dart2js/rti/rti_need_test_helper.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
index 3e809b1..1145266 100644
--- a/tests/compiler/dart2js/rti/rti_need_test_helper.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
@@ -34,6 +34,9 @@
     await checkTests(dataDir, computeKernelRtiMemberNeed,
         computeClassDataFromKernel: computeKernelRtiClassNeed,
         options: [],
+        skipForKernel: [
+          'runtime_type_closure_equals2.dart',
+        ],
         skipForStrong: [
           'map_literal_checked.dart',
           // TODO(johnniwinther): Optimize local function type signature need.
diff --git a/tests/compiler/dart2js/rti/type_representation_test.dart b/tests/compiler/dart2js/rti/type_representation_test.dart
index ffb6fbd..a4a6f9e 100644
--- a/tests/compiler/dart2js/rti/type_representation_test.dart
+++ b/tests/compiler/dart2js/rti/type_representation_test.dart
@@ -67,7 +67,7 @@
 ''';
   CompilationResult result = await runCompiler(
       memorySourceFiles: {'main.dart': source},
-      options: strongMode ? [Flags.strongMode] : []);
+      options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]);
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
   JavaScriptBackend backend = compiler.backend;
diff --git a/tests/compiler/dart2js/sourcemaps/pub_build_validity_test.dart b/tests/compiler/dart2js/sourcemaps/pub_build_validity_test.dart
deleted file mode 100644
index 6783b33..0000000
--- a/tests/compiler/dart2js/sourcemaps/pub_build_validity_test.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'helpers/source_map_validator_helper.dart';
-
-void main() {
-  asyncTest(() async {
-    Directory tmpDir = await createTempDir();
-    try {
-      Directory sunflowerDir = new Directory.fromUri(
-          Platform.script.resolve('../../../../third_party/sunflower'));
-
-      print("Copying '${sunflowerDir.path}' to '${tmpDir.path}'.");
-      copyDirectory(sunflowerDir, tmpDir);
-      String ext = Platform.isWindows ? '.bat' : '';
-      String command = path.fromUri(Uri
-          .parse(Platform.resolvedExecutable)
-          .resolve('dart-sdk/bin/pub${ext}'));
-      String file = path.join(tmpDir.path, 'build/web/sunflower.dart.js');
-
-      // sunflower/pubspec.yaml only depends on package:browser for Dartium, we
-      // override the file to remove this dependency and make pub-get --offline
-      // trivially succeed.
-      print("Overriding '${tmpDir.path}/pubspec.yaml'.");
-      new File(path.join(tmpDir.path, "pubspec.yaml"))
-          .writeAsStringSync(_newPubspec);
-
-      print("Running '$command get --offline' from '${tmpDir}'.");
-      ProcessResult getResult = await Process.run(command, ['get', '--offline'],
-          workingDirectory: tmpDir.path);
-      print(getResult.stdout);
-      print(getResult.stderr);
-      Expect.equals(0, getResult.exitCode, 'Unexpected exitCode from pub get');
-
-      print("Running '$command build --mode=debug' from '${tmpDir}'.");
-      ProcessResult buildResult = await Process.run(
-          command, ['build', '--mode=debug'],
-          workingDirectory: tmpDir.path);
-      print(buildResult.stdout);
-      print(buildResult.stderr);
-      Expect.equals(0, buildResult.exitCode, 'Unexpected exitCode from pub');
-      validateSourceMap(new Uri.file(file, windows: Platform.isWindows));
-      print("Deleting '${tmpDir.path}'.");
-    } finally {
-      tmpDir.deleteSync(recursive: true);
-    }
-  });
-}
-
-String _newPubspec = '''
-# Generated by test
-name: sunflower
-version: 0.0.0
-''';
diff --git a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
index 4eaf294..6d62f1f3 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
@@ -131,7 +131,7 @@
 }
 
 const Map<String, List<String>> TEST_CONFIGURATIONS = const {
-  'kernel': const [],
+  'kernel': const [Flags.noPreviewDart2],
 };
 
 final Map<String, Uri> TEST_FILES = _computeTestFiles();
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index bf6a661..0328d9e 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -70,9 +70,6 @@
 mirrors_used_warning_test/minif: Crash
 mirrors_used_warning_test/none: Crash
 
-[ $compiler == dart2js && !$checked ]
-closure_signature_unneeded_test: RuntimeError # Too eager signature generation.
-
 [ $compiler == dart2js && $csp ]
 deferred_custom_loader_test: SkipByDesign # Issue 25683
 deferred_fail_and_retry_test: SkipByDesign # Uses eval to simulate failed loading.
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart
new file mode 100644
index 0000000..8f9836f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  local1a() {}
+
+  local1b() {}
+
+  local2(int i, String s) => i;
+
+  Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+  Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart
new file mode 100644
index 0000000..56afe25
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  T local1a<T>() => null;
+
+  T local1b<T>() => null;
+
+  T local2<T>(T t, String s) => t;
+
+  Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+  Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart
new file mode 100644
index 0000000..673211e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+String method() => null;
+
+class Class1<T> {
+  Class1();
+
+  method() {
+    T local1a() => null;
+
+    T local1b() => null;
+
+    T local2(T t, String s) => t;
+
+    Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+    Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+    Expect.isFalse(local1a.runtimeType == method.runtimeType);
+  }
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  new Class1<int>().method();
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart
new file mode 100644
index 0000000..73b72b3
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1<T> {
+  Class1();
+
+  method1a() => null;
+
+  method1b() => null;
+
+  method2(t, s) => t;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart
new file mode 100644
index 0000000..ecad991
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1<T> {
+  Class1();
+
+  T method1a() => null;
+
+  T method1b() => null;
+
+  T method2(T t, String s) => t;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart
new file mode 100644
index 0000000..23641eb
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+method1a() => null;
+
+method1b() => null;
+
+method2(t, s) => t;
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
+  Expect.isFalse(method1a.runtimeType == method2.runtimeType);
+  new Class<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart
new file mode 100644
index 0000000..129dcca
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+T method1a<T>() => null;
+
+T method1b<T>() => null;
+
+T method2<T>(T t, String s) => t;
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
+  Expect.isFalse(method1a.runtimeType == method2.runtimeType);
+  new Class<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart
new file mode 100644
index 0000000..7a1142d
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1<S> {
+  Class1();
+
+  T method1a<T>() => null;
+
+  T method1b<T>() => null;
+
+  T method2<T>(T t, String s) => t;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
new file mode 100644
index 0000000..2e5a44f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
@@ -0,0 +1,25 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  local1() {}
+  local2(int i) => i;
+
+  var toString = '${local1.runtimeType}';
+  if ('$Object' == 'Object') {
+    // `true` if non-minified.
+    Expect.equals("main_local1", toString);
+  }
+  print(toString);
+  local2(0);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
new file mode 100644
index 0000000..dddd5e2
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
@@ -0,0 +1,25 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  local1<T>() {}
+  local2<T>(t) => t;
+
+  var toString = '${local1.runtimeType}';
+  if ('$Object' == 'Object') {
+    // `true` if non-minified.
+    Expect.equals("main_local1", toString);
+  }
+  print(toString);
+  local2(0);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart
new file mode 100644
index 0000000..1cf0e0e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1<T> {
+  Class1();
+
+  T method() => null;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1<int> cls1 = new Class1<int>();
+  Expect.equals("() => dynamic", cls1.method.runtimeType.toString());
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart
new file mode 100644
index 0000000..c95cf29
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1 {
+  Class1();
+
+  T method<T>() => null;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1 cls1 = new Class1();
+  Expect.equals("<T1>() => T1", cls1.method.runtimeType.toString());
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart
new file mode 100644
index 0000000..cd87fa4
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+method1() {}
+
+method2(int i) => i;
+
+main() {
+  Expect.equals("() => dynamic", '${method1.runtimeType}');
+  method2(0);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart
new file mode 100644
index 0000000..899a217
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+method1<T>() {}
+
+method2<T>(t) => t;
+
+main() {
+  Expect.equals("<T1>() => dynamic", '${method1.runtimeType}');
+  method2(0);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart
new file mode 100644
index 0000000..6ef574d
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return runtimeType == other.runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart
new file mode 100644
index 0000000..0883581
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return other.runtimeType == runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart
new file mode 100644
index 0000000..c9911a5
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return runtimeType == other?.runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart
new file mode 100644
index 0000000..bf77141
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return other?.runtimeType == runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
new file mode 100644
index 0000000..d8b456c
--- /dev/null
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+main() {
+  T id<T>(T t) => t;
+  int Function(int) x = id;
+  var toString = "${x.runtimeType}";
+  if ('$Object' == 'Object') {
+    // `true` if non-minified.
+    // The signature of `id` is not otherwise needed so the instantiation
+    // wrapper doesn't have a function type.
+    Expect.equals("Instantiation1", toString);
+  }
+  print(toString);
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart
new file mode 100644
index 0000000..c09441f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m(x);
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    print("nsm call: ${i.memberName}");
+    if (i.isGetter) {
+      throw (" - tearoff");
+    }
+    if (i.isMethod) {
+      print(" - method invocation");
+      return 42;
+    }
+    return 123;
+  }
+}
+
+void main() {
+  A x = new B();
+  var tearoff = x.m;
+  Expect.equals(42, tearoff(3));
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart
new file mode 100644
index 0000000..62b6c60
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m(x);
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    print("nsm call: ${i.memberName}");
+    if (i.isGetter) {
+      throw (" - tearoff");
+    }
+    if (i.isMethod) {
+      print(" - method invocation");
+      return 42;
+    }
+    return 123;
+  }
+}
+
+void main() {
+  A x = new B();
+  Expect.equals(42, x.m(3));
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart
new file mode 100644
index 0000000..e42f388
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m(x);
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    return i.memberName;
+  }
+}
+
+void main() {
+  A x = new B();
+  Expect.equals(#m, x.m(3));
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart
new file mode 100644
index 0000000..5353d7b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m(x, y);
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    return '${i.positionalArguments[0]},${i.positionalArguments[1]}';
+  }
+}
+
+void main() {
+  A x = new B();
+  Expect.equals('3,4', x.m(3, 4));
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart
new file mode 100644
index 0000000..1ec9499
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m({a, b});
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    return '${i.namedArguments[#a]},${i.namedArguments[#b]}';
+  }
+}
+
+void main() {
+  A x = new B();
+  Expect.equals('3,4', x.m(a: 3, b: 4));
+  Expect.equals('3,4', x.m(b: 4, a: 3));
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart
new file mode 100644
index 0000000..94f1531
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m<X, Y>();
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    return [i.typeArguments[0], i.typeArguments[1]];
+  }
+}
+
+void main() {
+  A x = new B();
+  Expect.listEquals([int, String], x.m<int, String>());
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart
new file mode 100644
index 0000000..0018b85
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart
@@ -0,0 +1,28 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m();
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    return 42;
+  }
+}
+
+class C extends B {
+  noSuchMethod(Invocation i) => 87;
+
+  method() => super.m();
+}
+
+void main() {
+  C x = new C();
+  Expect.equals(87, x.method());
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart
new file mode 100644
index 0000000..7f3925f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  get m;
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    return i.isGetter ? 42 : 87;
+  }
+}
+
+void main() {
+  A x = new B();
+  Expect.equals(42, x.m);
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart
new file mode 100644
index 0000000..a98447b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  set m(_);
+}
+
+class B implements A {
+  noSuchMethod(Invocation i) {
+    return i.isSetter ? i.positionalArguments[0] : 87;
+  }
+}
+
+void main() {
+  A x = new B();
+  Expect.equals(42, x.m = 42);
+}
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart
new file mode 100644
index 0000000..25ccc7e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+abstract class A {
+  m();
+}
+
+abstract class B implements A {
+  noSuchMethod(Invocation i) {
+    return 42;
+  }
+}
+
+class C extends B {}
+
+class D extends C {
+  noSuchMethod(Invocation i) => 87;
+
+  method() => super.m();
+}
+
+void main() {
+  D x = new D();
+  Expect.equals(87, x.method());
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart
new file mode 100644
index 0000000..5defc5e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  local1a() {}
+
+  local1b() {}
+
+  local2(int i, String s) => i;
+
+  Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+  Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart
new file mode 100644
index 0000000..86fe4b2
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  T local1a<T>() => null;
+
+  T local1b<T>() => null;
+
+  T local2<T>(T t, String s) => t;
+
+  Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+  Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+  new Class();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart
new file mode 100644
index 0000000..ffcd03f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+String method() => null;
+
+class Class1<T> {
+  Class1();
+
+  method() {
+    T local1a() => null;
+
+    T local1b() => null;
+
+    T local2(T t, String s) => t;
+
+    Expect.isTrue(local1a.runtimeType == local1b.runtimeType);
+    Expect.isFalse(local1a.runtimeType == local2.runtimeType);
+    Expect.isFalse(local1a.runtimeType == method.runtimeType);
+  }
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  new Class1<int>().method();
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart
new file mode 100644
index 0000000..967b5f6
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1<T> {
+  Class1();
+
+  method1a() => null;
+
+  method1b() => null;
+
+  method2(t, s) => t;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart
new file mode 100644
index 0000000..1b19f8d
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1<T> {
+  Class1();
+
+  T method1a() => null;
+
+  T method1b() => null;
+
+  T method2(T t, String s) => t;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart
new file mode 100644
index 0000000..5090f04
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+method1a() => null;
+
+method1b() => null;
+
+method2(t, s) => t;
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
+  Expect.isFalse(method1a.runtimeType == method2.runtimeType);
+  new Class<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart
new file mode 100644
index 0000000..73348c9
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+T method1a<T>() => null;
+
+T method1b<T>() => null;
+
+T method2<T>(T t, String s) => t;
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
+  Expect.isFalse(method1a.runtimeType == method2.runtimeType);
+  new Class<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart
new file mode 100644
index 0000000..5f03539
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1<S> {
+  Class1();
+
+  T method1a<T>() => null;
+
+  T method1b<T>() => null;
+
+  T method2<T>(T t, String s) => t;
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  var c = new Class1<int>();
+
+  Expect.isTrue(c.method1a.runtimeType == c.method1b.runtimeType);
+  Expect.isFalse(c.method1a.runtimeType == c.method2.runtimeType);
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart
new file mode 100644
index 0000000..f625055
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return runtimeType == other.runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart
new file mode 100644
index 0000000..ce93178
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return other.runtimeType == runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart
new file mode 100644
index 0000000..f412f86
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return runtimeType == other?.runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart
new file mode 100644
index 0000000..4a1c8d9
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return other?.runtimeType == runtimeType;
+  }
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> implements Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+main() {
+  Class1a<int> cls1a = new Class1a<int>();
+  Class1a<int> cls1b1 = new Class1b<int>();
+  Class1a<int> cls1b2 = new Class1b<int>();
+  Class1c<int> cls1c = new Class1c<int>();
+  Class2<int> cls2 = new Class2<int>();
+  Expect.isFalse(cls1a == cls1b1);
+  Expect.isTrue(cls1b1 == cls1b2);
+  Expect.isFalse(cls1a == cls1c);
+  Expect.isFalse(cls1a == cls2);
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart
new file mode 100644
index 0000000..cd6926e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart
@@ -0,0 +1,34 @@
+// 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:expect/expect.dart';
+
+class Class1 {
+  Class1();
+}
+
+class Class2<T> implements Class1 {
+  Class2();
+}
+
+main() {
+  Class1 cls1 = new Class1();
+  Class1 cls2a = new Class2<int>();
+  Class1 cls2b = new Class2<int>();
+  Class1 cls2c = new Class2<String>();
+  var r1 = cls1.runtimeType;
+  var r2a = cls2a.runtimeType;
+  var r2b = cls2b.runtimeType;
+  var r2c = cls2c.runtimeType;
+  Expect.equals(r1, r1);
+  Expect.notEquals(r1, r2a);
+  Expect.notEquals(r1, r2b);
+  Expect.notEquals(r1, r2c);
+  Expect.equals(r2a, r2a);
+  Expect.equals(r2a, r2b);
+  Expect.notEquals(r2a, r2c);
+  Expect.equals(r2b, r2b);
+  Expect.notEquals(r2b, r2c);
+  Expect.equals(r2c, r2c);
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart b/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
new file mode 100644
index 0000000..8c6cbb4
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
+
+import 'package:expect/expect.dart';
+
+class Class<T> {
+  Class();
+}
+
+main() {
+  Expect.equals((Class).toString(), new Class().runtimeType.toString());
+  Expect.equals((Class).toString(), new Class<int>().runtimeType.toString());
+}
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 8200941..d09fc30 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -16,6 +16,7 @@
 bigint_from_test: CompileTimeError # Issue 32585
 compare_to2_test: CompileTimeError # invalid test
 int_parse_radix_bad_handler_test: MissingCompileTimeError
+int_try_parse_test: CompileTimeError # Issue 32585
 iterable_element_at_test/static: Pass
 num_sign_test: Crash, Pass # Issue 31768
 
@@ -93,6 +94,7 @@
 
 [ !$strong ]
 cast_test: SkipByDesign # Uses generic method parameters.
+regress_33166_test: SkipByDesign # Not a Dart 1 test
 
 [ $arch == simarmv5te && ($runtime == dart_precompiled || $runtime == vm) ]
 int_parse_radix_test/*: Pass, Slow
@@ -213,7 +215,6 @@
 cast_test: RuntimeError
 error_stack_trace1_test: RuntimeError
 growable_list_test: RuntimeError
-int_parse_radix_test/02: RuntimeError
 integer_to_radix_string_test/01: RuntimeError
 integer_to_radix_string_test/02: RuntimeError
 integer_to_radix_string_test/none: RuntimeError
@@ -222,25 +223,17 @@
 list_concurrent_modify_test: RuntimeError
 main_test: RuntimeError
 nan_infinity_test/01: RuntimeError
-string_split_test/checkedstore: RuntimeError
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 uri_base_test: Crash # RangeError (index): Invalid value: Valid value range is empty: 0
 
 [ $compiler == dart2js && $fasta ]
-int_from_environment_int64_test: RuntimeError # WontFix: Int not precisely representable in JS
-int_parse_radix_int64_test/01: RuntimeError # WontFix: Int not precisely representable in JS
 int_parse_radix_int64_test/02: RuntimeError # WontFix: Int not precisely representable in JS
-int_parse_radix_int64_test/none: RuntimeError # WontFix: Int not precisely representable in JS
 int_parse_radix_test/01: RuntimeError
-int_parse_radix_test/badTypes: RuntimeError # Issue 33351
-int_parse_radix_test/none: RuntimeError # Issue 33351
-int_try_parse_int64_test: RuntimeError # WontFix: Int not precisely representable in JS
 
 [ $compiler == dart2js && $fasta && $host_checked && $strong ]
 cast_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 growable_list_test: RuntimeError # Concurrent modifications test always runs
-int_parse_radix_test/02: RuntimeError
 integer_to_radix_string_test/01: RuntimeError
 integer_to_radix_string_test/02: RuntimeError
 integer_to_radix_string_test/none: RuntimeError
@@ -251,7 +244,6 @@
 main_test: RuntimeError
 nan_infinity_test/01: RuntimeError
 regexp/pcre_test: RuntimeError
-string_split_test/checkedstore: RuntimeError # Issue 30548: does not check stores into List<String>
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 uri_base_test: RuntimeError
 
@@ -261,7 +253,6 @@
 error_stack_trace1_test: RuntimeError # Issue 12399
 growable_list_test: RuntimeError # Concurrent modifications test always runs
 hash_set_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(_CustomHashSet.#x), local(_CustomHashSet.#)) for j:closure_call(_CustomHashSet__CustomHashSet_closure.call).
-int_parse_radix_test/02: RuntimeError
 integer_to_radix_string_test/01: RuntimeError
 integer_to_radix_string_test/02: RuntimeError
 integer_to_radix_string_test/none: RuntimeError
@@ -273,7 +264,6 @@
 nan_infinity_test/01: RuntimeError
 nsm_invocation_test: RuntimeError # Symbols don't match due to minifiaction.
 regexp/pcre_test: RuntimeError
-string_split_test/checkedstore: RuntimeError # Issue 30548: does not check stores into List<String>
 symbol_operator_test/03: RuntimeError
 symbol_operator_test/none: RuntimeError
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
@@ -292,6 +282,7 @@
 [ $compiler == dartdevc && $runtime != none ]
 bigint_from_test: CompileTimeError # Issue 32585
 compare_to2_test: CompileTimeError # invalid test
+int_try_parse_test: CompileTimeError # Issue 32585
 symbol_operator_test: RuntimeError # Issue 29921
 
 [ $compiler != dartdevc && $compiler != dartdevk && $checked && !$strong ]
diff --git a/tests/corelib_2/int_try_parse_test.dart b/tests/corelib_2/int_try_parse_test.dart
index 3d9d294..282cee52 100644
--- a/tests/corelib_2/int_try_parse_test.dart
+++ b/tests/corelib_2/int_try_parse_test.dart
@@ -99,8 +99,8 @@
   Expect.equals(1, int.tryParse("\n1\n", radix: 2));
   Expect.equals(1, int.tryParse("+1", radix: 2));
 
-  void testFails(String source, int radix) {
-    Expect.isNull(int.tryParse(source, radix: radix));
+  void testFails(String source, int radix, [String message]) {
+    Expect.isNull(int.tryParse(source, radix: radix), message);
   }
 
   for (int i = 2; i < 36; i++) {
@@ -117,6 +117,7 @@
     // At radix 34 and above, "x" is a valid digit.
     testFails("0x10", i);
   }
+
   int digitX = 33;
   Expect.equals(((digitX * 34) + 1) * 34, int.tryParse("0x10", radix: 34));
   Expect.equals(((digitX * 35) + 1) * 35, int.tryParse("0x10", radix: 35));
@@ -126,4 +127,22 @@
   Expect.throwsArgumentError(() => int.tryParse("0", radix: 0));
   Expect.throwsArgumentError(() => int.tryParse("0", radix: -1));
   Expect.throwsArgumentError(() => int.tryParse("0", radix: 37));
+
+  // Regression test for http://dartbug.com/32858
+  Expect.equals(
+      -0x8000000000000000, int.tryParse("-0x8000000000000000"), "-minint");
+
+  // Tests run only with 64-bit integers.
+  if (0x8000000000000000 < 0) {
+    // `int` is 64-bit signed integers.
+    Expect.equals(
+        -0x8000000000000000, int.tryParse("0x8000000000000000"), "0xUnsigned");
+    Expect.equals(-1, int.tryParse("0xFFFFFFFFFFFFFFFF"), "0xUnsigned2");
+
+    Expect.equals(
+        0x8000000000000000 - 1, int.tryParse("0x7FFFFFFFFFFFFFFF"), "maxint");
+    testFails("8000000000000000", 16, "2^63 radix: 16");
+    testFails("FFFFFFFFFFFFFFFF", 16, "maxuint64 radix: 16");
+    testFails("-0xC000000000000000", null, "signed uint64");
+  }
 }
diff --git a/tests/corelib_2/regress_33166_test.dart b/tests/corelib_2/regress_33166_test.dart
index 03f0faf..b97bfd6 100644
--- a/tests/corelib_2/regress_33166_test.dart
+++ b/tests/corelib_2/regress_33166_test.dart
@@ -7,6 +7,26 @@
 
 // Regression test for https://github.com/dart-lang/sdk/issues/33166
 void main() async {
-  var stream = new Stream.fromIterable([1, 2, 3]);
-  Expect.equals(await stream.cast<int>().drain().then((_) => 'Done'), 'Done');
+  // Check that a `null` data handler (like the one passe by `drain`)
+  // doesn't crash.
+  {
+    var stream = new Stream<Object>.fromIterable([1, 2, 3]);
+    Expect.equals(await stream.cast<int>().drain().then((_) => 'Done'), 'Done');
+  }
+
+  // Check that type errors go into stream error channel.
+  {
+    var stream = new Stream<Object>.fromIterable([1, 2, 3]);
+    var errors = [];
+    var done = new Completer();
+    var subscription = stream.cast<String>().listen((value) {
+      Expect.fail("Unexpected value: $value");
+    }, onError: (e, s) {
+      errors.add(e);
+    }, onDone: () {
+      done.complete(null);
+    });
+    await done.future;
+    Expect.equals(3, errors.length);
+  }
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 647ae2e..0003482 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -17,7 +17,6 @@
 js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue #25759
 localstorage_test: StaticWarning
 mutationobserver_test: StaticWarning
-queryall_test: Fail
 track_element_constructor_test: StaticWarning
 transferables_test: StaticWarning
 typed_arrays_range_checks_test: StaticWarning
diff --git a/tests/language/language.status b/tests/language/language.status
index 6032632..ac2747f 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -475,10 +475,6 @@
 
 [ $runtime == dart_precompiled || $runtime == vm ]
 arithmetic_test: CompileTimeError # Large integer literal
-async_await_test: RuntimeError # sync-async is on by default
-asyncstar_throw_in_catch_test: RuntimeError # sync-async is on by default
-await_nonfuture_test: RuntimeError # sync-async is on by default
-await_not_started_immediately_test: RuntimeError # sync-async is on by default
 bit_operations_test: CompileTimeError # Large integer literal
 deopt_inlined_function_lazy_test: CompileTimeError # Large integer literal
 guess_cid_test: CompileTimeError # Large integer literal
diff --git a/tests/language_2/assert_message_test.dart b/tests/language_2/assert_message_test.dart
index 5b7debb..e35f793 100644
--- a/tests/language_2/assert_message_test.dart
+++ b/tests/language_2/assert_message_test.dart
@@ -78,7 +78,7 @@
   assert(await true, await 2);
 
   // Successful asserts won't await/evaluate message.
-  void unreachable() => throw "unreachable";
+  Future unreachable() => throw "unreachable";
   assert(await true, await unreachable());
 
   try {
diff --git a/tests/language_2/async_and_or_test.dart b/tests/language_2/async_and_or_test.dart
index 6d1e858..6241a70 100644
--- a/tests/language_2/async_and_or_test.dart
+++ b/tests/language_2/async_and_or_test.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+import "dart:async";
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
@@ -34,7 +35,7 @@
   return x;
 }
 
-testEvaluation(void fn()) async {
+testEvaluation(Future<void> fn()) async {
   trace = "";
   await fn();
 }
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index ba20d61..227ceb6 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -45,6 +45,26 @@
 initializer_super_last_test/cc30: MissingCompileTimeError
 initializer_super_last_test/cc31: MissingCompileTimeError
 initializer_super_last_test/cc32: MissingCompileTimeError
+void/return_future_future_or_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_future_or_void_sync_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_future_or_void_sync_error0_test: MissingCompileTimeError
+void/return_future_or_future_or_void_sync_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_sync_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_sync_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_sync_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_sync_error3_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_void_async_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error3_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error4_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_sync_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_sync_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_sync_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 
 [ $compiler != app_jitk && $compiler != dartk && $compiler != dartkp && $mode == debug && $runtime == vm ]
 built_in_identifier_type_annotation_test/set: Crash # Not supported by legacy VM front-end.
@@ -235,6 +255,7 @@
 vm/type_vm_test/25: MissingCompileTimeError
 vm/type_vm_test/26: MissingCompileTimeError
 vm/type_vm_test/27: MissingCompileTimeError
+void/return_future_future_or_void_sync_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 void_block_return_test/00: MissingCompileTimeError # Requires strong mode
 void_type_callbacks_test: Skip # Requires strong mode
 void_type_function_types_test: Skip # Requires strong mode
@@ -270,6 +291,25 @@
 implicit_creation/implicit_new_prefix_constructor_generic_named_test: Fail # No support for implicit creation.
 implicit_creation/implicit_new_prefix_constructor_named_test: Fail # No support for implicit creation.
 setter_override2_test/02: MissingCompileTimeError # Issue 14736
+void/return_future_future_or_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_future_or_void_async_error1_test/none: MissingStaticWarning # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_future_or_void_sync_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_future_or_void_sync_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_future_or_void_sync_error2_test/none: MissingStaticWarning # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_sync_error3_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_or_void_sync_error4_test/none: MissingStaticWarning # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_future_void_async_test: StaticWarning # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error3_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_error4_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_async_test: StaticWarning # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_sync_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_sync_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
+void/return_void_sync_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 
 [ $compiler == app_jit || $compiler == none ]
 library_env_test/has_no_mirror_support: RuntimeError, OK
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index b22bdfb..a8deafd 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -142,6 +142,9 @@
 vm/lazy_deopt_with_exception_test: Pass
 vm/reflect_core_vm_test: CompileTimeError
 vm/regress_27201_test: SkipByDesign # Loads bad library, so will always crash.
+vm/regress_33469_test/01: Crash # http://dartbug.com/33481
+vm/regress_33469_test/02: Crash # http://dartbug.com/33481
+vm/regress_33469_test/03: MissingCompileTimeError # http://dartbug.com/33481
 void_type_override_test/00: MissingCompileTimeError
 void_type_override_test/00b: MissingCompileTimeError
 void_type_override_test/01: MissingCompileTimeError
@@ -579,7 +582,6 @@
 static_getter_no_setter3_test/01: MissingCompileTimeError
 static_initializer_type_error_test: MissingCompileTimeError
 static_setter_get_test/01: MissingCompileTimeError
-string_interpolate_test: StaticWarning
 string_test/01: MissingCompileTimeError
 string_unicode1_negative_test: CompileTimeError
 string_unicode2_negative_test: CompileTimeError
@@ -1023,7 +1025,6 @@
 static_getter_no_setter3_test/01: MissingCompileTimeError
 static_initializer_type_error_test: MissingCompileTimeError
 static_setter_get_test/01: MissingCompileTimeError
-string_interpolate_test: StaticWarning
 string_test/01: MissingCompileTimeError
 string_unicode1_negative_test: CompileTimeError
 string_unicode2_negative_test: CompileTimeError
@@ -1162,7 +1163,6 @@
 regress_30339_test: CompileTimeError
 reify_typevar_static_test/00: MissingCompileTimeError # Issue 28823
 setter_override2_test/02: MissingCompileTimeError # Issue 14736
-string_interpolate_test: CompileTimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 string_unicode1_negative_test: CompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index fae79c4..ef32963 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -760,8 +760,6 @@
 no_main_test/01: CompileTimeError
 no_such_method_mock_test: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
@@ -796,17 +794,11 @@
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
 stacktrace_test: RuntimeError # Issue 12698
-string_interpolate_test: CompileTimeError
 string_interpolation_and_buffer_test: RuntimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
+super_call4_test/01: MissingCompileTimeError
 super_operator_index6_test: CompileTimeError
 super_operator_index7_test: CompileTimeError
 super_operator_index8_test: CompileTimeError
@@ -840,7 +832,6 @@
 type_variable_promotion_test: RuntimeError
 
 [ $compiler == dart2js && $fasta ]
-arithmetic_int64_test: RuntimeError # WontFix: Int not precisely representable in JS
 call_method_as_cast_test/06: RuntimeError
 call_method_implicit_tear_off_implements_function_test/05: RuntimeError
 call_method_implicit_tear_off_implements_function_test/06: RuntimeError
@@ -856,7 +847,6 @@
 function_propagation_test: RuntimeError
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
 instantiate_tearoff_of_call_test: RuntimeError
-mint_compares_test: RuntimeError # WontFix: Int not precisely representable in JS
 mixin_type_parameter_inference_error_test/none: CompileTimeError
 mixin_type_parameter_inference_previous_mixin_test/01: CompileTimeError
 mixin_type_parameter_inference_previous_mixin_test/02: CompileTimeError
@@ -1209,8 +1199,6 @@
 no_main_test/01: CompileTimeError
 no_such_method_mock_test: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
@@ -1263,17 +1251,11 @@
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
 stacktrace_test: RuntimeError # Issue 12698
-string_interpolate_test: CompileTimeError
 string_interpolation_and_buffer_test: RuntimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
+super_call4_test/01: MissingCompileTimeError
 super_operator_index6_test: CompileTimeError
 super_operator_index7_test: CompileTimeError
 super_operator_index8_test: CompileTimeError
@@ -1725,8 +1707,6 @@
 no_such_method_native_test: RuntimeError
 no_such_method_test: RuntimeError
 nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_test/05: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_test/06: RuntimeError
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
@@ -1779,17 +1759,11 @@
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
 stacktrace_test: RuntimeError # Issue 12698
-string_interpolate_test: CompileTimeError
 string_interpolation_and_buffer_test: RuntimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
+super_call4_test/01: MissingCompileTimeError
 super_operator_index6_test: CompileTimeError
 super_operator_index7_test: CompileTimeError
 super_operator_index8_test: CompileTimeError
@@ -1876,7 +1850,6 @@
 const_constructor3_test/04: MissingCompileTimeError # OK - Subtype check uses JS number semantics.
 covariant_subtyping_test: Crash
 ct_const_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_partial_instantiation_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && !$strong ]
 *: SkipByDesign
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 79b883b..dccaa3a 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -158,18 +158,13 @@
 reify_typevar_static_test/00: MissingCompileTimeError # Issue 29920
 setter_override2_test/02: MissingCompileTimeError # Issue 14736
 stacktrace_test: RuntimeError # Issue 29920
-string_interpolate_test: CompileTimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
-super_no_such_method1_test: RuntimeError
-super_no_such_method2_test: RuntimeError
-super_no_such_method3_test: RuntimeError
-super_no_such_method4_test: RuntimeError
-super_operator_index5_test: RuntimeError
-super_operator_index7_test: RuntimeError
-super_operator_index8_test: RuntimeError
+super_operator_index5_test: RuntimeError # 33470
+super_operator_index7_test: RuntimeError # 33470
+super_operator_index8_test: RuntimeError # 33470
 switch_case_test/none: CompileTimeError
 syntax_test/60: MissingCompileTimeError
 syntax_test/61: MissingCompileTimeError
@@ -554,19 +549,13 @@
 setter_override_test/01: MissingCompileTimeError
 setter_override_test/02: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
-string_interpolate_test: CompileTimeError # Issue 31533
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
+super_call4_test/01: MissingCompileTimeError
+super_operator_index6_test: CompileTimeError # Issue 33498
+super_operator_index7_test: CompileTimeError # Issue 33498
+super_operator_index8_test: CompileTimeError # Issue 33498
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
 switch_case_test/00: MissingCompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index a24b3c2..cca8c17 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -146,20 +146,10 @@
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
 regress_30339_test: CompileTimeError
-string_interpolate_test: CompileTimeError
 string_interpolation_and_buffer_test: RuntimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
 super_test: RuntimeError
 type_alias_equality_test/02: RuntimeError
 type_alias_equality_test/03: RuntimeError
@@ -176,7 +166,6 @@
 type_promotion_functions_test/14: CompileTimeError
 type_promotion_functions_test/none: CompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError
-vm/optimized_guarded_field_isolates_test: RuntimeError
 vm/type_cast_vm_test: RuntimeError
 
 [ $compiler == dartkp ]
@@ -221,6 +210,10 @@
 implicit_creation/implicit_const_not_default_values_test/e5: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e7: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e8: MissingCompileTimeError
+vm/regress_33469_test/01: MissingCompileTimeError
+vm/regress_33469_test/02: MissingCompileTimeError
+vm/regress_33469_test/03: MissingCompileTimeError
+vm/regress_33469_test/04: MissingCompileTimeError
 
 [ $fasta ]
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32014.
@@ -630,6 +623,9 @@
 mixin_supertype_subclass_test/02: MissingCompileTimeError
 mixin_supertype_subclass_test/05: MissingCompileTimeError
 
+[ $compiler != dart2js && $fasta && $strong ]
+super_call4_test/01: MissingCompileTimeError
+
 [ $compiler == dartk && $mode == debug && $hot_reload ]
 async_star_test/01: Crash
 async_star_test/05: Crash
@@ -657,11 +653,6 @@
 vm/type_vm_test/35: MissingRuntimeError
 vm/type_vm_test/36: MissingRuntimeError
 
-[ $compiler == dartk && $runtime == vm ]
-type_alias_equality_test/02: RuntimeError # Issue 31359
-type_alias_equality_test/03: RuntimeError # Issue 31359
-type_alias_equality_test/04: RuntimeError # Issue 31359
-
 [ $compiler == dartk && $runtime == vm && $checked && $strong ]
 assert_initializer_test/31: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 assert_initializer_test/32: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -832,20 +823,11 @@
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_30339_test: CompileTimeError # Issue 31402 (Variable declaration)
-string_interpolate_test: CompileTimeError # Issue 31533
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
+super_call4_test/01: MissingCompileTimeError
 super_test: Fail, OK
 type_literal_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError # Issue 31537
@@ -860,7 +842,6 @@
 type_promotion_logical_and_test/01: MissingCompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError # Issue 31533
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
-vm/optimized_guarded_field_isolates_test: RuntimeError # Issue 31402 (Variable declaration)
 vm/regress_29145_test: Skip # Issue 29145
 vm/type_cast_vm_test: RuntimeError
 void_block_return_test/00: MissingCompileTimeError
@@ -873,10 +854,6 @@
 [ $compiler == dartk && $system == windows && $strong ]
 ct_const2_test: Fail
 
-[ $compiler == dartk && $hot_reload ]
-vm/causal_async_exception_stack2_test: Crash
-vm/causal_async_exception_stack_test: Crash
-
 [ $compiler == dartk && $strong ]
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
 assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
@@ -928,6 +905,7 @@
 vm/type_vm_test/36: MissingRuntimeError
 
 [ $compiler == dartkp && $runtime == dart_precompiled ]
+super_no_such_method5_test: RuntimeError # Issue 33517
 type_alias_equality_test/02: RuntimeError # Issue 31359
 type_alias_equality_test/03: RuntimeError # Issue 31359
 type_alias_equality_test/04: RuntimeError # Issue 31359
@@ -1201,20 +1179,10 @@
 setter_override_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 setter_override_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 stacktrace_demangle_ctors_test: RuntimeError
-string_interpolate_test: CompileTimeError # Issue 31533
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
 super_test: Fail, OK
 syntax_test/00: MissingCompileTimeError
 type_literal_test: RuntimeError
@@ -1232,7 +1200,6 @@
 vm/causal_async_exception_stack2_test: SkipByDesign
 vm/causal_async_exception_stack_test: SkipByDesign
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
-vm/optimized_guarded_field_isolates_test: RuntimeError
 vm/optimized_stacktrace_test: Crash
 vm/optimized_stacktrace_test: Skip # Issue 30198
 vm/reflect_core_vm_test: SkipByDesign
@@ -1406,19 +1373,12 @@
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
-string_interpolate_test: CompileTimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_no_such_method1_test: CompileTimeError
-super_no_such_method2_test: CompileTimeError
-super_no_such_method3_test: CompileTimeError
-super_no_such_method4_test: CompileTimeError
-super_no_such_method5_test: CompileTimeError
-super_operator_index5_test: CompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
+super_operator_index6_test: CompileTimeError # Issue 33498
+super_operator_index7_test: CompileTimeError # Issue 33498
+super_operator_index8_test: CompileTimeError # Issue 33498
 try_catch_test/01: MissingCompileTimeError
 type_promotion_functions_test/02: CompileTimeError
 type_promotion_functions_test/03: CompileTimeError
@@ -2280,9 +2240,18 @@
 unresolved_top_level_method_test: MissingCompileTimeError
 unresolved_top_level_var_test: MissingCompileTimeError
 
-[ !$strong && ($compiler == dartk || $compiler == dartkp) ]
+[ !$strong && ($compiler == dartk || $compiler == dartkp || $runtime == dart_precompiled || $runtime == vm) ]
 *: SkipByDesign # language_2 is only supported in strong mode.
 
+[ ($compiler == app_jitk || $compiler == dartk || $compiler == dartkp) && ($runtime == dart_precompiled || $runtime == vm) ]
+super_no_such_method4_test: RuntimeError # Issue 33517
+super_operator_index6_test: CompileTimeError # Issue 33498
+super_operator_index7_test: CompileTimeError # Issue 33498
+super_operator_index8_test: CompileTimeError # Issue 33498
+type_alias_equality_test/02: RuntimeError # Issue 31359
+type_alias_equality_test/03: RuntimeError # Issue 31359
+type_alias_equality_test/04: RuntimeError # Issue 31359
+
 [ $compiler == dartk || $compiler == dartkp ]
 generic_function_bounds_test: RuntimeError # Issue 32076
 generic_test/01: MissingCompileTimeError
diff --git a/tests/language_2/string_interpolate_test.dart b/tests/language_2/string_interpolate_test.dart
index 563a434..769ee94 100644
--- a/tests/language_2/string_interpolate_test.dart
+++ b/tests/language_2/string_interpolate_test.dart
@@ -6,13 +6,12 @@
 import "package:expect/expect.dart";
 
 class WhatchamaCallIt {
-
-  String get name => "";
-
   WhatchamaCallIt() {}
 
   String foo() {
     // Test $this and Field name is defined in subclass.
+    dynamic self = this;
+    dynamic name = self.name;
     return "$this and $name";
   }
 }
@@ -20,7 +19,7 @@
 class ThingamaBob extends WhatchamaCallIt {
   ThingamaBob(String s)
       : name = s,
-        super() {}
+        super();
   String name;
   toString() => "Hansel";
 }
@@ -56,7 +55,7 @@
   print(s);
   Expect.equals(r"eins und 1 macht zwei.", s);
 
-  var t = new ThingamaBob("Gretel");
+  dynamic t = new ThingamaBob("Gretel");
   print(t.foo());
   Expect.equals(t.foo(), "Hansel and Gretel");
 
@@ -73,8 +72,8 @@
 void testStringVariants() {
   String latin = "ab\x00\xff";
   String nonLatin = "\u2000\u{10000}\ufeff";
-  Object oLatin = new Stringable(latin);
-  Object oNonLatin = new Stringable(nonLatin);
+  dynamic oLatin = new Stringable(latin);
+  dynamic oNonLatin = new Stringable(nonLatin);
 
   // ASCII.
   Expect.equals(latin * 3, "$latin$latin$latin");
diff --git a/tests/language_2/super_no_such_method1_test.dart b/tests/language_2/super_no_such_method1_test.dart
index 8f9d928..1b990b8 100644
--- a/tests/language_2/super_no_such_method1_test.dart
+++ b/tests/language_2/super_no_such_method1_test.dart
@@ -16,5 +16,5 @@
 }
 
 main() {
-  Expect.equals(42, new B().foo());
+  Expect.equals(87, new B().foo());
 }
diff --git a/tests/language_2/super_no_such_method2_test.dart b/tests/language_2/super_no_such_method2_test.dart
index 836a996..a85c675 100644
--- a/tests/language_2/super_no_such_method2_test.dart
+++ b/tests/language_2/super_no_such_method2_test.dart
@@ -16,5 +16,5 @@
 }
 
 main() {
-  Expect.equals(42, new B().foo);
+  Expect.equals(87, new B().foo);
 }
diff --git a/tests/language_2/super_no_such_method3_test.dart b/tests/language_2/super_no_such_method3_test.dart
index 386749d..16433d8 100644
--- a/tests/language_2/super_no_such_method3_test.dart
+++ b/tests/language_2/super_no_such_method3_test.dart
@@ -8,7 +8,7 @@
 
 class A {
   set foo(int a);
-  
+
   noSuchMethod(im) {
     result = 42;
   }
@@ -24,5 +24,5 @@
 
 main() {
   new B().foo = 0;
-  Expect.equals(42, result);
+  Expect.equals(87, result);
 }
diff --git a/tests/language_2/super_no_such_method4_test.dart b/tests/language_2/super_no_such_method4_test.dart
index 7d3c606..88dd2d7 100644
--- a/tests/language_2/super_no_such_method4_test.dart
+++ b/tests/language_2/super_no_such_method4_test.dart
@@ -17,5 +17,5 @@
 }
 
 main() {
-  Expect.equals(42, new B().foo());
+  Expect.equals(87, new B().foo());
 }
diff --git a/tests/language_2/vm/optimized_guarded_field_isolates_test.dart b/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
index 763dd12..8e68120 100644
--- a/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
+++ b/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
@@ -37,9 +37,9 @@
     test_b(b);
   }
   Expect.equals(3, test_b(b));
-  Future<B> item = receive_port.first;
-  item.then((B value) {
-    Expect.equals("foobar", test_b(value));
+  Future item = receive_port.first;
+  item.then((value) {
+    Expect.equals("foobar", test_b(value as B));
     receive_port.close();
     asyncEnd();
   });
@@ -65,9 +65,9 @@
     test_c(c);
   }
   Expect.equals(null, test_c(c));
-  Future<C> item = receive_port.first;
-  item.then((C value) {
-    Expect.throwsRangeError(() => test_c(value));
+  Future item = receive_port.first;
+  item.then((value) {
+    Expect.throwsRangeError(() => test_c(value as C));
     receive_port.close();
     asyncEnd();
   });
diff --git a/tests/language_2/vm/regress_33469_test.dart b/tests/language_2/vm/regress_33469_test.dart
new file mode 100644
index 0000000..a18a6ad
--- /dev/null
+++ b/tests/language_2/vm/regress_33469_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class X {
+  final x;
+  const X(this.x);
+}
+
+void main() {
+  print(const X(1 << -1).x);  /// 01: compile-time error
+  print(const X(1 >> -1).x);  /// 02: compile-time error
+  print(const X(1 % 0).x);    /// 03: compile-time error
+  print(const X(1 ~/ 0).x);   /// 04: compile-time error
+}
diff --git a/tests/language_2/void/return_future_future_or_void_async_error0_test.dart b/tests/language_2/void/return_future_future_or_void_async_error0_test.dart
new file mode 100644
index 0000000..ea6093a
--- /dev/null
+++ b/tests/language_2/void/return_future_future_or_void_async_error0_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may not return void
+Future<FutureOr<void>> test() async {
+  return /*@compile-error=unspecified*/ voidValue;
+}
diff --git a/tests/language_2/void/return_future_future_or_void_async_error1_test.dart b/tests/language_2/void/return_future_future_or_void_async_error1_test.dart
new file mode 100644
index 0000000..ed75e7b
--- /dev/null
+++ b/tests/language_2/void/return_future_future_or_void_async_error1_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may not have an empty return
+Future<FutureOr<void>> test() async {
+  return; //# none: static type warning
+}
diff --git a/tests/language_2/void/return_future_future_or_void_async_test.dart b/tests/language_2/void/return_future_future_or_void_async_test.dart
new file mode 100644
index 0000000..81fb4da
--- /dev/null
+++ b/tests/language_2/void/return_future_future_or_void_async_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+  test7();
+  test8();
+}
+
+// Testing that a block bodied async function may have no return
+Future<FutureOr<void>> test1() async {}
+
+// Testing that a block bodied async function may return Future<void>
+Future<FutureOr<void>> test2([bool b]) async {
+  return null as Future<void>;
+}
+
+// Testing that a block bodied async function may return FutureOr<void>
+Future<FutureOr<void>> test3([bool b]) async {
+  return null as FutureOr<void>;
+}
+
+// Testing that a block bodied async function may return Future<FutureOr<void>>
+Future<FutureOr<void>> test4([bool b]) async {
+  return null as Future<FutureOr<void>>;
+}
+
+// Testing that a block bodied async function may return Future<Future<void>>
+Future<FutureOr<void>> test5([bool b]) async {
+  return null as Future<Future<void>>;
+}
+
+// Testing that a block bodied async function may return FutureOr<Future<void>>
+Future<FutureOr<void>> test6([bool b]) async {
+  return null as FutureOr<Future<void>>;
+}
+
+// Testing that a block bodied async function may return non-void
+// values
+Future<FutureOr<void>> test7() async {
+  return 42;
+}
+
+// Testing that a block bodied async function may return non-void
+// Future values
+Future<FutureOr<void>> test8() async {
+  return new Future.value(42);
+}
diff --git a/tests/language_2/void/return_future_future_or_void_sync_error0_test.dart b/tests/language_2/void/return_future_future_or_void_sync_error0_test.dart
new file mode 100644
index 0000000..70f8c2e
--- /dev/null
+++ b/tests/language_2/void/return_future_future_or_void_sync_error0_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not return void
+Future<FutureOr<void>> test() {
+  return /*@compile-error=unspecified*/ voidValue;
+}
diff --git a/tests/language_2/void/return_future_future_or_void_sync_error1_test.dart b/tests/language_2/void/return_future_future_or_void_sync_error1_test.dart
new file mode 100644
index 0000000..dd12358
--- /dev/null
+++ b/tests/language_2/void/return_future_future_or_void_sync_error1_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not have an empty return
+Future<FutureOr<void>> test0() {
+  return; /*@compile-error=unspecified*/
+}
diff --git a/tests/language_2/void/return_future_future_or_void_sync_test.dart b/tests/language_2/void/return_future_future_or_void_sync_test.dart
new file mode 100644
index 0000000..fae59d5
--- /dev/null
+++ b/tests/language_2/void/return_future_future_or_void_sync_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test1();
+  test2();
+  test3();
+  test4();
+}
+
+// Testing that a block bodied function may have no return
+Future<FutureOr<void>> test1() {}
+
+// Testing that a block bodied function may return Future<void>
+Future<FutureOr<void>> test2() {
+  return null as Future<void>;
+}
+
+// Testing that a block bodied function may return FutureOr<void>
+Future<FutureOr<void>> test3() {
+  return null as Future<FutureOr<void>>;
+}
+
+// Testing that a block bodied function may return non-void Future values
+Future<FutureOr<void>> test4() {
+  return new Future.value(42);
+}
diff --git a/tests/language_2/void/return_future_or_future_or_void_sync_error1_test.dart b/tests/language_2/void/return_future_or_future_or_void_sync_error1_test.dart
new file mode 100644
index 0000000..25b0df7
--- /dev/null
+++ b/tests/language_2/void/return_future_or_future_or_void_sync_error1_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not return void
+FutureOr<FutureOr<void>> test() {
+  return /*@compile-error=unspecified*/ voidValue;
+}
diff --git a/tests/language_2/void/return_future_or_future_or_void_sync_error2_test.dart b/tests/language_2/void/return_future_or_future_or_void_sync_error2_test.dart
new file mode 100644
index 0000000..36421f5
--- /dev/null
+++ b/tests/language_2/void/return_future_or_future_or_void_sync_error2_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may have an empty return
+FutureOr<FutureOr<void>> test() {
+  return; //# none: static type warning
+}
diff --git a/tests/language_2/void/return_future_or_future_or_void_sync_test.dart b/tests/language_2/void/return_future_or_future_or_void_sync_test.dart
new file mode 100644
index 0000000..ab95eff
--- /dev/null
+++ b/tests/language_2/void/return_future_or_future_or_void_sync_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+}
+
+// Testing that a block bodied function may have no return
+FutureOr<FutureOr<void>> test1() {}
+
+// Testing that a block bodied function may return Future<void>
+FutureOr<FutureOr<void>> test2() {
+  return null as Future<void>;
+}
+
+// Testing that a block bodied function may return FutureOr<void>
+FutureOr<FutureOr<void>> test3() {
+  return null as FutureOr<void>;
+}
+
+// Testing that a block bodied function may return Future<void>
+FutureOr<FutureOr<void>> test4() {
+  return null as Future<Future<void>>;
+}
+
+// Testing that a block bodied function may return non-void values
+FutureOr<FutureOr<void>> test5() {
+  return 42;
+}
+
+// Testing that a block bodied function may return non-void Future values
+FutureOr<FutureOr<void>> test6() {
+  return new Future.value(42);
+}
+
+// Testing that a block bodied function may return overly nested Future
+// values
+FutureOr<FutureOr<void>> test() {
+  return null as Future<Future<Future<void>>>;
+}
diff --git a/tests/language_2/void/return_future_or_void_async_error0_test.dart b/tests/language_2/void/return_future_or_void_async_error0_test.dart
new file mode 100644
index 0000000..c5115a7
--- /dev/null
+++ b/tests/language_2/void/return_future_or_void_async_error0_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not return void
+FutureOr<void> test() async {
+  return /*@compile-error=unspecified*/ voidValue;
+}
diff --git a/tests/language_2/void/return_future_or_void_async_test.dart b/tests/language_2/void/return_future_or_void_async_test.dart
new file mode 100644
index 0000000..dfdf1e7
--- /dev/null
+++ b/tests/language_2/void/return_future_or_void_async_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test0();
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+}
+
+// Testing that a block bodied function may have an empty return
+FutureOr<void> test0() async {
+  return;
+}
+
+// Testing that a block bodied function may have no return
+FutureOr<void> test1() async {}
+
+// Testing that a block bodied function may return Future<void>
+FutureOr<void> test2() async {
+  return null as Future<void>;
+}
+
+// Testing that a block bodied function may return FutureOr<void>
+FutureOr<void> test3() async {
+  return null as FutureOr<void>;
+}
+
+// Testing that a block bodied async function may return non-void
+// values
+FutureOr<void> test4() async {
+  return 42;
+}
+
+// Testing that a block bodied async function may return non-void
+// Future values
+FutureOr<void> test5() async {
+  return new Future.value(42);
+}
diff --git a/tests/language_2/void/return_future_or_void_sync_error3_test.dart b/tests/language_2/void/return_future_or_void_sync_error3_test.dart
new file mode 100644
index 0000000..c921114
--- /dev/null
+++ b/tests/language_2/void/return_future_or_void_sync_error3_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not return void
+FutureOr<void> test() {
+  return /*@compile-error=unspecified*/ voidValue;
+}
diff --git a/tests/language_2/void/return_future_or_void_sync_error4_test.dart b/tests/language_2/void/return_future_or_void_sync_error4_test.dart
new file mode 100644
index 0000000..53d3b0c
--- /dev/null
+++ b/tests/language_2/void/return_future_or_void_sync_error4_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not have an empty return
+FutureOr<void> test() {
+  return; //# none: static type warning
+}
diff --git a/tests/language_2/void/return_future_or_void_sync_test.dart b/tests/language_2/void/return_future_or_void_sync_test.dart
new file mode 100644
index 0000000..986bd28
--- /dev/null
+++ b/tests/language_2/void/return_future_or_void_sync_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+}
+
+// Testing that a block bodied function may have no return
+FutureOr<void> test1() {}
+
+// Testing that a block bodied function may return Future<void>
+FutureOr<void> test2() {
+  return null as Future<void>;
+}
+
+// Testing that a block bodied function may return FutureOr<void>
+FutureOr<void> test3() {
+  return null as FutureOr<void>;
+}
+
+// Testing that a block bodied function may return Future<void>
+FutureOr<void> test4() {
+  return null as Future<Future<void>>;
+}
+
+// Testing that a block bodied function may return non-void values
+FutureOr<void> test5() {
+  return 42;
+}
+
+// Testing that a block bodied function may return non-void Future values
+FutureOr<void> test6() {
+  return new Future.value(42);
+}
diff --git a/tests/language_2/void/return_future_void_async_error2_test.dart b/tests/language_2/void/return_future_void_async_error2_test.dart
new file mode 100644
index 0000000..d31263e
--- /dev/null
+++ b/tests/language_2/void/return_future_void_async_error2_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may return void
+Future<void> test() async {
+  return /*@compile-error=unspecified*/ voidValue;
+}
diff --git a/tests/language_2/void/return_future_void_async_test.dart b/tests/language_2/void/return_future_void_async_test.dart
new file mode 100644
index 0000000..ba3f1f1
--- /dev/null
+++ b/tests/language_2/void/return_future_void_async_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test0();
+  test1();
+  test2();
+  test3();
+  test4();
+  test5();
+  test6();
+}
+
+// Testing that a block bodied async function may have an empty return
+Future<void> test0() async {
+  return;
+}
+
+// Testing that a block bodied async function may have no return
+Future<void> test1() async {}
+
+// Testing that a block bodied async function may return Future<void>
+Future<void> test2([bool b]) async {
+  return null as Future<void>;
+}
+
+// Testing that a block bodied async function may return FutureOr<void>
+Future<void> test3([bool b]) async {
+  return null as FutureOr<void>;
+}
+
+// Testing that a block bodied async function may return non-void
+// values
+Future<void> test4() async {
+  return 42;
+}
+
+// Testing that a block bodied async function may return non-void
+// Future values
+Future<void> test5() async {
+  return new Future.value(42);
+}
+
+// Testing that a block bodied async function return nested void
+// Future values
+Future<void> test6() async {
+  return null as Future<Future<void>>;
+}
diff --git a/tests/language_2/void/return_void_async_error0_test.dart b/tests/language_2/void/return_void_async_error0_test.dart
new file mode 100644
index 0000000..cb02f38
--- /dev/null
+++ b/tests/language_2/void/return_void_async_error0_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may not return non-void non-top
+// values
+void test() async {
+  return /*@compile-error=unspecified*/ 3;
+}
diff --git a/tests/language_2/void/return_void_async_error1_test.dart b/tests/language_2/void/return_void_async_error1_test.dart
new file mode 100644
index 0000000..c685097
--- /dev/null
+++ b/tests/language_2/void/return_void_async_error1_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may not return non-void Object
+// values
+void test() async {
+  Object a = 3;
+  return /*@compile-error=unspecified*/ a;
+}
diff --git a/tests/language_2/void/return_void_async_error2_test.dart b/tests/language_2/void/return_void_async_error2_test.dart
new file mode 100644
index 0000000..afc2825
--- /dev/null
+++ b/tests/language_2/void/return_void_async_error2_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may not return non-void Future
+// values
+void test() async {
+  return /*@compile-error=unspecified*/ null as Future<int>;
+}
diff --git a/tests/language_2/void/return_void_async_error3_test.dart b/tests/language_2/void/return_void_async_error3_test.dart
new file mode 100644
index 0000000..27e691b
--- /dev/null
+++ b/tests/language_2/void/return_void_async_error3_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may not return Future<void>
+void test() async {
+  return /*@compile-error=unspecified*/ null as Future<void>;
+}
diff --git a/tests/language_2/void/return_void_async_error4_test.dart b/tests/language_2/void/return_void_async_error4_test.dart
new file mode 100644
index 0000000..cc1d1db
--- /dev/null
+++ b/tests/language_2/void/return_void_async_error4_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied async function may not return FutureOr<void>
+void test() async {
+  return /*@compile-error=unspecified*/ null as FutureOr<void>;
+}
diff --git a/tests/language_2/void/return_void_async_test.dart b/tests/language_2/void/return_void_async_test.dart
new file mode 100644
index 0000000..bf10b9c
--- /dev/null
+++ b/tests/language_2/void/return_void_async_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void voidValue = null;
+
+void main() {
+  test0();
+  test1();
+  test2();
+  test3();
+}
+
+// Testing that a block bodied async function may have an empty return
+void test0() async {
+  return;
+}
+
+// Testing that a block bodied async function may have no return
+void test1() async {}
+
+// Testing that a block bodied async function may return void
+void test2() async {
+  return voidValue;
+}
+
+// Testing that a block bodied async function may have both empty returns
+//  and void returning paths
+void test3([bool b]) async {
+  if (b == null) {
+    return;
+  } else {
+    return voidValue;
+  }
+}
diff --git a/tests/language_2/void/return_void_sync_error0_test.dart b/tests/language_2/void/return_void_sync_error0_test.dart
new file mode 100644
index 0000000..5d27b5d
--- /dev/null
+++ b/tests/language_2/void/return_void_sync_error0_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not return non-void non-top values
+void test() {
+  return /*@compile-error=unspecified*/ 3;
+}
diff --git a/tests/language_2/void/return_void_sync_error1_test.dart b/tests/language_2/void/return_void_sync_error1_test.dart
new file mode 100644
index 0000000..4d212c9
--- /dev/null
+++ b/tests/language_2/void/return_void_sync_error1_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not return non-void Object values
+void test() {
+  Object a = 3;
+  return /*@compile-error=unspecified*/ a;
+}
diff --git a/tests/language_2/void/return_void_sync_error2_test.dart b/tests/language_2/void/return_void_sync_error2_test.dart
new file mode 100644
index 0000000..389aa15
--- /dev/null
+++ b/tests/language_2/void/return_void_sync_error2_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+void main() {
+  test();
+}
+
+// Testing that a block bodied function may not return FutureOr<void>
+void test() {
+  return /*@compile-error=unspecified*/ null as FutureOr<void>;
+}
diff --git a/tests/language_2/void/return_void_sync_test.dart b/tests/language_2/void/return_void_sync_test.dart
new file mode 100644
index 0000000..8c558ba
--- /dev/null
+++ b/tests/language_2/void/return_void_sync_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+void voidValue = null;
+
+void main() {
+  test0();
+  test1();
+  test2();
+  test3();
+}
+
+// Testing that a block bodied function may have an empty return
+void test0() {
+  return;
+}
+
+// Testing that a block bodied function may have no return
+void test1() {}
+
+// Testing that a block bodied function may return void
+void test2() {
+  return voidValue;
+}
+
+// Testing that a block bodied function may have both empty returns
+// and void returning paths
+void test3([bool b]) {
+  if (b == null) {
+    return;
+  } else if (b) {
+    return voidValue;
+  }
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index fc51aee..116c44e 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -367,7 +367,6 @@
 convert/utf85_test: Skip # Pass, Slow Issue 12644.
 
 [ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
-async/async_await_sync_completer_test: RuntimeError # sync-async is on by default.
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 async/timer_regress22626_test: Pass, RuntimeError # Issue 28254
 mirrors/mirrors_used*: SkipByDesign # Invalid tests. MirrorsUsed does not have a specification, and dart:mirrors is not required to hide declarations that are not covered by any MirrorsUsed annotation.
diff --git a/tests/lib_2/html/element_classes_svg_test.dart b/tests/lib_2/html/element_classes_svg_test.dart
index 67a40e8..e7214a5 100644
--- a/tests/lib_2/html/element_classes_svg_test.dart
+++ b/tests/lib_2/html/element_classes_svg_test.dart
@@ -6,6 +6,7 @@
 import 'dart:html';
 import 'dart:svg' as svg;
 
+import "package:expect/expect.dart";
 import 'package:expect/minitest.dart';
 
 // Test for `querySelectorAll(xxx).classes.op()` where the query returns mixed
@@ -27,11 +28,50 @@
 
 Element elementsContainer;
 
+/// Test top-level querySelectorAll with generics.
+topLevelQuerySelector() {
+  var noElementsTop = querySelectorAll<svg.PathElement>('.no');
+  expect(noElementsTop.length, 0);
+  expect(noElementsTop is List, true);
+
+  var varWeird = querySelectorAll<svg.CircleElement>('path');
+  expect(varWeird.length, 1);
+  expect(varWeird is List, true);
+  expect(varWeird is List<svg.CircleElement>, true);
+  // Runtime error expected 'PathElement' is not a subtype of expected type 'CircleElement'.'
+  Expect.throwsTypeError(() => varWeird[0] is svg.CircleElement);
+
+  var simpleElems = querySelectorAll('circle');
+  expect(simpleElems.length, 1);
+  expect(simpleElems is List, true);
+  expect(simpleElems is List<dynamic>, true);
+  expect(simpleElems is List<svg.CircleElement>, false);
+  expect(simpleElems[0] is svg.CircleElement, true);
+
+  var varElementsFromTop = querySelectorAll<svg.CircleElement>('circle');
+  expect(varElementsFromTop.length, 1);
+  expect(varElementsFromTop is List, true);
+  expect(varElementsFromTop is List<svg.CircleElement>, true);
+  expect(varElementsFromTop[0] is svg.CircleElement, true);
+  expect(varElementsFromTop is List<svg.PathElement>, false);
+  expect(varElementsFromTop[0] is svg.PathElement, false);
+
+  List<svg.CircleElement> elementsFromTop =
+      querySelectorAll<svg.CircleElement>('circle');
+  expect(elementsFromTop is List, true);
+  expect(elementsFromTop is List<svg.CircleElement>, true);
+  expect(elementsFromTop[0] is svg.CircleElement, true);
+  expect(elementsFromTop.length, 1);
+}
+
 ElementList<Element> elementsSetup() {
   elementsContainer = makeElementsContainer();
   document.documentElement.children.add(elementsContainer);
   var elements = document.querySelectorAll('.yes');
   expect(elements.length, 4);
+
+  topLevelQuerySelector();
+
   return elements;
 }
 
diff --git a/tests/lib_2/html/webgl_1_test.dart b/tests/lib_2/html/webgl_1_test.dart
index 58f299b..f156e2f 100644
--- a/tests/lib_2/html/webgl_1_test.dart
+++ b/tests/lib_2/html/webgl_1_test.dart
@@ -38,10 +38,11 @@
         var canvas = new CanvasElement();
         var context =
             canvas.getContext('experimental-webgl') as gl.RenderingContext;
-        var shader = context.createShader(gl.VERTEX_SHADER);
+        var shader = context.createShader(gl.WebGL.VERTEX_SHADER);
         context.shaderSource(shader, 'void main() { }');
         context.compileShader(shader);
-        var success = context.getShaderParameter(shader, gl.COMPILE_STATUS);
+        var success =
+            context.getShaderParameter(shader, gl.WebGL.COMPILE_STATUS);
         expect(success, isTrue);
       });
 
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index ca9b2be..fed5352 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -535,7 +535,6 @@
 html/domparser_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/element_add_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/element_animate_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
-html/element_classes_svg_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/element_constructor_1_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/element_dimensions_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
 html/element_offset_test: Crash # NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.
@@ -779,6 +778,9 @@
 [ $compiler == dart2js && $minified ]
 html/canvas_pixel_array_type_alias_test/types2_runtimeTypeName: Fail, OK # Issue 12605
 
+[ $compiler == dart2js && !$strong ]
+html/element_classes_svg_test: RuntimeError # Expected runtime type check only in strong mode.
+
 [ $compiler == dart2js && ($runtime == chrome || $runtime == ff) ]
 async/slow_consumer2_test: SkipSlow # Times out. Issue 22050
 convert/streamed_conversion_json_utf8_decode_test: SkipSlow # Times out. Issue 22050
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index db43afe..2fdab77 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -38,7 +38,6 @@
 html/xhr_test: Skip # Times out. Issue 21527
 
 [ $compiler == dartdevc || $compiler == dartdevk ]
-async/async_await_zones_test: RuntimeError # Issue 29922
 async/future_or_bad_type_test/implements: RuntimeError # Issue 29922
 async/future_or_bad_type_test/none: RuntimeError # Issue 29922
 async/future_test: RuntimeError # Issue 29922
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index bef13c5..e8a160c 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -46,6 +46,9 @@
 mirrors/reflected_type_test/03: MissingCompileTimeError
 mirrors/variable_is_const_test/01: MissingCompileTimeError
 
+[ $arch == simarm64 && $compiler == dartk && $strong ]
+isolate/mint_maker_test: Timeout # Please triage.
+
 [ $arch == simdbc64 && $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
 isolate/isolate_complex_messages_test: Crash # http://dartbug.com/33128
 
@@ -198,15 +201,11 @@
 isolate/ping_pause_test: Skip # Issues 32137 and 32138
 
 [ $compiler == dartk && $hot_reload ]
-async/stream_state_nonzero_timer_test: Crash
-async/stream_subscription_as_future_test: Crash
-async/stream_subscription_cancel_test: Crash
 isolate/message4_test: Pass, Timeout
-isolate/spawn_uri_multi_test/01: Crash
-isolate/spawn_uri_multi_test/none: Crash
 
 [ $compiler == dartk && $hot_reload_rollback ]
 isolate/illegal_msg_function_test: Skip # Timeout
+isolate/message4_test: Pass, Timeout
 isolate/pause_test: Skip # Timeout
 
 [ $compiler == dartk && $strong ]
diff --git a/tests/standalone/app_snapshot_share_test.dart b/tests/standalone/app_snapshot_share_test.dart
index 3e80c75..65b95f5 100644
--- a/tests/standalone/app_snapshot_share_test.dart
+++ b/tests/standalone/app_snapshot_share_test.dart
@@ -30,6 +30,7 @@
 
   var exec = "$buildDir/dart_bootstrap";
   args = new List<String>();
+  args.add("--no-preview-dart-2");
   args.add("--deterministic");
   args.add("--use-blobs");
   args.add("--snapshot-kind=app-aot");
@@ -48,6 +49,7 @@
 
   exec = "$buildDir/dart_bootstrap";
   args = new List<String>();
+  args.add("--no-preview-dart-2");
   args.add("--deterministic");
   args.add("--use-blobs");
   args.add("--snapshot-kind=app-aot");
@@ -75,6 +77,7 @@
 
   exec = "$buildDir/dart_precompiled_runtime";
   args = new List<String>();
+  args.add("--no-preview-dart-2");
   args.add("--shared-blobs=$snapshot1Path");
   args.add(snapshot2Path);
   args.add("--child");
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 5444e3d..2ee8956 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -23,6 +23,9 @@
 [ $runtime == dart_precompiled ]
 verbose_gc_to_bmu_test: Skip # These tests attempt to spawn another script using the precompiled runtime.
 
+[ $runtime == vm ]
+verbose_gc_to_bmu_test: Skip # spawns a process which runs in Dart2 mode.
+
 [ $system == windows ]
 io/sleep_test: Pass, Fail # Issue 25757
 verbose_gc_to_bmu_test: Skip
diff --git a/tests/standalone_2/app_snapshot_share_test.dart b/tests/standalone_2/app_snapshot_share_test.dart
index f623875..6603417 100644
--- a/tests/standalone_2/app_snapshot_share_test.dart
+++ b/tests/standalone_2/app_snapshot_share_test.dart
@@ -27,68 +27,82 @@
       .uri
       .resolve("../../tests/standalone_2/app_snapshot_share_test.dart")
       .toFilePath();
+  final scriptPathDill = tempDir.uri.resolve('app.dill').toFilePath();
 
-  var exec = "$buildDir/dart_bootstrap";
-  args = new List<String>();
-  args.add("--deterministic");
-  args.add("--use-blobs");
-  args.add("--snapshot-kind=app-aot");
-  args.add("--snapshot=$snapshot1Path");
-  args.add(scriptPath);
-  print("+ $exec $args");
-  var result = Process.runSync(exec, args);
+  try {
+    args = <String>[
+      '--aot',
+      '--strong-mode',
+      '--sync-async',
+      '--platform=$buildDir/vm_platform_strong.dill',
+      '-o',
+      scriptPathDill,
+      '--entry-points',
+      '$buildDir/gen/runtime/bin/precompiler_entry_points.json',
+      '--entry-points',
+      'pkg/vm/lib/transformations/type_flow/entry_points_extra.json',
+      '--entry-points',
+      'pkg/vm/lib/transformations/type_flow/entry_points_extra_standalone.json',
+      scriptPath,
+    ];
+    runSync("pkg/vm/tool/gen_kernel${Platform.isWindows ? '.bat' : ''}", args);
+
+    args = <String>[
+      "--strong",
+      "--deterministic",
+      "--use-blobs",
+      "--snapshot-kind=app-aot",
+      "--snapshot=$snapshot1Path",
+      scriptPathDill,
+    ];
+    runSync("$buildDir/dart_bootstrap", args);
+
+    args = <String>[
+      "--strong",
+      "--deterministic",
+      "--use-blobs",
+      "--snapshot-kind=app-aot",
+      "--snapshot=$snapshot2Path",
+      "--shared-blobs=$snapshot1Path",
+      scriptPathDill,
+    ];
+    runSync("$buildDir/dart_bootstrap", args);
+
+    var sizeWithoutSharing = new File(snapshot1Path).statSync().size;
+    var deltaWhenSharing = new File(snapshot2Path).statSync().size;
+    print("sizeWithoutSharing: ${sizeWithoutSharing.toString().padLeft(8)}");
+    print("deltaWhenSharing:   ${deltaWhenSharing.toString().padLeft(8)}");
+    if (deltaWhenSharing >= sizeWithoutSharing) {
+      throw "Sharing did not shrink size";
+    }
+
+    args = <String>[
+      "--strong",
+      "--shared-blobs=$snapshot1Path",
+      snapshot2Path,
+      "--child",
+    ];
+    final result = runSync("$buildDir/dart_precompiled_runtime", args);
+    if (!result.stdout.contains("Hello, sharing world!")) {
+      throw "Missing output";
+    }
+  } finally {
+    tempDir.deleteSync(recursive: true);
+  }
+}
+
+ProcessResult runSync(String executable, List<String> args) {
+  print("+ $executable ${args.join(' ')}");
+
+  final result = Process.runSync(executable, args);
   print("Exit code: ${result.exitCode}");
   print("stdout:");
   print(result.stdout);
   print("stderr:");
   print(result.stderr);
+
   if (result.exitCode != 0) {
     throw "Bad exit code";
   }
-
-  exec = "$buildDir/dart_bootstrap";
-  args = new List<String>();
-  args.add("--deterministic");
-  args.add("--use-blobs");
-  args.add("--snapshot-kind=app-aot");
-  args.add("--snapshot=$snapshot2Path");
-  args.add("--shared-blobs=$snapshot1Path");
-  args.add(scriptPath);
-  print("+ $exec $args");
-  result = Process.runSync(exec, args);
-  print("Exit code: ${result.exitCode}");
-  print("stdout:");
-  print(result.stdout);
-  print("stderr:");
-  print(result.stderr);
-  if (result.exitCode != 0) {
-    throw "Bad exit code";
-  }
-
-  var sizeWithoutSharing = new File(snapshot1Path).statSync().size;
-  var deltaWhenSharing = new File(snapshot2Path).statSync().size;
-  print("sizeWithoutSharing: $sizeWithoutSharing");
-  print("deltaWhenSharing: $deltaWhenSharing");
-  if (deltaWhenSharing >= sizeWithoutSharing) {
-    throw "Sharing did not shrink size";
-  }
-
-  exec = "$buildDir/dart_precompiled_runtime";
-  args = new List<String>();
-  args.add("--shared-blobs=$snapshot1Path");
-  args.add(snapshot2Path);
-  args.add("--child");
-  print("+ $exec $args");
-  result = Process.runSync(exec, args);
-  print("Exit code: ${result.exitCode}");
-  print("stdout:");
-  print(result.stdout);
-  print("stderr:");
-  print(result.stderr);
-  if (result.exitCode != 0) {
-    throw "Bad exit code";
-  }
-  if (!result.stdout.contains("Hello, sharing world!")) {
-    throw "Missing output";
-  }
+  return result;
 }
diff --git a/tests/standalone_2/io/file_write_only_test.dart b/tests/standalone_2/io/file_write_only_test.dart
index a4e571e..b2ed67d 100644
--- a/tests/standalone_2/io/file_write_only_test.dart
+++ b/tests/standalone_2/io/file_write_only_test.dart
@@ -10,7 +10,7 @@
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
-Future withTempDir(String prefix, void test(Directory dir)) async {
+Future withTempDir(String prefix, Future<void> test(Directory dir)) async {
   var tempDir = Directory.systemTemp.createTempSync(prefix);
   try {
     await test(tempDir);
diff --git a/tests/standalone_2/io/process_detached_script.dart b/tests/standalone_2/io/process_detached_script.dart
index 6e907598..7811726 100644
--- a/tests/standalone_2/io/process_detached_script.dart
+++ b/tests/standalone_2/io/process_detached_script.dart
@@ -12,7 +12,7 @@
 
   // If an argument 'echo' is passed echo stdin to stdout and stderr.
   if (args.length == 1 && args[0] == 'echo') {
-    stdin.fold([], (p, e) => p..addAll(e)).then((message) {
+    stdin.fold(<int>[], (p, e) => p..addAll(e)).then((message) {
       stdout.add(message);
       stderr.add(message);
       stdout.close();
diff --git a/tests/standalone_2/io/secure_unauthorized_test.dart b/tests/standalone_2/io/secure_unauthorized_test.dart
index 7f4285c..2ea739b 100644
--- a/tests/standalone_2/io/secure_unauthorized_test.dart
+++ b/tests/standalone_2/io/secure_unauthorized_test.dart
@@ -40,9 +40,10 @@
   var clientScript = localFile('secure_unauthorized_client.dart');
 
   Future clientProcess(int port) {
-    return Process
-        .run(Platform.executable, [clientScript, port.toString()]).then(
-            (ProcessResult result) {
+    List<String> args = new List<String>.from(Platform.executableArguments);
+    args.add(clientScript);
+    args.add(port.toString());
+    return Process.run(Platform.executable, args).then((ProcessResult result) {
       if (result.exitCode != 0 || !result.stdout.contains('SUCCESS')) {
         print("Client failed");
         print("  stdout:");
diff --git a/tests/standalone_2/io/test_extension_fail_test.dart b/tests/standalone_2/io/test_extension_fail_test.dart
index ebe3a46..262d1db 100644
--- a/tests/standalone_2/io/test_extension_fail_test.dart
+++ b/tests/standalone_2/io/test_extension_fail_test.dart
@@ -88,7 +88,7 @@
       }
     }
   } finally {
-    await tempDirectory.deleteSync(recursive: true);
+    tempDirectory.deleteSync(recursive: true);
   }
 }
 
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 1475337..77fcc36 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -15,6 +15,7 @@
 package/scenarios/empty_packages_file/empty_packages_file_option_test: Fail, OK # CompileTimeErrors intentionally
 package/scenarios/invalid/invalid_package_name_test: RuntimeError, CompileTimeError # Errors intentionally
 package/scenarios/invalid/same_package_twice_test.dart: RuntimeError, CompileTimeError # Errors intentionally
+package/scenarios/packages_dir_only/packages_dir_only_test: Fail # Confirm this no longer works for now. TODO(mfairhurst): delete this test.
 package/scenarios/packages_file_strange_formatting/empty_package_dir_test: Fail, OK # CompileTimeErrors intentionally
 packages_file_test: Skip # Issue 26715
 packages_file_test/none: Skip # contains no tests.
@@ -74,11 +75,6 @@
 [ $compiler != app_jitk && $compiler != dart2analyzer && $compiler != dartdevc && $compiler != dartk && $compiler != dartkp && $runtime != none && $strong ]
 float_array_static_test: MissingCompileTimeError
 
-# We want to confirm that this behavior no longer works. Works in kernel though.
-# TODO(mfairhurst) delete this test.
-[ $compiler != dartk && !$fasta ]
-package/scenarios/packages_dir_only/packages_dir_only_test: Fail
-
 [ $compiler == none && $runtime == vm && $system == fuchsia ]
 *: Skip # Not yet triaged.
 
@@ -95,6 +91,12 @@
 [ $runtime == none && !$strong ]
 io/process_exit_negative_test: Fail, OK # Must be run to exit with non-zero exit code.
 
+# These tests spawn a process that imports using a http URL, since
+# spawned processes now run in Dart2 mode the tests fail as http URL imports
+# is not supported by the front end.
+[ $runtime == vm && ($compiler == app_jit || $compiler == none) ]
+http_launch_test: RuntimeError # Issue 33388
+
 [ $system == linux && ($runtime == flutter || $runtime == vm) ]
 io/http_basic_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
 io/http_launch_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
@@ -174,6 +176,10 @@
 deferred_transitive_import_error_test: Crash
 fragmentation_test: Pass, Crash # Issue 31421
 io/addlatexhash_test: Pass, Crash # Issue 31252
+io/non_utf8_directory_test: Skip # Issue 33519
+io/non_utf8_file_test: Skip # Issue 33519
+io/non_utf8_link_test: Skip # Issue 33519
+io/non_utf8_output_test: Skip # Issue 33519
 io/raw_datagram_read_all_test: Pass, Fail # Timing dependent.
 io/skipping_dart2js_compilations_test: Pass, Slow # Slow.
 io/test_runner_test: Pass, Slow # Slow.
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 347c7ad..2dbeff7 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -11,6 +11,7 @@
 # to add them.
 
 [ $compiler == app_jitk ]
+http_launch_test: RuntimeError # Issue 33388
 io/directory_test: RuntimeError
 io/file_error_test: RuntimeError
 io/file_test: RuntimeError
@@ -23,20 +24,12 @@
 io/http_redirect_test: RuntimeError
 io/http_reuse_server_port_test: RuntimeError
 io/http_server_response_test: RuntimeError
-io/namespace_test: RuntimeError
-io/platform_resolved_executable_test/00: RuntimeError
-io/platform_resolved_executable_test/01: RuntimeError
-io/platform_resolved_executable_test/02: RuntimeError
-io/platform_resolved_executable_test/03: RuntimeError
-io/platform_resolved_executable_test/04: RuntimeError
-io/platform_resolved_executable_test/05: RuntimeError
 io/platform_test: RuntimeError
 io/regress_10026_test: RuntimeError
 io/secure_socket_argument_test: CompileTimeError
 io/socket_upgrade_to_secure_test: RuntimeError
 io/test_extension_fail_test: RuntimeError
 io/test_extension_test: RuntimeError
-io/test_runner_test: RuntimeError
 io/web_socket_pipe_test: RuntimeError
 io/web_socket_protocol_processor_test: CompileTimeError
 io/zlib_test: RuntimeError
@@ -58,7 +51,6 @@
 
 [ $compiler == app_jitk && ($mode == debug || $mode == release) ]
 dart_developer_disabled_env_test: RuntimeError
-io/code_collection_test: RuntimeError
 
 [ $compiler == dartk && $mode == debug && $runtime == vm && $strong ]
 io/file_lock_test: Slow, Pass
@@ -73,8 +65,8 @@
 io/http_basic_test: Crash
 io/web_socket_ping_test: Crash, Pass
 
-# ===== dartk + vm status lines =====
 [ $compiler == dartk && $runtime == vm && $strong ]
+http_launch_test: RuntimeError # Issue 33388
 io/http_client_request_test: Pass, Timeout
 io/http_compression_test: RuntimeError
 io/platform_resolved_executable_test/03: Pass, RuntimeError
@@ -93,10 +85,6 @@
 
 [ $compiler == dartk && $system == windows && $strong ]
 io/compile_all_test: Pass, Fail # Possibly related to issue 32373
-io/file_stream_test: RuntimeError # Issue 31904
-io/platform_test: RuntimeError # Issue 31904
-io/process_non_ascii_test: RuntimeError # Issue 31904
-io/regress_7679_test: RuntimeError # Issue 31904
 map_insert_remove_oom_test: Skip # Heap limit too low.
 
 [ $compiler == dartk && $hot_reload ]
@@ -110,12 +98,15 @@
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $compiler == dartk && $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
+fragmentation_test: Timeout, Pass
+io/dart_std_io_pipe_test: Timeout, Pass
 io/directory_list_sync_test: Timeout, Pass # Please triage.
 io/file_blocking_lock_test: Pass, Crash # Please triage.
 io/file_lock_test: Slow, Pass
 io/platform_resolved_executable_test/01: Pass, RuntimeError # Issue 32134
 io/platform_resolved_executable_test/05: Pass, RuntimeError # Issue 32134
 io/platform_test: RuntimeError # Please triage.
+io/process_sync_test: Timeout, Pass
 io/test_extension_fail_test: RuntimeError # Please traige.
 io/test_extension_test: RuntimeError # Please traige.
 map_insert_remove_oom_test: Skip # Heap limit too low.
@@ -134,9 +125,9 @@
 io/http_auth_test: Skip # Timeout
 io/http_proxy_advanced_test: Skip # Timeout
 io/http_read_test: Skip # Timeout
-io/non_utf8_directory_test: Crash
-io/non_utf8_file_test: Crash
-io/non_utf8_link_test: Crash
+io/non_utf8_directory_test: Pass, Timeout
+io/non_utf8_file_test: Pass, Timeout
+io/non_utf8_link_test: Pass, Timeout
 io/pipe_server_test: Skip # Timeout
 io/socket_close_test: Skip # Timeout
 io/socket_many_connections_test: Skip # Timeout
@@ -147,6 +138,7 @@
 
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 io/compile_all_test: Crash # Issue 32373
+io/directory_test: Crash # Issue 33475
 io/raw_socket_test: Crash
 io/skipping_dart2js_compilations_test: Crash
 io/socket_exception_test: Pass, Crash
@@ -208,3 +200,6 @@
 
 [ $fasta && !$strong ]
 regress_29350_test/none: MissingCompileTimeError
+
+[ !$strong && ($compiler == dartk || $compiler == dartkp || $runtime == dart_precompiled || $runtime == vm) ]
+*: SkipByDesign # standalone_2 is only supported in strong mode.
diff --git a/tests/standalone_2/standalone_2_precompiled.status b/tests/standalone_2/standalone_2_precompiled.status
index bbaa92a..4d15ac5 100644
--- a/tests/standalone_2/standalone_2_precompiled.status
+++ b/tests/standalone_2/standalone_2_precompiled.status
@@ -46,7 +46,6 @@
 io/stdio_nonblocking_test: Skip
 io/test_extension_fail_test: Skip
 io/test_extension_test: Skip
-io/test_runner_test: RuntimeError # Issue 33168
 io/windows_environment_test: Skip
 
 [ $arch == arm && $mode == release && $runtime == dart_precompiled && $system == android ]
diff --git a/tests/standalone_2/standalone_2_vm.status b/tests/standalone_2/standalone_2_vm.status
index 03479a7..729da33 100644
--- a/tests/standalone_2/standalone_2_vm.status
+++ b/tests/standalone_2/standalone_2_vm.status
@@ -22,6 +22,9 @@
 io/test_runner_test: RuntimeError # Issue 33168
 regress_26031_test: Skip # Platform.resolvedExecutable
 
+[ $runtime == vm ]
+io/test_runner_test: Skip # Spawns a process which runs in Dart2 mode.
+
 [ $system == android ]
 io/file_stat_test: Skip # Issue 26376
 io/file_system_watcher_test: Skip # Issue 26376
@@ -84,9 +87,20 @@
 io/file_constructor_test: RuntimeError
 
 [ $runtime == vm && ($arch == arm || $arch == arm64) ]
+io/code_collection_test: Timeout, Pass
+io/dart_std_io_pipe_test: Timeout, Pass
 io/file_input_stream_test: Skip # Issue 26109
 io/file_stream_test: Skip # Issue 26109
 io/file_typed_data_test: Skip # Issue 26109
+io/http_client_stays_alive_test: RuntimeError
+io/process_sync_test: Timeout, Pass
+
+[ $runtime == vm && ($arch == simarm || $arch == simarm64) ]
+io/code_collection_test: Timeout, Pass
+io/dart_std_io_pipe_test: Timeout, Pass
+io/http_client_stays_alive_test: Skip # Spawns process in Dart2 mode.
+io/process_sync_test: Timeout, Pass
+io/skipping_dart2js_compilations_test: Skip # Spawns process in Dart2 mode.
 
 [ $arch == simdbc || $arch == simdbc64 ]
 full_coverage_test: Skip # TODO(vegorov) SIMDBC interpreter doesn't support coverage yet.
diff --git a/third_party/pkg_tested/pkg_tested.status b/third_party/pkg_tested/pkg_tested.status
index 18998fa..2340170 100644
--- a/third_party/pkg_tested/pkg_tested.status
+++ b/third_party/pkg_tested/pkg_tested.status
@@ -14,6 +14,10 @@
 pub/test/serve/web_socket/url_to_asset_id_test: Pass, Slow
 pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test: Pass, Slow
 
+[ $runtime == vm ]
+dart_style/test/command_line_test: Skip # Issue 33473
+http_io/test/http_client_stays_alive_test: Skip # Issue 33472
+
 [ $browser ]
 dart_style/*: SkipByDesign
 pub/*: SkipByDesign
diff --git a/tools/VERSION b/tools/VERSION
index ee58962..cb38d48 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 63
+PRERELEASE 64
 PRERELEASE_PATCH 0
diff --git a/tools/addlatexhash.dart b/tools/addlatexhash.dart
index cbdc349..c93f039 100755
--- a/tools/addlatexhash.dart
+++ b/tools/addlatexhash.dart
@@ -237,7 +237,7 @@
 
 /// Returns true iff [line] does not end a block of lines that gets
 /// a hash value.
-isntHashBlockTerminator(line) => !isSectioningCommand(line);
+bool isntHashBlockTerminator(line) => !isSectioningCommand(line);
 
 /// Returns the label text part from [line], based on the assumption
 /// that isHashLabel(line) returns true.
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 2007e17..3e2549b 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1615,6 +1615,9 @@
     },
     {
       "builders": ["analyzer-analysis-server-linux"],
+      "meta": {
+        "description": "Analyze analyzer related packages."
+      },
       "steps": [
         {
           "name": "build dart",
@@ -1622,23 +1625,93 @@
           "arguments": ["create_sdk"]
         },
         {
-          "name": "Analyze analysis_server",
+          "name": "Analyze pkg/analysis_server/",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": ["--no-hints","pkg/analysis_server"]
         },
         {
-          "name": "Analyze analysis_server",
+          "name": "Analyze pkg/analyzer/",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": ["--no-hints","pkg/analyzer"]
         },
         {
-          "name": "Analyze analysis_server",
+          "name": "Analyze pkg/analyzer_plugin/",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": ["--no-hints","pkg/analyzer_plugin"]
         }
       ]
     },
     {
+      "builders": ["analyzer-use-fasta-parser-linux"],
+      "meta": {
+        "description": "Run the analyzer using the Fasta parser."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
+          "name": "analyze pkg/analysis_server/",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": [
+            "--no-hints",
+            "--use-fasta-parser",
+            "pkg/analysis_server"
+          ]
+        },
+        {
+          "name": "analyze pkg/analyzer/",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": [
+            "--no-hints",
+            "--use-fasta-parser",
+            "pkg/analyzer"
+          ]
+        },
+        {
+          "name": "analyze pkg/analyzer_cli/lib/",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": [
+            "--no-hints",
+            "--use-fasta-parser",
+            "pkg/analyzer_cli/lib"
+          ]
+        },
+        {
+          "name": "run analyzer unit tests",
+          "arguments": [
+            "--builder-tag=analyzer_use_fasta",
+            "--compiler=none",
+            "--use-sdk",
+            "--vm-options=-DuseFastaParser=true",
+            "pkg/analyzer/"
+          ]
+        },
+        {
+          "name": "run analysis server plugin tests",
+          "arguments": [
+            "--builder-tag=analyzer_use_fasta",
+            "--compiler=none",
+            "--use-sdk",
+            "--vm-options=-DuseFastaParser=true",
+            "pkg/analyzer_plugin/"
+          ]
+        },
+        {
+          "name": "run analysis server unit tests",
+          "arguments": [
+            "--builder-tag=analyzer_use_fasta",
+            "--compiler=none",
+            "--use-sdk",
+            "--vm-options=-DuseFastaParser=true",
+            "pkg/analysis_server/"
+          ]
+        }
+      ]
+    },
+    {
       "builders": ["pkg-linux-release","pkg-win-release","pkg-mac-release"],
       "meta": {
         "description": "This configuration is used by the pkg builders."
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index 919e1bb..b7c5551 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -209,7 +209,6 @@
 }
 EOF
     out/ReleaseIA32/dart --profile-period=10000 --packages=.packages hello.dart
-    out/ReleaseIA32/dart --profile-period=10000 --packages=.packages --checked hello.dart
     out/ReleaseIA32/dart-sdk/bin/dart2js --packages=.packages --out=out.js -m hello.dart
     third_party/d8/linux/ia32/d8 --stack_size=1024 sdk/lib/_internal/js_runtime/lib/preambles/d8.js out.js
     out/ReleaseIA32/dart-sdk/bin/dart2js --checked --packages=.packages --out=out.js -m hello.dart
@@ -224,7 +223,6 @@
     out/ReleaseIA32/dart pkg/front_end/tool/perf.dart scan hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart --legacy kernel_gen_e2e hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart kernel_gen_e2e hello.dart
-    out/ReleaseIA32/dart_bootstrap --parse_all --compiler_stats hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/perf.dart linked_summarize hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/perf.dart prelinked_summarize hello.dart
     out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart scan hello.dart
@@ -402,19 +400,13 @@
 }
 EOF
     out/ReleaseX64/dart --profile-period=10000 --packages=.packages hello.dart
-    out/ReleaseX64/dart --profile-period=10000 --packages=.packages --checked hello.dart
-    out/ReleaseX64/dart_bootstrap --packages=.packages --use-blobs --snapshot-kind=app-aot --snapshot=blob.bin hello.dart
-    out/ReleaseX64/dart_precompiled_runtime --profile-period=10000 blob.bin
-    DART_CONFIGURATION=ReleaseX64 pkg/vm/tool/dart2 --profile-period=10000 --packages=.packages hello.dart
     DART_CONFIGURATION=ReleaseX64 pkg/vm/tool/precompiler2 --packages=.packages hello.dart blob.bin
     DART_CONFIGURATION=ReleaseX64 pkg/vm/tool/dart_precompiled_runtime2 --profile-period=10000 blob.bin
     out/ReleaseSIMDBC64/dart --profile-period=10000 --packages=.packages hello.dart
-    out/ReleaseSIMDBC64/dart --profile-period=10000 --checked --packages=.packages hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart parse hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart scan hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/fasta_perf.dart --legacy kernel_gen_e2e hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/fasta_perf.dart kernel_gen_e2e hello.dart
-    out/ReleaseX64/dart_bootstrap --parse_all --compiler_stats hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart linked_summarize hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart prelinked_summarize hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/fasta_perf.dart scan hello.dart
diff --git a/tools/compile_platform.py b/tools/compile_platform.py
deleted file mode 100755
index 3d71fed..0000000
--- a/tools/compile_platform.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-import os
-import subprocess
-import sys
-import utils
-
-usage = """compile_platform.py [options]"""
-
-def DisplayBootstrapWarning():
-  print """\
-
-
-WARNING: Your system can't run the checked-in Dart SDK.  Using the bootstrap
-Dart executable will make debug builds slow.  Please see the Wiki for
-instructions on replacing the checked-in Dart SDK.
-
-https://github.com/dart-lang/sdk/wiki/The-checked-in-SDK-in-tools
-
-"""
-
-
-def path(uri_path):
-  args = [ os.path.dirname(__file__), ".." ] + uri_path.split("/")
-  return os.path.normpath(os.path.join(*args))
-
-
-def main():
-  verbose = False
-  arguments = [ None ] # Leave room for the Dart VM executable.
-  arguments.append("--packages=" + path(".packages"))
-  arguments.append(path("pkg/front_end/tool/_fasta/compile_platform.dart"))
-  i = 1 # Skip argument #0 which is the script name.
-  dart_executable = None
-  while i < len(sys.argv):
-    argument = sys.argv[i]
-    if argument == "--dart-executable":
-      dart_executable = sys.argv[i + 1]
-      i += 1
-    elif argument.startswith("--dart-executable="):
-      dart_executable = argument[len("--dart-executable="):]
-    else:
-      if argument == "-v" or argument == "--verbose":
-        verbose = True
-      arguments.append(argument)
-    i += 1
-
-  if dart_executable:
-    dart_executable = os.path.abspath(dart_executable)
-  else:
-    if utils.CheckedInSdkCheckExecutable():
-      dart_executable = utils.CheckedInSdkExecutable()
-    else:
-      DisplayBootstrapWarning()
-      print >> sys.stderr, "ERROR: Can't locate Dart VM executable."
-      return -1
-
-  arguments[0] = os.path.abspath(dart_executable)
-  if verbose:
-    print "Running:", " ".join(arguments)
-  return subprocess.call(arguments)
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index cf6254c..97ccbd5 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -3306,6 +3306,1790 @@
     },
     "support_level": "untriaged"
   },
+  "Constants": {
+    "members": {
+      "ACTIVE_ATTRIBUTES": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_UNIFORMS": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_LINE_WIDTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_POINT_SIZE_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ALPHA_BITS": {
+        "support_level": "untriaged"
+      },
+      "ALREADY_SIGNALED": {
+        "support_level": "untriaged"
+      },
+      "ALWAYS": {
+        "support_level": "untriaged"
+      },
+      "ANY_SAMPLES_PASSED": {
+        "support_level": "untriaged"
+      },
+      "ANY_SAMPLES_PASSED_CONSERVATIVE": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "ATTACHED_SHADERS": {
+        "support_level": "untriaged"
+      },
+      "BACK": {
+        "support_level": "untriaged"
+      },
+      "BLEND": {
+        "support_level": "untriaged"
+      },
+      "BLEND_COLOR": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLUE_BITS": {
+        "support_level": "untriaged"
+      },
+      "BOOL": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC2": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC3": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC4": {
+        "support_level": "untriaged"
+      },
+      "BROWSER_DEFAULT_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_USAGE": {
+        "support_level": "untriaged"
+      },
+      "BYTE": {
+        "support_level": "untriaged"
+      },
+      "CCW": {
+        "support_level": "untriaged"
+      },
+      "CLAMP_TO_EDGE": {
+        "support_level": "untriaged"
+      },
+      "COLOR": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT0": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT0_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT1": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT10": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT10_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT11": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT11_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT12": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT12_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT13": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT13_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT14": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT14_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT15": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT15_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT1_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT2": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT2_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT3": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT3_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT4": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT4_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT5": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT5_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT6": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT6_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT7": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT7_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT8": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT8_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT9": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT9_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "COLOR_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "COLOR_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "COMPARE_REF_TO_TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "COMPILE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_TEXTURE_FORMATS": {
+        "support_level": "untriaged"
+      },
+      "CONDITION_SATISFIED": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "CONTEXT_LOST_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COPY_READ_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "COPY_READ_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "COPY_WRITE_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "COPY_WRITE_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE_MODE": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_PROGRAM": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_QUERY": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_VERTEX_ATTRIB": {
+        "support_level": "untriaged"
+      },
+      "CW": {
+        "support_level": "untriaged"
+      },
+      "DECR": {
+        "support_level": "untriaged"
+      },
+      "DECR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "DELETE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH": {
+        "support_level": "untriaged"
+      },
+      "DEPTH24_STENCIL8": {
+        "support_level": "untriaged"
+      },
+      "DEPTH32F_STENCIL8": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BITS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT16": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT24": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT32F": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_FUNC": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_TEST": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "DITHER": {
+        "support_level": "untriaged"
+      },
+      "DONT_CARE": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER0": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER0_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER1": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER10": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER10_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER11": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER11_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER12": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER12_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER13": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER13_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER14": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER14_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER15": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER15_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER1_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER2": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER2_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER3": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER3_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER4": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER4_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER5": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER5_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER6": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER6_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER7": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER7_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER8": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER8_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER9": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER9_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "DRAW_FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_COPY": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_READ": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "EQUAL": {
+        "support_level": "untriaged"
+      },
+      "FASTEST": {
+        "support_level": "untriaged"
+      },
+      "FLOAT": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_32_UNSIGNED_INT_24_8_REV": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2x3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2x4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3x2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3x4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4x2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4x3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "FRAGMENT_SHADER": {
+        "support_level": "untriaged"
+      },
+      "FRAGMENT_SHADER_DERIVATIVE_HINT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_RED_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_COMPLETE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_DEFAULT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_DIMENSIONS": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_MULTISAMPLE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_UNSUPPORTED": {
+        "support_level": "untriaged"
+      },
+      "FRONT": {
+        "support_level": "untriaged"
+      },
+      "FRONT_AND_BACK": {
+        "support_level": "untriaged"
+      },
+      "FRONT_FACE": {
+        "support_level": "untriaged"
+      },
+      "FUNC_ADD": {
+        "support_level": "untriaged"
+      },
+      "FUNC_REVERSE_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "FUNC_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "GENERATE_MIPMAP_HINT": {
+        "support_level": "untriaged"
+      },
+      "GEQUAL": {
+        "support_level": "untriaged"
+      },
+      "GREATER": {
+        "support_level": "untriaged"
+      },
+      "GREEN_BITS": {
+        "support_level": "untriaged"
+      },
+      "HALF_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "HIGH_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "HIGH_INT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_TYPE": {
+        "support_level": "untriaged"
+      },
+      "INCR": {
+        "support_level": "untriaged"
+      },
+      "INCR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "INT": {
+        "support_level": "untriaged"
+      },
+      "INTERLEAVED_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "INT_2_10_10_10_REV": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "INVALID_ENUM": {
+        "support_level": "untriaged"
+      },
+      "INVALID_FRAMEBUFFER_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_INDEX": {
+        "support_level": "untriaged"
+      },
+      "INVALID_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_VALUE": {
+        "support_level": "untriaged"
+      },
+      "INVERT": {
+        "support_level": "untriaged"
+      },
+      "KEEP": {
+        "support_level": "untriaged"
+      },
+      "LEQUAL": {
+        "support_level": "untriaged"
+      },
+      "LESS": {
+        "support_level": "untriaged"
+      },
+      "LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "LINES": {
+        "support_level": "untriaged"
+      },
+      "LINE_LOOP": {
+        "support_level": "untriaged"
+      },
+      "LINE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "LINE_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "LINK_STATUS": {
+        "support_level": "untriaged"
+      },
+      "LOW_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "LOW_INT": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "MAX": {
+        "support_level": "untriaged"
+      },
+      "MAX_3D_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_ARRAY_TEXTURE_LAYERS": {
+        "support_level": "untriaged"
+      },
+      "MAX_CLIENT_WAIT_TIMEOUT_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "MAX_COLOR_ATTACHMENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COLOR_ATTACHMENTS_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_CUBE_MAP_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_DRAW_BUFFERS": {
+        "support_level": "untriaged"
+      },
+      "MAX_DRAW_BUFFERS_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENTS_INDICES": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENTS_VERTICES": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENT_INDEX": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_INPUT_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_PROGRAM_TEXEL_OFFSET": {
+        "support_level": "untriaged"
+      },
+      "MAX_RENDERBUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "MAX_SERVER_WAIT_TIMEOUT": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_LOD_BIAS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_UNIFORM_BLOCK_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_UNIFORM_BUFFER_BINDINGS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VARYING_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VARYING_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_OUTPUT_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VIEWPORT_DIMS": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_INT": {
+        "support_level": "untriaged"
+      },
+      "MIN": {
+        "support_level": "untriaged"
+      },
+      "MIN_PROGRAM_TEXEL_OFFSET": {
+        "support_level": "untriaged"
+      },
+      "MIRRORED_REPEAT": {
+        "support_level": "untriaged"
+      },
+      "NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEVER": {
+        "support_level": "untriaged"
+      },
+      "NICEST": {
+        "support_level": "untriaged"
+      },
+      "NONE": {
+        "support_level": "untriaged"
+      },
+      "NOTEQUAL": {
+        "support_level": "untriaged"
+      },
+      "NO_ERROR": {
+        "support_level": "untriaged"
+      },
+      "OBJECT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "ONE": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "OUT_OF_MEMORY": {
+        "support_level": "untriaged"
+      },
+      "PACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "PACK_ROW_LENGTH": {
+        "support_level": "untriaged"
+      },
+      "PACK_SKIP_PIXELS": {
+        "support_level": "untriaged"
+      },
+      "PACK_SKIP_ROWS": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_PACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_PACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_UNPACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_UNPACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "POINTS": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FACTOR": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FILL": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_UNITS": {
+        "support_level": "untriaged"
+      },
+      "QUERY_RESULT": {
+        "support_level": "untriaged"
+      },
+      "QUERY_RESULT_AVAILABLE": {
+        "support_level": "untriaged"
+      },
+      "R11F_G11F_B10F": {
+        "support_level": "untriaged"
+      },
+      "R16F": {
+        "support_level": "untriaged"
+      },
+      "R16I": {
+        "support_level": "untriaged"
+      },
+      "R16UI": {
+        "support_level": "untriaged"
+      },
+      "R32F": {
+        "support_level": "untriaged"
+      },
+      "R32I": {
+        "support_level": "untriaged"
+      },
+      "R32UI": {
+        "support_level": "untriaged"
+      },
+      "R8": {
+        "support_level": "untriaged"
+      },
+      "R8I": {
+        "support_level": "untriaged"
+      },
+      "R8UI": {
+        "support_level": "untriaged"
+      },
+      "R8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RASTERIZER_DISCARD": {
+        "support_level": "untriaged"
+      },
+      "READ_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "READ_FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "READ_FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "RED": {
+        "support_level": "untriaged"
+      },
+      "RED_BITS": {
+        "support_level": "untriaged"
+      },
+      "RED_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_ALPHA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BLUE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_DEPTH_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_GREEN_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_HEIGHT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_INTERNAL_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_RED_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_STENCIL_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "RENDERER": {
+        "support_level": "untriaged"
+      },
+      "REPEAT": {
+        "support_level": "untriaged"
+      },
+      "REPLACE": {
+        "support_level": "untriaged"
+      },
+      "RG": {
+        "support_level": "untriaged"
+      },
+      "RG16F": {
+        "support_level": "untriaged"
+      },
+      "RG16I": {
+        "support_level": "untriaged"
+      },
+      "RG16UI": {
+        "support_level": "untriaged"
+      },
+      "RG32F": {
+        "support_level": "untriaged"
+      },
+      "RG32I": {
+        "support_level": "untriaged"
+      },
+      "RG32UI": {
+        "support_level": "untriaged"
+      },
+      "RG8": {
+        "support_level": "untriaged"
+      },
+      "RG8I": {
+        "support_level": "untriaged"
+      },
+      "RG8UI": {
+        "support_level": "untriaged"
+      },
+      "RG8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGB": {
+        "support_level": "untriaged"
+      },
+      "RGB10_A2": {
+        "support_level": "untriaged"
+      },
+      "RGB10_A2UI": {
+        "support_level": "untriaged"
+      },
+      "RGB16F": {
+        "support_level": "untriaged"
+      },
+      "RGB16I": {
+        "support_level": "untriaged"
+      },
+      "RGB16UI": {
+        "support_level": "untriaged"
+      },
+      "RGB32F": {
+        "support_level": "untriaged"
+      },
+      "RGB32I": {
+        "support_level": "untriaged"
+      },
+      "RGB32UI": {
+        "support_level": "untriaged"
+      },
+      "RGB565": {
+        "support_level": "untriaged"
+      },
+      "RGB5_A1": {
+        "support_level": "untriaged"
+      },
+      "RGB8": {
+        "support_level": "untriaged"
+      },
+      "RGB8I": {
+        "support_level": "untriaged"
+      },
+      "RGB8UI": {
+        "support_level": "untriaged"
+      },
+      "RGB8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGB9_E5": {
+        "support_level": "untriaged"
+      },
+      "RGBA": {
+        "support_level": "untriaged"
+      },
+      "RGBA16F": {
+        "support_level": "untriaged"
+      },
+      "RGBA16I": {
+        "support_level": "untriaged"
+      },
+      "RGBA16UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA32F": {
+        "support_level": "untriaged"
+      },
+      "RGBA32I": {
+        "support_level": "untriaged"
+      },
+      "RGBA32UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA4": {
+        "support_level": "untriaged"
+      },
+      "RGBA8": {
+        "support_level": "untriaged"
+      },
+      "RGBA8I": {
+        "support_level": "untriaged"
+      },
+      "RGBA8UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGBA_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RGB_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RG_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_ARRAY_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_CUBE_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_ALPHA_TO_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_BUFFERS": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_INVERT": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_VALUE": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_BOX": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_TEST": {
+        "support_level": "untriaged"
+      },
+      "SEPARATE_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "SHADER_TYPE": {
+        "support_level": "untriaged"
+      },
+      "SHADING_LANGUAGE_VERSION": {
+        "support_level": "untriaged"
+      },
+      "SHORT": {
+        "support_level": "untriaged"
+      },
+      "SIGNALED": {
+        "support_level": "untriaged"
+      },
+      "SIGNED_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA_SATURATE": {
+        "support_level": "untriaged"
+      },
+      "SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "SRGB": {
+        "support_level": "untriaged"
+      },
+      "SRGB8": {
+        "support_level": "untriaged"
+      },
+      "SRGB8_ALPHA8": {
+        "support_level": "untriaged"
+      },
+      "STATIC_COPY": {
+        "support_level": "untriaged"
+      },
+      "STATIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "STATIC_READ": {
+        "support_level": "untriaged"
+      },
+      "STENCIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BITS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_INDEX8": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_TEST": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STREAM_COPY": {
+        "support_level": "untriaged"
+      },
+      "STREAM_DRAW": {
+        "support_level": "untriaged"
+      },
+      "STREAM_READ": {
+        "support_level": "untriaged"
+      },
+      "SUBPIXEL_BITS": {
+        "support_level": "untriaged"
+      },
+      "SYNC_CONDITION": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FENCE": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FLAGS": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FLUSH_COMMANDS_BIT": {
+        "support_level": "untriaged"
+      },
+      "SYNC_GPU_COMMANDS_COMPLETE": {
+        "support_level": "untriaged"
+      },
+      "SYNC_STATUS": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE0": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE1": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE10": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE11": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE12": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE13": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE14": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE15": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE16": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE17": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE18": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE19": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE2": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE20": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE21": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE22": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE23": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE24": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE25": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE26": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE27": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE28": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE29": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE3": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE30": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE31": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE4": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE5": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE6": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE7": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE8": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE9": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_3D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BASE_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_3D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_COMPARE_FUNC": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_COMPARE_MODE": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_IMMUTABLE_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_IMMUTABLE_LEVELS": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAG_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAX_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAX_LOD": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MIN_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MIN_LOD": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_R": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_S": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_T": {
+        "support_level": "untriaged"
+      },
+      "TIMEOUT_EXPIRED": {
+        "support_level": "untriaged"
+      },
+      "TIMEOUT_IGNORED": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_ACTIVE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BINDING": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_MODE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_START": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_PAUSED": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_VARYINGS": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLES": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_FAN": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_ARRAY_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_ACTIVE_UNIFORMS": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_BINDING": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_DATA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_INDEX": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_OFFSET_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_START": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_IS_ROW_MAJOR": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_MATRIX_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_OFFSET": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_TYPE": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_COLORSPACE_CONVERSION_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_FLIP_Y_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_IMAGE_HEIGHT": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_PREMULTIPLY_ALPHA_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_ROW_LENGTH": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_IMAGES": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_PIXELS": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_ROWS": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNALED": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_BYTE": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_10F_11F_11F_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_24_8": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_2_10_10_10_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_5_9_9_9_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_4_4_4_4": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_5_5_1": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_6_5": {
+        "support_level": "untriaged"
+      },
+      "VALIDATE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "VENDOR": {
+        "support_level": "untriaged"
+      },
+      "VERSION": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ARRAY_BINDING": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_DIVISOR": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_ENABLED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_POINTER": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_SIZE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_TYPE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_SHADER": {
+        "support_level": "untriaged"
+      },
+      "VIEWPORT": {
+        "support_level": "untriaged"
+      },
+      "WAIT_FAILED": {
+        "support_level": "untriaged"
+      },
+      "ZERO": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ConvolverNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ConvolverNode",
     "members": {
@@ -21801,7 +23585,7 @@
     "members": {},
     "support_level": "experimental"
   },
-  "WebGL2RenderingContext": {
+  "WebGL": {
     "members": {
       "ACTIVE_ATTRIBUTES": {
         "support_level": "untriaged"
@@ -21812,6 +23596,9 @@
       "ACTIVE_UNIFORMS": {
         "support_level": "untriaged"
       },
+      "ACTIVE_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
       "ALIASED_LINE_WIDTH_RANGE": {
         "support_level": "untriaged"
       },
@@ -21824,9 +23611,18 @@
       "ALPHA_BITS": {
         "support_level": "untriaged"
       },
+      "ALREADY_SIGNALED": {
+        "support_level": "untriaged"
+      },
       "ALWAYS": {
         "support_level": "untriaged"
       },
+      "ANY_SAMPLES_PASSED": {
+        "support_level": "untriaged"
+      },
+      "ANY_SAMPLES_PASSED_CONSERVATIVE": {
+        "support_level": "untriaged"
+      },
       "ARRAY_BUFFER": {
         "support_level": "untriaged"
       },
@@ -21899,9 +23695,105 @@
       "CLAMP_TO_EDGE": {
         "support_level": "untriaged"
       },
+      "COLOR": {
+        "support_level": "untriaged"
+      },
       "COLOR_ATTACHMENT0": {
         "support_level": "untriaged"
       },
+      "COLOR_ATTACHMENT0_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT1": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT10": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT10_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT11": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT11_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT12": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT12_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT13": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT13_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT14": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT14_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT15": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT15_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT1_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT2": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT2_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT3": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT3_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT4": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT4_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT5": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT5_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT6": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT6_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT7": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT7_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT8": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT8_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT9": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT9_WEBGL": {
+        "support_level": "untriaged"
+      },
       "COLOR_BUFFER_BIT": {
         "support_level": "untriaged"
       },
@@ -21911,12 +23803,18 @@
       "COLOR_WRITEMASK": {
         "support_level": "untriaged"
       },
+      "COMPARE_REF_TO_TEXTURE": {
+        "support_level": "untriaged"
+      },
       "COMPILE_STATUS": {
         "support_level": "untriaged"
       },
       "COMPRESSED_TEXTURE_FORMATS": {
         "support_level": "untriaged"
       },
+      "CONDITION_SATISFIED": {
+        "support_level": "untriaged"
+      },
       "CONSTANT_ALPHA": {
         "support_level": "untriaged"
       },
@@ -21926,6 +23824,18 @@
       "CONTEXT_LOST_WEBGL": {
         "support_level": "untriaged"
       },
+      "COPY_READ_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "COPY_READ_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "COPY_WRITE_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "COPY_WRITE_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
       "CULL_FACE": {
         "support_level": "untriaged"
       },
@@ -21935,6 +23845,9 @@
       "CURRENT_PROGRAM": {
         "support_level": "untriaged"
       },
+      "CURRENT_QUERY": {
+        "support_level": "untriaged"
+      },
       "CURRENT_VERTEX_ATTRIB": {
         "support_level": "untriaged"
       },
@@ -21950,6 +23863,15 @@
       "DELETE_STATUS": {
         "support_level": "untriaged"
       },
+      "DEPTH": {
+        "support_level": "untriaged"
+      },
+      "DEPTH24_STENCIL8": {
+        "support_level": "untriaged"
+      },
+      "DEPTH32F_STENCIL8": {
+        "support_level": "untriaged"
+      },
       "DEPTH_ATTACHMENT": {
         "support_level": "untriaged"
       },
@@ -21968,6 +23890,12 @@
       "DEPTH_COMPONENT16": {
         "support_level": "untriaged"
       },
+      "DEPTH_COMPONENT24": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT32F": {
+        "support_level": "untriaged"
+      },
       "DEPTH_FUNC": {
         "support_level": "untriaged"
       },
@@ -21992,15 +23920,123 @@
       "DONT_CARE": {
         "support_level": "untriaged"
       },
+      "DRAW_BUFFER0": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER0_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER1": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER10": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER10_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER11": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER11_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER12": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER12_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER13": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER13_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER14": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER14_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER15": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER15_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER1_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER2": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER2_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER3": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER3_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER4": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER4_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER5": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER5_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER6": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER6_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER7": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER7_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER8": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER8_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER9": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER9_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "DRAW_FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "DRAW_FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
       "DST_ALPHA": {
         "support_level": "untriaged"
       },
       "DST_COLOR": {
         "support_level": "untriaged"
       },
+      "DYNAMIC_COPY": {
+        "support_level": "untriaged"
+      },
       "DYNAMIC_DRAW": {
         "support_level": "untriaged"
       },
+      "DYNAMIC_READ": {
+        "support_level": "untriaged"
+      },
       "ELEMENT_ARRAY_BUFFER": {
         "support_level": "untriaged"
       },
@@ -22016,15 +24052,36 @@
       "FLOAT": {
         "support_level": "untriaged"
       },
+      "FLOAT_32_UNSIGNED_INT_24_8_REV": {
+        "support_level": "untriaged"
+      },
       "FLOAT_MAT2": {
         "support_level": "untriaged"
       },
+      "FLOAT_MAT2x3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2x4": {
+        "support_level": "untriaged"
+      },
       "FLOAT_MAT3": {
         "support_level": "untriaged"
       },
+      "FLOAT_MAT3x2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3x4": {
+        "support_level": "untriaged"
+      },
       "FLOAT_MAT4": {
         "support_level": "untriaged"
       },
+      "FLOAT_MAT4x2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4x3": {
+        "support_level": "untriaged"
+      },
       "FLOAT_VEC2": {
         "support_level": "untriaged"
       },
@@ -22037,18 +24094,48 @@
       "FRAGMENT_SHADER": {
         "support_level": "untriaged"
       },
+      "FRAGMENT_SHADER_DERIVATIVE_HINT": {
+        "support_level": "untriaged"
+      },
       "FRAMEBUFFER": {
         "support_level": "untriaged"
       },
+      "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE": {
+        "support_level": "untriaged"
+      },
       "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": {
         "support_level": "untriaged"
       },
       "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": {
         "support_level": "untriaged"
       },
+      "FRAMEBUFFER_ATTACHMENT_RED_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE": {
+        "support_level": "untriaged"
+      },
       "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": {
         "support_level": "untriaged"
       },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER": {
+        "support_level": "untriaged"
+      },
       "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": {
         "support_level": "untriaged"
       },
@@ -22058,6 +24145,9 @@
       "FRAMEBUFFER_COMPLETE": {
         "support_level": "untriaged"
       },
+      "FRAMEBUFFER_DEFAULT": {
+        "support_level": "untriaged"
+      },
       "FRAMEBUFFER_INCOMPLETE_ATTACHMENT": {
         "support_level": "untriaged"
       },
@@ -22067,6 +24157,9 @@
       "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": {
         "support_level": "untriaged"
       },
+      "FRAMEBUFFER_INCOMPLETE_MULTISAMPLE": {
+        "support_level": "untriaged"
+      },
       "FRAMEBUFFER_UNSUPPORTED": {
         "support_level": "untriaged"
       },
@@ -22100,6 +24193,9 @@
       "GREEN_BITS": {
         "support_level": "untriaged"
       },
+      "HALF_FLOAT": {
+        "support_level": "untriaged"
+      },
       "HIGH_FLOAT": {
         "support_level": "untriaged"
       },
@@ -22121,6 +24217,24 @@
       "INT": {
         "support_level": "untriaged"
       },
+      "INTERLEAVED_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "INT_2_10_10_10_REV": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
       "INT_VEC2": {
         "support_level": "untriaged"
       },
@@ -22136,6 +24250,9 @@
       "INVALID_FRAMEBUFFER_OPERATION": {
         "support_level": "untriaged"
       },
+      "INVALID_INDEX": {
+        "support_level": "untriaged"
+      },
       "INVALID_OPERATION": {
         "support_level": "untriaged"
       },
@@ -22190,33 +24307,123 @@
       "LUMINANCE_ALPHA": {
         "support_level": "untriaged"
       },
+      "MAX": {
+        "support_level": "untriaged"
+      },
+      "MAX_3D_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_ARRAY_TEXTURE_LAYERS": {
+        "support_level": "untriaged"
+      },
+      "MAX_CLIENT_WAIT_TIMEOUT_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "MAX_COLOR_ATTACHMENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COLOR_ATTACHMENTS_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
       "MAX_COMBINED_TEXTURE_IMAGE_UNITS": {
         "support_level": "untriaged"
       },
+      "MAX_COMBINED_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
       "MAX_CUBE_MAP_TEXTURE_SIZE": {
         "support_level": "untriaged"
       },
+      "MAX_DRAW_BUFFERS": {
+        "support_level": "untriaged"
+      },
+      "MAX_DRAW_BUFFERS_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENTS_INDICES": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENTS_VERTICES": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENT_INDEX": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_INPUT_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
       "MAX_FRAGMENT_UNIFORM_VECTORS": {
         "support_level": "untriaged"
       },
+      "MAX_PROGRAM_TEXEL_OFFSET": {
+        "support_level": "untriaged"
+      },
       "MAX_RENDERBUFFER_SIZE": {
         "support_level": "untriaged"
       },
+      "MAX_SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "MAX_SERVER_WAIT_TIMEOUT": {
+        "support_level": "untriaged"
+      },
       "MAX_TEXTURE_IMAGE_UNITS": {
         "support_level": "untriaged"
       },
+      "MAX_TEXTURE_LOD_BIAS": {
+        "support_level": "untriaged"
+      },
       "MAX_TEXTURE_SIZE": {
         "support_level": "untriaged"
       },
+      "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_UNIFORM_BLOCK_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_UNIFORM_BUFFER_BINDINGS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VARYING_COMPONENTS": {
+        "support_level": "untriaged"
+      },
       "MAX_VARYING_VECTORS": {
         "support_level": "untriaged"
       },
       "MAX_VERTEX_ATTRIBS": {
         "support_level": "untriaged"
       },
+      "MAX_VERTEX_OUTPUT_COMPONENTS": {
+        "support_level": "untriaged"
+      },
       "MAX_VERTEX_TEXTURE_IMAGE_UNITS": {
         "support_level": "untriaged"
       },
+      "MAX_VERTEX_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
       "MAX_VERTEX_UNIFORM_VECTORS": {
         "support_level": "untriaged"
       },
@@ -22229,6 +24436,12 @@
       "MEDIUM_INT": {
         "support_level": "untriaged"
       },
+      "MIN": {
+        "support_level": "untriaged"
+      },
+      "MIN_PROGRAM_TEXEL_OFFSET": {
+        "support_level": "untriaged"
+      },
       "MIRRORED_REPEAT": {
         "support_level": "untriaged"
       },
@@ -22256,6 +24469,9 @@
       "NO_ERROR": {
         "support_level": "untriaged"
       },
+      "OBJECT_TYPE": {
+        "support_level": "untriaged"
+      },
       "ONE": {
         "support_level": "untriaged"
       },
@@ -22283,6 +24499,27 @@
       "PACK_ALIGNMENT": {
         "support_level": "untriaged"
       },
+      "PACK_ROW_LENGTH": {
+        "support_level": "untriaged"
+      },
+      "PACK_SKIP_PIXELS": {
+        "support_level": "untriaged"
+      },
+      "PACK_SKIP_ROWS": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_PACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_PACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_UNPACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_UNPACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
       "POINTS": {
         "support_level": "untriaged"
       },
@@ -22295,9 +24532,66 @@
       "POLYGON_OFFSET_UNITS": {
         "support_level": "untriaged"
       },
+      "QUERY_RESULT": {
+        "support_level": "untriaged"
+      },
+      "QUERY_RESULT_AVAILABLE": {
+        "support_level": "untriaged"
+      },
+      "R11F_G11F_B10F": {
+        "support_level": "untriaged"
+      },
+      "R16F": {
+        "support_level": "untriaged"
+      },
+      "R16I": {
+        "support_level": "untriaged"
+      },
+      "R16UI": {
+        "support_level": "untriaged"
+      },
+      "R32F": {
+        "support_level": "untriaged"
+      },
+      "R32I": {
+        "support_level": "untriaged"
+      },
+      "R32UI": {
+        "support_level": "untriaged"
+      },
+      "R8": {
+        "support_level": "untriaged"
+      },
+      "R8I": {
+        "support_level": "untriaged"
+      },
+      "R8UI": {
+        "support_level": "untriaged"
+      },
+      "R8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RASTERIZER_DISCARD": {
+        "support_level": "untriaged"
+      },
+      "READ_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "READ_FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "READ_FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "RED": {
+        "support_level": "untriaged"
+      },
       "RED_BITS": {
         "support_level": "untriaged"
       },
+      "RED_INTEGER": {
+        "support_level": "untriaged"
+      },
       "RENDERBUFFER": {
         "support_level": "untriaged"
       },
@@ -22325,6 +24619,9 @@
       "RENDERBUFFER_RED_SIZE": {
         "support_level": "untriaged"
       },
+      "RENDERBUFFER_SAMPLES": {
+        "support_level": "untriaged"
+      },
       "RENDERBUFFER_STENCIL_SIZE": {
         "support_level": "untriaged"
       },
@@ -22340,27 +24637,156 @@
       "REPLACE": {
         "support_level": "untriaged"
       },
+      "RG": {
+        "support_level": "untriaged"
+      },
+      "RG16F": {
+        "support_level": "untriaged"
+      },
+      "RG16I": {
+        "support_level": "untriaged"
+      },
+      "RG16UI": {
+        "support_level": "untriaged"
+      },
+      "RG32F": {
+        "support_level": "untriaged"
+      },
+      "RG32I": {
+        "support_level": "untriaged"
+      },
+      "RG32UI": {
+        "support_level": "untriaged"
+      },
+      "RG8": {
+        "support_level": "untriaged"
+      },
+      "RG8I": {
+        "support_level": "untriaged"
+      },
+      "RG8UI": {
+        "support_level": "untriaged"
+      },
+      "RG8_SNORM": {
+        "support_level": "untriaged"
+      },
       "RGB": {
         "support_level": "untriaged"
       },
+      "RGB10_A2": {
+        "support_level": "untriaged"
+      },
+      "RGB10_A2UI": {
+        "support_level": "untriaged"
+      },
+      "RGB16F": {
+        "support_level": "untriaged"
+      },
+      "RGB16I": {
+        "support_level": "untriaged"
+      },
+      "RGB16UI": {
+        "support_level": "untriaged"
+      },
+      "RGB32F": {
+        "support_level": "untriaged"
+      },
+      "RGB32I": {
+        "support_level": "untriaged"
+      },
+      "RGB32UI": {
+        "support_level": "untriaged"
+      },
       "RGB565": {
         "support_level": "untriaged"
       },
       "RGB5_A1": {
         "support_level": "untriaged"
       },
+      "RGB8": {
+        "support_level": "untriaged"
+      },
+      "RGB8I": {
+        "support_level": "untriaged"
+      },
+      "RGB8UI": {
+        "support_level": "untriaged"
+      },
+      "RGB8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGB9_E5": {
+        "support_level": "untriaged"
+      },
       "RGBA": {
         "support_level": "untriaged"
       },
+      "RGBA16F": {
+        "support_level": "untriaged"
+      },
+      "RGBA16I": {
+        "support_level": "untriaged"
+      },
+      "RGBA16UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA32F": {
+        "support_level": "untriaged"
+      },
+      "RGBA32I": {
+        "support_level": "untriaged"
+      },
+      "RGBA32UI": {
+        "support_level": "untriaged"
+      },
       "RGBA4": {
         "support_level": "untriaged"
       },
+      "RGBA8": {
+        "support_level": "untriaged"
+      },
+      "RGBA8I": {
+        "support_level": "untriaged"
+      },
+      "RGBA8UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGBA_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RGB_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RG_INTEGER": {
+        "support_level": "untriaged"
+      },
       "SAMPLER_2D": {
         "support_level": "untriaged"
       },
+      "SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_ARRAY_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_BINDING": {
+        "support_level": "untriaged"
+      },
       "SAMPLER_CUBE": {
         "support_level": "untriaged"
       },
+      "SAMPLER_CUBE_SHADOW": {
+        "support_level": "untriaged"
+      },
       "SAMPLES": {
         "support_level": "untriaged"
       },
@@ -22385,6 +24811,9 @@
       "SCISSOR_TEST": {
         "support_level": "untriaged"
       },
+      "SEPARATE_ATTRIBS": {
+        "support_level": "untriaged"
+      },
       "SHADER_TYPE": {
         "support_level": "untriaged"
       },
@@ -22394,6 +24823,12 @@
       "SHORT": {
         "support_level": "untriaged"
       },
+      "SIGNALED": {
+        "support_level": "untriaged"
+      },
+      "SIGNED_NORMALIZED": {
+        "support_level": "untriaged"
+      },
       "SRC_ALPHA": {
         "support_level": "untriaged"
       },
@@ -22403,9 +24838,27 @@
       "SRC_COLOR": {
         "support_level": "untriaged"
       },
+      "SRGB": {
+        "support_level": "untriaged"
+      },
+      "SRGB8": {
+        "support_level": "untriaged"
+      },
+      "SRGB8_ALPHA8": {
+        "support_level": "untriaged"
+      },
+      "STATIC_COPY": {
+        "support_level": "untriaged"
+      },
       "STATIC_DRAW": {
         "support_level": "untriaged"
       },
+      "STATIC_READ": {
+        "support_level": "untriaged"
+      },
+      "STENCIL": {
+        "support_level": "untriaged"
+      },
       "STENCIL_ATTACHMENT": {
         "support_level": "untriaged"
       },
@@ -22445,9 +24898,6 @@
       "STENCIL_FUNC": {
         "support_level": "untriaged"
       },
-      "STENCIL_INDEX": {
-        "support_level": "untriaged"
-      },
       "STENCIL_INDEX8": {
         "support_level": "untriaged"
       },
@@ -22469,12 +24919,36 @@
       "STENCIL_WRITEMASK": {
         "support_level": "untriaged"
       },
+      "STREAM_COPY": {
+        "support_level": "untriaged"
+      },
       "STREAM_DRAW": {
         "support_level": "untriaged"
       },
+      "STREAM_READ": {
+        "support_level": "untriaged"
+      },
       "SUBPIXEL_BITS": {
         "support_level": "untriaged"
       },
+      "SYNC_CONDITION": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FENCE": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FLAGS": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FLUSH_COMMANDS_BIT": {
+        "support_level": "untriaged"
+      },
+      "SYNC_GPU_COMMANDS_COMPLETE": {
+        "support_level": "untriaged"
+      },
+      "SYNC_STATUS": {
+        "support_level": "untriaged"
+      },
       "TEXTURE": {
         "support_level": "untriaged"
       },
@@ -22577,12 +25051,33 @@
       "TEXTURE_2D": {
         "support_level": "untriaged"
       },
+      "TEXTURE_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_3D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BASE_LEVEL": {
+        "support_level": "untriaged"
+      },
       "TEXTURE_BINDING_2D": {
         "support_level": "untriaged"
       },
+      "TEXTURE_BINDING_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_3D": {
+        "support_level": "untriaged"
+      },
       "TEXTURE_BINDING_CUBE_MAP": {
         "support_level": "untriaged"
       },
+      "TEXTURE_COMPARE_FUNC": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_COMPARE_MODE": {
+        "support_level": "untriaged"
+      },
       "TEXTURE_CUBE_MAP": {
         "support_level": "untriaged"
       },
@@ -22604,18 +25099,75 @@
       "TEXTURE_CUBE_MAP_POSITIVE_Z": {
         "support_level": "untriaged"
       },
+      "TEXTURE_IMMUTABLE_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_IMMUTABLE_LEVELS": {
+        "support_level": "untriaged"
+      },
       "TEXTURE_MAG_FILTER": {
         "support_level": "untriaged"
       },
+      "TEXTURE_MAX_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAX_LOD": {
+        "support_level": "untriaged"
+      },
       "TEXTURE_MIN_FILTER": {
         "support_level": "untriaged"
       },
+      "TEXTURE_MIN_LOD": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_R": {
+        "support_level": "untriaged"
+      },
       "TEXTURE_WRAP_S": {
         "support_level": "untriaged"
       },
       "TEXTURE_WRAP_T": {
         "support_level": "untriaged"
       },
+      "TIMEOUT_EXPIRED": {
+        "support_level": "untriaged"
+      },
+      "TIMEOUT_IGNORED": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_ACTIVE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BINDING": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_MODE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_START": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_PAUSED": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_VARYINGS": {
+        "support_level": "untriaged"
+      },
       "TRIANGLES": {
         "support_level": "untriaged"
       },
@@ -22625,6 +25177,60 @@
       "TRIANGLE_STRIP": {
         "support_level": "untriaged"
       },
+      "UNIFORM_ARRAY_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_ACTIVE_UNIFORMS": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_BINDING": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_DATA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_INDEX": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_OFFSET_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_START": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_IS_ROW_MAJOR": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_MATRIX_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_OFFSET": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_TYPE": {
+        "support_level": "untriaged"
+      },
       "UNPACK_ALIGNMENT": {
         "support_level": "untriaged"
       },
@@ -22634,15 +25240,69 @@
       "UNPACK_FLIP_Y_WEBGL": {
         "support_level": "untriaged"
       },
+      "UNPACK_IMAGE_HEIGHT": {
+        "support_level": "untriaged"
+      },
       "UNPACK_PREMULTIPLY_ALPHA_WEBGL": {
         "support_level": "untriaged"
       },
+      "UNPACK_ROW_LENGTH": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_IMAGES": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_PIXELS": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_ROWS": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNALED": {
+        "support_level": "untriaged"
+      },
       "UNSIGNED_BYTE": {
         "support_level": "untriaged"
       },
       "UNSIGNED_INT": {
         "support_level": "untriaged"
       },
+      "UNSIGNED_INT_10F_11F_11F_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_24_8": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_2_10_10_10_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_5_9_9_9_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_NORMALIZED": {
+        "support_level": "untriaged"
+      },
       "UNSIGNED_SHORT": {
         "support_level": "untriaged"
       },
@@ -22664,12 +25324,21 @@
       "VERSION": {
         "support_level": "untriaged"
       },
+      "VERTEX_ARRAY_BINDING": {
+        "support_level": "untriaged"
+      },
       "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": {
         "support_level": "untriaged"
       },
+      "VERTEX_ATTRIB_ARRAY_DIVISOR": {
+        "support_level": "untriaged"
+      },
       "VERTEX_ATTRIB_ARRAY_ENABLED": {
         "support_level": "untriaged"
       },
+      "VERTEX_ATTRIB_ARRAY_INTEGER": {
+        "support_level": "untriaged"
+      },
       "VERTEX_ATTRIB_ARRAY_NORMALIZED": {
         "support_level": "untriaged"
       },
@@ -22691,6 +25360,1694 @@
       "VIEWPORT": {
         "support_level": "untriaged"
       },
+      "WAIT_FAILED": {
+        "support_level": "untriaged"
+      },
+      "ZERO": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "WebGL2RenderingContext": {
+    "members": {
+      "ACTIVE_ATTRIBUTES": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_UNIFORMS": {
+        "support_level": "untriaged"
+      },
+      "ACTIVE_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_LINE_WIDTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALIASED_POINT_SIZE_RANGE": {
+        "support_level": "untriaged"
+      },
+      "ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ALPHA_BITS": {
+        "support_level": "untriaged"
+      },
+      "ALREADY_SIGNALED": {
+        "support_level": "untriaged"
+      },
+      "ALWAYS": {
+        "support_level": "untriaged"
+      },
+      "ANY_SAMPLES_PASSED": {
+        "support_level": "untriaged"
+      },
+      "ANY_SAMPLES_PASSED_CONSERVATIVE": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "ATTACHED_SHADERS": {
+        "support_level": "untriaged"
+      },
+      "BACK": {
+        "support_level": "untriaged"
+      },
+      "BLEND": {
+        "support_level": "untriaged"
+      },
+      "BLEND_COLOR": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_DST_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_EQUATION_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "BLEND_SRC_RGB": {
+        "support_level": "untriaged"
+      },
+      "BLUE_BITS": {
+        "support_level": "untriaged"
+      },
+      "BOOL": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC2": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC3": {
+        "support_level": "untriaged"
+      },
+      "BOOL_VEC4": {
+        "support_level": "untriaged"
+      },
+      "BROWSER_DEFAULT_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "BUFFER_USAGE": {
+        "support_level": "untriaged"
+      },
+      "BYTE": {
+        "support_level": "untriaged"
+      },
+      "CCW": {
+        "support_level": "untriaged"
+      },
+      "CLAMP_TO_EDGE": {
+        "support_level": "untriaged"
+      },
+      "COLOR": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT0": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT1": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT10": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT11": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT12": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT13": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT14": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT15": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT2": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT3": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT4": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT5": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT6": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT7": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT8": {
+        "support_level": "untriaged"
+      },
+      "COLOR_ATTACHMENT9": {
+        "support_level": "untriaged"
+      },
+      "COLOR_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "COLOR_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "COLOR_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "COMPARE_REF_TO_TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "COMPILE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "COMPRESSED_TEXTURE_FORMATS": {
+        "support_level": "untriaged"
+      },
+      "CONDITION_SATISFIED": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "CONTEXT_LOST_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "COPY_READ_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "COPY_READ_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "COPY_WRITE_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "COPY_WRITE_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE": {
+        "support_level": "untriaged"
+      },
+      "CULL_FACE_MODE": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_PROGRAM": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_QUERY": {
+        "support_level": "untriaged"
+      },
+      "CURRENT_VERTEX_ATTRIB": {
+        "support_level": "untriaged"
+      },
+      "CW": {
+        "support_level": "untriaged"
+      },
+      "DECR": {
+        "support_level": "untriaged"
+      },
+      "DECR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "DELETE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH": {
+        "support_level": "untriaged"
+      },
+      "DEPTH24_STENCIL8": {
+        "support_level": "untriaged"
+      },
+      "DEPTH32F_STENCIL8": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BITS": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT16": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT24": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_COMPONENT32F": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_FUNC": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_RANGE": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_TEST": {
+        "support_level": "untriaged"
+      },
+      "DEPTH_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "DITHER": {
+        "support_level": "untriaged"
+      },
+      "DONT_CARE": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER0": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER1": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER10": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER11": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER12": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER13": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER14": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER15": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER2": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER3": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER4": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER5": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER6": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER7": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER8": {
+        "support_level": "untriaged"
+      },
+      "DRAW_BUFFER9": {
+        "support_level": "untriaged"
+      },
+      "DRAW_FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "DRAW_FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_COPY": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "DYNAMIC_READ": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "ELEMENT_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "EQUAL": {
+        "support_level": "untriaged"
+      },
+      "FASTEST": {
+        "support_level": "untriaged"
+      },
+      "FLOAT": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_32_UNSIGNED_INT_24_8_REV": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2x3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT2x4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3x2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT3x4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4x2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_MAT4x3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "FLOAT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "FRAGMENT_SHADER": {
+        "support_level": "untriaged"
+      },
+      "FRAGMENT_SHADER_DERIVATIVE_HINT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_RED_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_COMPLETE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_DEFAULT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_DIMENSIONS": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_INCOMPLETE_MULTISAMPLE": {
+        "support_level": "untriaged"
+      },
+      "FRAMEBUFFER_UNSUPPORTED": {
+        "support_level": "untriaged"
+      },
+      "FRONT": {
+        "support_level": "untriaged"
+      },
+      "FRONT_AND_BACK": {
+        "support_level": "untriaged"
+      },
+      "FRONT_FACE": {
+        "support_level": "untriaged"
+      },
+      "FUNC_ADD": {
+        "support_level": "untriaged"
+      },
+      "FUNC_REVERSE_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "FUNC_SUBTRACT": {
+        "support_level": "untriaged"
+      },
+      "GENERATE_MIPMAP_HINT": {
+        "support_level": "untriaged"
+      },
+      "GEQUAL": {
+        "support_level": "untriaged"
+      },
+      "GREATER": {
+        "support_level": "untriaged"
+      },
+      "GREEN_BITS": {
+        "support_level": "untriaged"
+      },
+      "HALF_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "HIGH_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "HIGH_INT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "IMPLEMENTATION_COLOR_READ_TYPE": {
+        "support_level": "untriaged"
+      },
+      "INCR": {
+        "support_level": "untriaged"
+      },
+      "INCR_WRAP": {
+        "support_level": "untriaged"
+      },
+      "INT": {
+        "support_level": "untriaged"
+      },
+      "INTERLEAVED_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "INT_2_10_10_10_REV": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "INT_SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "INT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "INVALID_ENUM": {
+        "support_level": "untriaged"
+      },
+      "INVALID_FRAMEBUFFER_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_INDEX": {
+        "support_level": "untriaged"
+      },
+      "INVALID_OPERATION": {
+        "support_level": "untriaged"
+      },
+      "INVALID_VALUE": {
+        "support_level": "untriaged"
+      },
+      "INVERT": {
+        "support_level": "untriaged"
+      },
+      "KEEP": {
+        "support_level": "untriaged"
+      },
+      "LEQUAL": {
+        "support_level": "untriaged"
+      },
+      "LESS": {
+        "support_level": "untriaged"
+      },
+      "LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "LINEAR_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "LINES": {
+        "support_level": "untriaged"
+      },
+      "LINE_LOOP": {
+        "support_level": "untriaged"
+      },
+      "LINE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "LINE_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "LINK_STATUS": {
+        "support_level": "untriaged"
+      },
+      "LOW_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "LOW_INT": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE": {
+        "support_level": "untriaged"
+      },
+      "LUMINANCE_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "MAX": {
+        "support_level": "untriaged"
+      },
+      "MAX_3D_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_ARRAY_TEXTURE_LAYERS": {
+        "support_level": "untriaged"
+      },
+      "MAX_CLIENT_WAIT_TIMEOUT_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "MAX_COLOR_ATTACHMENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_CUBE_MAP_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_DRAW_BUFFERS": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENTS_INDICES": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENTS_VERTICES": {
+        "support_level": "untriaged"
+      },
+      "MAX_ELEMENT_INDEX": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_INPUT_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_FRAGMENT_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_PROGRAM_TEXEL_OFFSET": {
+        "support_level": "untriaged"
+      },
+      "MAX_RENDERBUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "MAX_SERVER_WAIT_TIMEOUT": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_LOD_BIAS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TEXTURE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_UNIFORM_BLOCK_SIZE": {
+        "support_level": "untriaged"
+      },
+      "MAX_UNIFORM_BUFFER_BINDINGS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VARYING_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VARYING_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_OUTPUT_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_TEXTURE_IMAGE_UNITS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_BLOCKS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_COMPONENTS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VERTEX_UNIFORM_VECTORS": {
+        "support_level": "untriaged"
+      },
+      "MAX_VIEWPORT_DIMS": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_FLOAT": {
+        "support_level": "untriaged"
+      },
+      "MEDIUM_INT": {
+        "support_level": "untriaged"
+      },
+      "MIN": {
+        "support_level": "untriaged"
+      },
+      "MIN_PROGRAM_TEXEL_OFFSET": {
+        "support_level": "untriaged"
+      },
+      "MIRRORED_REPEAT": {
+        "support_level": "untriaged"
+      },
+      "NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_LINEAR": {
+        "support_level": "untriaged"
+      },
+      "NEAREST_MIPMAP_NEAREST": {
+        "support_level": "untriaged"
+      },
+      "NEVER": {
+        "support_level": "untriaged"
+      },
+      "NICEST": {
+        "support_level": "untriaged"
+      },
+      "NONE": {
+        "support_level": "untriaged"
+      },
+      "NOTEQUAL": {
+        "support_level": "untriaged"
+      },
+      "NO_ERROR": {
+        "support_level": "untriaged"
+      },
+      "OBJECT_TYPE": {
+        "support_level": "untriaged"
+      },
+      "ONE": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_CONSTANT_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_DST_COLOR": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "ONE_MINUS_SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "OUT_OF_MEMORY": {
+        "support_level": "untriaged"
+      },
+      "PACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "PACK_ROW_LENGTH": {
+        "support_level": "untriaged"
+      },
+      "PACK_SKIP_PIXELS": {
+        "support_level": "untriaged"
+      },
+      "PACK_SKIP_ROWS": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_PACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_PACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_UNPACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "PIXEL_UNPACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "POINTS": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FACTOR": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_FILL": {
+        "support_level": "untriaged"
+      },
+      "POLYGON_OFFSET_UNITS": {
+        "support_level": "untriaged"
+      },
+      "QUERY_RESULT": {
+        "support_level": "untriaged"
+      },
+      "QUERY_RESULT_AVAILABLE": {
+        "support_level": "untriaged"
+      },
+      "R11F_G11F_B10F": {
+        "support_level": "untriaged"
+      },
+      "R16F": {
+        "support_level": "untriaged"
+      },
+      "R16I": {
+        "support_level": "untriaged"
+      },
+      "R16UI": {
+        "support_level": "untriaged"
+      },
+      "R32F": {
+        "support_level": "untriaged"
+      },
+      "R32I": {
+        "support_level": "untriaged"
+      },
+      "R32UI": {
+        "support_level": "untriaged"
+      },
+      "R8": {
+        "support_level": "untriaged"
+      },
+      "R8I": {
+        "support_level": "untriaged"
+      },
+      "R8UI": {
+        "support_level": "untriaged"
+      },
+      "R8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RASTERIZER_DISCARD": {
+        "support_level": "untriaged"
+      },
+      "READ_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "READ_FRAMEBUFFER": {
+        "support_level": "untriaged"
+      },
+      "READ_FRAMEBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "RED": {
+        "support_level": "untriaged"
+      },
+      "RED_BITS": {
+        "support_level": "untriaged"
+      },
+      "RED_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_ALPHA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_BLUE_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_DEPTH_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_GREEN_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_HEIGHT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_INTERNAL_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_RED_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_STENCIL_SIZE": {
+        "support_level": "untriaged"
+      },
+      "RENDERBUFFER_WIDTH": {
+        "support_level": "untriaged"
+      },
+      "RENDERER": {
+        "support_level": "untriaged"
+      },
+      "REPEAT": {
+        "support_level": "untriaged"
+      },
+      "REPLACE": {
+        "support_level": "untriaged"
+      },
+      "RG": {
+        "support_level": "untriaged"
+      },
+      "RG16F": {
+        "support_level": "untriaged"
+      },
+      "RG16I": {
+        "support_level": "untriaged"
+      },
+      "RG16UI": {
+        "support_level": "untriaged"
+      },
+      "RG32F": {
+        "support_level": "untriaged"
+      },
+      "RG32I": {
+        "support_level": "untriaged"
+      },
+      "RG32UI": {
+        "support_level": "untriaged"
+      },
+      "RG8": {
+        "support_level": "untriaged"
+      },
+      "RG8I": {
+        "support_level": "untriaged"
+      },
+      "RG8UI": {
+        "support_level": "untriaged"
+      },
+      "RG8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGB": {
+        "support_level": "untriaged"
+      },
+      "RGB10_A2": {
+        "support_level": "untriaged"
+      },
+      "RGB10_A2UI": {
+        "support_level": "untriaged"
+      },
+      "RGB16F": {
+        "support_level": "untriaged"
+      },
+      "RGB16I": {
+        "support_level": "untriaged"
+      },
+      "RGB16UI": {
+        "support_level": "untriaged"
+      },
+      "RGB32F": {
+        "support_level": "untriaged"
+      },
+      "RGB32I": {
+        "support_level": "untriaged"
+      },
+      "RGB32UI": {
+        "support_level": "untriaged"
+      },
+      "RGB565": {
+        "support_level": "untriaged"
+      },
+      "RGB5_A1": {
+        "support_level": "untriaged"
+      },
+      "RGB8": {
+        "support_level": "untriaged"
+      },
+      "RGB8I": {
+        "support_level": "untriaged"
+      },
+      "RGB8UI": {
+        "support_level": "untriaged"
+      },
+      "RGB8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGB9_E5": {
+        "support_level": "untriaged"
+      },
+      "RGBA": {
+        "support_level": "untriaged"
+      },
+      "RGBA16F": {
+        "support_level": "untriaged"
+      },
+      "RGBA16I": {
+        "support_level": "untriaged"
+      },
+      "RGBA16UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA32F": {
+        "support_level": "untriaged"
+      },
+      "RGBA32I": {
+        "support_level": "untriaged"
+      },
+      "RGBA32UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA4": {
+        "support_level": "untriaged"
+      },
+      "RGBA8": {
+        "support_level": "untriaged"
+      },
+      "RGBA8I": {
+        "support_level": "untriaged"
+      },
+      "RGBA8UI": {
+        "support_level": "untriaged"
+      },
+      "RGBA8_SNORM": {
+        "support_level": "untriaged"
+      },
+      "RGBA_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RGB_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "RG_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_ARRAY_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_2D_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLER_CUBE_SHADOW": {
+        "support_level": "untriaged"
+      },
+      "SAMPLES": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_ALPHA_TO_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_BUFFERS": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_INVERT": {
+        "support_level": "untriaged"
+      },
+      "SAMPLE_COVERAGE_VALUE": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_BOX": {
+        "support_level": "untriaged"
+      },
+      "SCISSOR_TEST": {
+        "support_level": "untriaged"
+      },
+      "SEPARATE_ATTRIBS": {
+        "support_level": "untriaged"
+      },
+      "SHADER_TYPE": {
+        "support_level": "untriaged"
+      },
+      "SHADING_LANGUAGE_VERSION": {
+        "support_level": "untriaged"
+      },
+      "SHORT": {
+        "support_level": "untriaged"
+      },
+      "SIGNALED": {
+        "support_level": "untriaged"
+      },
+      "SIGNED_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA": {
+        "support_level": "untriaged"
+      },
+      "SRC_ALPHA_SATURATE": {
+        "support_level": "untriaged"
+      },
+      "SRC_COLOR": {
+        "support_level": "untriaged"
+      },
+      "SRGB": {
+        "support_level": "untriaged"
+      },
+      "SRGB8": {
+        "support_level": "untriaged"
+      },
+      "SRGB8_ALPHA8": {
+        "support_level": "untriaged"
+      },
+      "STATIC_COPY": {
+        "support_level": "untriaged"
+      },
+      "STATIC_DRAW": {
+        "support_level": "untriaged"
+      },
+      "STATIC_READ": {
+        "support_level": "untriaged"
+      },
+      "STENCIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_ATTACHMENT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BACK_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BITS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_BUFFER_BIT": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_CLEAR_VALUE": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_FUNC": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_INDEX": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_INDEX8": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_FAIL": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_PASS_DEPTH_PASS": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_REF": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_TEST": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_VALUE_MASK": {
+        "support_level": "untriaged"
+      },
+      "STENCIL_WRITEMASK": {
+        "support_level": "untriaged"
+      },
+      "STREAM_COPY": {
+        "support_level": "untriaged"
+      },
+      "STREAM_DRAW": {
+        "support_level": "untriaged"
+      },
+      "STREAM_READ": {
+        "support_level": "untriaged"
+      },
+      "SUBPIXEL_BITS": {
+        "support_level": "untriaged"
+      },
+      "SYNC_CONDITION": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FENCE": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FLAGS": {
+        "support_level": "untriaged"
+      },
+      "SYNC_FLUSH_COMMANDS_BIT": {
+        "support_level": "untriaged"
+      },
+      "SYNC_GPU_COMMANDS_COMPLETE": {
+        "support_level": "untriaged"
+      },
+      "SYNC_STATUS": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE0": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE1": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE10": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE11": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE12": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE13": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE14": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE15": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE16": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE17": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE18": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE19": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE2": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE20": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE21": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE22": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE23": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE24": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE25": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE26": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE27": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE28": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE29": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE3": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE30": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE31": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE4": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE5": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE6": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE7": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE8": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE9": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_3D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BASE_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_2D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_3D": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_BINDING_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_COMPARE_FUNC": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_COMPARE_MODE": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_NEGATIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_X": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Y": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_CUBE_MAP_POSITIVE_Z": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_IMMUTABLE_FORMAT": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_IMMUTABLE_LEVELS": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAG_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAX_LEVEL": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MAX_LOD": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MIN_FILTER": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_MIN_LOD": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_R": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_S": {
+        "support_level": "untriaged"
+      },
+      "TEXTURE_WRAP_T": {
+        "support_level": "untriaged"
+      },
+      "TIMEOUT_EXPIRED": {
+        "support_level": "untriaged"
+      },
+      "TIMEOUT_IGNORED": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_ACTIVE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BINDING": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_MODE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_BUFFER_START": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_PAUSED": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN": {
+        "support_level": "untriaged"
+      },
+      "TRANSFORM_FEEDBACK_VARYINGS": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLES": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_FAN": {
+        "support_level": "untriaged"
+      },
+      "TRIANGLE_STRIP": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_ARRAY_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_ACTIVE_UNIFORMS": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_BINDING": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_DATA_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_INDEX": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_OFFSET_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_BUFFER_START": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_IS_ROW_MAJOR": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_MATRIX_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_OFFSET": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_SIZE": {
+        "support_level": "untriaged"
+      },
+      "UNIFORM_TYPE": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_ALIGNMENT": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_COLORSPACE_CONVERSION_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_FLIP_Y_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_IMAGE_HEIGHT": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_PREMULTIPLY_ALPHA_WEBGL": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_ROW_LENGTH": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_IMAGES": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_PIXELS": {
+        "support_level": "untriaged"
+      },
+      "UNPACK_SKIP_ROWS": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNALED": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_BYTE": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_10F_11F_11F_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_24_8": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_2_10_10_10_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_5_9_9_9_REV": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_2D": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_2D_ARRAY": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_3D": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_SAMPLER_CUBE": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC2": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC3": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_INT_VEC4": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_4_4_4_4": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_5_5_1": {
+        "support_level": "untriaged"
+      },
+      "UNSIGNED_SHORT_5_6_5": {
+        "support_level": "untriaged"
+      },
+      "VALIDATE_STATUS": {
+        "support_level": "untriaged"
+      },
+      "VENDOR": {
+        "support_level": "untriaged"
+      },
+      "VERSION": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ARRAY_BINDING": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_DIVISOR": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_ENABLED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_INTEGER": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_NORMALIZED": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_POINTER": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_SIZE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_STRIDE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_ATTRIB_ARRAY_TYPE": {
+        "support_level": "untriaged"
+      },
+      "VERTEX_SHADER": {
+        "support_level": "untriaged"
+      },
+      "VIEWPORT": {
+        "support_level": "untriaged"
+      },
+      "WAIT_FAILED": {
+        "support_level": "untriaged"
+      },
       "ZERO": {
         "support_level": "untriaged"
       },
diff --git a/tools/dom/scripts/css_code_generator.py b/tools/dom/scripts/css_code_generator.py
index bbbd9eb..1d921ef 100644
--- a/tools/dom/scripts/css_code_generator.py
+++ b/tools/dom/scripts/css_code_generator.py
@@ -144,7 +144,6 @@
   }
 
 
-  @DomName('CSSStyleDeclaration.setProperty')
   void setProperty(String propertyName, String value, [String priority]) {
     return _setPropertyHelper(_browserPropertyName(propertyName),
       value, priority);
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 2a07584..9148767 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -88,7 +88,7 @@
   return common_database
 
 def GenerateFromDatabase(common_database,
-                         dart2js_output_dir, dartium_output_dir, blink_output_dir,
+                         dart2js_output_dir,
                          update_dom_metadata=False,
                          logging_level=logging.WARNING, dart_js_interop=False):
   print '\n ----- Accessing DOM using %s -----\n' % ('dart:js' if dart_js_interop else 'C++')
@@ -136,11 +136,13 @@
     event_generator = HtmlEventGenerator(webkit_database, renamer, metadata,
         template_loader)
 
-    def generate_interface(interface):
+    def generate_interface(interface, gl_constants=None):
       backend = backend_factory(interface)
       interface_generator = HtmlDartInterfaceGenerator(
           options, dart_library_emitter, event_generator, interface, backend)
       interface_generator.Generate()
+      if len(backend._gl_constants) > 0 and not(gl_constants is None):
+          gl_constants.extend(backend._gl_constants)
 
     generator.Generate(webkit_database, common_database, generate_interface)
 
@@ -171,49 +173,8 @@
 
     print 'Generated dart2js in %s seconds' % round(time.time() - start_time, 2)
 
-  if dartium_output_dir:
-    template_paths = ['html/dartium', 'html/impl', 'html/interface', '']
-    template_loader = TemplateLoader(template_dir,
-                                     template_paths,
-                                     {'DARTIUM': True,
-                                      'DART2JS': False,
-                                      'JSINTEROP': dart_js_interop})
-    backend_options = GeneratorOptions(
-        template_loader, webkit_database, type_registry, renamer,
-        metadata, dart_js_interop)
-    cpp_output_dir = os.path.join(dartium_output_dir, 'cpp')
-    cpp_library_emitter = CPPLibraryEmitter(emitters, cpp_output_dir)
-    dart_output_dir = os.path.join(dartium_output_dir, 'dart')
-    backend_factory = lambda interface:\
-        DartiumBackend(interface, cpp_library_emitter, backend_options, _logger)
-    dart_libraries = DartLibraries(
-        HTML_LIBRARY_NAMES, template_loader, 'dartium', dartium_output_dir, dart_js_interop)
-
-    print '\nGenerating dartium:\n'
-    start_time = time.time()
-
-    RunGenerator(dart_libraries, dart_output_dir, template_loader,
-                 backend_factory, dart_js_interop)
-    print 'Generated dartium in %s seconds' % round(time.time() - start_time, 2)
-
-    cpp_library_emitter.EmitDerivedSources(
-        template_loader.Load('cpp_derived_sources.template'),
-        dartium_output_dir)
-    cpp_library_emitter.EmitResolver(
-        template_loader.Load('cpp_resolver.template'), dartium_output_dir)
-    cpp_library_emitter.EmitClassIdTable(
-        webkit_database, dartium_output_dir, type_registry, renamer)
-
   emitters.Flush()
 
-  if blink_output_dir:
-    print '\nGenerating _blink:\n'
-    start_time = time.time()
-
-    Generate_Blink(blink_output_dir, webkit_database, type_registry)
-
-    print 'Generated _blink in %s seconds' % round(time.time() - start_time, 2)
-
   if update_dom_metadata:
     metadata.Flush()
 
@@ -312,12 +273,6 @@
   dart2js_output_dir = None
   if 'htmldart2js' in systems:
     dart2js_output_dir = os.path.join(output_dir, 'dart2js')
-  dartium_output_dir = None
-  if 'htmldartium' in systems:
-    dartium_output_dir = os.path.join(output_dir, 'dartium')
-  blink_output_dir = None
-  if '_blink' in systems:
-    blink_output_dir = os.path.join(output_dir, 'dartium')
 
   logging_level = options.logging_level \
     if options.logging == logging.NOTSET else options.logging
@@ -331,8 +286,6 @@
 
   GenerateFromDatabase(database,
                        dart2js_output_dir,
-                       dartium_output_dir,
-                       blink_output_dir,
                        options.update_dom_metadata,
                        logging_level,
                        options.dart_js_interop)
@@ -347,32 +300,6 @@
           os.path.join(dart2js_output_dir, '%s_dart2js.dart' % library_name),
           os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dart2js'))
 
-  if 'htmldartium' in systems:
-    _logger.info('Generating dartium single files.')
-    file_generation_start_time = time.time()
-
-    for library_name in HTML_LIBRARY_NAMES:
-      GenerateSingleFile(
-          os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name),
-          os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dartium'))
-
-    if (not(options.no_cached_patches)):
-      # Blow away the cached_patches.dart needs to be re-generated for Dartium
-      # see tools/dartium/generate_patches.sh
-      cached_patches_filename = os.path.join('..', '..', '..', 'sdk', 'lib', 'js', 'dartium',
-                                             'cached_patches.dart')
-      cached_patches = open(cached_patches_filename, 'w')
-      cached_patches.write(CACHED_PATCHES);
-      cached_patches.close()
-
-  if '_blink' in systems:
-    _logger.info('Generating dartium _blink file.')
-    file_generation_start_time = time.time()
-
-    GenerateSingleFile(
-        os.path.join(dartium_output_dir, '%s_dartium.dart' % '_blink'),
-        os.path.join('..', '..', '..', 'sdk', 'lib', '_blink', 'dartium'))
-
   print '\nGenerating single file %s seconds' % round(time.time() - file_generation_start_time, 2)
 
   end_time = time.time()
diff --git a/tools/dom/scripts/dartgenerator.py b/tools/dom/scripts/dartgenerator.py
index 52ea4b5..8faa945 100755
--- a/tools/dom/scripts/dartgenerator.py
+++ b/tools/dom/scripts/dartgenerator.py
@@ -12,7 +12,7 @@
 import re
 import shutil
 from generator import *
-from idlnode import IDLType, resolveTypedef
+from idlnode import IDLType, IDLInterface, resolveTypedef
 
 _logger = logging.getLogger('dartgenerator')
 
@@ -176,6 +176,10 @@
         continue
       interfaces.append(interface)
 
+    # All web_gl constants from WebGLRenderingContextBase, WebGL2RenderingContextBase, WebGLDrawBuffers are generated
+    # in a synthesized class WebGL.  Those IDLConstants are in web_gl_constants.
+    web_gl_constants = []
+
     # Render all interfaces into Dart and save them in files.
     for interface in self._PreOrderInterfaces(interfaces):
       interface_name = interface.id
@@ -186,7 +190,13 @@
         continue
 
       _logger.info('Generating %s' % interface.id)
-      generate_interface(interface)
+      generate_interface(interface, gl_constants = web_gl_constants)
+
+    # Generate the WEB_GL constants
+    web_gl_constants_interface = IDLInterface(None, "WebGL")
+    web_gl_constants_interface.constants = web_gl_constants
+    self._database._all_interfaces['WebGL'] = web_gl_constants_interface
+    generate_interface(web_gl_constants_interface)
 
   def _PreOrderInterfaces(self, interfaces):
     """Returns the interfaces in pre-order, i.e. parents first."""
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 3b7ac56..39736b1 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -456,19 +456,16 @@
 
 _blink_experimental_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@Experimental()",
 ]
 
 _indexed_db_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME)",
   "@SupportedBrowser(SupportedBrowser.FIREFOX, '15')",
   "@SupportedBrowser(SupportedBrowser.IE, '10')",
-  "@Experimental()",
 ]
 
 _file_system_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@Experimental()",
 ]
 
 _all_but_ie9_annotations = [
@@ -494,17 +491,14 @@
 
 _rtc_annotations = [ # Note: Firefox nightly builds also support this.
   "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@Experimental()",
 ]
 
 _shadow_dom_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME, '26')",
-  "@Experimental()",
 ]
 
 _speech_recognition_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
-  "@Experimental()",
 ]
 
 _svg_annotations = _all_but_ie9_annotations;
@@ -512,13 +506,11 @@
 _web_sql_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME)",
   "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  "@Experimental()",
 ]
 
 _webgl_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME)",
   "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-  "@Experimental()",
 ]
 
 _web_audio_annotations = _webgl_annotations
@@ -526,7 +518,6 @@
 _webkit_experimental_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME)",
   "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  "@Experimental()",
 ]
 
 # Annotations to be placed on generated members.
@@ -558,17 +549,15 @@
   'Window.webkitResolveLocalFileSystemURL': _file_system_annotations,
   'Element.createShadowRoot': [
     "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
-    "@Experimental()",
   ],
   'Element.ontransitionend': _all_but_ie9_annotations,
   # Placeholder to add experimental flag, implementation for this is
   # pending in a separate CL.
-  'Element.webkitMatchesSelector': ['@Experimental()'],
+  'Element.webkitMatchesSelector': [],
   'Event.clipboardData': [
     "@SupportedBrowser(SupportedBrowser.CHROME)",
     "@SupportedBrowser(SupportedBrowser.FIREFOX)",
     "@SupportedBrowser(SupportedBrowser.SAFARI)",
-    "@Experimental()",
   ],
   'FormData': _all_but_ie9_annotations,
   'HashChangeEvent': [
@@ -619,7 +608,6 @@
     "@SupportedBrowser(SupportedBrowser.CHROME)",
     "@SupportedBrowser(SupportedBrowser.FIREFOX)",
     "@SupportedBrowser(SupportedBrowser.SAFARI)",
-    "@Experimental()",
   ],
   'Performance': _performance_annotations,
   'PopStateEvent': _history_annotations,
@@ -760,12 +748,7 @@
       key = interface.id
       dom_name = interface.javascript_binding_name
 
-    annotations = ["@DomName('" + dom_name + "')"]
-
-    # Only add this for members, so we don't add DocsEditable to templated
-    # classes (they get it from the default class template)
-    if member_name:
-      annotations.append('@DocsEditable()');
+    annotations = []
 
     if key in _annotations:
       annotations.extend(_annotations[key])
@@ -893,10 +876,6 @@
     if dart_action:
       if dart_action == 'unstable':
         annotations.append('@Unstable()')
-      elif dart_action == 'experimental':
-        if comment:
-          annotations.append('// %s' % comment)
-        annotations.append('@Experimental() // %s' % support_level)
       elif dart_action == 'suppress':
         if comment:
           annotations.append('// %s' % comment)
@@ -909,16 +888,6 @@
         pass
       else:
         _logger.warn('Unknown dart_action - %s:%s' % (interface_id, member_id))
-    elif support_level == 'untriaged':
-      annotations.append('@Experimental() // untriaged')
-    elif support_level == 'experimental':
-      if comment:
-        annotations.append('// %s' % comment)
-      annotations.append('@Experimental()')
-    elif support_level == 'nonstandard':
-      if comment:
-        annotations.append('// %s' % comment)
-      annotations.append('@Experimental() // non-standard')
     elif support_level == 'stable':
       pass
     elif support_level == 'deprecated':
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 52b1dfe..cbc0417 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -64,16 +64,20 @@
 
   def EmitEventGetter(self, events_class_name):
     self._members_emitter.Emit(
-        "\n  @DocsEditable()"
-        "\n  @DomName('EventTarget.addEventListener, "
         "EventTarget.removeEventListener, EventTarget.dispatchEvent')"
         "\n  @deprecated"
         "\n  $TYPE get on =>\n    new $TYPE(this);\n",
         TYPE=events_class_name)
 
   def AddMembers(self, interface, declare_only=False, dart_js_interop=False):
-    for const in sorted(interface.constants, ConstantOutputOrder):
-      self.AddConstant(const)
+    if self._interface.id == 'WebGLRenderingContextBase' or self._interface.id == 'WebGL2RenderingContextBase' or \
+        self._interface.id == 'WebGLDrawBuffers':
+      # Constants in classes WebGLRenderingContextBase, WebGL2RenderingContext, WebGLDrawBuffers are consolidated into
+      # one synthesized class (WebGL).
+      self._gl_constants.extend(interface.constants);
+    else:
+      for const in sorted(interface.constants, ConstantOutputOrder):
+        self.AddConstant(const)
 
     for attr in sorted(interface.attributes, ConstantOutputOrder):
       if attr.type.id != 'EventHandler' and attr.type.id != 'EventListener':
@@ -111,28 +115,7 @@
           convert_to_future_members):
         self.AddOperation(ConvertToFuture(info), declare_only)
 
-  def _HoistableConstants(self, interface):
-    consts = []
-    if interface.parents:
-      for parent in interface.parents:
-        parent_interface = self._database.GetInterface(parent.type.id)
-        # TODO(vsm): This should be a general check.  E.g., on private
-        # interfaces?
-        if parent.type.id == 'WebGLRenderingContextBase':
-          consts = consts + parent_interface.constants
-    return consts
-
   def AddSecondaryMembers(self, interface):
-    # With multiple inheritance, attributes and operations of non-first
-    # interfaces need to be added.  Sometimes the attribute or operation is
-    # defined in the current interface as well as a parent.  In that case we
-    # avoid making a duplicate definition and pray that the signatures match.
-    if not self._renamer.ShouldSuppressInterface(interface):
-      secondary_constants = sorted(self._HoistableConstants(interface),
-                                     ConstantOutputOrder)
-      for const in secondary_constants:
-        self.AddConstant(const)
-
     secondary_parents = self._database.TransitiveSecondaryParents(interface,
                           not self._dart_use_blink)
     remove_duplicate_parents = list(set(secondary_parents))
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index d0cb493..0148a18 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -444,6 +444,7 @@
   'SubtleCrypto.importKey',
   'SubtleCrypto.unwrapKey',
   'ShadowRoot.applyAuthorStyles',
+  'SpeechSynthesis.getVoices',
 
   'TextEvent.initTextEvent',
   # TODO(leafp): These have been converted from int to double in Chrome 37.
@@ -1109,7 +1110,8 @@
     if interface.id.startswith("SVG"):
       return 'svg'
     if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
-        or interface.id.startswith("EXT"):
+        or interface.id.startswith("EXT") \
+        or interface.id == "WebGL":    # Name of the synthesized class for WebGL constants.
       return 'web_gl'
 
     if interface.id in typed_array_renames:
@@ -1133,7 +1135,8 @@
     if interface.id.startswith("SVG"):
       return 'Svg'
     if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
-        or interface.id.startswith("EXT"):
+        or interface.id.startswith("EXT") \
+        or interface.id == 'WebGL':     # Name of the synthesized class for WebGL constants.
       return 'WebGl'
 
     if interface.id in typed_array_renames:
@@ -1153,7 +1156,9 @@
     # Strip off any standard prefixes.
     name = re.sub(r'^SVG', '', dart_name)
     name = re.sub(r'^IDB', '', name)
-    name = re.sub(r'^WebGL', '', name)
+    # Don't Strip the synthesized class name WebGL contains all rendering/draw constants.
+    if name != 'WebGL':
+      name = re.sub(r'^WebGL', '', name)
     name = re.sub(r'^WebKit', '', name)
 
     return self._CamelCaseName(name)
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 458d810..1f74820 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -39,7 +39,6 @@
     'AudioContext.createGain',
     'AudioContext.createScriptProcessor',
     'CanvasRenderingContext2D.drawImage',
-    'CanvasRenderingContext2D.fill',
     'CanvasRenderingContext2D.fillText',
     'CanvasRenderingContext2D.lineDashOffset',
     'CanvasRenderingContext2D.setLineDash',
@@ -877,6 +876,8 @@
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._current_secondary_parent = None
     self._library_name = self._renamer.GetLibraryName(self._interface)
+    # Global constants for all WebGLRenderingContextBase, WebGL2RenderingContextBase, WebGLDrawBuffers
+    self._gl_constants = []
     _logger.setLevel(logging_level)
 
   def ImplementsMergedMembers(self):
@@ -1126,14 +1127,16 @@
     input_type = self._NarrowInputType(attribute.type.id)
     metadata = self._Metadata(attribute.type.id, attribute.id, output_type)
     rename = self._RenamingAnnotation(attribute.id, html_name)
+    static_attribute = 'static' if attribute.is_static else ''
     if not read_only:
       if attribute.type.id == 'Promise':
         _logger.warn('R/W member is a Promise: %s.%s' % (self._interface.id, html_name))
+      template = '\n  $RENAME$METADATA$STATIC $TYPE $NAME;\n'
       self._members_emitter.Emit(
-          '\n  $RENAME$METADATA$TYPE $NAME;'
-          '\n',
+          template,
           RENAME=rename,
           METADATA=metadata,
+          STATIC=static_attribute,
           NAME=html_name,
           TYPE=output_type)
     else:
@@ -1165,6 +1168,7 @@
                                      PROMISE_CALL=promiseCall,
                                      NAME=html_name)
       else:
+        template = '\n  $RENAME$(ANNOTATIONS)$STATIC final $TYPE $NAME;\n'
         # Need to use a getter for list.length properties so we can add a
         # setter which throws an exception, satisfying List API.
         if self._interface_type_info.list_item_type() and html_name == 'length':
@@ -1174,6 +1178,7 @@
             template,
             RENAME=rename,
             ANNOTATIONS=metadata,
+            STATIC=static_attribute,
             NAME=html_name,
             TYPE=input_type if output_type == 'double' else output_type)
 
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 1df7f8c..31276a7 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -260,7 +260,6 @@
             self.DeriveQualifiedBlinkName(self._interface.id,
                                           dart_native_name)
         self._members_emitter.Emit(
-            '\n  @DocsEditable()\n'
             '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
             '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
             INTERFACE_NAME=self._interface_type_info.interface_name(),
diff --git a/tools/dom/src/Dimension.dart b/tools/dom/src/Dimension.dart
index d9b34d9..502b68d 100644
--- a/tools/dom/src/Dimension.dart
+++ b/tools/dom/src/Dimension.dart
@@ -5,7 +5,6 @@
  * [length measurement](https://developer.mozilla.org/en-US/docs/Web/CSS/length)
  * in CSS.
  */
-@Experimental()
 class Dimension {
   num _value;
   String _unit;
diff --git a/tools/dom/src/WebGLConstants.dart b/tools/dom/src/WebGLConstants.dart
deleted file mode 100644
index 89d87ce..0000000
--- a/tools/dom/src/WebGLConstants.dart
+++ /dev/null
@@ -1,333 +0,0 @@
-// 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.
-
-part of dom.web_gl;
-
-const int ACTIVE_ATTRIBUTES = RenderingContext.ACTIVE_ATTRIBUTES;
-const int ACTIVE_TEXTURE = RenderingContext.ACTIVE_TEXTURE;
-const int ACTIVE_UNIFORMS = RenderingContext.ACTIVE_UNIFORMS;
-const int ALIASED_LINE_WIDTH_RANGE = RenderingContext.ALIASED_LINE_WIDTH_RANGE;
-const int ALIASED_POINT_SIZE_RANGE = RenderingContext.ALIASED_POINT_SIZE_RANGE;
-const int ALPHA = RenderingContext.ALPHA;
-const int ALPHA_BITS = RenderingContext.ALPHA_BITS;
-const int ALWAYS = RenderingContext.ALWAYS;
-const int ARRAY_BUFFER = RenderingContext.ARRAY_BUFFER;
-const int ARRAY_BUFFER_BINDING = RenderingContext.ARRAY_BUFFER_BINDING;
-const int ATTACHED_SHADERS = RenderingContext.ATTACHED_SHADERS;
-const int BACK = RenderingContext.BACK;
-const int BLEND = RenderingContext.BLEND;
-const int BLEND_COLOR = RenderingContext.BLEND_COLOR;
-const int BLEND_DST_ALPHA = RenderingContext.BLEND_DST_ALPHA;
-const int BLEND_DST_RGB = RenderingContext.BLEND_DST_RGB;
-const int BLEND_EQUATION = RenderingContext.BLEND_EQUATION;
-const int BLEND_EQUATION_ALPHA = RenderingContext.BLEND_EQUATION_ALPHA;
-const int BLEND_EQUATION_RGB = RenderingContext.BLEND_EQUATION_RGB;
-const int BLEND_SRC_ALPHA = RenderingContext.BLEND_SRC_ALPHA;
-const int BLEND_SRC_RGB = RenderingContext.BLEND_SRC_RGB;
-const int BLUE_BITS = RenderingContext.BLUE_BITS;
-const int BOOL = RenderingContext.BOOL;
-const int BOOL_VEC2 = RenderingContext.BOOL_VEC2;
-const int BOOL_VEC3 = RenderingContext.BOOL_VEC3;
-const int BOOL_VEC4 = RenderingContext.BOOL_VEC4;
-const int BROWSER_DEFAULT_WEBGL = RenderingContext.BROWSER_DEFAULT_WEBGL;
-const int BUFFER_SIZE = RenderingContext.BUFFER_SIZE;
-const int BUFFER_USAGE = RenderingContext.BUFFER_USAGE;
-const int BYTE = RenderingContext.BYTE;
-const int CCW = RenderingContext.CCW;
-const int CLAMP_TO_EDGE = RenderingContext.CLAMP_TO_EDGE;
-const int COLOR_ATTACHMENT0 = RenderingContext.COLOR_ATTACHMENT0;
-const int COLOR_BUFFER_BIT = RenderingContext.COLOR_BUFFER_BIT;
-const int COLOR_CLEAR_VALUE = RenderingContext.COLOR_CLEAR_VALUE;
-const int COLOR_WRITEMASK = RenderingContext.COLOR_WRITEMASK;
-const int COMPILE_STATUS = RenderingContext.COMPILE_STATUS;
-const int COMPRESSED_TEXTURE_FORMATS =
-    RenderingContext.COMPRESSED_TEXTURE_FORMATS;
-const int CONSTANT_ALPHA = RenderingContext.CONSTANT_ALPHA;
-const int CONSTANT_COLOR = RenderingContext.CONSTANT_COLOR;
-const int CONTEXT_LOST_WEBGL = RenderingContext.CONTEXT_LOST_WEBGL;
-const int CULL_FACE = RenderingContext.CULL_FACE;
-const int CULL_FACE_MODE = RenderingContext.CULL_FACE_MODE;
-const int CURRENT_PROGRAM = RenderingContext.CURRENT_PROGRAM;
-const int CURRENT_VERTEX_ATTRIB = RenderingContext.CURRENT_VERTEX_ATTRIB;
-const int CW = RenderingContext.CW;
-const int DECR = RenderingContext.DECR;
-const int DECR_WRAP = RenderingContext.DECR_WRAP;
-const int DELETE_STATUS = RenderingContext.DELETE_STATUS;
-const int DEPTH_ATTACHMENT = RenderingContext.DEPTH_ATTACHMENT;
-const int DEPTH_BITS = RenderingContext.DEPTH_BITS;
-const int DEPTH_BUFFER_BIT = RenderingContext.DEPTH_BUFFER_BIT;
-const int DEPTH_CLEAR_VALUE = RenderingContext.DEPTH_CLEAR_VALUE;
-const int DEPTH_COMPONENT = RenderingContext.DEPTH_COMPONENT;
-const int DEPTH_COMPONENT16 = RenderingContext.DEPTH_COMPONENT16;
-const int DEPTH_FUNC = RenderingContext.DEPTH_FUNC;
-const int DEPTH_RANGE = RenderingContext.DEPTH_RANGE;
-const int DEPTH_STENCIL = RenderingContext.DEPTH_STENCIL;
-const int DEPTH_STENCIL_ATTACHMENT = RenderingContext.DEPTH_STENCIL_ATTACHMENT;
-const int DEPTH_TEST = RenderingContext.DEPTH_TEST;
-const int DEPTH_WRITEMASK = RenderingContext.DEPTH_WRITEMASK;
-const int DITHER = RenderingContext.DITHER;
-const int DONT_CARE = RenderingContext.DONT_CARE;
-const int DST_ALPHA = RenderingContext.DST_ALPHA;
-const int DST_COLOR = RenderingContext.DST_COLOR;
-const int DYNAMIC_DRAW = RenderingContext.DYNAMIC_DRAW;
-const int ELEMENT_ARRAY_BUFFER = RenderingContext.ELEMENT_ARRAY_BUFFER;
-const int ELEMENT_ARRAY_BUFFER_BINDING =
-    RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
-const int EQUAL = RenderingContext.EQUAL;
-const int FASTEST = RenderingContext.FASTEST;
-const int FLOAT = RenderingContext.FLOAT;
-const int FLOAT_MAT2 = RenderingContext.FLOAT_MAT2;
-const int FLOAT_MAT3 = RenderingContext.FLOAT_MAT3;
-const int FLOAT_MAT4 = RenderingContext.FLOAT_MAT4;
-const int FLOAT_VEC2 = RenderingContext.FLOAT_VEC2;
-const int FLOAT_VEC3 = RenderingContext.FLOAT_VEC3;
-const int FLOAT_VEC4 = RenderingContext.FLOAT_VEC4;
-const int FRAGMENT_SHADER = RenderingContext.FRAGMENT_SHADER;
-const int FRAMEBUFFER = RenderingContext.FRAMEBUFFER;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL =
-    RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
-const int FRAMEBUFFER_BINDING = RenderingContext.FRAMEBUFFER_BINDING;
-const int FRAMEBUFFER_COMPLETE = RenderingContext.FRAMEBUFFER_COMPLETE;
-const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT =
-    RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
-const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS =
-    RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT =
-    RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
-const int FRAMEBUFFER_UNSUPPORTED = RenderingContext.FRAMEBUFFER_UNSUPPORTED;
-const int FRONT = RenderingContext.FRONT;
-const int FRONT_AND_BACK = RenderingContext.FRONT_AND_BACK;
-const int FRONT_FACE = RenderingContext.FRONT_FACE;
-const int FUNC_ADD = RenderingContext.FUNC_ADD;
-const int FUNC_REVERSE_SUBTRACT = RenderingContext.FUNC_REVERSE_SUBTRACT;
-const int FUNC_SUBTRACT = RenderingContext.FUNC_SUBTRACT;
-const int GENERATE_MIPMAP_HINT = RenderingContext.GENERATE_MIPMAP_HINT;
-const int GEQUAL = RenderingContext.GEQUAL;
-const int GREATER = RenderingContext.GREATER;
-const int GREEN_BITS = RenderingContext.GREEN_BITS;
-const int HALF_FLOAT_OES = OesTextureHalfFloat.HALF_FLOAT_OES;
-const int HIGH_FLOAT = RenderingContext.HIGH_FLOAT;
-const int HIGH_INT = RenderingContext.HIGH_INT;
-const int INCR = RenderingContext.INCR;
-const int INCR_WRAP = RenderingContext.INCR_WRAP;
-const int INT = RenderingContext.INT;
-const int INT_VEC2 = RenderingContext.INT_VEC2;
-const int INT_VEC3 = RenderingContext.INT_VEC3;
-const int INT_VEC4 = RenderingContext.INT_VEC4;
-const int INVALID_ENUM = RenderingContext.INVALID_ENUM;
-const int INVALID_FRAMEBUFFER_OPERATION =
-    RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
-const int INVALID_OPERATION = RenderingContext.INVALID_OPERATION;
-const int INVALID_VALUE = RenderingContext.INVALID_VALUE;
-const int INVERT = RenderingContext.INVERT;
-const int KEEP = RenderingContext.KEEP;
-const int LEQUAL = RenderingContext.LEQUAL;
-const int LESS = RenderingContext.LESS;
-const int LINEAR = RenderingContext.LINEAR;
-const int LINEAR_MIPMAP_LINEAR = RenderingContext.LINEAR_MIPMAP_LINEAR;
-const int LINEAR_MIPMAP_NEAREST = RenderingContext.LINEAR_MIPMAP_NEAREST;
-const int LINES = RenderingContext.LINES;
-const int LINE_LOOP = RenderingContext.LINE_LOOP;
-const int LINE_STRIP = RenderingContext.LINE_STRIP;
-const int LINE_WIDTH = RenderingContext.LINE_WIDTH;
-const int LINK_STATUS = RenderingContext.LINK_STATUS;
-const int LOW_FLOAT = RenderingContext.LOW_FLOAT;
-const int LOW_INT = RenderingContext.LOW_INT;
-const int LUMINANCE = RenderingContext.LUMINANCE;
-const int LUMINANCE_ALPHA = RenderingContext.LUMINANCE_ALPHA;
-const int MAX_COMBINED_TEXTURE_IMAGE_UNITS =
-    RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
-const int MAX_CUBE_MAP_TEXTURE_SIZE =
-    RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
-const int MAX_FRAGMENT_UNIFORM_VECTORS =
-    RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
-const int MAX_RENDERBUFFER_SIZE = RenderingContext.MAX_RENDERBUFFER_SIZE;
-const int MAX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
-const int MAX_TEXTURE_SIZE = RenderingContext.MAX_TEXTURE_SIZE;
-const int MAX_VARYING_VECTORS = RenderingContext.MAX_VARYING_VECTORS;
-const int MAX_VERTEX_ATTRIBS = RenderingContext.MAX_VERTEX_ATTRIBS;
-const int MAX_VERTEX_TEXTURE_IMAGE_UNITS =
-    RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
-const int MAX_VERTEX_UNIFORM_VECTORS =
-    RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
-const int MAX_VIEWPORT_DIMS = RenderingContext.MAX_VIEWPORT_DIMS;
-const int MEDIUM_FLOAT = RenderingContext.MEDIUM_FLOAT;
-const int MEDIUM_INT = RenderingContext.MEDIUM_INT;
-const int MIRRORED_REPEAT = RenderingContext.MIRRORED_REPEAT;
-const int NEAREST = RenderingContext.NEAREST;
-const int NEAREST_MIPMAP_LINEAR = RenderingContext.NEAREST_MIPMAP_LINEAR;
-const int NEAREST_MIPMAP_NEAREST = RenderingContext.NEAREST_MIPMAP_NEAREST;
-const int NEVER = RenderingContext.NEVER;
-const int NICEST = RenderingContext.NICEST;
-const int NONE = RenderingContext.NONE;
-const int NOTEQUAL = RenderingContext.NOTEQUAL;
-const int NO_ERROR = RenderingContext.NO_ERROR;
-const int ONE = RenderingContext.ONE;
-const int ONE_MINUS_CONSTANT_ALPHA = RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
-const int ONE_MINUS_CONSTANT_COLOR = RenderingContext.ONE_MINUS_CONSTANT_COLOR;
-const int ONE_MINUS_DST_ALPHA = RenderingContext.ONE_MINUS_DST_ALPHA;
-const int ONE_MINUS_DST_COLOR = RenderingContext.ONE_MINUS_DST_COLOR;
-const int ONE_MINUS_SRC_ALPHA = RenderingContext.ONE_MINUS_SRC_ALPHA;
-const int ONE_MINUS_SRC_COLOR = RenderingContext.ONE_MINUS_SRC_COLOR;
-const int OUT_OF_MEMORY = RenderingContext.OUT_OF_MEMORY;
-const int PACK_ALIGNMENT = RenderingContext.PACK_ALIGNMENT;
-const int POINTS = RenderingContext.POINTS;
-const int POLYGON_OFFSET_FACTOR = RenderingContext.POLYGON_OFFSET_FACTOR;
-const int POLYGON_OFFSET_FILL = RenderingContext.POLYGON_OFFSET_FILL;
-const int POLYGON_OFFSET_UNITS = RenderingContext.POLYGON_OFFSET_UNITS;
-const int RED_BITS = RenderingContext.RED_BITS;
-const int RENDERBUFFER = RenderingContext.RENDERBUFFER;
-const int RENDERBUFFER_ALPHA_SIZE = RenderingContext.RENDERBUFFER_ALPHA_SIZE;
-const int RENDERBUFFER_BINDING = RenderingContext.RENDERBUFFER_BINDING;
-const int RENDERBUFFER_BLUE_SIZE = RenderingContext.RENDERBUFFER_BLUE_SIZE;
-const int RENDERBUFFER_DEPTH_SIZE = RenderingContext.RENDERBUFFER_DEPTH_SIZE;
-const int RENDERBUFFER_GREEN_SIZE = RenderingContext.RENDERBUFFER_GREEN_SIZE;
-const int RENDERBUFFER_HEIGHT = RenderingContext.RENDERBUFFER_HEIGHT;
-const int RENDERBUFFER_INTERNAL_FORMAT =
-    RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
-const int RENDERBUFFER_RED_SIZE = RenderingContext.RENDERBUFFER_RED_SIZE;
-const int RENDERBUFFER_STENCIL_SIZE =
-    RenderingContext.RENDERBUFFER_STENCIL_SIZE;
-const int RENDERBUFFER_WIDTH = RenderingContext.RENDERBUFFER_WIDTH;
-const int RENDERER = RenderingContext.RENDERER;
-const int REPEAT = RenderingContext.REPEAT;
-const int REPLACE = RenderingContext.REPLACE;
-const int RGB = RenderingContext.RGB;
-const int RGB565 = RenderingContext.RGB565;
-const int RGB5_A1 = RenderingContext.RGB5_A1;
-const int RGBA = RenderingContext.RGBA;
-const int RGBA4 = RenderingContext.RGBA4;
-const int SAMPLER_2D = RenderingContext.SAMPLER_2D;
-const int SAMPLER_CUBE = RenderingContext.SAMPLER_CUBE;
-const int SAMPLES = RenderingContext.SAMPLES;
-const int SAMPLE_ALPHA_TO_COVERAGE = RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
-const int SAMPLE_BUFFERS = RenderingContext.SAMPLE_BUFFERS;
-const int SAMPLE_COVERAGE = RenderingContext.SAMPLE_COVERAGE;
-const int SAMPLE_COVERAGE_INVERT = RenderingContext.SAMPLE_COVERAGE_INVERT;
-const int SAMPLE_COVERAGE_VALUE = RenderingContext.SAMPLE_COVERAGE_VALUE;
-const int SCISSOR_BOX = RenderingContext.SCISSOR_BOX;
-const int SCISSOR_TEST = RenderingContext.SCISSOR_TEST;
-const int SHADER_TYPE = RenderingContext.SHADER_TYPE;
-const int SHADING_LANGUAGE_VERSION = RenderingContext.SHADING_LANGUAGE_VERSION;
-const int SHORT = RenderingContext.SHORT;
-const int SRC_ALPHA = RenderingContext.SRC_ALPHA;
-const int SRC_ALPHA_SATURATE = RenderingContext.SRC_ALPHA_SATURATE;
-const int SRC_COLOR = RenderingContext.SRC_COLOR;
-const int STATIC_DRAW = RenderingContext.STATIC_DRAW;
-const int STENCIL_ATTACHMENT = RenderingContext.STENCIL_ATTACHMENT;
-const int STENCIL_BACK_FAIL = RenderingContext.STENCIL_BACK_FAIL;
-const int STENCIL_BACK_FUNC = RenderingContext.STENCIL_BACK_FUNC;
-const int STENCIL_BACK_PASS_DEPTH_FAIL =
-    RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
-const int STENCIL_BACK_PASS_DEPTH_PASS =
-    RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
-const int STENCIL_BACK_REF = RenderingContext.STENCIL_BACK_REF;
-const int STENCIL_BACK_VALUE_MASK = RenderingContext.STENCIL_BACK_VALUE_MASK;
-const int STENCIL_BACK_WRITEMASK = RenderingContext.STENCIL_BACK_WRITEMASK;
-const int STENCIL_BITS = RenderingContext.STENCIL_BITS;
-const int STENCIL_BUFFER_BIT = RenderingContext.STENCIL_BUFFER_BIT;
-const int STENCIL_CLEAR_VALUE = RenderingContext.STENCIL_CLEAR_VALUE;
-const int STENCIL_FAIL = RenderingContext.STENCIL_FAIL;
-const int STENCIL_FUNC = RenderingContext.STENCIL_FUNC;
-const int STENCIL_INDEX8 = RenderingContext.STENCIL_INDEX8;
-const int STENCIL_PASS_DEPTH_FAIL = RenderingContext.STENCIL_PASS_DEPTH_FAIL;
-const int STENCIL_PASS_DEPTH_PASS = RenderingContext.STENCIL_PASS_DEPTH_PASS;
-const int STENCIL_REF = RenderingContext.STENCIL_REF;
-const int STENCIL_TEST = RenderingContext.STENCIL_TEST;
-const int STENCIL_VALUE_MASK = RenderingContext.STENCIL_VALUE_MASK;
-const int STENCIL_WRITEMASK = RenderingContext.STENCIL_WRITEMASK;
-const int STREAM_DRAW = RenderingContext.STREAM_DRAW;
-const int SUBPIXEL_BITS = RenderingContext.SUBPIXEL_BITS;
-const int TEXTURE = RenderingContext.TEXTURE;
-const int TEXTURE0 = RenderingContext.TEXTURE0;
-const int TEXTURE1 = RenderingContext.TEXTURE1;
-const int TEXTURE10 = RenderingContext.TEXTURE10;
-const int TEXTURE11 = RenderingContext.TEXTURE11;
-const int TEXTURE12 = RenderingContext.TEXTURE12;
-const int TEXTURE13 = RenderingContext.TEXTURE13;
-const int TEXTURE14 = RenderingContext.TEXTURE14;
-const int TEXTURE15 = RenderingContext.TEXTURE15;
-const int TEXTURE16 = RenderingContext.TEXTURE16;
-const int TEXTURE17 = RenderingContext.TEXTURE17;
-const int TEXTURE18 = RenderingContext.TEXTURE18;
-const int TEXTURE19 = RenderingContext.TEXTURE19;
-const int TEXTURE2 = RenderingContext.TEXTURE2;
-const int TEXTURE20 = RenderingContext.TEXTURE20;
-const int TEXTURE21 = RenderingContext.TEXTURE21;
-const int TEXTURE22 = RenderingContext.TEXTURE22;
-const int TEXTURE23 = RenderingContext.TEXTURE23;
-const int TEXTURE24 = RenderingContext.TEXTURE24;
-const int TEXTURE25 = RenderingContext.TEXTURE25;
-const int TEXTURE26 = RenderingContext.TEXTURE26;
-const int TEXTURE27 = RenderingContext.TEXTURE27;
-const int TEXTURE28 = RenderingContext.TEXTURE28;
-const int TEXTURE29 = RenderingContext.TEXTURE29;
-const int TEXTURE3 = RenderingContext.TEXTURE3;
-const int TEXTURE30 = RenderingContext.TEXTURE30;
-const int TEXTURE31 = RenderingContext.TEXTURE31;
-const int TEXTURE4 = RenderingContext.TEXTURE4;
-const int TEXTURE5 = RenderingContext.TEXTURE5;
-const int TEXTURE6 = RenderingContext.TEXTURE6;
-const int TEXTURE7 = RenderingContext.TEXTURE7;
-const int TEXTURE8 = RenderingContext.TEXTURE8;
-const int TEXTURE9 = RenderingContext.TEXTURE9;
-const int TEXTURE_2D = RenderingContext.TEXTURE_2D;
-const int TEXTURE_BINDING_2D = RenderingContext.TEXTURE_BINDING_2D;
-const int TEXTURE_BINDING_CUBE_MAP = RenderingContext.TEXTURE_BINDING_CUBE_MAP;
-const int TEXTURE_CUBE_MAP = RenderingContext.TEXTURE_CUBE_MAP;
-const int TEXTURE_CUBE_MAP_NEGATIVE_X =
-    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Y =
-    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Z =
-    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
-const int TEXTURE_CUBE_MAP_POSITIVE_X =
-    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
-const int TEXTURE_CUBE_MAP_POSITIVE_Y =
-    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
-const int TEXTURE_CUBE_MAP_POSITIVE_Z =
-    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
-const int TEXTURE_MAG_FILTER = RenderingContext.TEXTURE_MAG_FILTER;
-const int TEXTURE_MIN_FILTER = RenderingContext.TEXTURE_MIN_FILTER;
-const int TEXTURE_WRAP_S = RenderingContext.TEXTURE_WRAP_S;
-const int TEXTURE_WRAP_T = RenderingContext.TEXTURE_WRAP_T;
-const int TRIANGLES = RenderingContext.TRIANGLES;
-const int TRIANGLE_FAN = RenderingContext.TRIANGLE_FAN;
-const int TRIANGLE_STRIP = RenderingContext.TRIANGLE_STRIP;
-const int UNPACK_ALIGNMENT = RenderingContext.UNPACK_ALIGNMENT;
-const int UNPACK_COLORSPACE_CONVERSION_WEBGL =
-    RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
-const int UNPACK_FLIP_Y_WEBGL = RenderingContext.UNPACK_FLIP_Y_WEBGL;
-const int UNPACK_PREMULTIPLY_ALPHA_WEBGL =
-    RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
-const int UNSIGNED_BYTE = RenderingContext.UNSIGNED_BYTE;
-const int UNSIGNED_INT = RenderingContext.UNSIGNED_INT;
-const int UNSIGNED_SHORT = RenderingContext.UNSIGNED_SHORT;
-const int UNSIGNED_SHORT_4_4_4_4 = RenderingContext.UNSIGNED_SHORT_4_4_4_4;
-const int UNSIGNED_SHORT_5_5_5_1 = RenderingContext.UNSIGNED_SHORT_5_5_5_1;
-const int UNSIGNED_SHORT_5_6_5 = RenderingContext.UNSIGNED_SHORT_5_6_5;
-const int VALIDATE_STATUS = RenderingContext.VALIDATE_STATUS;
-const int VENDOR = RenderingContext.VENDOR;
-const int VERSION = RenderingContext.VERSION;
-const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
-const int VERTEX_ATTRIB_ARRAY_ENABLED =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
-const int VERTEX_ATTRIB_ARRAY_NORMALIZED =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
-const int VERTEX_ATTRIB_ARRAY_POINTER =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
-const int VERTEX_ATTRIB_ARRAY_SIZE = RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
-const int VERTEX_ATTRIB_ARRAY_STRIDE =
-    RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
-const int VERTEX_ATTRIB_ARRAY_TYPE = RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
-const int VERTEX_SHADER = RenderingContext.VERTEX_SHADER;
-const int VIEWPORT = RenderingContext.VIEWPORT;
-const int ZERO = RenderingContext.ZERO;
diff --git a/tools/dom/src/dart2js_Console.dart b/tools/dom/src/dart2js_Console.dart
index 6166c0a..5ed9206 100644
--- a/tools/dom/src/dart2js_Console.dart
+++ b/tools/dom/src/dart2js_Console.dart
@@ -10,95 +10,73 @@
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
-  @DomName('Console.memory')
   MemoryInfo get memory =>
       _isConsoleDefined ? JS('MemoryInfo', 'window.console.memory') : null;
 
-  @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) => _isConsoleDefined
       ? JS('void', 'window.console.assertCondition(#, #)', condition, arg)
       : null;
 
-  @DomName('Console.clear')
   void clear(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.clear(#)', arg) : null;
 
-  @DomName('Console.count')
   void count(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.count(#)', arg) : null;
 
-  @DomName('Console.debug')
   void debug(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.debug(#)', arg) : null;
 
-  @DomName('Console.dir')
   void dir(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.dir(#)', arg) : null;
 
-  @DomName('Console.dirxml')
   void dirxml(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.dirxml(#)', arg) : null;
 
-  @DomName('Console.error')
   void error(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.error(#)', arg) : null;
 
-  @DomName('Console.group')
   void group(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.group(#)', arg) : null;
 
-  @DomName('Console.groupCollapsed')
   void groupCollapsed(Object arg) => _isConsoleDefined
       ? JS('void', 'window.console.groupCollapsed(#)', arg)
       : null;
 
-  @DomName('Console.groupEnd')
   void groupEnd() =>
       _isConsoleDefined ? JS('void', 'window.console.groupEnd()') : null;
 
-  @DomName('Console.info')
   void info(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.info(#)', arg) : null;
 
-  @DomName('Console.log')
   void log(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.log(#)', arg) : null;
 
-  @DomName('Console.markTimeline')
   void markTimeline(Object arg) => _isConsoleDefined
       ? JS('void', 'window.console.markTimeline(#)', arg)
       : null;
 
-  @DomName('Console.profile')
   void profile(String title) =>
       _isConsoleDefined ? JS('void', 'window.console.profile(#)', title) : null;
 
-  @DomName('Console.profileEnd')
   void profileEnd(String title) => _isConsoleDefined
       ? JS('void', 'window.console.profileEnd(#)', title)
       : null;
 
-  @DomName('Console.table')
   void table(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.table(#)', arg) : null;
 
-  @DomName('Console.time')
   void time(String title) =>
       _isConsoleDefined ? JS('void', 'window.console.time(#)', title) : null;
 
-  @DomName('Console.timeEnd')
   void timeEnd(String title) =>
       _isConsoleDefined ? JS('void', 'window.console.timeEnd(#)', title) : null;
 
-  @DomName('Console.timeStamp')
   void timeStamp(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.timeStamp(#)', arg) : null;
 
-  @DomName('Console.trace')
   void trace(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.trace(#)', arg) : null;
 
-  @DomName('Console.warn')
   void warn(Object arg) =>
       _isConsoleDefined ? JS('void', 'window.console.warn(#)', arg) : null;
 }
diff --git a/tools/dom/src/dart2js_KeyEvent.dart b/tools/dom/src/dart2js_KeyEvent.dart
index e4bc296..ad8c905 100644
--- a/tools/dom/src/dart2js_KeyEvent.dart
+++ b/tools/dom/src/dart2js_KeyEvent.dart
@@ -25,7 +25,6 @@
  * on how we can make this class work with as many international keyboards as
  * possible. Bugs welcome!
  */
-@Experimental()
 class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
@@ -230,10 +229,8 @@
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
 
-  @Experimental() // untriaged
   bool getModifierState(String keyArgument) => throw new UnimplementedError();
 
-  @Experimental() // untriaged
   bool get repeat => throw new UnimplementedError();
   bool get isComposed => throw new UnimplementedError();
   dynamic get _get_view => throw new UnimplementedError();
diff --git a/tools/dom/src/dart2js_WrappedEvent.dart b/tools/dom/src/dart2js_WrappedEvent.dart
index 02dab3d..4d2ac28 100644
--- a/tools/dom/src/dart2js_WrappedEvent.dart
+++ b/tools/dom/src/dart2js_WrappedEvent.dart
@@ -83,7 +83,6 @@
    *   from W3C.
    */
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
-  @Experimental()
   List<Node> get path => wrapped.path;
 
   dynamic get _get_currentTarget => wrapped._get_currentTarget;
diff --git a/tools/dom/src/shared_html.dart b/tools/dom/src/shared_html.dart
index d9b75ff..f2aa8a9 100644
--- a/tools/dom/src/shared_html.dart
+++ b/tools/dom/src/shared_html.dart
@@ -53,7 +53,7 @@
  * For details about CSS selector syntax, see the
  * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
  */
-ElementList<Element> querySelectorAll(String selectors) =>
+ElementList<T> querySelectorAll<T extends Element>(String selectors) =>
     document.querySelectorAll(selectors);
 
 /// A utility for changing the Dart wrapper type for elements.
diff --git a/tools/dom/templates/dart2js_impl.darttemplate b/tools/dom/templates/dart2js_impl.darttemplate
index fb30e0b..b88676a 100644
--- a/tools/dom/templates/dart2js_impl.darttemplate
+++ b/tools/dom/templates/dart2js_impl.darttemplate
@@ -4,6 +4,5 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
 $!MEMBERS}
diff --git a/tools/dom/templates/dart2js_maplike_impl.darttemplate b/tools/dom/templates/dart2js_maplike_impl.darttemplate
index c2f8f91..05af119 100644
--- a/tools/dom/templates/dart2js_maplike_impl.darttemplate
+++ b/tools/dom/templates/dart2js_maplike_impl.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index d989b1d..fc54b75 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -5,7 +5,6 @@
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:html library.
-
 /**
  * HTML elements and other resources for web-based applications that need to
  * interact with the browser and the DOM (Document Object Model).
@@ -16,20 +15,6 @@
  * check out the [Element] class, the base class for many of the HTML
  * DOM types.
  *
- * ## Other resources
- *
- * * If you've never written a web app before, try our
- * tutorials&mdash;[A Game of Darts](http://dartlang.org/docs/tutorials).
- *
- * * To see some web-based Dart apps in action and to play with the code,
- * download
- * [Dart Editor](http://www.dartlang.org/#get-started)
- * and run its built-in examples.
- *
- * * For even more examples, see
- * [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
- * on Github.
- *
  * {@category Web}
  */
 library dart.dom.html;
@@ -163,7 +148,6 @@
   HtmlElement.created() : super.created();
 
   // From NoncedElement
-  @DomName('HTMLElement.nonce')
   String nonce;
 }
 
@@ -171,7 +155,5 @@
  * Emitted for any setlike IDL entry needs a callback signature.
  * Today there is only one.
  */
-@DomName('FontFaceSetForEachCallback')
-@Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
diff --git a/tools/dom/templates/html/dart2js/impl_Console.darttemplate b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
index 4372f85..890ad2d 100644
--- a/tools/dom/templates/html/dart2js/impl_Console.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
@@ -12,91 +12,69 @@
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
-  @DomName('Console.memory')
   MemoryInfo get memory => _isConsoleDefined ?
       JS('MemoryInfo', 'console.memory') : null;
 
-  @DomName('Console.assertCondition')
   void assertCondition(bool condition, Object arg) => _isConsoleDefined ?
       JS('void', 'console.assertCondition(#, #)', condition, arg) : null;
 
-  @DomName('Console.clear')
   void clear(Object arg) => _isConsoleDefined ?
       JS('void', 'console.clear(#)', arg) : null;
 
-  @DomName('Console.count')
   void count(Object arg) => _isConsoleDefined ?
       JS('void', 'console.count(#)', arg) : null;
 
-  @DomName('Console.debug')
   void debug(Object arg) => _isConsoleDefined ?
       JS('void', 'console.debug(#)', arg) : null;
 
-  @DomName('Console.dir')
   void dir(Object arg) => _isConsoleDefined ?
       JS('void', 'console.dir(#)', arg) : null;
 
-  @DomName('Console.dirxml')
   void dirxml(Object arg) => _isConsoleDefined ?
       JS('void', 'console.dirxml(#)', arg) : null;
 
-  @DomName('Console.error')
   void error(Object arg) => _isConsoleDefined ?
       JS('void', 'console.error(#)', arg) : null;
 
-  @DomName('Console.group')
   void group(Object arg) => _isConsoleDefined ?
       JS('void', 'console.group(#)', arg) : null;
 
-  @DomName('Console.groupCollapsed')
   void groupCollapsed(Object arg) => _isConsoleDefined ?
       JS('void', 'console.groupCollapsed(#)', arg) : null;
 
-  @DomName('Console.groupEnd')
   void groupEnd() => _isConsoleDefined ?
       JS('void', 'console.groupEnd()') : null;
 
-  @DomName('Console.info')
   void info(Object arg) => _isConsoleDefined ?
       JS('void', 'console.info(#)', arg) : null;
 
-  @DomName('Console.log')
   void log(Object arg) => _isConsoleDefined ?
       JS('void', 'console.log(#)', arg) : null;
 
-  @DomName('Console.markTimeline')
   void markTimeline(Object arg) => _isConsoleDefined ?
       JS('void', 'console.markTimeline(#)', arg) : null;
 
-  @DomName('Console.profile')
   void profile(String title) => _isConsoleDefined ?
       JS('void', 'console.profile(#)', title) : null;
 
-  @DomName('Console.profileEnd')
   void profileEnd(String title) => _isConsoleDefined ?
       JS('void', 'console.profileEnd(#)', title) : null;
 
-  @DomName('Console.table')
   void table(Object arg) => _isConsoleDefined ?
       JS('void', 'console.table(#)', arg) : null;
 
-  @DomName('Console.time')
   void time(String title) => _isConsoleDefined ?
       JS('void', 'console.time(#)', title) : null;
 
-  @DomName('Console.timeEnd')
   void timeEnd(String title) => _isConsoleDefined ?
       JS('void', 'console.timeEnd(#)', title) : null;
 
-  @DomName('Console.timeStamp')
   void timeStamp(Object arg) => _isConsoleDefined ?
       JS('void', 'console.timeStamp(#)', arg) : null;
 
-  @DomName('Console.trace')
   void trace(Object arg) => _isConsoleDefined ?
       JS('void', 'console.trace(#)', arg) : null;
 
-  @DomName('Console.warn')
   void warn(Object arg) => _isConsoleDefined ?
       JS('void', 'console.warn(#)', arg) : null;
 $!MEMBERS
diff --git a/tools/dom/templates/html/dart2js/impl_HTMLAnchorElement.darttemplate b/tools/dom/templates/html/dart2js/impl_HTMLAnchorElement.darttemplate
index fb6ff5f..ede3614 100644
--- a/tools/dom/templates/html/dart2js/impl_HTMLAnchorElement.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_HTMLAnchorElement.darttemplate
@@ -4,11 +4,8 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
 $!MEMBERS
 
-  @DomName('HTMLAnchorElement.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
diff --git a/tools/dom/templates/html/dart2js/impl_HTMLAreaElement.darttemplate b/tools/dom/templates/html/dart2js/impl_HTMLAreaElement.darttemplate
index df3fdd6..ede3614 100644
--- a/tools/dom/templates/html/dart2js/impl_HTMLAreaElement.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_HTMLAreaElement.darttemplate
@@ -4,11 +4,8 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
 $!MEMBERS
 
-  @DomName('HTMLAreaElement.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
diff --git a/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate b/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
index 28374c1..dbb094f6 100644
--- a/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_KeyboardEvent.darttemplate
@@ -44,7 +44,6 @@
     return e;
   }
 
-  @DomName('KeyboardEvent.initKeyboardEvent')
   void _initKeyboardEvent(String type, bool canBubble, bool cancelable,
       Window view, String keyIdentifier, int location, bool ctrlKey,
       bool altKey, bool shiftKey, bool metaKey) {
@@ -64,13 +63,10 @@
     }
   }
 
-  @DomName('KeyboardEvent.keyCode')
   final int keyCode;
 
-  @DomName('KeyboardEvent.charCode')
   final int charCode;
 
-  @DomName('KeyboardEvent.which')
   int get which => _which;
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate b/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
index 2b582c6..f6c080a 100644
--- a/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_MouseEvent.darttemplate
@@ -22,14 +22,10 @@
   }
 $!MEMBERS
 
-  @DomName('MouseEvent.clientX') @DomName('MouseEvent.clientY')
   Point get client => new Point(_clientX, _clientY);
 
-  @DomName('MouseEvent.movementX')
-  @DomName('MouseEvent.movementY')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @Experimental()
   Point get movement => new Point(_movementX, _movementY);
 
   /**
@@ -56,19 +52,12 @@
     }
   }
 
-  @DomName('MouseEvent.screenX')
-  @DomName('MouseEvent.screenY')
   Point get screen => new Point(_screenX, _screenY);
 
-  @DomName('MouseEvent.layerX')
-  @DomName('MouseEvent.layerY')
   Point get layer => new Point(_layerX, _layerY);
 
-  @DomName('MouseEvent.pageX')
-  @DomName('MouseEvent.pageY')
   Point get page => new Point(_pageX, _pageY);
 
-  @DomName('MouseEvent.dataTransfer')
   DataTransfer get dataTransfer => JS('DataTransfer', "#['dataTransfer']", this);
 
 }
diff --git a/tools/dom/templates/html/dart2js/impl_PaymentRequest.darttemplate b/tools/dom/templates/html/dart2js/impl_PaymentRequest.darttemplate
index 3110cc8..96e0513 100644
--- a/tools/dom/templates/html/dart2js/impl_PaymentRequest.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_PaymentRequest.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
   factory PaymentRequest(List<Map> methodData, Map details,
       [Map options]) {
diff --git a/tools/dom/templates/html/dart2js/impl_URL.darttemplate b/tools/dom/templates/html/dart2js/impl_URL.darttemplate
index 1e14cca..7e7350e 100644
--- a/tools/dom/templates/html/dart2js/impl_URL.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_URL.darttemplate
@@ -24,8 +24,6 @@
       JS('void',
          '(self.URL || self.webkitURL).revokeObjectURL(#)', url);
 
-  @DomName('URL.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 
 $!MEMBERS
diff --git a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
index e336c9b..8780f3a 100644
--- a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
@@ -20,6 +20,4 @@
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 
-part '$AUXILIARY_DIR/WebGLConstants.dart';
-
 $!GENERATED_DART_FILES
diff --git a/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
index 8bb0f41..745d25b 100644
--- a/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
@@ -4,6 +4,5 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS implements EventTarget {
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
index a90e62e..d98519b 100644
--- a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
@@ -41,13 +41,10 @@
   }
 
   @JSName('decodeAudioData')
-  @DomName('AudioContext.decodeAudioData')
-  @DocsEditable()
   Future _decodeAudioData(ByteBuffer audioData,
       [DecodeSuccessCallback successCallback,
       DecodeErrorCallback errorCallback]) native;
 
-  @DomName('AudioContext.decodeAudioData')
   Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
       [DecodeSuccessCallback successCallback,
       DecodeErrorCallback errorCallback]) {
diff --git a/tools/dom/templates/html/impl/impl_AudioNode.darttemplate b/tools/dom/templates/html/impl/impl_AudioNode.darttemplate
index e5ba37a..1342ec5b 100644
--- a/tools/dom/templates/html/impl/impl_AudioNode.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AudioNode.darttemplate
@@ -6,12 +6,10 @@
 
 $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
-  @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) {
     _connect(destination, output, input);
   }
 
-  @DomName('AudioNode.connect')
   void connectParam(AudioParam destination, [int output = 0]) {
     _connect(destination, output);
   }
diff --git a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index 03a2914..574ef48 100644
--- a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -53,7 +53,6 @@
   }
 
 
-  @DomName('CSSStyleDeclaration.setProperty')
   void setProperty(String propertyName, String value, [String priority]) {
     return _setPropertyHelper(_browserPropertyName(propertyName),
       value, priority);
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index a2df9a3..ac9403d 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -11,8 +11,6 @@
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS implements CanvasRenderingContext {
 $!MEMBERS
 
-  @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
-  @DocsEditable()
   ImageData createImageDataFromImageData(ImageData imagedata) =>
     JS('ImageData', '#.createImageData(#)', this, imagedata);
 
@@ -52,7 +50,6 @@
     this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
   }
 
-  @DomName('CanvasRenderingContext2D.arc')
   void arc(num x,  num y,  num radius,  num startAngle, num endAngle,
       [bool anticlockwise = false]) {
     // TODO(terry): This should not be needed: dartbug.com/20939.
@@ -60,7 +57,6 @@
        endAngle, anticlockwise);
   }
 
-  @DomName('CanvasRenderingContext2D.createPatternFromImage')
   CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) =>
     JS('CanvasPattern', '#.createPattern(#, #)', this, image, repetitionType);
 
@@ -104,7 +100,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   void drawImageToRect(CanvasImageSource source, Rectangle destRect,
       {Rectangle sourceRect}) {
     if (sourceRect == null) {
@@ -155,7 +150,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
   void drawImage(CanvasImageSource source, num destX, num destY) native;
 
@@ -185,7 +179,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
   void drawImageScaled(CanvasImageSource source,
       num destX, num destY, num destWidth, num destHeight) native;
@@ -219,7 +212,6 @@
    *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
    * from the WHATWG.
    */
-  @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
   void drawImageScaledFromSource(CanvasImageSource source,
       num sourceX, num sourceY, num sourceWidth, num sourceHeight,
@@ -229,7 +221,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.lineDashOffset')
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
   num get lineDashOffset => JS('num',
@@ -239,7 +230,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.lineDashOffset')
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
   set lineDashOffset(num value) {
@@ -252,7 +242,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.getLineDash')
   List<num> getLineDash() {
     // TODO(14316): Firefox has this functionality with mozDash, but it's a bit
     // different.
@@ -267,7 +256,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @SupportedBrowser(SupportedBrowser.IE, '11')
   @Unstable()
-  @DomName('CanvasRenderingContext2D.setLineDash')
   void setLineDash(List<num> dash) {
     // TODO(14316): Firefox has this functionality with mozDash, but it's a bit
     // different.
@@ -293,7 +281,6 @@
    * [CanvasRenderingContext2D.textBaseLine] properties are also applied to the
    * drawn text.
    */
-  @DomName('CanvasRenderingContext2D.fillText')
   void fillText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
       JS('void', '#.fillText(#, #, #, #)', this, text, x, y, maxWidth);
@@ -302,14 +289,7 @@
     }
   }
 
-  @DomName('CanvasRenderingContext2D.fill')
-  void fill([String winding = 'nonzero']) {
-    JS('void', '#.fill(#)', this, winding);
-  }
-
   /** Deprecated always returns 1.0 */
-  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRation')
-  @Experimental()
   @deprecated
   double get backingStorePixelRatio => 1.0;
 }
diff --git a/tools/dom/templates/html/impl/impl_Comment.darttemplate b/tools/dom/templates/html/impl/impl_Comment.darttemplate
index 44b6b54..aebaf0b 100644
--- a/tools/dom/templates/html/impl/impl_Comment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Comment.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
   factory Comment([String data]) {
     return JS('returns:Comment;depends:none;effects:none;new:true',
diff --git a/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate b/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
index 317a9cc..02a4f92 100644
--- a/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
@@ -33,7 +33,6 @@
     return e;
   }
 
-  @DomName('CustomEvent.detail')
   get detail {
     if (_dartDetail != null) {
       return _dartDetail;
diff --git a/tools/dom/templates/html/impl/impl_DOMException.darttemplate b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
index 963cb3c..4eddc81 100644
--- a/tools/dom/templates/html/impl/impl_DOMException.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
@@ -41,7 +41,5 @@
     return errorName;
   }
 $!MEMBERS
-  @DomName('DOMException.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
diff --git a/tools/dom/templates/html/impl/impl_DOMRect.darttemplate b/tools/dom/templates/html/impl/impl_DOMRect.darttemplate
index 22f115e..f99d980 100644
--- a/tools/dom/templates/html/impl/impl_DOMRect.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DOMRect.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS implements Rectangle$IMPLEMENTS {
 
   // NOTE! All code below should be common with RectangleBase.
diff --git a/tools/dom/templates/html/impl/impl_DOMRectReadOnly.darttemplate b/tools/dom/templates/html/impl/impl_DOMRectReadOnly.darttemplate
index b17b5bc..912f652 100644
--- a/tools/dom/templates/html/impl/impl_DOMRectReadOnly.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DOMRectReadOnly.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS implements Rectangle$IMPLEMENTS {
 
   // NOTE! All code below should be common with RectangleBase.
diff --git a/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate b/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate
index 1636c05..940eeac 100644
--- a/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_Database.darttemplate b/tools/dom/templates/html/impl/impl_Database.darttemplate
index ef5d8bd..5bc5d1e 100644
--- a/tools/dom/templates/html/impl/impl_Database.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Database.darttemplate
@@ -4,13 +4,10 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 
   @JSName('transaction')
-  @DomName('Database.transaction')
-  @DocsEditable()
   Future<SqlTransaction> transaction_future() {
     var completer = new Completer<SqlTransaction>();
     transaction((value) {
diff --git a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate
index 2e28d10..53bc0ef 100644
--- a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate
@@ -7,8 +7,6 @@
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 
-  @DomName('DirectoryReader.readEntries')
-  @DocsEditable()
   Future<List<Entry>> readEntries() {
     var completer = new Completer<List<Entry>>();
     _readEntries((value) {
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index a7336fb..838507e 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME extends Node
 {
 
@@ -42,7 +41,6 @@
         registerElement2(tag, {'prototype': customElementClass, 'extends': extendsTag});
   }
 
-  @DomName('Document.createElement')
   @ForceInline() // Almost all call sites have one argument.
   Element createElement(String tagName, [String typeExtension]) {
     return (typeExtension == null)
@@ -52,41 +50,33 @@
 
   // The two-argument version of this is automatically generated, but we need to
   // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
-  @DomName('Document.createElement')
   _createElement_2(String tagName) =>
       JS('Element', '#.createElement(#)', this, tagName);
 
   // The three-argument version of this is automatically generated, but we need to
   // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
-  @DomName('Document.createElementNS')
   _createElementNS_2(String namespaceURI, String qualifiedName) =>
       JS('Element', '#.createElementNS(#, #)', this, namespaceURI, qualifiedName);
 
-  @DomName('Document.createElementNS')
-  @DocsEditable()
   Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
     return (typeExtension == null)
         ? _createElementNS_2(namespaceURI, qualifiedName)
         : _createElementNS(namespaceURI, qualifiedName, typeExtension);
   }
 
-  @DomName('Document.createNodeIterator')
   NodeIterator _createNodeIterator(Node root,
       [int whatToShow, NodeFilter filter])
       => JS('NodeIterator', '#.createNodeIterator(#, #, #, false)',
           this, root, whatToShow, filter);
 
-  @DomName('Document.createTreeWalker')
   TreeWalker _createTreeWalker(Node root,
       [int whatToShow, NodeFilter filter])
       => JS('TreeWalker', '#.createTreeWalker(#, #, #, false)',
           this, root, whatToShow, filter);
 
-  @DomName('Document.visibilityState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
-  @Experimental()
   String get visibilityState => JS('String',
     '(#.visibilityState || #.mozVisibilityState || #.msVisibilityState ||'
       '#.webkitVisibilityState)', this, this, this, this);
diff --git a/tools/dom/templates/html/impl/impl_DocumentType.darttemplate b/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index c894295..f8f956e 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -211,7 +211,6 @@
    * Unlike [getBoundingClientRect], the dimensions of this rectangle
    * will return the same numerical height if the element is hidden or not.
    */
-  @Experimental()
   CssRect get contentEdge;
 
   /**
@@ -226,7 +225,6 @@
    * is also a rectangle equalling the dimensions of clientHeight and
    * clientWidth.
    */
-  @Experimental()
   CssRect get paddingEdge;
 
   /**
@@ -239,7 +237,6 @@
    * will return the same numerical height if the element is hidden or not. This
    * can be used to retrieve jQuery's `outerHeight` value for an element.
    */
-  @Experimental()
   CssRect get borderEdge;
 
   /**
@@ -252,7 +249,6 @@
    * will return the same numerical height if the element is hidden or not. This
    * can be used to retrieve jQuery's `outerHeight` value for an element.
    */
-  @Experimental()
   CssRect get marginEdge;
 $!STREAM_GETTER_SIGNATURES
 }
@@ -323,7 +319,6 @@
 $!ELEMENT_STREAM_GETTERS
 }
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
   /**
@@ -598,7 +593,6 @@
    * For details about CSS selector syntax, see the
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
-  @DomName('Element.querySelectorAll')
   ElementList<T> querySelectorAll<T extends Element>(String selectors) =>
     new _FrozenElementList<T>._wrap(_querySelectorAll(selectors));
 
@@ -738,7 +732,6 @@
    * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
    * draft specification.
    */
-  @Experimental()
   void attached() {
     // For the deprecation period, call the old callback.
     enteredView();
@@ -752,19 +745,15 @@
    * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
    * draft specification.
    */
-  @Experimental()
   void detached() {
     // For the deprecation period, call the old callback.
     leftView();
   }
 
   /** *Deprecated*: override [attached] instead. */
-  @Experimental()
   @deprecated
   void enteredView() {}
 
-  @DomName('Element.getClientRects')
-  @DocsEditable()
   List<Rectangle> getClientRects() {
     var value = _getClientRects();
 
@@ -780,7 +769,6 @@
   }
 
   /** *Deprecated*: override [detached] instead. */
-  @Experimental()
   @deprecated
   void leftView() {}
 
@@ -806,7 +794,6 @@
    * for the transition, or a Map with fields corresponding to those
    * of the [Timing] object.
   **/
-  @Experimental()
   @SupportedBrowser(SupportedBrowser.CHROME, '36')
   Animation animate(Iterable<Map<String, dynamic>> frames, [timing]) {
     if (frames is! Iterable || !(frames.every((x) => x is Map))) {
@@ -825,17 +812,13 @@
       : _animate(convertedFrames, convertedTiming);
   }
 
-  @DomName('Element.animate')
   @JSName('animate')
-  @Experimental() // untriaged
   Animation _animate(Object effect, [timing]) native;
   /**
    * Called by the DOM whenever an attribute on this has been changed.
    */
   void attributeChanged(String name, String oldValue, String newValue) {}
 
-  @DomName('Element.localName')
-  @DocsEditable()
   @Returns('String')
   // Non-null for Elements.
   String get localName => JS('String', '#', _localName);
@@ -850,7 +833,6 @@
    * * [Node.namespaceURI](http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname)
    *   from W3C.
    */
-  @DomName('Element.namespaceUri')
   String get namespaceUri => _namespaceUri;
 
   /**
@@ -902,7 +884,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.mouseWheelEvent')
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const _CustomEventStreamProvider<WheelEvent>(
         Element._determineMouseWheelEventType);
@@ -915,7 +896,6 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Element.transitionEndEvent')
   static const EventStreamProvider<TransitionEvent> transitionEndEvent =
       const _CustomEventStreamProvider<TransitionEvent>(
         Element._determineTransitionEventType);
@@ -1032,7 +1012,6 @@
   /**
    * Checks if this element matches the CSS selectors.
    */
-  @Experimental()
   bool matches(String selectors) {
     if (JS('bool', '!!#.matches', this)) {
       return JS('bool', '#.matches(#)', this, selectors);
@@ -1050,7 +1029,6 @@
   }
 
   /** Checks if this element or any of its parents match the CSS selectors. */
-  @Experimental()
   bool matchesWithAncestors(String selectors) {
     var elem = this;
     do {
@@ -1069,9 +1047,7 @@
    *   from HTML5Rocks.
    * * [Shadow DOM specification](http://www.w3.org/TR/shadow-dom/) from W3C.
    */
-  @DomName('Element.createShadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
-  @Experimental()
   ShadowRoot createShadowRoot() {
     return JS('ShadowRoot',
       '(#.createShadowRoot || #.webkitCreateShadowRoot).call(#)',
@@ -1088,9 +1064,7 @@
    * * [Shadow DOM specification](http://www.w3.org/TR/shadow-dom/)
    *   from W3C.
    */
-  @DomName('Element.shadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
-  @Experimental()
   ShadowRoot get shadowRoot =>
       JS('ShadowRoot|Null', '#.shadowRoot || #.webkitShadowRoot', this, this);
 
@@ -1107,7 +1081,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get contentEdge => new _ContentCssRect(this);
 
   /**
@@ -1127,7 +1100,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get paddingEdge => new _PaddingCssRect(this);
 
   /**
@@ -1146,7 +1118,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get borderEdge => new _BorderCssRect(this);
 
   /**
@@ -1165,7 +1136,6 @@
    * animation frame is discouraged. See also:
    * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
    */
-  @Experimental()
   CssRect get marginEdge => new _MarginCssRect(this);
 
   /**
@@ -1175,7 +1145,6 @@
    * This method is the Dart equivalent to jQuery's
    * [offset](http://api.jquery.com/offset/) method.
    */
-  @Experimental()
   Point get documentOffset => offsetTo(document.documentElement);
 
   /**
@@ -1189,7 +1158,6 @@
    * element is _not_ an offset parent or transitive offset parent to this
    * element, an [ArgumentError] is thrown.
    */
-  @Experimental()
   Point offsetTo(Element parent) {
     return Element._offsetToHelper(this, parent);
   }
@@ -1430,52 +1398,29 @@
     return result;
   }
 
-  @DomName('Element.offsetParent')
-  @DocsEditable()
   final Element offsetParent;
 
-  @DomName('Element.offsetHeight')
-  @DocsEditable()
   int get offsetHeight => JS('num', '#.offsetHeight', this).round();
 
-  @DomName('Element.offsetLeft')
-  @DocsEditable()
   int get offsetLeft => JS('num', '#.offsetLeft', this).round();
 
-  @DomName('Element.offsetTop')
-  @DocsEditable()
   int get offsetTop => JS('num', '#.offsetTop', this).round();
 
-  @DomName('Element.offsetWidth')
-  @DocsEditable()
   int get offsetWidth => JS('num', '#.offsetWidth', this).round();
 
-  @DomName('Element.scrollHeight')
-  @DocsEditable()
   int get scrollHeight => JS('num', '#.scrollHeight', this).round();
-
-  @DomName('Element.scrollLeft')
-  @DocsEditable()
   int get scrollLeft => JS('num', '#.scrollLeft', this).round();
 
-  @DomName('Element.scrollLeft')
-  @DocsEditable()
   set scrollLeft(int value) {
     JS("void", "#.scrollLeft = #", this, value.round());
   }
 
-  @DomName('Element.scrollTop')
-  @DocsEditable()
   int get scrollTop => JS('num', '#.scrollTop', this).round();
 
-  @DomName('Element.scrollTop')
-  @DocsEditable()
   set scrollTop(int value) {
     JS("void", "#.scrollTop = #", this, value.round());
   }
 
-  @DomName('Element.scrollWidth')
-  @DocsEditable()
   int get scrollWidth => JS('num', '#.scrollWidth', this).round();
 
 $!MEMBERS
@@ -1484,7 +1429,6 @@
 
 class _ElementFactoryProvider {
 
-  @DomName('Document.createElement')
   // Optimization to improve performance until the dart2js compiler inlines this
   // method.
   static dynamic createElement_tag(String tag, String typeExtension) {
diff --git a/tools/dom/templates/html/impl/impl_Event.darttemplate b/tools/dom/templates/html/impl/impl_Event.darttemplate
index 6359078..45a00d5 100644
--- a/tools/dom/templates/html/impl/impl_Event.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Event.darttemplate
@@ -57,9 +57,6 @@
     throw new StateError('No selector matched for populating matchedTarget.');
   }
 
-  @DomName('Event.path')
-  @DocsEditable()
-  @Experimental()
   List<EventTarget> get path =>
     JS('bool', '!!#.composedPath', this) ? composedPath() : [];
 
diff --git a/tools/dom/templates/html/impl/impl_FileReader.darttemplate b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
index c2bbff1..366774b 100644
--- a/tools/dom/templates/html/impl/impl_FileReader.darttemplate
+++ b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
@@ -4,11 +4,8 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('FileReader.result')
-  @DocsEditable()
   Object get result {
     var res = JS('Null|String|NativeByteBuffer', '#.result', this);
     if (res is ByteBuffer) {
diff --git a/tools/dom/templates/html/impl/impl_Geolocation.darttemplate b/tools/dom/templates/html/impl/impl_Geolocation.darttemplate
index 1396e4a..456850e 100644
--- a/tools/dom/templates/html/impl/impl_Geolocation.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Geolocation.darttemplate
@@ -4,10 +4,8 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('Geolocation.getCurrentPosition')
   Future<Geoposition> getCurrentPosition({bool enableHighAccuracy,
       Duration timeout, Duration maximumAge}) {
     var options = {};
@@ -36,7 +34,6 @@
     return completer.future;
   }
 
-  @DomName('Geolocation.watchPosition')
   Stream<Geoposition> watchPosition({bool enableHighAccuracy,
       Duration timeout, Duration maximumAge}) {
 
diff --git a/tools/dom/templates/html/impl/impl_GlobalEventHandlers.darttemplate b/tools/dom/templates/html/impl/impl_GlobalEventHandlers.darttemplate
index af140f7..7ce924f 100644
--- a/tools/dom/templates/html/impl/impl_GlobalEventHandlers.darttemplate
+++ b/tools/dom/templates/html/impl/impl_GlobalEventHandlers.darttemplate
@@ -7,7 +7,6 @@
 // We implement EventTarget and have stubs for its methods because it's tricky to
 // convince the scripts to make our instance methods abstract, and the bodies that
 // get generated require `this` to be an EventTarget.
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME implements EventTarget {
 
   void addEventListener(String type, dynamic listener(Event event), [bool useCapture]);
diff --git a/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
index f9895fb..be9517a 100644
--- a/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
   factory AudioElement([String src]) => new AudioElement._(src);
diff --git a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
index 1e3a14b..bfde34a 100644
--- a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
@@ -21,7 +21,6 @@
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @Experimental()
   gl.RenderingContext getContext3d({alpha: true, depth: true, stencil: false,
     antialias: true, premultipliedAlpha: true, preserveDrawingBuffer: false}) {
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 6469079..6ad09ec 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -9,46 +9,35 @@
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 
-  @DomName('Document.body')
   BodyElement body;
 
   /// UNSTABLE: Chrome-only - create a Range from the given point.
-  @DomName('Document.caretRangeFromPoint')
   @Unstable()
   Range caretRangeFromPoint(int x, int y) {
     return _caretRangeFromPoint(x, y);
   }
 
-  @DomName('Document.elementFromPoint')
   Element elementFromPoint(int x, int y) {
     return _elementFromPoint(x, y);
   }
 
-  @DomName('Document.head')
   HeadElement get head => _head;
 
-  @DomName('Document.lastModified')
   String get lastModified => _lastModified;
 
-  @DomName('Document.preferredStylesheetSet')
   String get preferredStylesheetSet => _preferredStylesheetSet;
 
-  @DomName('Document.referrer')
   String get referrer => _referrer;
 
-  @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => _selectedStylesheetSet;
   set selectedStylesheetSet(String value) {
     _selectedStylesheetSet = value;
   }
 
-  @DomName('Document.styleSheets')
   List<StyleSheet> get styleSheets => _styleSheets;
 
-  @DomName('Document.title')
   String get title => _title;
 
-  @DomName('Document.title')
   set title(String value) {
     _title = value;
   }
@@ -65,16 +54,13 @@
    *   from WebPlatform.org.
    * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
    */
-  @DomName('Document.webkitExitFullscreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   void exitFullscreen() {
     _webkitExitFullscreen();
   }
 
 
-  @Experimental()
   /**
    * Register a custom subclass of Element to be instantiatable by the DOM.
    *
@@ -122,7 +108,6 @@
 
   /** *Deprecated*: use [registerElement] instead. */
   @deprecated
-  @Experimental()
   void register(String tag, Type customElementClass, {String extendsTag}) {
     return registerElement(tag, customElementClass, extendsTag: extendsTag);
   }
@@ -133,11 +118,9 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
-  @Experimental()
   static const EventStreamProvider<Event> visibilityChangeEvent =
       const _CustomEventStreamProvider<Event>(
         _determineVisibilityChangeEventType);
@@ -159,7 +142,6 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
-  @Experimental()
   Stream<Event> get onVisibilityChange =>
       visibilityChangeEvent.forTarget(this);
 
@@ -171,7 +153,6 @@
   ///
   /// If the type is not a direct subclass of HtmlElement then the extendsTag
   /// parameter must be provided.
-  @Experimental()
   ElementUpgrader createElementUpgrader(Type type, {String extendsTag}) {
     return new _JSElementUpgrader(this, type, extendsTag);
   }
diff --git a/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate
index 2f16d16..36795c9 100644
--- a/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_HTMLFrameSetElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLFrameSetElement.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_HTMLFrameSetElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLFrameSetElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate
index e6ad32f..12f29c3 100644
--- a/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLInputElement.darttemplate
@@ -50,40 +50,28 @@
  * Exposes the functionality common between all InputElement types.
  */
 abstract class InputElementBase implements Element {
-  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  @DomName('HTMLInputElement.disabled')
   bool disabled;
 
-  @DomName('HTMLInputElement.incremental')
   bool incremental;
 
-  @DomName('HTMLInputElement.indeterminate')
   bool indeterminate;
 
-  @DomName('HTMLInputElement.labels')
   List<Node> get labels;
 
-  @DomName('HTMLInputElement.name')
   String name;
 
-  @DomName('HTMLInputElement.validationMessage')
   String get validationMessage;
 
-  @DomName('HTMLInputElement.validity')
   ValidityState get validity;
 
-  @DomName('HTMLInputElement.value')
   String value;
 
-  @DomName('HTMLInputElement.willValidate')
   bool get willValidate;
 
-  @DomName('HTMLInputElement.checkValidity')
   bool checkValidity();
 
-  @DomName('HTMLInputElement.setCustomValidity')
   void setCustomValidity(String error);
 }
 
@@ -99,40 +87,28 @@
  * Base interface for all inputs which involve text editing.
  */
 abstract class TextInputElementBase implements InputElementBase {
-  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
-  @DomName('HTMLInputElement.size')
   int size;
 
-  @DomName('HTMLInputElement.select')
   void select();
 
-  @DomName('HTMLInputElement.selectionDirection')
   String selectionDirection;
 
-  @DomName('HTMLInputElement.selectionEnd')
   int selectionEnd;
 
-  @DomName('HTMLInputElement.selectionStart')
   int selectionStart;
 
-  @DomName('HTMLInputElement.setSelectionRange')
   void setSelectionRange(int start, int end, [String direction]);
 }
 
@@ -149,10 +125,8 @@
 abstract class SearchInputElement implements TextInputElementBase {
   factory SearchInputElement() => new InputElement(type: 'search');
 
-  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -167,10 +141,8 @@
 abstract class TextInputElement implements TextInputElementBase {
   factory TextInputElement() => new InputElement(type: 'text');
 
-  @DomName('HTMLInputElement.dirName')
   String dirName;
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 }
 
@@ -186,7 +158,6 @@
 abstract class UrlInputElement implements TextInputElementBase {
   factory UrlInputElement() => new InputElement(type: 'url');
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -210,7 +181,6 @@
 abstract class TelephoneInputElement implements TextInputElementBase {
   factory TelephoneInputElement() => new InputElement(type: 'tel');
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
   /// Returns true if this input type is supported on the current platform.
@@ -231,34 +201,24 @@
 abstract class EmailInputElement implements TextInputElementBase {
   factory EmailInputElement() => new InputElement(type: 'email');
 
-  @DomName('HTMLInputElement.autocomplete')
   String autocomplete;
 
-  @DomName('HTMLInputElement.autofocus')
   bool autofocus;
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
-  @DomName('HTMLInputElement.maxLength')
   int maxLength;
 
-  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  @DomName('HTMLInputElement.pattern')
   String pattern;
 
-  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
-  @DomName('HTMLInputElement.size')
   int size;
 
   /// Returns true if this input type is supported on the current platform.
@@ -279,25 +239,18 @@
  */
 abstract class RangeInputElementBase implements InputElementBase {
 
-  @DomName('HTMLInputElement.list')
   Element get list;
 
-  @DomName('HTMLInputElement.max')
   String max;
 
-  @DomName('HTMLInputElement.min')
   String min;
 
-  @DomName('HTMLInputElement.step')
   String step;
 
-  @DomName('HTMLInputElement.valueAsNumber')
   num valueAsNumber;
 
-  @DomName('HTMLInputElement.stepDown')
   void stepDown([int n]);
 
-  @DomName('HTMLInputElement.stepUp')
   void stepUp([int n]);
 }
 
@@ -307,17 +260,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class DateInputElement implements RangeInputElementBase {
   factory DateInputElement() => new InputElement(type: 'date');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -332,17 +281,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class MonthInputElement implements RangeInputElementBase {
   factory MonthInputElement() => new InputElement(type: 'month');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -357,17 +302,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class WeekInputElement implements RangeInputElementBase {
   factory WeekInputElement() => new InputElement(type: 'week');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -382,17 +323,13 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Experimental()
 abstract class TimeInputElement implements RangeInputElementBase {
   factory TimeInputElement() => new InputElement(type: 'time');
 
-  @DomName('HTMLInputElement.valueAsDate')
   DateTime valueAsDate;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -408,15 +345,12 @@
  * Use [supported] to check if this is supported on the current platform.
  */
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
-@Experimental()
 abstract class LocalDateTimeInputElement implements RangeInputElementBase {
   factory LocalDateTimeInputElement() =>
       new InputElement(type: 'datetime-local');
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -431,17 +365,13 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
 @SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
 abstract class NumberInputElement implements RangeInputElementBase {
   factory NumberInputElement() => new InputElement(type: 'number');
 
-  @DomName('HTMLInputElement.placeholder')
   String placeholder;
 
-  @DomName('HTMLInputElement.readOnly')
   bool readOnly;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
   /// Returns true if this input type is supported on the current platform.
@@ -458,7 +388,6 @@
  */
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE, '10')
-@Experimental()
 abstract class RangeInputElement implements RangeInputElementBase {
   factory RangeInputElement() => new InputElement(type: 'range');
 
@@ -477,10 +406,8 @@
 abstract class CheckboxInputElement implements InputElementBase {
   factory CheckboxInputElement() => new InputElement(type: 'checkbox');
 
-  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -499,10 +426,8 @@
 abstract class RadioButtonInputElement implements InputElementBase {
   factory RadioButtonInputElement() => new InputElement(type: 'radio');
 
-  @DomName('HTMLInputElement.checked')
   bool checked;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 }
 
@@ -512,16 +437,12 @@
 abstract class FileUploadInputElement implements InputElementBase {
   factory FileUploadInputElement() => new InputElement(type: 'file');
 
-  @DomName('HTMLInputElement.accept')
   String accept;
 
-  @DomName('HTMLInputElement.multiple')
   bool multiple;
 
-  @DomName('HTMLInputElement.required')
   bool required;
 
-  @DomName('HTMLInputElement.files')
   List<File> files;
 }
 
@@ -531,19 +452,14 @@
 abstract class SubmitButtonInputElement implements InputElementBase {
   factory SubmitButtonInputElement() => new InputElement(type: 'submit');
 
-  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 }
 
@@ -554,31 +470,22 @@
 abstract class ImageButtonInputElement implements InputElementBase {
   factory ImageButtonInputElement() => new InputElement(type: 'image');
 
-  @DomName('HTMLInputElement.alt')
   String alt;
 
-  @DomName('HTMLInputElement.formAction')
   String formAction;
 
-  @DomName('HTMLInputElement.formEnctype')
   String formEnctype;
 
-  @DomName('HTMLInputElement.formMethod')
   String formMethod;
 
-  @DomName('HTMLInputElement.formNoValidate')
   bool formNoValidate;
 
-  @DomName('HTMLInputElement.formTarget')
   String formTarget;
 
-  @DomName('HTMLInputElement.height')
   int height;
 
-  @DomName('HTMLInputElement.src')
   String src;
 
-  @DomName('HTMLInputElement.width')
   int width;
 }
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLLinkElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLLinkElement.darttemplate
index 831534a..92b704b3 100644
--- a/tools/dom/templates/html/impl/impl_HTMLLinkElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLLinkElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate
index 67738cd..6f71be6 100644
--- a/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate
@@ -4,14 +4,11 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('HTMLTableElement.tBodies')
   List<TableSectionElement> get tBodies =>
   new _WrappedList<TableSectionElement>(_tBodies);
 
-  @DomName('HTMLTableElement.rows')
   List<TableRowElement> get rows =>
       new _WrappedList<TableRowElement>(_rows);
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate
index 7bce32d..0b119f4 100644
--- a/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate
@@ -4,10 +4,8 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('HTMLTableRowElement.cells')
   List<TableCellElement> get cells =>
       new _WrappedList<TableCellElement>(_cells);
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate
index 00a0803..b7a08a6 100644
--- a/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate
@@ -4,10 +4,8 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('HTMLTableSectionElement.rows')
   List<TableRowElement> get rows =>
     new _WrappedList<TableRowElement>(_rows);
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLTemplateElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLTemplateElement.darttemplate
index 7d546fe..f37da96 100644
--- a/tools/dom/templates/html/impl/impl_HTMLTemplateElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLTemplateElement.darttemplate
@@ -6,7 +6,6 @@
 
 part of $LIBRARYNAME;
 
-@Experimental()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_IDBCursor.darttemplate b/tools/dom/templates/html/impl/impl_IDBCursor.darttemplate
index 0fef1c3..4154659 100644
--- a/tools/dom/templates/html/impl/impl_IDBCursor.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBCursor.darttemplate
@@ -5,7 +5,6 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
-  @DomName('IDBCursor.delete')
   Future delete() {
    try {
       return _completeRequest(_delete());
@@ -14,7 +13,6 @@
     }
   }
 
-  @DomName('IDBCursor.value')
   Future update(value) {
    try {
       return _completeRequest(_update(value));
@@ -24,7 +22,6 @@
   }
 
   @JSName('continue')
-  @DomName('IDBCursor.continue')
   void next([Object key]) {
     if (key == null) {
       JS('void', '#.continue()', this);
diff --git a/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate b/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate
index 0485ff3..76adb99 100644
--- a/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate
@@ -4,10 +4,7 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
-  @DomName('IDBDatabase.createObjectStore')
-  @DocsEditable()
   ObjectStore createObjectStore(String name,
       {String keyPath, bool autoIncrement}) {
     var options = {};
diff --git a/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate b/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
index 2fba73d..4fd732e 100644
--- a/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBFactory.darttemplate
@@ -15,7 +15,6 @@
         'window.mozIndexedDB)');
   }
 
-  @DomName('IDBFactory.open')
   Future<Database> open(String name,
       {int version, void onUpgradeNeeded(VersionChangeEvent event),
       void onBlocked(Event event)}) {
@@ -43,7 +42,6 @@
     }
   }
 
-  @DomName('IDBFactory.deleteDatabase')
   Future<IdbFactory> deleteDatabase(String name,
       {void onBlocked(Event e)}) {
     try {
diff --git a/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate b/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate
index ff033a2..608f1bc 100644
--- a/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate
@@ -5,7 +5,6 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
-  @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
    try {
       var request = _count(key_OR_range);
@@ -15,7 +14,6 @@
     }
   }
 
-  @DomName('IDBIndex.get')
   Future get(key) {
     try {
       var request = _get(key);
@@ -26,7 +24,6 @@
     }
   }
 
-  @DomName('IDBIndex.getKey')
   Future getKey(key) {
     try {
       var request = _getKey(key);
diff --git a/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate b/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate
index 28439a4..1572c87 100644
--- a/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBKeyRange.darttemplate
@@ -5,19 +5,15 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
-  @DomName('IDBKeyRange.only')
   factory KeyRange.only(/*Key*/ value) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_only(value);
 
-  @DomName('IDBKeyRange.lowerBound')
   factory KeyRange.lowerBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_lowerBound(bound, open);
 
-  @DomName('IDBKeyRange.upperBound')
   factory KeyRange.upperBound(/*Key*/ bound, [bool open = false]) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_upperBound(bound, open);
 
-  @DomName('KeyRange.bound')
   factory KeyRange.bound(/*Key*/ lower, /*Key*/ upper,
                             [bool lowerOpen = false, bool upperOpen = false]) =>
       _KeyRangeFactoryProvider.create$(CLASSNAME)_bound(
diff --git a/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate b/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
index 2dfff92..704d16e 100644
--- a/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
@@ -6,7 +6,6 @@
 
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('IDBObjectStore.add')
   Future add(value, [key]) {
     try {
       var request;
@@ -21,7 +20,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.clear')
   Future clear() {
     try {
       return _completeRequest(_clear());
@@ -30,7 +28,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.delete')
   Future delete(key_OR_keyRange){
     try {
       return _completeRequest(_delete(key_OR_keyRange));
@@ -39,7 +36,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.count')
   Future<int> count([key_OR_range]) {
    try {
       var request = _count(key_OR_range);
@@ -49,7 +45,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.put')
   Future put(value, [key]) {
     try {
       var request;
@@ -64,7 +59,6 @@
     }
   }
 
-  @DomName('IDBObjectStore.get')
   Future getObject(key) {
     try {
       var request = _get(key);
@@ -96,7 +90,6 @@
    * must be done synchronously unless they are additional async requests to
    * the current transaction.
    */
-  @DomName('IDBObjectStore.openCursor')
   Stream<CursorWithValue> openCursor({key, KeyRange range, String direction,
       bool autoAdvance}) {
     var key_OR_range = null;
@@ -119,7 +112,6 @@
     return _cursorStreamFromResult(request, autoAdvance);
   }
 
-  @DomName('IDBObjectStore.createIndex')
   Index createIndex(String name, keyPath, {bool unique, bool multiEntry}) {
     var options = {};
     if (unique != null) {
diff --git a/tools/dom/templates/html/impl/impl_IDBVersionChangeEvent.darttemplate b/tools/dom/templates/html/impl/impl_IDBVersionChangeEvent.darttemplate
index 60faa8d..f93d07e 100644
--- a/tools/dom/templates/html/impl/impl_IDBVersionChangeEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBVersionChangeEvent.darttemplate
@@ -7,8 +7,6 @@
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
   @JSName('target')
-  @DomName('IDBVersionChangeEvent.target')
-  @DocsEditable()
   final OpenDBRequest target;
 }
 
diff --git a/tools/dom/templates/html/impl/impl_Location.darttemplate b/tools/dom/templates/html/impl/impl_Location.darttemplate
index 345bc532..eb9529c 100644
--- a/tools/dom/templates/html/impl/impl_Location.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Location.darttemplate
@@ -4,11 +4,9 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 
-  @DomName('Location.origin')
   String get origin {
     if (JS('bool', '("origin" in #)', this)) {
       return JS('String', '#.origin', this);
@@ -16,7 +14,5 @@
     return '${this.protocol}//${this.host}';
   }
 
-  @DomName('Location.toString')
-  @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 }
diff --git a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
index 826f607..571ab6d2 100644
--- a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
@@ -29,13 +29,9 @@
   // TODO(alanknight): This really should be generated by the
   // _OutputConversion in the systemnative.py script, but that doesn't
   // use those conversions right now, so do this as a one-off.
-  @DomName('MessageEvent.data')
-  @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(this._get_data);
 
   @JSName('data')
-  @DomName('MessageEvent.data')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_data;
diff --git a/tools/dom/templates/html/impl/impl_Navigator.darttemplate b/tools/dom/templates/html/impl/impl_Navigator.darttemplate
index 022e9e3..5265a5b 100644
--- a/tools/dom/templates/html/impl/impl_Navigator.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Navigator.darttemplate
@@ -6,7 +6,6 @@
 
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('Navigator.getGamepads')
   List<Gamepad> getGamepads() {
     var gamepadList = _getGamepads();
 
@@ -20,7 +19,6 @@
     return gamepadList;
   }
 
-  @DomName('Navigator.language')
   String get language => JS('String', '#.language || #.userLanguage', this,
       this);
 
@@ -59,9 +57,7 @@
    * See also:
    * * [MediaStream.supported]
    */
-  @DomName('Navigator.webkitGetUserMedia')
   @SupportedBrowser(SupportedBrowser.CHROME)
-  @Experimental()
   Future<MediaStream> getUserMedia({audio: false, video: false}) {
     var completer = new Completer<MediaStream>();
     var options = {
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index a05ab6e..fef9633 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -199,7 +199,6 @@
   /**
    * Removes this node from the DOM.
    */
-  @DomName('Node.removeChild')
   void remove() {
     // TODO(jacobr): should we throw an exception if parent is already null?
     // TODO(vsm): Use the native remove when available.
@@ -212,7 +211,6 @@
   /**
    * Replaces this node with another node.
    */
-  @DomName('Node.replaceChild')
   Node replaceWith(Node otherNode) {
     try {
       final Node parent = this.parentNode;
@@ -270,8 +268,6 @@
    * * [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
    *   from MDN.
    */
-  @DomName('Node.childNodes')
-  @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
   final List<Node> childNodes;
diff --git a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
index c1ed25a..508af04 100644
--- a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
+++ b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
@@ -50,9 +50,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.generateCertificate')
-  @DocsEditable()
-  @Experimental() // untriaged
   static Future generateCertificate(/*AlgorithmIdentifier*/ keygenAlgorithm) =>
       JS('dynamic', 'generateCertificate(#)', keygenAlgorithm);
 
diff --git a/tools/dom/templates/html/impl/impl_Range.darttemplate b/tools/dom/templates/html/impl/impl_Range.darttemplate
index c6dba15..f420027 100644
--- a/tools/dom/templates/html/impl/impl_Range.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Range.darttemplate
@@ -13,8 +13,6 @@
       document._caretRangeFromPoint(point.x, point.y);
 $!MEMBERS
 
-  @DomName('Range.getClientRects')
-  @DocsEditable()
   List<Rectangle> getClientRects() {
     var value = _getClientRects();
 
diff --git a/tools/dom/templates/html/impl/impl_SVGColor.darttemplate b/tools/dom/templates/html/impl/impl_SVGColor.darttemplate
index 053f229..0a06097 100644
--- a/tools/dom/templates/html/impl/impl_SVGColor.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGColor.darttemplate
@@ -6,7 +6,6 @@
 
 // Hack because the baseclass is private in dart:html, and we want to omit this
 // type entirely but can't.
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$IMPLEMENTS {
   _SVGColor.internal();
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
index bcd5eb5..2c4cd6a 100644
--- a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
@@ -112,18 +112,15 @@
 
   // Unsupported methods inherited from Element.
 
-  @DomName('Element.insertAdjacentText')
   void insertAdjacentText(String where, String text) {
     throw new UnsupportedError("Cannot invoke insertAdjacentText on SVG.");
   }
 
-  @DomName('Element.insertAdjacentHTML')
   void insertAdjacentHtml(String where, String text, {NodeValidator validator,
       NodeTreeSanitizer treeSanitizer}) {
     throw new UnsupportedError("Cannot invoke insertAdjacentHtml on SVG.");
   }
 
-  @DomName('Element.insertAdjacentElement')
   Element insertAdjacentElement(String where, Element element) {
     throw new UnsupportedError("Cannot invoke insertAdjacentElement on SVG.");
   }
diff --git a/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_Screen.darttemplate b/tools/dom/templates/html/impl/impl_Screen.darttemplate
index efffa28..e31aed5 100644
--- a/tools/dom/templates/html/impl/impl_Screen.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Screen.darttemplate
@@ -4,13 +4,8 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
-  @DomName('Screen.availHeight')
-  @DomName('Screen.availLeft')
-  @DomName('Screen.availTop')
-  @DomName('Screen.availWidth')
   Rectangle get available => new Rectangle(_availLeft, _availTop, _availWidth,
       _availHeight);
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate b/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
index 63ba163..2df0f3b 100644
--- a/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
@@ -13,13 +13,9 @@
   // TODO(alanknight): This really should be generated by the
   // _OutputConversion in the systemnative.py script, but that doesn't
   // use those conversions right now, so do this as a one-off.
-  @DomName('ServiceWorkerMessageEvent.data')
-  @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(this._get_data);
 
   @JSName('data')
-  @DomName('ServiceWorkerMessageEvent.data')
-  @DocsEditable()
   @annotation_Creates_SerializedScriptValue
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_data;
diff --git a/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate b/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
new file mode 100644
index 0000000..20e19cf
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
@@ -0,0 +1,19 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of $LIBRARYNAME;
+
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS
+{
+  @DomName('SpeechSynthesis.getVoices')
+  @DocsEditable()
+  List<SpeechSynthesisVoice> getVoices() {
+    List<SpeechSynthesisVoice> voices = _getVoices();
+    if (voices.length > 0)
+      applyExtension('SpeechSynthesisVoice', voices[0]);
+    return voices;
+  }
+
+$!MEMBERS
+}
diff --git a/tools/dom/templates/html/impl/impl_Touch.darttemplate b/tools/dom/templates/html/impl/impl_Touch.darttemplate
index 7f599fa..ef3b5c2 100644
--- a/tools/dom/templates/html/impl/impl_Touch.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Touch.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 
@@ -19,30 +18,18 @@
   int get __radiusX => JS('num', '#.radiusX', this).round();
   int get __radiusY => JS('num', '#.radiusY', this).round();
 
-  @DomName('Touch.clientX')
-  @DomName('Touch.clientY')
   Point get client => new Point(__clientX, __clientY);
 
-  @DomName('Touch.pageX')
-  @DomName('Touch.pageY')
   Point get page => new Point(__pageX, __pageY);
 
-  @DomName('Touch.screenX')
-  @DomName('Touch.screenY')
   Point get screen => new Point(__screenX, __screenY);
 
-  @DomName('Touch.radiusX')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   int get radiusX => __radiusX;
 
-  @DomName('Touch.radiusY')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   int get radiusY => __radiusY;
 
 }
diff --git a/tools/dom/templates/html/impl/impl_WebGL.darttemplate b/tools/dom/templates/html/impl/impl_WebGL.darttemplate
new file mode 100644
index 0000000..1aaf0ed
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_WebGL.darttemplate
@@ -0,0 +1,15 @@
+// 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.
+
+part of $LIBRARYNAME;
+
+/// Amalgamation of the WebGL constants from the IDL interfaces in
+/// WebGLRenderingContextBase, WebGL2RenderingContextBase, & WebGLDrawBuffers.
+/// Because the RenderingContextBase interfaces are hidden they would be
+/// replicated in more than one class (e.g., RenderingContext and
+/// RenderingContext2) to prevent that duplication these 600+ constants are
+/// defined in one abstract class (WebGL).
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)abstract class $CLASSNAME {
+$!MEMBERS
+}
diff --git a/tools/dom/templates/html/impl/impl_WebGL2RenderingContext.darttemplate b/tools/dom/templates/html/impl/impl_WebGL2RenderingContext.darttemplate
index b4a0e4e..04b82e8 100644
--- a/tools/dom/templates/html/impl/impl_WebGL2RenderingContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WebGL2RenderingContext.darttemplate
@@ -4,12 +4,9 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS implements _WebGL2RenderingContextBase, _WebGLRenderingContextBase {
 $!MEMBERS
 
-  @DomName('WebGLRenderingContext2.readPixels')
-  @DocsEditable()
   void readPixels(int x, int y, int width, int height, int format, int type,
           TypedData pixels) {
       _readPixels(x, y, width, height, format, type, pixels);
diff --git a/tools/dom/templates/html/impl/impl_WebGLCanvas.darttemplate b/tools/dom/templates/html/impl/impl_WebGLCanvas.darttemplate
index 26e09b6..a4730dc 100644
--- a/tools/dom/templates/html/impl/impl_WebGLCanvas.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WebGLCanvas.darttemplate
@@ -4,18 +4,13 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS {
 $!MEMBERS
 
   @JSName('canvas')
-  @DomName('WebGLCanvas.canvas')
-  @DocsEditable()
   final CanvasElement canvas;
 
   @JSName('canvas')
-  @DomName('WebGLCanvas.offscreenCanvas')
-  @DocsEditable()
   final OffscreenCanvas offscreenCanvas;
 }
 
diff --git a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
index 90cf7f0..ac73e21 100644
--- a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
@@ -7,8 +7,6 @@
 $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS implements CanvasRenderingContext {
 $!MEMBERS
 
-  @DomName('WebGLRenderingContext.readPixels')
-  @DocsEditable()
   void readPixels(int x, int y, int width, int height, int format, int type,
           TypedData pixels) {
       _readPixels(x, y, width, height, format, type, pixels);
diff --git a/tools/dom/templates/html/impl/impl_WebKitCSSKeyframesRule.darttemplate b/tools/dom/templates/html/impl/impl_WebKitCSSKeyframesRule.darttemplate
index 19ee4cc..00cfadd 100644
--- a/tools/dom/templates/html/impl/impl_WebKitCSSKeyframesRule.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WebKitCSSKeyframesRule.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
 $!MEMBERS
 
diff --git a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
index 188c9a2..0768608 100644
--- a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
@@ -54,7 +54,6 @@
    *
    * * [WheelEvent.deltaY](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaY) from the W3C.
    */
-  @DomName('WheelEvent.deltaY')
   num get deltaY {
     if (JS('bool', '#.deltaY !== undefined', this)) {
       // W3C WheelEvent
@@ -72,7 +71,6 @@
    *
    * * [WheelEvent.deltaX](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaX) from the W3C.
    */
-  @DomName('WheelEvent.deltaX')
   num get deltaX {
     if (JS('bool', '#.deltaX !== undefined', this)) {
       // W3C WheelEvent
@@ -82,7 +80,6 @@
         'deltaX is not supported');
   }
 
-  @DomName('WheelEvent.deltaMode')
   int get deltaMode {
     if (JS('bool', '!!(#.deltaMode)', this)) {
       return JS('int', '#.deltaMode', this);
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index cf5ddf9..03d768f 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)@Native("Window,DOMWindow")
 $(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
@@ -107,7 +106,6 @@
    * Note: The supplied [callback] needs to call [requestAnimationFrame] again
    * for the animation to continue.
    */
-  @DomName('Window.requestAnimationFrame')
   int requestAnimationFrame(FrameRequestCallback callback) {
     _ensureRequestAnimationFrame();
     return _requestAnimationFrame(_wrapZone(callback));
@@ -167,14 +165,12 @@
   @SupportedBrowser(SupportedBrowser.CHROME, '23.0')
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15.0')
   @SupportedBrowser(SupportedBrowser.IE, '10.0')
-  @Experimental()
   IdbFactory get indexedDB =>
       JS('IdbFactory|Null',  // If not supported, returns null.
          '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
          this, this, this);
 
   /// The debugging console for this window.
-  @DomName('Window.console')
   Console get console => Console._safeConsole;
 
   /**
@@ -202,16 +198,13 @@
    *
    * See [EventStreamProvider] for usage information.
    */
-  @DomName('Window.beforeunloadEvent')
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
   /// Stream of `beforeunload` events handled by this [Window].
-  @DomName('Window.onbeforeunload')
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   /// Stream of `wheel` events handled by this [Window].
-  @DomName('Window.onWheel')
   Stream<WheelEvent> get onWheel => Element.wheelEvent.forTarget(this);
 
   /**
@@ -231,11 +224,8 @@
   }
 
   @JSName('openDatabase')
-  @DomName('Window.openDatabase')
-  @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
   @Creates('SqlDatabase')
   SqlDatabase openDatabase(
       String name, String version, String displayName, int estimatedSize,
@@ -252,12 +242,8 @@
     return db;
   }
 
-  @DomName('Window.pageXOffset')
-  @DocsEditable()
   int get pageXOffset => JS('num', '#.pageXOffset', this).round();
 
-  @DomName('Window.pageYOffset')
-  @DocsEditable()
   int get pageYOffset => JS('num', '#.pageYOffset', this).round();
 
   /**
@@ -270,8 +256,6 @@
    * * [scrollX](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX)
    *   from MDN.
    */
-  @DomName('Window.scrollX')
-  @DocsEditable()
   int get scrollX => JS('bool', '("scrollX" in #)', this) ?
       JS('num', '#.scrollX', this).round() :
       document.documentElement.scrollLeft;
@@ -286,8 +270,6 @@
    * * [scrollY](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY)
    *   from MDN.
    */
-  @DomName('Window.scrollY')
-  @DocsEditable()
   int get scrollY => JS('bool', '("scrollY" in #)', this) ?
       JS('num', '#.scrollY', this).round() :
       document.documentElement.scrollTop;
diff --git a/tools/dom/templates/html/impl/impl_WindowEventHandlers.darttemplate b/tools/dom/templates/html/impl/impl_WindowEventHandlers.darttemplate
index d1b4f83..a5065ed 100644
--- a/tools/dom/templates/html/impl/impl_WindowEventHandlers.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WindowEventHandlers.darttemplate
@@ -4,6 +4,5 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME extends EventTarget {
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate b/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate b/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
index 0517910..cfc1a6e 100644
--- a/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
@@ -4,7 +4,6 @@
 
 part of $LIBRARYNAME;
 
-@DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index 51c129f..97b141a 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -292,7 +292,6 @@
    * This API provides a subset of [request] which works on IE9. If IE9
    * cross-origin support is not required then [request] should be used instead.
    */
-  @Experimental()
   static Future<String> requestCrossOrigin(String url,
       {String method, String sendData}) {
     if (supportsCrossOrigin) {
@@ -381,8 +380,6 @@
    * `open` method is intended only for more complex HTTP requests where
    * finer-grained control is needed.
    */
-  @DomName('XMLHttpRequest.open')
-  @DocsEditable()
   void open(String method, String url, {bool async, String user, String password}) native;
 
 $!MEMBERS
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index c32cb3c..445af50 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-dbd141e72b88a1a30768af3acf75eba45963a896
\ No newline at end of file
+2abdfae6bf237e3d10e7d6e7680e62653c59f167
\ No newline at end of file
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index cf501d1..355c7c2 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-6b686b5dd4a33806fc136cf01fa4bf3ac7f661b7
\ No newline at end of file
+e2d609d355ce8e8a0de9dc107818055fead5c6c1
\ No newline at end of file
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 902188f..9cd92de 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-898a3784afca3a8f0e8624fda56d243aadd1b95d
\ No newline at end of file
+c5cca53d8fa715c6409eca288cd5560d55d50bdc
\ No newline at end of file
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 1cf0526..2db6368 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -29,8 +29,6 @@
           onerror="scriptTagOnErrorCallback(null)"
           defer>
   </script>
-  <script type="text/javascript"
-          src="/root_dart/pkg/browser/lib/dart.js"></script>
 </body>
 </html>""";
 }
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 15ac03d..757ef01 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -41,11 +41,7 @@
   bool get _useSdk => _configuration.useSdk;
   bool get _useEnableAsserts => _configuration.useEnableAsserts;
 
-  /// Only some subclasses support this check, but we statically allow calling
-  /// it on [CompilerConfiguration].
-  bool get useDfe {
-    throw new UnsupportedError("This compiler does not support DFE.");
-  }
+  bool get previewDart2 => !_configuration.noPreviewDart2;
 
   /// Whether to run the runtime on the compilation result of a test which
   /// expects a compile-time error and the compiler did not emit one.
@@ -66,13 +62,15 @@
         return new DevKernelCompilerConfiguration(configuration);
 
       case Compiler.appJit:
-        return new AppJitCompilerConfiguration(configuration);
+        return new AppJitCompilerConfiguration(configuration,
+            previewDart2: false);
 
       case Compiler.appJitk:
-        return new AppJitCompilerConfiguration(configuration, useDfe: true);
+        return new AppJitCompilerConfiguration(configuration);
 
       case Compiler.precompiler:
-        return new PrecompilerCompilerConfiguration(configuration);
+        return new PrecompilerCompilerConfiguration(configuration,
+            previewDart2: false);
 
       case Compiler.dartk:
         if (configuration.architecture == Architecture.simdbc64 ||
@@ -80,11 +78,10 @@
             configuration.architecture == Architecture.simarm64) {
           return new VMKernelCompilerConfiguration(configuration);
         }
-        return new NoneCompilerConfiguration(configuration, useDfe: true);
+        return new NoneCompilerConfiguration(configuration);
 
       case Compiler.dartkp:
-        return new PrecompilerCompilerConfiguration(configuration,
-            useDfe: true);
+        return new PrecompilerCompilerConfiguration(configuration);
 
       case Compiler.specParser:
         return new SpecParserCompilerConfiguration(configuration);
@@ -156,11 +153,7 @@
 
 /// The "none" compiler.
 class NoneCompilerConfiguration extends CompilerConfiguration {
-  // This boolean is used by the [VMTestSuite] for running cc tests via
-  // run_vm_tests.
-  final bool useDfe;
-
-  NoneCompilerConfiguration(Configuration configuration, {this.useDfe: false})
+  NoneCompilerConfiguration(Configuration configuration)
       : super._subclass(configuration);
 
   bool get hasCompiler => false;
@@ -173,29 +166,22 @@
       List<String> originalArguments,
       CommandArtifact artifact) {
     var args = <String>[];
-    if (useDfe) {
-      // DFE+strong configuration is a Dart 2.0 configuration which uses
-      // pkg/vm/tool/dart2 wrapper script, which takes care of passing
-      // correct arguments to VM binary. No need to pass any additional
-      // arguments.
-      if (!_isStrong) {
-        args.add('--preview_dart_2');
-      }
+    if (previewDart2) {
       if (_isDebug) {
         // Temporarily disable background compilation to avoid flaky crashes
         // (see http://dartbug.com/30016 for details).
         args.add('--no-background-compilation');
       }
+      if (_isChecked) {
+        args.add('--enable_asserts');
+      }
     } else {
       args.add('--no-preview-dart-2');
-      if (_isStrong) {
-        args.add('--strong');
+      if (_isChecked) {
+        args.add('--enable_asserts');
+        args.add('--enable_type_checks');
       }
     }
-    if (_isChecked) {
-      args.add('--enable_asserts');
-      args.add('--enable_type_checks');
-    }
     if (_useEnableAsserts) {
       args.add('--enable_asserts');
     }
@@ -216,12 +202,6 @@
   VMKernelCompilerConfiguration(Configuration configuration)
       : super._subclass(configuration);
 
-  // This boolean is used by the [VMTestSuite] for running cc tests via
-  // run_vm_tests.  We enable it here, so the cc tests continue to use the
-  // kernel-isolate.  All the remaining tests will use a separate compilation
-  // command (which this class represents).
-  bool get useDfe => true;
-
   bool get _isAot => false;
 
   // Issue(http://dartbug.com/29840): Currently fasta sometimes does not emit a
@@ -254,12 +234,7 @@
       List<String> originalArguments,
       CommandArtifact artifact) {
     var args = <String>[];
-    args.add('--preview-dart-2');
-    if (_isChecked) {
-      args.add('--enable_asserts');
-      args.add('--enable_type_checks');
-    }
-    if (_useEnableAsserts) {
+    if (_isChecked || _useEnableAsserts) {
       args.add('--enable_asserts');
     }
     if (_configuration.hotReload) {
@@ -664,9 +639,7 @@
 
 class PrecompilerCompilerConfiguration extends CompilerConfiguration
     with VMKernelCompilerMixin {
-  // This boolean is used by the [VMTestSuite] for running cc tests via
-  // run_vm_tests.
-  final bool useDfe;
+  final bool previewDart2;
 
   bool get _isAndroid => _configuration.system == System.android;
   bool get _isArm => _configuration.architecture == Architecture.arm;
@@ -675,7 +648,7 @@
   bool get _isAot => true;
 
   PrecompilerCompilerConfiguration(Configuration configuration,
-      {this.useDfe: false})
+      {this.previewDart2: true})
       : super._subclass(configuration);
 
   int get timeoutMultiplier {
@@ -689,7 +662,7 @@
       List<String> arguments, Map<String, String> environmentOverrides) {
     var commands = <Command>[];
 
-    if (useDfe) {
+    if (previewDart2) {
       commands.add(computeCompileToKernelCommand(
           tempDir, arguments, environmentOverrides));
     }
@@ -697,7 +670,7 @@
     commands.add(
         computeDartBootstrapCommand(tempDir, arguments, environmentOverrides));
 
-    if (useDfe) {
+    if (previewDart2) {
       commands.add(computeRemoveKernelFileCommand(
           tempDir, arguments, environmentOverrides));
     }
@@ -770,8 +743,7 @@
     if (_isStrong) {
       args.add('--strong');
     }
-    if (useDfe) {
-      args.add('--preview-dart-2');
+    if (previewDart2) {
       args.addAll(_replaceDartFiles(arguments, tempKernelFile(tempDir)));
     } else {
       args.add('--no-preview-dart-2');
@@ -892,12 +864,19 @@
       List<String> originalArguments,
       CommandArtifact artifact) {
     var args = <String>[];
-    if (_isChecked) {
-      args.add('--enable_asserts');
-      args.add('--enable_type_checks');
+    if (previewDart2) {
+      if (_isChecked) {
+        args.add('--enable_asserts');
+      }
+    } else {
+      args.add('--no-preview-dart-2');
+      if (_isChecked) {
+        args.add('--enable_asserts');
+        args.add('--enable_type_checks');
+      }
     }
-    if (useDfe) {
-      args.add('--preview-dart-2');
+    if (_useEnableAsserts) {
+      args.add('--enable_asserts');
     }
     var dir = artifact.filename;
     if (runtimeConfiguration is DartPrecompiledAdbRuntimeConfiguration) {
@@ -916,11 +895,10 @@
 }
 
 class AppJitCompilerConfiguration extends CompilerConfiguration {
-  // This boolean is used by the [VMTestSuite] for running cc tests via
-  // run_vm_tests.
-  final bool useDfe;
+  final bool previewDart2;
 
-  AppJitCompilerConfiguration(Configuration configuration, {this.useDfe: false})
+  AppJitCompilerConfiguration(Configuration configuration,
+      {this.previewDart2: true})
       : super._subclass(configuration);
 
   int get timeoutMultiplier {
@@ -944,9 +922,7 @@
     var exec = "${_configuration.buildDirectory}/dart";
     var snapshot = "$tempDir/out.jitsnapshot";
     var args = ["--snapshot=$snapshot", "--snapshot-kind=app-jit"];
-    if (useDfe) {
-      args.add("--preview-dart-2");
-    } else {
+    if (!previewDart2) {
       args.add("--no-preview-dart-2");
     }
     args.addAll(arguments);
@@ -977,14 +953,19 @@
       List<String> originalArguments,
       CommandArtifact artifact) {
     var args = <String>[];
-    if (_isChecked) {
-      args.add('--enable_asserts');
-      args.add('--enable_type_checks');
-    }
-    if (useDfe) {
-      args.add('--preview-dart-2');
+    if (previewDart2) {
+      if (_isChecked) {
+        args.add('--enable_asserts');
+      }
     } else {
       args.add("--no-preview-dart-2");
+      if (_isChecked) {
+        args.add('--enable_asserts');
+        args.add('--enable_type_checks');
+      }
+    }
+    if (_useEnableAsserts) {
+      args.add('--enable_asserts');
     }
     args
       ..addAll(vmOptions)
@@ -1030,6 +1011,10 @@
     } else {
       arguments.add('--no-strong');
     }
+    if (_configuration.compiler == Compiler.dart2analyzer &&
+        _configuration.usesFasta) {
+      arguments.add('--use-fasta-parser');
+    }
 
     // Since this is not a real compilation, no artifacts are produced.
     return new CommandArtifact([
@@ -1171,9 +1156,6 @@
       : super._subclass(configuration);
 
   @override
-  bool get useDfe => true;
-
-  @override
   bool get runRuntimeDespiteMissingCompileTimeError => true;
 
   @override
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index a6ad1fd..e78b2d4 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -41,7 +41,6 @@
       this.listTests,
       this.listStatusFiles,
       this.noPreviewDart2,
-      this.previewDart2,
       this.printTiming,
       this.printReport,
       this.reportInJson,
@@ -116,7 +115,6 @@
   final bool listTests;
   final bool listStatusFiles;
   final bool noPreviewDart2;
-  final bool previewDart2;
   final bool printTiming;
   final bool printReport;
   final bool reportInJson;
@@ -194,16 +192,11 @@
       Compiler.fasta,
     ];
     return fastaCompilers.contains(compiler) ||
-        compiler == Compiler.dart2js && !useDart2JSOldFrontend;
+        (compiler == Compiler.dart2js && !useDart2JSOldFrontend) ||
+        (compiler == Compiler.dart2analyzer &&
+            builderTag == 'analyzer_use_fasta');
   }
 
-  /// Returns true if this configuration is considered Dart 2.0 configuration
-  /// by VM (which is identified by using common front-end and strong mode).
-  /// In this case instead of invoking VM binary directly we use
-  /// pkg/vm/tool/dart2 wrapper script, which takes care of passing
-  /// correct arguments to VM binary.
-  bool get usingDart2VMWrapper => isStrong && compiler == Compiler.dartk;
-
   /// The base directory named for this configuration, like:
   ///
   ///     none_vm_release_x64
@@ -478,7 +471,6 @@
         'fast_startup': useFastStartup,
         'timeout': timeout,
         'no_preview_dart_2': noPreviewDart2,
-        'preview_dart_2': previewDart2,
         'dart2js_with_kernel': useDart2JSWithKernel,
         'dart2js_old_frontend': useDart2JSOldFrontend,
         'enable_asserts': useEnableAsserts,
diff --git a/tools/testing/dart/environment.dart b/tools/testing/dart/environment.dart
index 01da811..55397f8 100644
--- a/tools/testing/dart/environment.dart
+++ b/tools/testing/dart/environment.dart
@@ -33,10 +33,11 @@
   "minified": new _Variable.bool((c) => c.isMinified),
   "mode": new _Variable((c) => c.mode.name, Mode.names),
   "no_preview_dart_2": new _Variable.bool((c) => c.noPreviewDart2),
-  "preview_dart_2": new _Variable.bool((c) => c.previewDart2),
+  "preview_dart_2": new _Variable.bool((c) => !c.noPreviewDart2),
   "runtime": new _Variable(_runtimeName, Runtime.names),
   "spec_parser": new _Variable.bool((c) => c.compiler == Compiler.specParser),
-  "strong": new _Variable.bool((c) => c.isStrong),
+  "strong": new _Variable.bool(
+      (c) => c.isStrong || c.compilerConfiguration.previewDart2),
   "system": new _Variable((c) => c.system.name, System.names),
   "use_sdk": new _Variable.bool((c) => c.useSdk)
 };
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 5bb7760..5493852 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -168,10 +168,10 @@
     new _Option.bool('enable_asserts',
         'Pass the --enable-asserts flag to dart2js or to the vm.'),
     new _Option.bool(
-        'no_preview_dart_2', 'Pass the --no-preview-dart-2 flag for Dart1 mode',
+        'preview_dart_2', 'Pass the --preview-dart-2 flag to analyzer',
         hide: true),
-    new _Option.bool('preview_dart_2',
-        'Pass the --preview-dart-2 flag to analyzer, or pass --no-preview-dart-2 if false.',
+    new _Option.bool(
+        'no_preview_dart_2', 'Pass the --no-preview-dart-2 flag to analyzer',
         hide: true),
     // TODO(sigmund): replace dart2js_with_kernel with preview-dart-2.
     new _Option.bool(
@@ -465,6 +465,10 @@
       }
     }
 
+    if (configuration['no_preview_dart_2'] && configuration['preview_dart_2']) {
+      _fail('"--no-preview-dart-2" and "--preview-dart-2" specified,');
+    }
+
     return _createConfigurations(configuration);
   }
 
@@ -645,8 +649,7 @@
                 isVerbose: data["verbose"] as bool,
                 listTests: data["list"] as bool,
                 listStatusFiles: data["list_status_files"] as bool,
-                noPreviewDart2: !(data["preview_dart_2"] as bool),
-                previewDart2: data["preview_dart_2"] as bool,
+                noPreviewDart2: data["no_preview_dart_2"] as bool,
                 printTiming: data["time"] as bool,
                 printReport: data["report"] as bool,
                 reportInJson: data["report_in_json"] as bool,
@@ -765,7 +768,7 @@
 If you specify only a runtime ("-r"), then an appropriate default compiler will
 be chosen for that runtime. Likewise, if you specify only a compiler ("-c"),
 then a matching runtime is chosen. If neither compiler nor runtime is selected,
-the test is run directly from source on the VM. 
+the test is run directly from source on the VM.
 
 Options:''');
 
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 4a16a03..84594c8 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -130,10 +130,6 @@
     _environmentOverrides = {
       'DART_CONFIGURATION': configuration.configurationDirectory,
     };
-
-    if (useSdk && configuration.usingDart2VMWrapper) {
-      _environmentOverrides['DART_USE_SDK'] = '1';
-    }
   }
 
   Map<String, String> get environmentOverrides => _environmentOverrides;
@@ -168,14 +164,6 @@
     // Controlled by user with the option "--dart".
     var dartExecutable = configuration.dartPath;
 
-    if (configuration.usingDart2VMWrapper) {
-      if (dartExecutable != null) {
-        throw 'Can not use --dart when testing Dart 2.0 configuration';
-      }
-
-      dartExecutable = 'pkg/vm/tool/dart2$executableScriptSuffix';
-    }
-
     if (dartExecutable == null) {
       dartExecutable = dartVmExecutableFileName;
     }
@@ -489,7 +477,7 @@
 
   void _addTest(ExpectationSet testExpectations, String testName) {
     var args = configuration.standardOptions.toList();
-    if (configuration.compilerConfiguration.useDfe) {
+    if (configuration.compilerConfiguration.previewDart2) {
       args.add('--use-dart-frontend');
       // '--dfe' has to be the first argument for run_vm_test to pick it up.
       args.insert(0, '--dfe=$buildDir/gen/kernel-service.dart.snapshot');
@@ -859,14 +847,6 @@
         allVmOptions = vmOptions.toList()..addAll(extraVmOptions);
       }
 
-      // TODO(rnystrom): Hack. When running the 2.0 tests, always implicitly
-      // turn on reified generics in the VM.
-      // Note that VMOptions=--no-reify-generic-functions in test is ignored.
-      // Dart 2 VM wrapper (pkg/vm/tool/dart2) already passes correct arguments.
-      if (suiteName.endsWith("_2") && !configuration.usingDart2VMWrapper) {
-        allVmOptions = allVmOptions.toList()..add("--reify-generic-functions");
-      }
-
       var commands =
           makeCommands(info, vmOptionsVariant, allVmOptions, commonArguments);
       var expectations = testExpectations.expectations(testName);
@@ -1279,6 +1259,13 @@
     if (options != null) args.addAll(options);
     options = optionsFromFile['dart2jsOptions'] as List<String>;
     if (options != null) args.addAll(options);
+    if (configuration.compiler == Compiler.dart2js) {
+      if (configuration.noPreviewDart2) {
+        args.add("--no-preview-dart-2");
+      } else {
+        args.add("--preview-dart-2");
+      }
+    }
 
     return Command.compilation(Compiler.dart2js.name, outputFile,
         dart2JsBootstrapDependencies, compilerPath, args, environmentOverrides,
@@ -1309,13 +1296,24 @@
     if (configuration.compiler == Compiler.dart2analyzer) {
       args.add('--format=machine');
       args.add('--no-hints');
-      if (configuration.previewDart2) args.add("--preview-dart-2");
-      if (configuration.noPreviewDart2) args.add("--no-preview-dart-2");
 
       if (filePath.filename.contains("dart2js") ||
           filePath.directoryPath.segments().last.contains('html_common')) {
         args.add("--use-dart2js-libraries");
       }
+      if (configuration.noPreviewDart2) {
+        args.add("--no-preview-dart-2");
+      } else {
+        args.add("--preview-dart-2");
+      }
+    }
+
+    if (configuration.compiler == Compiler.dart2js) {
+      if (configuration.noPreviewDart2) {
+        args.add("--no-preview-dart-2");
+      } else {
+        args.add("--preview-dart-2");
+      }
     }
 
     var isMultitest = optionsFromFile["isMultitest"] as bool;
diff --git a/utils/analysis_server/BUILD.gn b/utils/analysis_server/BUILD.gn
index 9359e2c..625dd25 100644
--- a/utils/analysis_server/BUILD.gn
+++ b/utils/analysis_server/BUILD.gn
@@ -5,6 +5,7 @@
 import("../application_snapshot.gni")
 
 application_snapshot("analysis_server") {
+  dart_version = 2
   main_dart = "../../pkg/analysis_server/bin/server.dart"
   training_args = [ "--help" ]
 }
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 3630bee..5ed85b2 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -76,6 +76,7 @@
   if (defined(invoker.output)) {
     output = invoker.output
   }
+  # TODO(asiva), flip default once the VM is dart2 by default.
   dart_version = 1
   if (defined(invoker.dart_version)) {
     dart_version = invoker.dart_version
@@ -85,14 +86,15 @@
   dart_action(target_name) {
     deps = extra_deps
 
-    if (dart_version == 2) {
+    if (dart_version == 1) {
+      snapshot_vm_args += [ "--no-preview-dart-2" ]
+    } else {
       # HACK: When creating app-jit snapshots for Dart 2 apps, the standalone
       # Dart VM binary requires the app-jit snapshot for the kernel service to
       # be adjacent to it. This deps ensures that it is there, but a different
       # approach will be needed when the kernel service itself switches to
       # Dart 2 to avoid creating a circular dependence.
       deps += [ "$_dart_root/utils/kernel-service:copy_kernel_service_snapshot"]
-      snapshot_vm_args += [ "--preview-dart-2" ]
     }
 
     depfile = "$output.d"
@@ -173,6 +175,9 @@
     abs_output = rebase_path(output, root_build_dir)
 
     vm_args = [
+      # TODO(asiva): For not use --no-preview-dart-2, need to flip this to use
+      # gen_kernel to generate a kernel file before creating an app snapshot.
+      "--no-preview-dart-2",
       "--deterministic",
       "--packages=$dot_packages",
       "--snapshot-kind=app-aot",
diff --git a/utils/bazel/BUILD.gn b/utils/bazel/BUILD.gn
index 79a0a7e..6f6d3da 100644
--- a/utils/bazel/BUILD.gn
+++ b/utils/bazel/BUILD.gn
@@ -4,7 +4,7 @@
 
 import("../application_snapshot.gni")
 
-application_snapshot("kernel_summary_worker") {
-  main_dart = "kernel_summary_worker.dart"
+application_snapshot("kernel_worker") {
+  main_dart = "kernel_worker.dart"
   training_args = [ "--help" ]
 }
diff --git a/utils/bazel/kernel_summary_worker.dart b/utils/bazel/kernel_worker.dart
similarity index 80%
rename from utils/bazel/kernel_summary_worker.dart
rename to utils/bazel/kernel_worker.dart
index 9ac2ab9..27bfd22 100644
--- a/utils/bazel/kernel_summary_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -15,9 +15,10 @@
 import 'package:args/args.dart';
 import 'package:bazel_worker/bazel_worker.dart';
 import 'package:build_integration/file_system/multi_root.dart';
-import 'package:front_end/src/api_unstable/summary_worker.dart' as fe;
+import 'package:front_end/src/api_unstable/bazel_worker.dart' as fe;
 import 'package:kernel/ast.dart' show Component, Library;
 import 'package:kernel/target/targets.dart';
+import 'package:kernel/target/vm.dart';
 
 main(List<String> args) async {
   args = preprocessArgs(args);
@@ -27,22 +28,22 @@
       throw new StateError(
           "unexpected args, expected only --persistent-worker but got: $args");
     }
-    await new SummaryWorker().run();
+    await new KernelWorker().run();
   } else {
-    var succeeded = await computeSummary(args);
+    var succeeded = await computeKernel(args);
     if (!succeeded) {
       exitCode = 15;
     }
   }
 }
 
-/// A bazel worker loop that can compute summaries.
-class SummaryWorker extends AsyncWorkerLoop {
+/// A bazel worker loop that can compute full or summary kernel files.
+class KernelWorker extends AsyncWorkerLoop {
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var outputBuffer = new StringBuffer();
     var response = new WorkResponse()..exitCode = 0;
     try {
-      var succeeded = await computeSummary(request.arguments,
+      var succeeded = await computeKernel(request.arguments,
           isWorker: true, outputBuffer: outputBuffer);
       if (!succeeded) {
         response.exitCode = 15;
@@ -87,15 +88,20 @@
       negatable: false,
       help: 'Whether source files loaded implicitly should be included as '
           'part of the summary.')
+  ..addFlag('summary-only',
+      defaultsTo: true,
+      negatable: true,
+      help: 'Whether to only build summary files.')
   ..addOption('dart-sdk-summary')
-  ..addOption('input-summary', allowMultiple: true)
-  ..addOption('multi-root', allowMultiple: true)
+  ..addMultiOption('input-summary')
+  ..addMultiOption('input-linked')
+  ..addMultiOption('multi-root')
   ..addOption('multi-root-scheme', defaultsTo: 'org-dartlang-multi-root')
   ..addOption('packages-file')
-  ..addOption('source', allowMultiple: true)
+  ..addMultiOption('source')
   ..addOption('output');
 
-/// Computes a kernel summary based on [args].
+/// Computes a kernel file based on [args].
 ///
 /// If [isWorker] is true then exit codes will not be set on failure.
 ///
@@ -103,14 +109,16 @@
 /// instead of printed to the console.
 ///
 /// Returns whether or not the summary was successfully output.
-Future<bool> computeSummary(List<String> args,
+Future<bool> computeKernel(List<String> args,
     {bool isWorker: false, StringBuffer outputBuffer}) async {
+  dynamic out = outputBuffer ?? stderr;
   bool succeeded = true;
   var parsedArgs = summaryArgsParser.parse(args);
 
   if (parsedArgs['help']) {
-    print(summaryArgsParser.usage);
-    exit(0);
+    out.writeln(summaryArgsParser.usage);
+    if (!isWorker) exit(0);
+    return false;
   }
 
   // Bazel creates an overlay file system where some files may be located in the
@@ -121,32 +129,41 @@
   var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
       multiRoots, fe.StandardFileSystem.instance);
   var sources = parsedArgs['source'].map(Uri.parse).toList();
+  Target target;
+  var summaryOnly = parsedArgs['summary-only'] as bool;
+  var excludeNonSources = parsedArgs['exclude-non-sources'] as bool;
+  if (summaryOnly) {
+    target = new SummaryTarget(
+        sources, excludeNonSources, new TargetFlags(strongMode: true));
+  } else {
+    target = new VmTarget(new TargetFlags(strongMode: true));
+  }
   var state = await fe.initializeCompiler(
       // TODO(sigmund): pass an old state once we can make use of it.
       null,
       Uri.base.resolve(parsedArgs['dart-sdk-summary']),
       Uri.base.resolve(parsedArgs['packages-file']),
       parsedArgs['input-summary'].map(Uri.base.resolve).toList(),
-      new SummaryTarget(sources, parsedArgs['exclude-non-sources'],
-          new TargetFlags(strongMode: true)),
+      parsedArgs['input-linked'].map(Uri.base.resolve).toList(),
+      target,
       fileSystem);
 
   void onProblem(fe.FormattedMessage message, severity,
       List<fe.FormattedMessage> context) {
-    dynamic out = outputBuffer ?? stderr;
-    out.println(message.formatted);
+    out.writeln(message.formatted);
     for (fe.FormattedMessage message in context) {
-      out.println(message.formatted);
+      out.writeln(message.formatted);
     }
     succeeded = false;
   }
 
-  var summary = await fe.compile(state, sources, onProblem);
+  var kernel =
+      await fe.compile(state, sources, onProblem, summaryOnly: summaryOnly);
 
-  if (summary != null) {
+  if (kernel != null) {
     var outputFile = new File(parsedArgs['output']);
     outputFile.createSync(recursive: true);
-    outputFile.writeAsBytesSync(summary);
+    outputFile.writeAsBytesSync(kernel);
   } else {
     assert(!succeeded);
   }
diff --git a/utils/compile_platform.gni b/utils/compile_platform.gni
index 9c157b7..94bce50 100644
--- a/utils/compile_platform.gni
+++ b/utils/compile_platform.gni
@@ -2,29 +2,22 @@
 # for 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("../build/dart/dart_host_sdk_toolchain.gni")
-import("../build/dart/prebuilt_dart_sdk.gni")
-
-_is_fuchsia = defined(is_fuchsia_tree) && is_fuchsia_tree
-
-if (_is_fuchsia) {
-  import("//build/dart/dart.gni")
-}
+import("../build/dart/dart_action.gni")
 
 _dart_root = get_path_info("..", "abspath")
 
 template("compile_platform") {
   assert(defined(invoker.libraries_specification_uri),
-      "Need 'libraries_specification_uri' in $target_name")
+         "Need 'libraries_specification_uri' in $target_name")
   assert(defined(invoker.outputs), "Need 'outputs' in $target_name")
   assert(defined(invoker.args), "Need 'args' in $target_name")
   if (defined(invoker.single_root_scheme)) {
     assert(defined(invoker.single_root_base),
-        "Need 'single_root_base' in $target_name")
+           "Need 'single_root_base' in $target_name")
   }
   if (defined(invoker.single_root_base)) {
     assert(defined(invoker.single_root_scheme),
-        "Need 'single_root_scheme' in $target_name")
+           "Need 'single_root_scheme' in $target_name")
   }
   assert(!defined(invoker.script), "Remove 'script' from $target_name")
   assert(!defined(invoker.depfile), "Remove 'depfile' from $target_name")
@@ -41,8 +34,10 @@
         invoker.add_implicit_vm_platform_dependency
   }
 
-  action(target_name) {
-    script = "$_dart_root/tools/compile_platform.py"
+  prebuilt_dart_action(target_name) {
+    script = "$_dart_root/pkg/front_end/tool/_fasta/compile_platform.dart"
+
+    packages = "$_dart_root/.packages"
 
     outputs = invoker.outputs
 
@@ -64,34 +59,21 @@
     }
     depfile = outputs[0] + ".d"
 
-    if (_is_fuchsia) {
-      args += [
-        "--dart-executable",
-        rebase_path(prebuilt_dart),
-      ]
-    } else if (!prebuilt_dart_exe_works) {
-      deps += [ "$_dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)" ]
-      dart_out_dir = get_label_info(
-              "$_dart_root/runtime/bin:dart_bootstrap($dart_host_toolchain)",
-              "root_out_dir")
-      args += [
-        "--dart-executable",
-        rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix"),
-      ]
-    }
-
     args += invoker.args
     if (defined(invoker.single_root_scheme)) {
-      args += ["--single-root-scheme=" + invoker.single_root_scheme]
+      args += [ "--single-root-scheme=" + invoker.single_root_scheme ]
     }
     if (defined(invoker.single_root_base)) {
-      args += ["--single-root-base=" + invoker.single_root_base]
+      args += [ "--single-root-base=" + invoker.single_root_base ]
     }
     if (defined(invoker.single_root_scheme)) {
-      args += [invoker.libraries_specification_uri]
+      args += [ invoker.libraries_specification_uri ]
     } else {
-      args += [rebase_path(invoker.libraries_specification_uri, root_build_dir)]
+      args +=
+          [ rebase_path(invoker.libraries_specification_uri, root_build_dir) ]
     }
+    args +=
+        [ rebase_path("$root_out_dir/vm_outline_strong.dill", root_build_dir) ]
     args += rebase_path(outputs, root_build_dir)
   }
 }
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index abadd8d..d3e0c7b 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -124,6 +124,8 @@
 # Apply dev_compiler's patch files to create the Dart version of the dartdevc
 # SDK.
 prebuilt_dart_action("dartdevc_patch_sdk") {
+  vm_args = ["--preview-dart-2"]
+
   # TODO(rnystrom): Unfork DDC's patch_sdk.dart script with the
   # tools/patch_sdk.dart and then change this to use generate_patch_sdk().
   deps = [
@@ -165,6 +167,8 @@
 # Compiles the Dart core libraries and DDC runtime to an analyzer summary and
 # JS.
 prebuilt_dart_action("dartdevc_sdk") {
+  vm_args = ["--preview-dart-2"]
+
   deps = [
     ":dartdevc_files_stamp",
     ":dartdevc_patch_sdk",
@@ -261,6 +265,8 @@
 # Compiles the packages used by the tests to JS with dartdevc so that they are
 # available for loading by the tests.
 prebuilt_dart_action("dartdevc_test_pkg") {
+  vm_args = ["--preview-dart-2"]
+
   deps = [
     ":dartdevc_files_stamp",
     ":dartdevc_sdk",
@@ -322,13 +328,18 @@
 
 # Compiles the DDC SDK's kernel summary and JS code.
 prebuilt_dart_action("dartdevk_sdk") {
+  vm_args = ["--preview-dart-2"]
+
   deps = [
+    "../../pkg:pkg_files_stamp",
     ":dartdevc_files_stamp",
     ":dartdevc_sdk_patch_stamp",
   ]
 
   inputs = [
+    "../../pkg/dev_compiler/tool/kernel_sdk.dart",
     "$target_gen_dir/dartdevc_files.stamp",
+    "$root_gen_dir/pkg_files.stamp",
   ]
 
   outputs = [
diff --git a/utils/generate_entry_points_json.gni b/utils/generate_entry_points_json.gni
index 04fc0fc..dbb3a42 100644
--- a/utils/generate_entry_points_json.gni
+++ b/utils/generate_entry_points_json.gni
@@ -30,6 +30,7 @@
       output,
     ]
     vm_args = [
+      "--no-preview-dart-2",
       "--print-precompiler-entry-points=" + rebase_path(output),
       "--snapshot=" + rebase_path("$target_gen_dir/dummy.snapshot"),
       "--snapshot-kind=app-aot",
