Version 2.8.0-dev.5.0

Merge commit '4ad57412bb175a67eb7851c41104c52a48bd2fc8' into dev
diff --git a/.packages b/.packages
index cd51491..b88c3ba 100644
--- a/.packages
+++ b/.packages
@@ -33,6 +33,7 @@
 dart2native:pkg/dart2native/lib
 dart_internal:pkg/dart_internal/lib
 dart_style:third_party/pkg_tested/dart_style/lib
+dartdev:pkg/dartdev/lib
 dartdoc:third_party/pkg/dartdoc/lib
 dartfix:pkg/dartfix/lib
 dev_compiler:pkg/dev_compiler/lib
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
index 55c60ec..421d174 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
@@ -4,7 +4,7 @@
 
 // @dart=2.5
 
-/*cfe.library: nnbd=false*/
+/*library: nnbd=false*/
 
 import 'opt_in.dart';
 
@@ -30,7 +30,8 @@
 */
 class LegacyClass3b<T> extends Class3<T> implements GenericInterface<T> {}
 
-/*class: LegacyClass4a:Class4a,GenericInterface<num*>,LegacyClass4a,Object*/
+/*cfe.class: LegacyClass4a:Class4a,GenericInterface<num*>,LegacyClass4a,Object*/
+/*cfe:builder.class: LegacyClass4a:Class4a,GenericInterface<num!>,LegacyClass4a,Object*/
 class LegacyClass4a extends Class4a {}
 
 /*class: LegacyClass4b:GenericInterface<num*>,LegacyClass4b,Object*/
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/main.dart
index 932d232..b2a6b48 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_out/main.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*cfe.library: nnbd=true*/
+/*library: nnbd=true*/
 
 import 'opt_out.dart';
 
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index c2b5a9c..e2b398a 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -43,7 +43,7 @@
     - prefer_for_elements_to_map_fromIterable
     - prefer_generic_function_type_aliases
     #- prefer_if_null_operators # 22
-    #- prefer_single_quotes # 6653
+    - prefer_single_quotes
     #- prefer_spread_collections # 3
     - unnecessary_this
     - use_function_type_syntax_for_parameters
diff --git a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
index a669956..cf8f498 100644
--- a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
+++ b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
@@ -16,9 +16,9 @@
   FlutterAnalyzeBenchmark()
       : super(
           'analysis-flutter-analyze',
-          "Clone the flutter/flutter repo and run "
+          'Clone the flutter/flutter repo and run '
               "'flutter analyze --flutter-repo' with the current Dart VM and "
-              "analysis server.",
+              'analysis server.',
           kind: 'cpu',
         );
 
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
index a2189cc..7edf09c 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -53,15 +53,15 @@
       reporter.push('isAnalyzing');
       try {
         if (!obj.containsKey('isAnalyzing')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['isAnalyzing'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['isAnalyzing'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -69,7 +69,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type AnalyzerStatusParams");
+      reporter.reportError('must be of type AnalyzerStatusParams');
       return false;
     }
   }
@@ -126,15 +126,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -143,15 +143,15 @@
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['label'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -159,7 +159,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ClosingLabel");
+      reporter.reportError('must be of type ClosingLabel');
       return false;
     }
   }
@@ -247,15 +247,15 @@
       reporter.push('file');
       try {
         if (!obj.containsKey('file')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['file'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['file'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -264,15 +264,15 @@
       reporter.push('offset');
       try {
         if (!obj.containsKey('offset')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['offset'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['offset'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -281,15 +281,15 @@
       reporter.push('libId');
       try {
         if (!obj.containsKey('libId')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['libId'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['libId'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -298,15 +298,15 @@
       reporter.push('displayUri');
       try {
         if (!obj.containsKey('displayUri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['displayUri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['displayUri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -315,15 +315,15 @@
       reporter.push('rOffset');
       try {
         if (!obj.containsKey('rOffset')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['rOffset'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['rOffset'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -332,15 +332,15 @@
       reporter.push('rLength');
       try {
         if (!obj.containsKey('rLength')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['rLength'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['rLength'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -348,7 +348,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CompletionItemResolutionInfo");
+      reporter.reportError('must be of type CompletionItemResolutionInfo');
       return false;
     }
   }
@@ -410,15 +410,15 @@
       reporter.push('port');
       try {
         if (!obj.containsKey('port')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['port'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['port'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -426,7 +426,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DartDiagnosticServer");
+      reporter.reportError('must be of type DartDiagnosticServer');
       return false;
     }
   }
@@ -503,7 +503,7 @@
       reporter.push('range');
       try {
         if (obj['range'] != null && !(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -512,15 +512,15 @@
       reporter.push('name');
       try {
         if (!obj.containsKey('name')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['name'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['name'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -529,15 +529,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['kind'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -546,7 +546,7 @@
       reporter.push('parameters');
       try {
         if (obj['parameters'] != null && !(obj['parameters'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -556,7 +556,7 @@
       try {
         if (obj['typeParameters'] != null &&
             !(obj['typeParameters'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -565,7 +565,7 @@
       reporter.push('returnType');
       try {
         if (obj['returnType'] != null && !(obj['returnType'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -573,7 +573,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Element");
+      reporter.reportError('must be of type Element');
       return false;
     }
   }
@@ -698,15 +698,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['kind'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -715,7 +715,7 @@
       reporter.push('label');
       try {
         if (obj['label'] != null && !(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -724,7 +724,7 @@
       reporter.push('className');
       try {
         if (obj['className'] != null && !(obj['className'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -733,7 +733,7 @@
       reporter.push('variableName');
       try {
         if (obj['variableName'] != null && !(obj['variableName'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -745,7 +745,7 @@
             !((obj['attributes'] is List &&
                 (obj['attributes'].every((item) =>
                     FlutterOutlineAttribute.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<FlutterOutlineAttribute>");
+          reporter.reportError('must be of type List<FlutterOutlineAttribute>');
           return false;
         }
       } finally {
@@ -755,7 +755,7 @@
       try {
         if (obj['dartElement'] != null &&
             !(Element.canParse(obj['dartElement'], reporter))) {
-          reporter.reportError("must be of type Element");
+          reporter.reportError('must be of type Element');
           return false;
         }
       } finally {
@@ -764,15 +764,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -781,15 +781,15 @@
       reporter.push('codeRange');
       try {
         if (!obj.containsKey('codeRange')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['codeRange'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['codeRange'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -801,7 +801,7 @@
             !((obj['children'] is List &&
                 (obj['children'].every(
                     (item) => FlutterOutline.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<FlutterOutline>");
+          reporter.reportError('must be of type List<FlutterOutline>');
           return false;
         }
       } finally {
@@ -809,7 +809,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type FlutterOutline");
+      reporter.reportError('must be of type FlutterOutline');
       return false;
     }
   }
@@ -894,15 +894,15 @@
       reporter.push('name');
       try {
         if (!obj.containsKey('name')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['name'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['name'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -911,15 +911,15 @@
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['label'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -929,7 +929,7 @@
       try {
         if (obj['valueRange'] != null &&
             !(Range.canParse(obj['valueRange'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -937,7 +937,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type FlutterOutlineAttribute");
+      reporter.reportError('must be of type FlutterOutlineAttribute');
       return false;
     }
   }
@@ -1016,15 +1016,15 @@
       reporter.push('element');
       try {
         if (!obj.containsKey('element')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['element'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Element.canParse(obj['element'], reporter))) {
-          reporter.reportError("must be of type Element");
+          reporter.reportError('must be of type Element');
           return false;
         }
       } finally {
@@ -1033,15 +1033,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -1050,15 +1050,15 @@
       reporter.push('codeRange');
       try {
         if (!obj.containsKey('codeRange')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['codeRange'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['codeRange'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -1070,7 +1070,7 @@
             !((obj['children'] is List &&
                 (obj['children']
                     .every((item) => Outline.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<Outline>");
+          reporter.reportError('must be of type List<Outline>');
           return false;
         }
       } finally {
@@ -1078,7 +1078,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Outline");
+      reporter.reportError('must be of type Outline');
       return false;
     }
   }
@@ -1146,15 +1146,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -1163,17 +1163,17 @@
       reporter.push('labels');
       try {
         if (!obj.containsKey('labels')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['labels'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['labels'] is List &&
             (obj['labels']
                 .every((item) => ClosingLabel.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<ClosingLabel>");
+          reporter.reportError('must be of type List<ClosingLabel>');
           return false;
         }
       } finally {
@@ -1181,7 +1181,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type PublishClosingLabelsParams");
+      reporter.reportError('must be of type PublishClosingLabelsParams');
       return false;
     }
   }
@@ -1246,15 +1246,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -1263,15 +1263,15 @@
       reporter.push('outline');
       try {
         if (!obj.containsKey('outline')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['outline'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(FlutterOutline.canParse(obj['outline'], reporter))) {
-          reporter.reportError("must be of type FlutterOutline");
+          reporter.reportError('must be of type FlutterOutline');
           return false;
         }
       } finally {
@@ -1279,7 +1279,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type PublishFlutterOutlineParams");
+      reporter.reportError('must be of type PublishFlutterOutlineParams');
       return false;
     }
   }
@@ -1339,15 +1339,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -1356,15 +1356,15 @@
       reporter.push('outline');
       try {
         if (!obj.containsKey('outline')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['outline'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Outline.canParse(obj['outline'], reporter))) {
-          reporter.reportError("must be of type Outline");
+          reporter.reportError('must be of type Outline');
           return false;
         }
       } finally {
@@ -1372,7 +1372,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type PublishOutlineParams");
+      reporter.reportError('must be of type PublishOutlineParams');
       return false;
     }
   }
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index b113704..062b70d 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -62,7 +62,7 @@
       reporter.push('label');
       try {
         if (obj['label'] != null && !(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -71,15 +71,15 @@
       reporter.push('edit');
       try {
         if (!obj.containsKey('edit')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['edit'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(WorkspaceEdit.canParse(obj['edit'], reporter))) {
-          reporter.reportError("must be of type WorkspaceEdit");
+          reporter.reportError('must be of type WorkspaceEdit');
           return false;
         }
       } finally {
@@ -87,7 +87,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ApplyWorkspaceEditParams");
+      reporter.reportError('must be of type ApplyWorkspaceEditParams');
       return false;
     }
   }
@@ -150,15 +150,15 @@
       reporter.push('applied');
       try {
         if (!obj.containsKey('applied')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['applied'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['applied'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -167,7 +167,7 @@
       reporter.push('failureReason');
       try {
         if (obj['failureReason'] != null && !(obj['failureReason'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -175,7 +175,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ApplyWorkspaceEditResponse");
+      reporter.reportError('must be of type ApplyWorkspaceEditResponse');
       return false;
     }
   }
@@ -234,15 +234,15 @@
       reporter.push('id');
       try {
         if (!obj.containsKey('id')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['id'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['id'] is num || obj['id'] is String))) {
-          reporter.reportError("must be of type Either2<num, String>");
+          reporter.reportError('must be of type Either2<num, String>');
           return false;
         }
       } finally {
@@ -250,7 +250,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CancelParams");
+      reporter.reportError('must be of type CancelParams');
       return false;
     }
   }
@@ -320,7 +320,7 @@
         if (obj['workspace'] != null &&
             !(WorkspaceClientCapabilities.canParse(
                 obj['workspace'], reporter))) {
-          reporter.reportError("must be of type WorkspaceClientCapabilities");
+          reporter.reportError('must be of type WorkspaceClientCapabilities');
           return false;
         }
       } finally {
@@ -332,7 +332,7 @@
             !(TextDocumentClientCapabilities.canParse(
                 obj['textDocument'], reporter))) {
           reporter
-              .reportError("must be of type TextDocumentClientCapabilities");
+              .reportError('must be of type TextDocumentClientCapabilities');
           return false;
         }
       } finally {
@@ -341,7 +341,7 @@
       reporter.push('experimental');
       try {
         if (obj['experimental'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -349,7 +349,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ClientCapabilities");
+      reporter.reportError('must be of type ClientCapabilities');
       return false;
     }
   }
@@ -448,15 +448,15 @@
       reporter.push('title');
       try {
         if (!obj.containsKey('title')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['title'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['title'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -466,7 +466,7 @@
       try {
         if (obj['kind'] != null &&
             !(CodeActionKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type CodeActionKind");
+          reporter.reportError('must be of type CodeActionKind');
           return false;
         }
       } finally {
@@ -478,7 +478,7 @@
             !((obj['diagnostics'] is List &&
                 (obj['diagnostics']
                     .every((item) => Diagnostic.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<Diagnostic>");
+          reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
       } finally {
@@ -488,7 +488,7 @@
       try {
         if (obj['edit'] != null &&
             !(WorkspaceEdit.canParse(obj['edit'], reporter))) {
-          reporter.reportError("must be of type WorkspaceEdit");
+          reporter.reportError('must be of type WorkspaceEdit');
           return false;
         }
       } finally {
@@ -498,7 +498,7 @@
       try {
         if (obj['command'] != null &&
             !(Command.canParse(obj['command'], reporter))) {
-          reporter.reportError("must be of type Command");
+          reporter.reportError('must be of type Command');
           return false;
         }
       } finally {
@@ -506,7 +506,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeAction");
+      reporter.reportError('must be of type CodeAction');
       return false;
     }
   }
@@ -587,17 +587,17 @@
       reporter.push('diagnostics');
       try {
         if (!obj.containsKey('diagnostics')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['diagnostics'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['diagnostics'] is List &&
             (obj['diagnostics']
                 .every((item) => Diagnostic.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<Diagnostic>");
+          reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
       } finally {
@@ -609,7 +609,7 @@
             !((obj['only'] is List &&
                 (obj['only'].every(
                     (item) => CodeActionKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<CodeActionKind>");
+          reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
       } finally {
@@ -617,7 +617,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeActionContext");
+      reporter.reportError('must be of type CodeActionContext');
       return false;
     }
   }
@@ -757,7 +757,7 @@
             !((obj['codeActionKinds'] is List &&
                 (obj['codeActionKinds'].every(
                     (item) => CodeActionKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<CodeActionKind>");
+          reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
       } finally {
@@ -765,7 +765,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeActionOptions");
+      reporter.reportError('must be of type CodeActionOptions');
       return false;
     }
   }
@@ -842,15 +842,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -859,15 +859,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -876,15 +876,15 @@
       reporter.push('context');
       try {
         if (!obj.containsKey('context')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['context'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(CodeActionContext.canParse(obj['context'], reporter))) {
-          reporter.reportError("must be of type CodeActionContext");
+          reporter.reportError('must be of type CodeActionContext');
           return false;
         }
       } finally {
@@ -892,7 +892,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeActionParams");
+      reporter.reportError('must be of type CodeActionParams');
       return false;
     }
   }
@@ -964,14 +964,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -983,7 +983,7 @@
             !((obj['codeActionKinds'] is List &&
                 (obj['codeActionKinds'].every(
                     (item) => CodeActionKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<CodeActionKind>");
+          reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
       } finally {
@@ -991,7 +991,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeActionRegistrationOptions");
+      reporter.reportError('must be of type CodeActionRegistrationOptions');
       return false;
     }
   }
@@ -1070,15 +1070,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -1088,7 +1088,7 @@
       try {
         if (obj['command'] != null &&
             !(Command.canParse(obj['command'], reporter))) {
-          reporter.reportError("must be of type Command");
+          reporter.reportError('must be of type Command');
           return false;
         }
       } finally {
@@ -1097,7 +1097,7 @@
       reporter.push('data');
       try {
         if (obj['data'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -1105,7 +1105,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeLens");
+      reporter.reportError('must be of type CodeLens');
       return false;
     }
   }
@@ -1162,7 +1162,7 @@
       try {
         if (obj['resolveProvider'] != null &&
             !(obj['resolveProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -1170,7 +1170,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeLensOptions");
+      reporter.reportError('must be of type CodeLensOptions');
       return false;
     }
   }
@@ -1225,15 +1225,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -1241,7 +1241,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeLensParams");
+      reporter.reportError('must be of type CodeLensParams');
       return false;
     }
   }
@@ -1303,7 +1303,7 @@
       try {
         if (obj['resolveProvider'] != null &&
             !(obj['resolveProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -1312,14 +1312,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -1327,7 +1327,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CodeLensRegistrationOptions");
+      reporter.reportError('must be of type CodeLensRegistrationOptions');
       return false;
     }
   }
@@ -1406,15 +1406,15 @@
       reporter.push('red');
       try {
         if (!obj.containsKey('red')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['red'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['red'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -1423,15 +1423,15 @@
       reporter.push('green');
       try {
         if (!obj.containsKey('green')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['green'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['green'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -1440,15 +1440,15 @@
       reporter.push('blue');
       try {
         if (!obj.containsKey('blue')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['blue'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['blue'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -1457,15 +1457,15 @@
       reporter.push('alpha');
       try {
         if (!obj.containsKey('alpha')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['alpha'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['alpha'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -1473,7 +1473,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Color");
+      reporter.reportError('must be of type Color');
       return false;
     }
   }
@@ -1540,15 +1540,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -1557,15 +1557,15 @@
       reporter.push('color');
       try {
         if (!obj.containsKey('color')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['color'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Color.canParse(obj['color'], reporter))) {
-          reporter.reportError("must be of type Color");
+          reporter.reportError('must be of type Color');
           return false;
         }
       } finally {
@@ -1573,7 +1573,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ColorInformation");
+      reporter.reportError('must be of type ColorInformation');
       return false;
     }
   }
@@ -1650,15 +1650,15 @@
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['label'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -1668,7 +1668,7 @@
       try {
         if (obj['textEdit'] != null &&
             !(TextEdit.canParse(obj['textEdit'], reporter))) {
-          reporter.reportError("must be of type TextEdit");
+          reporter.reportError('must be of type TextEdit');
           return false;
         }
       } finally {
@@ -1680,7 +1680,7 @@
             !((obj['additionalTextEdits'] is List &&
                 (obj['additionalTextEdits']
                     .every((item) => TextEdit.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<TextEdit>");
+          reporter.reportError('must be of type List<TextEdit>');
           return false;
         }
       } finally {
@@ -1688,7 +1688,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ColorPresentation");
+      reporter.reportError('must be of type ColorPresentation');
       return false;
     }
   }
@@ -1765,15 +1765,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -1782,15 +1782,15 @@
       reporter.push('color');
       try {
         if (!obj.containsKey('color')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['color'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Color.canParse(obj['color'], reporter))) {
-          reporter.reportError("must be of type Color");
+          reporter.reportError('must be of type Color');
           return false;
         }
       } finally {
@@ -1799,15 +1799,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -1815,7 +1815,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ColorPresentationParams");
+      reporter.reportError('must be of type ColorPresentationParams');
       return false;
     }
   }
@@ -1862,7 +1862,7 @@
     if (obj is Map<String, dynamic>) {
       return true;
     } else {
-      reporter.reportError("must be of type ColorProviderOptions");
+      reporter.reportError('must be of type ColorProviderOptions');
       return false;
     }
   }
@@ -1929,15 +1929,15 @@
       reporter.push('title');
       try {
         if (!obj.containsKey('title')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['title'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['title'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -1946,15 +1946,15 @@
       reporter.push('command');
       try {
         if (!obj.containsKey('command')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['command'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['command'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -1965,7 +1965,7 @@
         if (obj['arguments'] != null &&
             !((obj['arguments'] is List &&
                 (obj['arguments'].every((item) => true))))) {
-          reporter.reportError("must be of type List<dynamic>");
+          reporter.reportError('must be of type List<dynamic>');
           return false;
         }
       } finally {
@@ -1973,7 +1973,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Command");
+      reporter.reportError('must be of type Command');
       return false;
     }
   }
@@ -2044,15 +2044,15 @@
       reporter.push('triggerKind');
       try {
         if (!obj.containsKey('triggerKind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['triggerKind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(CompletionTriggerKind.canParse(obj['triggerKind'], reporter))) {
-          reporter.reportError("must be of type CompletionTriggerKind");
+          reporter.reportError('must be of type CompletionTriggerKind');
           return false;
         }
       } finally {
@@ -2062,7 +2062,7 @@
       try {
         if (obj['triggerCharacter'] != null &&
             !(obj['triggerCharacter'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -2070,7 +2070,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CompletionContext");
+      reporter.reportError('must be of type CompletionContext');
       return false;
     }
   }
@@ -2308,15 +2308,15 @@
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['label'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -2326,7 +2326,7 @@
       try {
         if (obj['kind'] != null &&
             !(CompletionItemKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type CompletionItemKind");
+          reporter.reportError('must be of type CompletionItemKind');
           return false;
         }
       } finally {
@@ -2335,7 +2335,7 @@
       reporter.push('detail');
       try {
         if (obj['detail'] != null && !(obj['detail'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -2347,7 +2347,7 @@
             !((obj['documentation'] is String ||
                 MarkupContent.canParse(obj['documentation'], reporter)))) {
           reporter
-              .reportError("must be of type Either2<String, MarkupContent>");
+              .reportError('must be of type Either2<String, MarkupContent>');
           return false;
         }
       } finally {
@@ -2356,7 +2356,7 @@
       reporter.push('deprecated');
       try {
         if (obj['deprecated'] != null && !(obj['deprecated'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -2365,7 +2365,7 @@
       reporter.push('preselect');
       try {
         if (obj['preselect'] != null && !(obj['preselect'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -2374,7 +2374,7 @@
       reporter.push('sortText');
       try {
         if (obj['sortText'] != null && !(obj['sortText'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -2383,7 +2383,7 @@
       reporter.push('filterText');
       try {
         if (obj['filterText'] != null && !(obj['filterText'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -2392,7 +2392,7 @@
       reporter.push('insertText');
       try {
         if (obj['insertText'] != null && !(obj['insertText'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -2402,7 +2402,7 @@
       try {
         if (obj['insertTextFormat'] != null &&
             !(InsertTextFormat.canParse(obj['insertTextFormat'], reporter))) {
-          reporter.reportError("must be of type InsertTextFormat");
+          reporter.reportError('must be of type InsertTextFormat');
           return false;
         }
       } finally {
@@ -2412,7 +2412,7 @@
       try {
         if (obj['textEdit'] != null &&
             !(TextEdit.canParse(obj['textEdit'], reporter))) {
-          reporter.reportError("must be of type TextEdit");
+          reporter.reportError('must be of type TextEdit');
           return false;
         }
       } finally {
@@ -2424,7 +2424,7 @@
             !((obj['additionalTextEdits'] is List &&
                 (obj['additionalTextEdits']
                     .every((item) => TextEdit.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<TextEdit>");
+          reporter.reportError('must be of type List<TextEdit>');
           return false;
         }
       } finally {
@@ -2435,7 +2435,7 @@
         if (obj['commitCharacters'] != null &&
             !((obj['commitCharacters'] is List &&
                 (obj['commitCharacters'].every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -2445,7 +2445,7 @@
       try {
         if (obj['command'] != null &&
             !(Command.canParse(obj['command'], reporter))) {
-          reporter.reportError("must be of type Command");
+          reporter.reportError('must be of type Command');
           return false;
         }
       } finally {
@@ -2455,7 +2455,7 @@
       try {
         if (obj['data'] != null &&
             !(CompletionItemResolutionInfo.canParse(obj['data'], reporter))) {
-          reporter.reportError("must be of type CompletionItemResolutionInfo");
+          reporter.reportError('must be of type CompletionItemResolutionInfo');
           return false;
         }
       } finally {
@@ -2463,7 +2463,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CompletionItem");
+      reporter.reportError('must be of type CompletionItem');
       return false;
     }
   }
@@ -2609,15 +2609,15 @@
       reporter.push('isIncomplete');
       try {
         if (!obj.containsKey('isIncomplete')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['isIncomplete'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['isIncomplete'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -2626,17 +2626,17 @@
       reporter.push('items');
       try {
         if (!obj.containsKey('items')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['items'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['items'] is List &&
             (obj['items']
                 .every((item) => CompletionItem.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<CompletionItem>");
+          reporter.reportError('must be of type List<CompletionItem>');
           return false;
         }
       } finally {
@@ -2644,7 +2644,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CompletionList");
+      reporter.reportError('must be of type CompletionList');
       return false;
     }
   }
@@ -2711,7 +2711,7 @@
       try {
         if (obj['resolveProvider'] != null &&
             !(obj['resolveProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -2722,7 +2722,7 @@
         if (obj['triggerCharacters'] != null &&
             !((obj['triggerCharacters'] is List &&
                 (obj['triggerCharacters'].every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -2730,7 +2730,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CompletionOptions");
+      reporter.reportError('must be of type CompletionOptions');
       return false;
     }
   }
@@ -2811,7 +2811,7 @@
       try {
         if (obj['context'] != null &&
             !(CompletionContext.canParse(obj['context'], reporter))) {
-          reporter.reportError("must be of type CompletionContext");
+          reporter.reportError('must be of type CompletionContext');
           return false;
         }
       } finally {
@@ -2820,15 +2820,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -2837,15 +2837,15 @@
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['position'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Position.canParse(obj['position'], reporter))) {
-          reporter.reportError("must be of type Position");
+          reporter.reportError('must be of type Position');
           return false;
         }
       } finally {
@@ -2853,7 +2853,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CompletionParams");
+      reporter.reportError('must be of type CompletionParams');
       return false;
     }
   }
@@ -2961,7 +2961,7 @@
         if (obj['triggerCharacters'] != null &&
             !((obj['triggerCharacters'] is List &&
                 (obj['triggerCharacters'].every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -2973,7 +2973,7 @@
             !((obj['allCommitCharacters'] is List &&
                 (obj['allCommitCharacters']
                     .every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -2983,7 +2983,7 @@
       try {
         if (obj['resolveProvider'] != null &&
             !(obj['resolveProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -2992,14 +2992,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -3007,7 +3007,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CompletionRegistrationOptions");
+      reporter.reportError('must be of type CompletionRegistrationOptions');
       return false;
     }
   }
@@ -3113,7 +3113,7 @@
       reporter.push('scopeUri');
       try {
         if (obj['scopeUri'] != null && !(obj['scopeUri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3122,7 +3122,7 @@
       reporter.push('section');
       try {
         if (obj['section'] != null && !(obj['section'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3130,7 +3130,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ConfigurationItem");
+      reporter.reportError('must be of type ConfigurationItem');
       return false;
     }
   }
@@ -3185,17 +3185,17 @@
       reporter.push('items');
       try {
         if (!obj.containsKey('items')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['items'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['items'] is List &&
             (obj['items'].every(
                 (item) => ConfigurationItem.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<ConfigurationItem>");
+          reporter.reportError('must be of type List<ConfigurationItem>');
           return false;
         }
       } finally {
@@ -3203,7 +3203,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ConfigurationParams");
+      reporter.reportError('must be of type ConfigurationParams');
       return false;
     }
   }
@@ -3275,15 +3275,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['kind'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3292,15 +3292,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3310,7 +3310,7 @@
       try {
         if (obj['options'] != null &&
             !(CreateFileOptions.canParse(obj['options'], reporter))) {
-          reporter.reportError("must be of type CreateFileOptions");
+          reporter.reportError('must be of type CreateFileOptions');
           return false;
         }
       } finally {
@@ -3318,7 +3318,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CreateFile");
+      reporter.reportError('must be of type CreateFile');
       return false;
     }
   }
@@ -3381,7 +3381,7 @@
       reporter.push('overwrite');
       try {
         if (obj['overwrite'] != null && !(obj['overwrite'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -3390,7 +3390,7 @@
       reporter.push('ignoreIfExists');
       try {
         if (obj['ignoreIfExists'] != null && !(obj['ignoreIfExists'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -3398,7 +3398,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type CreateFileOptions");
+      reporter.reportError('must be of type CreateFileOptions');
       return false;
     }
   }
@@ -3471,15 +3471,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['kind'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3488,15 +3488,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3506,7 +3506,7 @@
       try {
         if (obj['options'] != null &&
             !(DeleteFileOptions.canParse(obj['options'], reporter))) {
-          reporter.reportError("must be of type DeleteFileOptions");
+          reporter.reportError('must be of type DeleteFileOptions');
           return false;
         }
       } finally {
@@ -3514,7 +3514,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DeleteFile");
+      reporter.reportError('must be of type DeleteFile');
       return false;
     }
   }
@@ -3577,7 +3577,7 @@
       reporter.push('recursive');
       try {
         if (obj['recursive'] != null && !(obj['recursive'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -3587,7 +3587,7 @@
       try {
         if (obj['ignoreIfNotExists'] != null &&
             !(obj['ignoreIfNotExists'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -3595,7 +3595,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DeleteFileOptions");
+      reporter.reportError('must be of type DeleteFileOptions');
       return false;
     }
   }
@@ -3698,15 +3698,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -3716,7 +3716,7 @@
       try {
         if (obj['severity'] != null &&
             !(DiagnosticSeverity.canParse(obj['severity'], reporter))) {
-          reporter.reportError("must be of type DiagnosticSeverity");
+          reporter.reportError('must be of type DiagnosticSeverity');
           return false;
         }
       } finally {
@@ -3725,7 +3725,7 @@
       reporter.push('code');
       try {
         if (obj['code'] != null && !(obj['code'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3734,7 +3734,7 @@
       reporter.push('source');
       try {
         if (obj['source'] != null && !(obj['source'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3743,15 +3743,15 @@
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['message'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['message'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3764,7 +3764,7 @@
                 (obj['relatedInformation'].every((item) =>
                     DiagnosticRelatedInformation.canParse(item, reporter)))))) {
           reporter.reportError(
-              "must be of type List<DiagnosticRelatedInformation>");
+              'must be of type List<DiagnosticRelatedInformation>');
           return false;
         }
       } finally {
@@ -3772,7 +3772,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Diagnostic");
+      reporter.reportError('must be of type Diagnostic');
       return false;
     }
   }
@@ -3855,15 +3855,15 @@
       reporter.push('location');
       try {
         if (!obj.containsKey('location')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['location'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Location.canParse(obj['location'], reporter))) {
-          reporter.reportError("must be of type Location");
+          reporter.reportError('must be of type Location');
           return false;
         }
       } finally {
@@ -3872,15 +3872,15 @@
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['message'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['message'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3888,7 +3888,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DiagnosticRelatedInformation");
+      reporter.reportError('must be of type DiagnosticRelatedInformation');
       return false;
     }
   }
@@ -3971,11 +3971,11 @@
       reporter.push('settings');
       try {
         if (!obj.containsKey('settings')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['settings'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -3983,7 +3983,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DidChangeConfigurationParams");
+      reporter.reportError('must be of type DidChangeConfigurationParams');
       return false;
     }
   }
@@ -4055,17 +4055,17 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(VersionedTextDocumentIdentifier.canParse(
             obj['textDocument'], reporter))) {
           reporter
-              .reportError("must be of type VersionedTextDocumentIdentifier");
+              .reportError('must be of type VersionedTextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -4074,18 +4074,18 @@
       reporter.push('contentChanges');
       try {
         if (!obj.containsKey('contentChanges')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['contentChanges'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['contentChanges'] is List &&
             (obj['contentChanges'].every((item) =>
                 TextDocumentContentChangeEvent.canParse(item, reporter)))))) {
           reporter.reportError(
-              "must be of type List<TextDocumentContentChangeEvent>");
+              'must be of type List<TextDocumentContentChangeEvent>');
           return false;
         }
       } finally {
@@ -4093,7 +4093,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DidChangeTextDocumentParams");
+      reporter.reportError('must be of type DidChangeTextDocumentParams');
       return false;
     }
   }
@@ -4158,17 +4158,17 @@
       reporter.push('changes');
       try {
         if (!obj.containsKey('changes')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['changes'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['changes'] is List &&
             (obj['changes']
                 .every((item) => FileEvent.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<FileEvent>");
+          reporter.reportError('must be of type List<FileEvent>');
           return false;
         }
       } finally {
@@ -4176,7 +4176,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DidChangeWatchedFilesParams");
+      reporter.reportError('must be of type DidChangeWatchedFilesParams');
       return false;
     }
   }
@@ -4237,17 +4237,17 @@
       reporter.push('watchers');
       try {
         if (!obj.containsKey('watchers')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['watchers'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['watchers'] is List &&
             (obj['watchers'].every(
                 (item) => FileSystemWatcher.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<FileSystemWatcher>");
+          reporter.reportError('must be of type List<FileSystemWatcher>');
           return false;
         }
       } finally {
@@ -4256,7 +4256,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type DidChangeWatchedFilesRegistrationOptions");
+          'must be of type DidChangeWatchedFilesRegistrationOptions');
       return false;
     }
   }
@@ -4313,15 +4313,15 @@
       reporter.push('event');
       try {
         if (!obj.containsKey('event')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['event'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(WorkspaceFoldersChangeEvent.canParse(obj['event'], reporter))) {
-          reporter.reportError("must be of type WorkspaceFoldersChangeEvent");
+          reporter.reportError('must be of type WorkspaceFoldersChangeEvent');
           return false;
         }
       } finally {
@@ -4329,7 +4329,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DidChangeWorkspaceFoldersParams");
+      reporter.reportError('must be of type DidChangeWorkspaceFoldersParams');
       return false;
     }
   }
@@ -4384,15 +4384,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -4400,7 +4400,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DidCloseTextDocumentParams");
+      reporter.reportError('must be of type DidCloseTextDocumentParams');
       return false;
     }
   }
@@ -4455,15 +4455,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentItem.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentItem");
+          reporter.reportError('must be of type TextDocumentItem');
           return false;
         }
       } finally {
@@ -4471,7 +4471,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DidOpenTextDocumentParams");
+      reporter.reportError('must be of type DidOpenTextDocumentParams');
       return false;
     }
   }
@@ -4534,15 +4534,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -4551,7 +4551,7 @@
       reporter.push('text');
       try {
         if (obj['text'] != null && !(obj['text'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -4559,7 +4559,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DidSaveTextDocumentParams");
+      reporter.reportError('must be of type DidSaveTextDocumentParams');
       return false;
     }
   }
@@ -4636,7 +4636,7 @@
       reporter.push('language');
       try {
         if (obj['language'] != null && !(obj['language'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -4645,7 +4645,7 @@
       reporter.push('scheme');
       try {
         if (obj['scheme'] != null && !(obj['scheme'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -4654,7 +4654,7 @@
       reporter.push('pattern');
       try {
         if (obj['pattern'] != null && !(obj['pattern'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -4662,7 +4662,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentFilter");
+      reporter.reportError('must be of type DocumentFilter');
       return false;
     }
   }
@@ -4733,15 +4733,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -4750,15 +4750,15 @@
       reporter.push('options');
       try {
         if (!obj.containsKey('options')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['options'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(FormattingOptions.canParse(obj['options'], reporter))) {
-          reporter.reportError("must be of type FormattingOptions");
+          reporter.reportError('must be of type FormattingOptions');
           return false;
         }
       } finally {
@@ -4766,7 +4766,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentFormattingParams");
+      reporter.reportError('must be of type DocumentFormattingParams');
       return false;
     }
   }
@@ -4833,15 +4833,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -4851,7 +4851,7 @@
       try {
         if (obj['kind'] != null &&
             !(DocumentHighlightKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type DocumentHighlightKind");
+          reporter.reportError('must be of type DocumentHighlightKind');
           return false;
         }
       } finally {
@@ -4859,7 +4859,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentHighlight");
+      reporter.reportError('must be of type DocumentHighlight');
       return false;
     }
   }
@@ -4961,15 +4961,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -4978,7 +4978,7 @@
       reporter.push('target');
       try {
         if (obj['target'] != null && !(obj['target'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -4987,7 +4987,7 @@
       reporter.push('data');
       try {
         if (obj['data'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -4995,7 +4995,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentLink");
+      reporter.reportError('must be of type DocumentLink');
       return false;
     }
   }
@@ -5052,7 +5052,7 @@
       try {
         if (obj['resolveProvider'] != null &&
             !(obj['resolveProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -5060,7 +5060,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentLinkOptions");
+      reporter.reportError('must be of type DocumentLinkOptions');
       return false;
     }
   }
@@ -5115,15 +5115,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -5131,7 +5131,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentLinkParams");
+      reporter.reportError('must be of type DocumentLinkParams');
       return false;
     }
   }
@@ -5193,7 +5193,7 @@
       try {
         if (obj['resolveProvider'] != null &&
             !(obj['resolveProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -5202,14 +5202,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -5217,7 +5217,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentLinkRegistrationOptions");
+      reporter.reportError('must be of type DocumentLinkRegistrationOptions');
       return false;
     }
   }
@@ -5287,15 +5287,15 @@
       reporter.push('firstTriggerCharacter');
       try {
         if (!obj.containsKey('firstTriggerCharacter')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['firstTriggerCharacter'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['firstTriggerCharacter'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -5307,7 +5307,7 @@
             !((obj['moreTriggerCharacter'] is List &&
                 (obj['moreTriggerCharacter']
                     .every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -5315,7 +5315,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentOnTypeFormattingOptions");
+      reporter.reportError('must be of type DocumentOnTypeFormattingOptions');
       return false;
     }
   }
@@ -5405,15 +5405,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -5422,15 +5422,15 @@
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['position'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Position.canParse(obj['position'], reporter))) {
-          reporter.reportError("must be of type Position");
+          reporter.reportError('must be of type Position');
           return false;
         }
       } finally {
@@ -5439,15 +5439,15 @@
       reporter.push('ch');
       try {
         if (!obj.containsKey('ch')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['ch'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['ch'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -5456,15 +5456,15 @@
       reporter.push('options');
       try {
         if (!obj.containsKey('options')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['options'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(FormattingOptions.canParse(obj['options'], reporter))) {
-          reporter.reportError("must be of type FormattingOptions");
+          reporter.reportError('must be of type FormattingOptions');
           return false;
         }
       } finally {
@@ -5472,7 +5472,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentOnTypeFormattingParams");
+      reporter.reportError('must be of type DocumentOnTypeFormattingParams');
       return false;
     }
   }
@@ -5556,15 +5556,15 @@
       reporter.push('firstTriggerCharacter');
       try {
         if (!obj.containsKey('firstTriggerCharacter')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['firstTriggerCharacter'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['firstTriggerCharacter'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -5576,7 +5576,7 @@
             !((obj['moreTriggerCharacter'] is List &&
                 (obj['moreTriggerCharacter']
                     .every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -5585,14 +5585,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -5601,7 +5601,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type DocumentOnTypeFormattingRegistrationOptions");
+          'must be of type DocumentOnTypeFormattingRegistrationOptions');
       return false;
     }
   }
@@ -5682,15 +5682,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -5699,15 +5699,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -5716,15 +5716,15 @@
       reporter.push('options');
       try {
         if (!obj.containsKey('options')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['options'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(FormattingOptions.canParse(obj['options'], reporter))) {
-          reporter.reportError("must be of type FormattingOptions");
+          reporter.reportError('must be of type FormattingOptions');
           return false;
         }
       } finally {
@@ -5732,7 +5732,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentRangeFormattingParams");
+      reporter.reportError('must be of type DocumentRangeFormattingParams');
       return false;
     }
   }
@@ -5853,15 +5853,15 @@
       reporter.push('name');
       try {
         if (!obj.containsKey('name')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['name'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['name'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -5870,7 +5870,7 @@
       reporter.push('detail');
       try {
         if (obj['detail'] != null && !(obj['detail'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -5879,15 +5879,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(SymbolKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type SymbolKind");
+          reporter.reportError('must be of type SymbolKind');
           return false;
         }
       } finally {
@@ -5896,7 +5896,7 @@
       reporter.push('deprecated');
       try {
         if (obj['deprecated'] != null && !(obj['deprecated'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -5905,15 +5905,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -5922,15 +5922,15 @@
       reporter.push('selectionRange');
       try {
         if (!obj.containsKey('selectionRange')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['selectionRange'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['selectionRange'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -5942,7 +5942,7 @@
             !((obj['children'] is List &&
                 (obj['children'].every(
                     (item) => DocumentSymbol.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentSymbol>");
+          reporter.reportError('must be of type List<DocumentSymbol>');
           return false;
         }
       } finally {
@@ -5950,7 +5950,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentSymbol");
+      reporter.reportError('must be of type DocumentSymbol');
       return false;
     }
   }
@@ -6019,15 +6019,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -6035,7 +6035,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type DocumentSymbolParams");
+      reporter.reportError('must be of type DocumentSymbolParams');
       return false;
     }
   }
@@ -6126,16 +6126,16 @@
       reporter.push('commands');
       try {
         if (!obj.containsKey('commands')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['commands'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['commands'] is List &&
             (obj['commands'].every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -6143,7 +6143,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ExecuteCommandOptions");
+      reporter.reportError('must be of type ExecuteCommandOptions');
       return false;
     }
   }
@@ -6206,15 +6206,15 @@
       reporter.push('command');
       try {
         if (!obj.containsKey('command')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['command'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['command'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -6225,7 +6225,7 @@
         if (obj['arguments'] != null &&
             !((obj['arguments'] is List &&
                 (obj['arguments'].every((item) => true))))) {
-          reporter.reportError("must be of type List<dynamic>");
+          reporter.reportError('must be of type List<dynamic>');
           return false;
         }
       } finally {
@@ -6233,7 +6233,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ExecuteCommandParams");
+      reporter.reportError('must be of type ExecuteCommandParams');
       return false;
     }
   }
@@ -6293,16 +6293,16 @@
       reporter.push('commands');
       try {
         if (!obj.containsKey('commands')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['commands'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['commands'] is List &&
             (obj['commands'].every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -6310,7 +6310,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ExecuteCommandRegistrationOptions");
+      reporter.reportError('must be of type ExecuteCommandRegistrationOptions');
       return false;
     }
   }
@@ -6451,15 +6451,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -6468,15 +6468,15 @@
       reporter.push('type');
       try {
         if (!obj.containsKey('type')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['type'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['type'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -6484,7 +6484,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type FileEvent");
+      reporter.reportError('must be of type FileEvent');
       return false;
     }
   }
@@ -6558,15 +6558,15 @@
       reporter.push('globPattern');
       try {
         if (!obj.containsKey('globPattern')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['globPattern'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['globPattern'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -6576,7 +6576,7 @@
       try {
         if (obj['kind'] != null &&
             !(WatchKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type WatchKind");
+          reporter.reportError('must be of type WatchKind');
           return false;
         }
       } finally {
@@ -6584,7 +6584,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type FileSystemWatcher");
+      reporter.reportError('must be of type FileSystemWatcher');
       return false;
     }
   }
@@ -6676,15 +6676,15 @@
       reporter.push('startLine');
       try {
         if (!obj.containsKey('startLine')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['startLine'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['startLine'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -6693,7 +6693,7 @@
       reporter.push('startCharacter');
       try {
         if (obj['startCharacter'] != null && !(obj['startCharacter'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -6702,15 +6702,15 @@
       reporter.push('endLine');
       try {
         if (!obj.containsKey('endLine')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['endLine'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['endLine'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -6719,7 +6719,7 @@
       reporter.push('endCharacter');
       try {
         if (obj['endCharacter'] != null && !(obj['endCharacter'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -6729,7 +6729,7 @@
       try {
         if (obj['kind'] != null &&
             !(FoldingRangeKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type FoldingRangeKind");
+          reporter.reportError('must be of type FoldingRangeKind');
           return false;
         }
       } finally {
@@ -6737,7 +6737,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type FoldingRange");
+      reporter.reportError('must be of type FoldingRange');
       return false;
     }
   }
@@ -6832,15 +6832,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -6848,7 +6848,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type FoldingRangeParams");
+      reporter.reportError('must be of type FoldingRangeParams');
       return false;
     }
   }
@@ -6891,7 +6891,7 @@
     if (obj is Map<String, dynamic>) {
       return true;
     } else {
-      reporter.reportError("must be of type FoldingRangeProviderOptions");
+      reporter.reportError('must be of type FoldingRangeProviderOptions');
       return false;
     }
   }
@@ -6953,15 +6953,15 @@
       reporter.push('tabSize');
       try {
         if (!obj.containsKey('tabSize')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['tabSize'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['tabSize'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -6970,15 +6970,15 @@
       reporter.push('insertSpaces');
       try {
         if (!obj.containsKey('insertSpaces')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['insertSpaces'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['insertSpaces'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -6986,7 +6986,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type FormattingOptions");
+      reporter.reportError('must be of type FormattingOptions');
       return false;
     }
   }
@@ -7056,17 +7056,17 @@
       reporter.push('contents');
       try {
         if (!obj.containsKey('contents')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['contents'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['contents'] is String ||
             MarkupContent.canParse(obj['contents'], reporter)))) {
           reporter
-              .reportError("must be of type Either2<String, MarkupContent>");
+              .reportError('must be of type Either2<String, MarkupContent>');
           return false;
         }
       } finally {
@@ -7075,7 +7075,7 @@
       reporter.push('range');
       try {
         if (obj['range'] != null && !(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -7083,7 +7083,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Hover");
+      reporter.reportError('must be of type Hover');
       return false;
     }
   }
@@ -7199,11 +7199,11 @@
       reporter.push('processId');
       try {
         if (!obj.containsKey('processId')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['processId'] != null && !(obj['processId'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -7212,7 +7212,7 @@
       reporter.push('rootPath');
       try {
         if (obj['rootPath'] != null && !(obj['rootPath'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -7221,11 +7221,11 @@
       reporter.push('rootUri');
       try {
         if (!obj.containsKey('rootUri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['rootUri'] != null && !(obj['rootUri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -7234,7 +7234,7 @@
       reporter.push('initializationOptions');
       try {
         if (obj['initializationOptions'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -7243,15 +7243,15 @@
       reporter.push('capabilities');
       try {
         if (!obj.containsKey('capabilities')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['capabilities'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(ClientCapabilities.canParse(obj['capabilities'], reporter))) {
-          reporter.reportError("must be of type ClientCapabilities");
+          reporter.reportError('must be of type ClientCapabilities');
           return false;
         }
       } finally {
@@ -7260,7 +7260,7 @@
       reporter.push('trace');
       try {
         if (obj['trace'] != null && !(obj['trace'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -7272,7 +7272,7 @@
             !((obj['workspaceFolders'] is List &&
                 (obj['workspaceFolders'].every(
                     (item) => WorkspaceFolder.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<WorkspaceFolder>");
+          reporter.reportError('must be of type List<WorkspaceFolder>');
           return false;
         }
       } finally {
@@ -7280,7 +7280,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type InitializeParams");
+      reporter.reportError('must be of type InitializeParams');
       return false;
     }
   }
@@ -7349,15 +7349,15 @@
       reporter.push('capabilities');
       try {
         if (!obj.containsKey('capabilities')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['capabilities'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(ServerCapabilities.canParse(obj['capabilities'], reporter))) {
-          reporter.reportError("must be of type ServerCapabilities");
+          reporter.reportError('must be of type ServerCapabilities');
           return false;
         }
       } finally {
@@ -7365,7 +7365,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type InitializeResult");
+      reporter.reportError('must be of type InitializeResult');
       return false;
     }
   }
@@ -7406,7 +7406,7 @@
     if (obj is Map<String, dynamic>) {
       return true;
     } else {
-      reporter.reportError("must be of type InitializedParams");
+      reporter.reportError('must be of type InitializedParams');
       return false;
     }
   }
@@ -7501,15 +7501,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -7518,15 +7518,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -7534,7 +7534,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Location");
+      reporter.reportError('must be of type Location');
       return false;
     }
   }
@@ -7630,7 +7630,7 @@
       try {
         if (obj['originSelectionRange'] != null &&
             !(Range.canParse(obj['originSelectionRange'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -7639,15 +7639,15 @@
       reporter.push('targetUri');
       try {
         if (!obj.containsKey('targetUri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['targetUri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['targetUri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -7656,15 +7656,15 @@
       reporter.push('targetRange');
       try {
         if (!obj.containsKey('targetRange')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['targetRange'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['targetRange'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -7673,15 +7673,15 @@
       reporter.push('targetSelectionRange');
       try {
         if (!obj.containsKey('targetSelectionRange')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['targetSelectionRange'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['targetSelectionRange'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -7689,7 +7689,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type LocationLink");
+      reporter.reportError('must be of type LocationLink');
       return false;
     }
   }
@@ -7758,15 +7758,15 @@
       reporter.push('type');
       try {
         if (!obj.containsKey('type')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['type'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(MessageType.canParse(obj['type'], reporter))) {
-          reporter.reportError("must be of type MessageType");
+          reporter.reportError('must be of type MessageType');
           return false;
         }
       } finally {
@@ -7775,15 +7775,15 @@
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['message'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['message'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -7791,7 +7791,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type LogMessageParams");
+      reporter.reportError('must be of type LogMessageParams');
       return false;
     }
   }
@@ -7875,15 +7875,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(MarkupKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type MarkupKind");
+          reporter.reportError('must be of type MarkupKind');
           return false;
         }
       } finally {
@@ -7892,15 +7892,15 @@
       reporter.push('value');
       try {
         if (!obj.containsKey('value')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['value'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['value'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -7908,7 +7908,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type MarkupContent");
+      reporter.reportError('must be of type MarkupContent');
       return false;
     }
   }
@@ -8006,15 +8006,15 @@
       reporter.push('jsonrpc');
       try {
         if (!obj.containsKey('jsonrpc')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['jsonrpc'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['jsonrpc'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -8022,7 +8022,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Message");
+      reporter.reportError('must be of type Message');
       return false;
     }
   }
@@ -8074,15 +8074,15 @@
       reporter.push('title');
       try {
         if (!obj.containsKey('title')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['title'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['title'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -8090,7 +8090,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type MessageActionItem");
+      reporter.reportError('must be of type MessageActionItem');
       return false;
     }
   }
@@ -8369,15 +8369,15 @@
       reporter.push('method');
       try {
         if (!obj.containsKey('method')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['method'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Method.canParse(obj['method'], reporter))) {
-          reporter.reportError("must be of type Method");
+          reporter.reportError('must be of type Method');
           return false;
         }
       } finally {
@@ -8386,7 +8386,7 @@
       reporter.push('params');
       try {
         if (obj['params'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -8395,15 +8395,15 @@
       reporter.push('jsonrpc');
       try {
         if (!obj.containsKey('jsonrpc')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['jsonrpc'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['jsonrpc'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -8411,7 +8411,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type NotificationMessage");
+      reporter.reportError('must be of type NotificationMessage');
       return false;
     }
   }
@@ -8495,15 +8495,15 @@
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['label'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -8515,7 +8515,7 @@
             !((obj['documentation'] is String ||
                 MarkupContent.canParse(obj['documentation'], reporter)))) {
           reporter
-              .reportError("must be of type Either2<String, MarkupContent>");
+              .reportError('must be of type Either2<String, MarkupContent>');
           return false;
         }
       } finally {
@@ -8523,7 +8523,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ParameterInformation");
+      reporter.reportError('must be of type ParameterInformation');
       return false;
     }
   }
@@ -8592,15 +8592,15 @@
       reporter.push('line');
       try {
         if (!obj.containsKey('line')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['line'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['line'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -8609,15 +8609,15 @@
       reporter.push('character');
       try {
         if (!obj.containsKey('character')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['character'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['character'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -8625,7 +8625,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Position");
+      reporter.reportError('must be of type Position');
       return false;
     }
   }
@@ -8690,15 +8690,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -8707,17 +8707,17 @@
       reporter.push('diagnostics');
       try {
         if (!obj.containsKey('diagnostics')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['diagnostics'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['diagnostics'] is List &&
             (obj['diagnostics']
                 .every((item) => Diagnostic.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<Diagnostic>");
+          reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
       } finally {
@@ -8725,7 +8725,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type PublishDiagnosticsParams");
+      reporter.reportError('must be of type PublishDiagnosticsParams');
       return false;
     }
   }
@@ -8789,15 +8789,15 @@
       reporter.push('start');
       try {
         if (!obj.containsKey('start')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['start'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Position.canParse(obj['start'], reporter))) {
-          reporter.reportError("must be of type Position");
+          reporter.reportError('must be of type Position');
           return false;
         }
       } finally {
@@ -8806,15 +8806,15 @@
       reporter.push('end');
       try {
         if (!obj.containsKey('end')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['end'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Position.canParse(obj['end'], reporter))) {
-          reporter.reportError("must be of type Position");
+          reporter.reportError('must be of type Position');
           return false;
         }
       } finally {
@@ -8822,7 +8822,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Range");
+      reporter.reportError('must be of type Range');
       return false;
     }
   }
@@ -8881,15 +8881,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -8898,15 +8898,15 @@
       reporter.push('placeholder');
       try {
         if (!obj.containsKey('placeholder')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['placeholder'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['placeholder'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -8914,7 +8914,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RangeAndPlaceholder");
+      reporter.reportError('must be of type RangeAndPlaceholder');
       return false;
     }
   }
@@ -8968,15 +8968,15 @@
       reporter.push('includeDeclaration');
       try {
         if (!obj.containsKey('includeDeclaration')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['includeDeclaration'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['includeDeclaration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -8984,7 +8984,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ReferenceContext");
+      reporter.reportError('must be of type ReferenceContext');
       return false;
     }
   }
@@ -9059,15 +9059,15 @@
       reporter.push('context');
       try {
         if (!obj.containsKey('context')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['context'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(ReferenceContext.canParse(obj['context'], reporter))) {
-          reporter.reportError("must be of type ReferenceContext");
+          reporter.reportError('must be of type ReferenceContext');
           return false;
         }
       } finally {
@@ -9076,15 +9076,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -9093,15 +9093,15 @@
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['position'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Position.canParse(obj['position'], reporter))) {
-          reporter.reportError("must be of type Position");
+          reporter.reportError('must be of type Position');
           return false;
         }
       } finally {
@@ -9109,7 +9109,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ReferenceParams");
+      reporter.reportError('must be of type ReferenceParams');
       return false;
     }
   }
@@ -9183,15 +9183,15 @@
       reporter.push('id');
       try {
         if (!obj.containsKey('id')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['id'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['id'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -9200,15 +9200,15 @@
       reporter.push('method');
       try {
         if (!obj.containsKey('method')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['method'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['method'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -9217,7 +9217,7 @@
       reporter.push('registerOptions');
       try {
         if (obj['registerOptions'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -9225,7 +9225,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Registration");
+      reporter.reportError('must be of type Registration');
       return false;
     }
   }
@@ -9285,17 +9285,17 @@
       reporter.push('registrations');
       try {
         if (!obj.containsKey('registrations')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['registrations'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['registrations'] is List &&
             (obj['registrations']
                 .every((item) => Registration.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<Registration>");
+          reporter.reportError('must be of type List<Registration>');
           return false;
         }
       } finally {
@@ -9303,7 +9303,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RegistrationParams");
+      reporter.reportError('must be of type RegistrationParams');
       return false;
     }
   }
@@ -9383,15 +9383,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['kind'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -9400,15 +9400,15 @@
       reporter.push('oldUri');
       try {
         if (!obj.containsKey('oldUri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['oldUri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['oldUri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -9417,15 +9417,15 @@
       reporter.push('newUri');
       try {
         if (!obj.containsKey('newUri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['newUri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['newUri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -9435,7 +9435,7 @@
       try {
         if (obj['options'] != null &&
             !(RenameFileOptions.canParse(obj['options'], reporter))) {
-          reporter.reportError("must be of type RenameFileOptions");
+          reporter.reportError('must be of type RenameFileOptions');
           return false;
         }
       } finally {
@@ -9443,7 +9443,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RenameFile");
+      reporter.reportError('must be of type RenameFile');
       return false;
     }
   }
@@ -9508,7 +9508,7 @@
       reporter.push('overwrite');
       try {
         if (obj['overwrite'] != null && !(obj['overwrite'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -9517,7 +9517,7 @@
       reporter.push('ignoreIfExists');
       try {
         if (obj['ignoreIfExists'] != null && !(obj['ignoreIfExists'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -9525,7 +9525,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RenameFileOptions");
+      reporter.reportError('must be of type RenameFileOptions');
       return false;
     }
   }
@@ -9580,7 +9580,7 @@
       try {
         if (obj['prepareProvider'] != null &&
             !(obj['prepareProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -9588,7 +9588,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RenameOptions");
+      reporter.reportError('must be of type RenameOptions');
       return false;
     }
   }
@@ -9663,15 +9663,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -9680,15 +9680,15 @@
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['position'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Position.canParse(obj['position'], reporter))) {
-          reporter.reportError("must be of type Position");
+          reporter.reportError('must be of type Position');
           return false;
         }
       } finally {
@@ -9697,15 +9697,15 @@
       reporter.push('newName');
       try {
         if (!obj.containsKey('newName')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['newName'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['newName'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -9713,7 +9713,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RenameParams");
+      reporter.reportError('must be of type RenameParams');
       return false;
     }
   }
@@ -9779,7 +9779,7 @@
       try {
         if (obj['prepareProvider'] != null &&
             !(obj['prepareProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -9788,14 +9788,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -9803,7 +9803,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RenameRegistrationOptions");
+      reporter.reportError('must be of type RenameRegistrationOptions');
       return false;
     }
   }
@@ -9885,15 +9885,15 @@
       reporter.push('id');
       try {
         if (!obj.containsKey('id')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['id'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['id'] is num || obj['id'] is String))) {
-          reporter.reportError("must be of type Either2<num, String>");
+          reporter.reportError('must be of type Either2<num, String>');
           return false;
         }
       } finally {
@@ -9902,15 +9902,15 @@
       reporter.push('method');
       try {
         if (!obj.containsKey('method')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['method'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Method.canParse(obj['method'], reporter))) {
-          reporter.reportError("must be of type Method");
+          reporter.reportError('must be of type Method');
           return false;
         }
       } finally {
@@ -9919,7 +9919,7 @@
       reporter.push('params');
       try {
         if (obj['params'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -9928,15 +9928,15 @@
       reporter.push('jsonrpc');
       try {
         if (!obj.containsKey('jsonrpc')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['jsonrpc'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['jsonrpc'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -9944,7 +9944,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type RequestMessage");
+      reporter.reportError('must be of type RequestMessage');
       return false;
     }
   }
@@ -10058,15 +10058,15 @@
       reporter.push('code');
       try {
         if (!obj.containsKey('code')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['code'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(ErrorCodes.canParse(obj['code'], reporter))) {
-          reporter.reportError("must be of type ErrorCodes");
+          reporter.reportError('must be of type ErrorCodes');
           return false;
         }
       } finally {
@@ -10075,15 +10075,15 @@
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['message'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['message'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -10092,7 +10092,7 @@
       reporter.push('data');
       try {
         if (obj['data'] != null && !(obj['data'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -10100,7 +10100,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ResponseError<D>");
+      reporter.reportError('must be of type ResponseError<D>');
       return false;
     }
   }
@@ -10185,11 +10185,11 @@
       reporter.push('id');
       try {
         if (!obj.containsKey('id')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['id'] != null && !((obj['id'] is num || obj['id'] is String))) {
-          reporter.reportError("must be of type Either2<num, String>");
+          reporter.reportError('must be of type Either2<num, String>');
           return false;
         }
       } finally {
@@ -10198,7 +10198,7 @@
       reporter.push('result');
       try {
         if (obj['result'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -10208,7 +10208,7 @@
       try {
         if (obj['error'] != null &&
             !(ResponseError.canParse(obj['error'], reporter))) {
-          reporter.reportError("must be of type ResponseError<dynamic>");
+          reporter.reportError('must be of type ResponseError<dynamic>');
           return false;
         }
       } finally {
@@ -10217,15 +10217,15 @@
       reporter.push('jsonrpc');
       try {
         if (!obj.containsKey('jsonrpc')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['jsonrpc'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['jsonrpc'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -10233,7 +10233,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ResponseMessage");
+      reporter.reportError('must be of type ResponseMessage');
       return false;
     }
   }
@@ -10291,7 +10291,7 @@
       reporter.push('includeText');
       try {
         if (obj['includeText'] != null && !(obj['includeText'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10299,7 +10299,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type SaveOptions");
+      reporter.reportError('must be of type SaveOptions');
       return false;
     }
   }
@@ -10626,7 +10626,7 @@
                     obj['textDocumentSync'], reporter) ||
                 obj['textDocumentSync'] is num))) {
           reporter.reportError(
-              "must be of type Either2<TextDocumentSyncOptions, num>");
+              'must be of type Either2<TextDocumentSyncOptions, num>');
           return false;
         }
       } finally {
@@ -10635,7 +10635,7 @@
       reporter.push('hoverProvider');
       try {
         if (obj['hoverProvider'] != null && !(obj['hoverProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10646,7 +10646,7 @@
         if (obj['completionProvider'] != null &&
             !(CompletionOptions.canParse(
                 obj['completionProvider'], reporter))) {
-          reporter.reportError("must be of type CompletionOptions");
+          reporter.reportError('must be of type CompletionOptions');
           return false;
         }
       } finally {
@@ -10657,7 +10657,7 @@
         if (obj['signatureHelpProvider'] != null &&
             !(SignatureHelpOptions.canParse(
                 obj['signatureHelpProvider'], reporter))) {
-          reporter.reportError("must be of type SignatureHelpOptions");
+          reporter.reportError('must be of type SignatureHelpOptions');
           return false;
         }
       } finally {
@@ -10667,7 +10667,7 @@
       try {
         if (obj['definitionProvider'] != null &&
             !(obj['definitionProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10676,7 +10676,7 @@
       reporter.push('typeDefinitionProvider');
       try {
         if (obj['typeDefinitionProvider'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -10685,7 +10685,7 @@
       reporter.push('implementationProvider');
       try {
         if (obj['implementationProvider'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -10695,7 +10695,7 @@
       try {
         if (obj['referencesProvider'] != null &&
             !(obj['referencesProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10705,7 +10705,7 @@
       try {
         if (obj['documentHighlightProvider'] != null &&
             !(obj['documentHighlightProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10715,7 +10715,7 @@
       try {
         if (obj['documentSymbolProvider'] != null &&
             !(obj['documentSymbolProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10725,7 +10725,7 @@
       try {
         if (obj['workspaceSymbolProvider'] != null &&
             !(obj['workspaceSymbolProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10738,7 +10738,7 @@
                 CodeActionOptions.canParse(
                     obj['codeActionProvider'], reporter)))) {
           reporter
-              .reportError("must be of type Either2<bool, CodeActionOptions>");
+              .reportError('must be of type Either2<bool, CodeActionOptions>');
           return false;
         }
       } finally {
@@ -10748,7 +10748,7 @@
       try {
         if (obj['codeLensProvider'] != null &&
             !(CodeLensOptions.canParse(obj['codeLensProvider'], reporter))) {
-          reporter.reportError("must be of type CodeLensOptions");
+          reporter.reportError('must be of type CodeLensOptions');
           return false;
         }
       } finally {
@@ -10758,7 +10758,7 @@
       try {
         if (obj['documentFormattingProvider'] != null &&
             !(obj['documentFormattingProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10768,7 +10768,7 @@
       try {
         if (obj['documentRangeFormattingProvider'] != null &&
             !(obj['documentRangeFormattingProvider'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -10780,7 +10780,7 @@
             !(DocumentOnTypeFormattingOptions.canParse(
                 obj['documentOnTypeFormattingProvider'], reporter))) {
           reporter
-              .reportError("must be of type DocumentOnTypeFormattingOptions");
+              .reportError('must be of type DocumentOnTypeFormattingOptions');
           return false;
         }
       } finally {
@@ -10791,7 +10791,7 @@
         if (obj['renameProvider'] != null &&
             !((obj['renameProvider'] is bool ||
                 RenameOptions.canParse(obj['renameProvider'], reporter)))) {
-          reporter.reportError("must be of type Either2<bool, RenameOptions>");
+          reporter.reportError('must be of type Either2<bool, RenameOptions>');
           return false;
         }
       } finally {
@@ -10802,7 +10802,7 @@
         if (obj['documentLinkProvider'] != null &&
             !(DocumentLinkOptions.canParse(
                 obj['documentLinkProvider'], reporter))) {
-          reporter.reportError("must be of type DocumentLinkOptions");
+          reporter.reportError('must be of type DocumentLinkOptions');
           return false;
         }
       } finally {
@@ -10811,7 +10811,7 @@
       reporter.push('colorProvider');
       try {
         if (obj['colorProvider'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -10820,7 +10820,7 @@
       reporter.push('foldingRangeProvider');
       try {
         if (obj['foldingRangeProvider'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -10829,7 +10829,7 @@
       reporter.push('declarationProvider');
       try {
         if (obj['declarationProvider'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -10840,7 +10840,7 @@
         if (obj['executeCommandProvider'] != null &&
             !(ExecuteCommandOptions.canParse(
                 obj['executeCommandProvider'], reporter))) {
-          reporter.reportError("must be of type ExecuteCommandOptions");
+          reporter.reportError('must be of type ExecuteCommandOptions');
           return false;
         }
       } finally {
@@ -10851,7 +10851,7 @@
         if (obj['workspace'] != null &&
             !(ServerCapabilitiesWorkspace.canParse(
                 obj['workspace'], reporter))) {
-          reporter.reportError("must be of type ServerCapabilitiesWorkspace");
+          reporter.reportError('must be of type ServerCapabilitiesWorkspace');
           return false;
         }
       } finally {
@@ -10860,7 +10860,7 @@
       reporter.push('experimental');
       try {
         if (obj['experimental'] != null && !(true)) {
-          reporter.reportError("must be of type dynamic");
+          reporter.reportError('must be of type dynamic');
           return false;
         }
       } finally {
@@ -10868,7 +10868,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ServerCapabilities");
+      reporter.reportError('must be of type ServerCapabilities');
       return false;
     }
   }
@@ -10977,7 +10977,7 @@
             !(ServerCapabilitiesWorkspaceFolders.canParse(
                 obj['workspaceFolders'], reporter))) {
           reporter.reportError(
-              "must be of type ServerCapabilitiesWorkspaceFolders");
+              'must be of type ServerCapabilitiesWorkspaceFolders');
           return false;
         }
       } finally {
@@ -10985,7 +10985,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ServerCapabilitiesWorkspace");
+      reporter.reportError('must be of type ServerCapabilitiesWorkspace');
       return false;
     }
   }
@@ -11049,7 +11049,7 @@
       reporter.push('supported');
       try {
         if (obj['supported'] != null && !(obj['supported'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -11059,7 +11059,7 @@
       try {
         if (obj['changeNotifications'] != null &&
             !(obj['changeNotifications'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -11068,7 +11068,7 @@
       return true;
     } else {
       reporter
-          .reportError("must be of type ServerCapabilitiesWorkspaceFolders");
+          .reportError('must be of type ServerCapabilitiesWorkspaceFolders');
       return false;
     }
   }
@@ -11133,15 +11133,15 @@
       reporter.push('type');
       try {
         if (!obj.containsKey('type')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['type'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(MessageType.canParse(obj['type'], reporter))) {
-          reporter.reportError("must be of type MessageType");
+          reporter.reportError('must be of type MessageType');
           return false;
         }
       } finally {
@@ -11150,15 +11150,15 @@
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['message'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['message'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -11166,7 +11166,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ShowMessageParams");
+      reporter.reportError('must be of type ShowMessageParams');
       return false;
     }
   }
@@ -11239,15 +11239,15 @@
       reporter.push('type');
       try {
         if (!obj.containsKey('type')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['type'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(MessageType.canParse(obj['type'], reporter))) {
-          reporter.reportError("must be of type MessageType");
+          reporter.reportError('must be of type MessageType');
           return false;
         }
       } finally {
@@ -11256,15 +11256,15 @@
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['message'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['message'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -11276,7 +11276,7 @@
             !((obj['actions'] is List &&
                 (obj['actions'].every(
                     (item) => MessageActionItem.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<MessageActionItem>");
+          reporter.reportError('must be of type List<MessageActionItem>');
           return false;
         }
       } finally {
@@ -11284,7 +11284,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type ShowMessageRequestParams");
+      reporter.reportError('must be of type ShowMessageRequestParams');
       return false;
     }
   }
@@ -11373,17 +11373,17 @@
       reporter.push('signatures');
       try {
         if (!obj.containsKey('signatures')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['signatures'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['signatures'] is List &&
             (obj['signatures'].every(
                 (item) => SignatureInformation.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<SignatureInformation>");
+          reporter.reportError('must be of type List<SignatureInformation>');
           return false;
         }
       } finally {
@@ -11393,7 +11393,7 @@
       try {
         if (obj['activeSignature'] != null &&
             !(obj['activeSignature'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -11403,7 +11403,7 @@
       try {
         if (obj['activeParameter'] != null &&
             !(obj['activeParameter'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -11411,7 +11411,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type SignatureHelp");
+      reporter.reportError('must be of type SignatureHelp');
       return false;
     }
   }
@@ -11473,7 +11473,7 @@
         if (obj['triggerCharacters'] != null &&
             !((obj['triggerCharacters'] is List &&
                 (obj['triggerCharacters'].every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -11481,7 +11481,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type SignatureHelpOptions");
+      reporter.reportError('must be of type SignatureHelpOptions');
       return false;
     }
   }
@@ -11551,7 +11551,7 @@
         if (obj['triggerCharacters'] != null &&
             !((obj['triggerCharacters'] is List &&
                 (obj['triggerCharacters'].every((item) => item is String))))) {
-          reporter.reportError("must be of type List<String>");
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -11560,14 +11560,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -11575,7 +11575,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type SignatureHelpRegistrationOptions");
+      reporter.reportError('must be of type SignatureHelpRegistrationOptions');
       return false;
     }
   }
@@ -11660,15 +11660,15 @@
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['label'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['label'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -11680,7 +11680,7 @@
             !((obj['documentation'] is String ||
                 MarkupContent.canParse(obj['documentation'], reporter)))) {
           reporter
-              .reportError("must be of type Either2<String, MarkupContent>");
+              .reportError('must be of type Either2<String, MarkupContent>');
           return false;
         }
       } finally {
@@ -11692,7 +11692,7 @@
             !((obj['parameters'] is List &&
                 (obj['parameters'].every((item) =>
                     ParameterInformation.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<ParameterInformation>");
+          reporter.reportError('must be of type List<ParameterInformation>');
           return false;
         }
       } finally {
@@ -11700,7 +11700,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type SignatureInformation");
+      reporter.reportError('must be of type SignatureInformation');
       return false;
     }
   }
@@ -11758,7 +11758,7 @@
       reporter.push('id');
       try {
         if (obj['id'] != null && !(obj['id'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -11766,7 +11766,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type StaticRegistrationOptions");
+      reporter.reportError('must be of type StaticRegistrationOptions');
       return false;
     }
   }
@@ -11865,15 +11865,15 @@
       reporter.push('name');
       try {
         if (!obj.containsKey('name')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['name'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['name'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -11882,15 +11882,15 @@
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['kind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(SymbolKind.canParse(obj['kind'], reporter))) {
-          reporter.reportError("must be of type SymbolKind");
+          reporter.reportError('must be of type SymbolKind');
           return false;
         }
       } finally {
@@ -11899,7 +11899,7 @@
       reporter.push('deprecated');
       try {
         if (obj['deprecated'] != null && !(obj['deprecated'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -11908,15 +11908,15 @@
       reporter.push('location');
       try {
         if (!obj.containsKey('location')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['location'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Location.canParse(obj['location'], reporter))) {
-          reporter.reportError("must be of type Location");
+          reporter.reportError('must be of type Location');
           return false;
         }
       } finally {
@@ -11925,7 +11925,7 @@
       reporter.push('containerName');
       try {
         if (obj['containerName'] != null && !(obj['containerName'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -11933,7 +11933,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type SymbolInformation");
+      reporter.reportError('must be of type SymbolInformation');
       return false;
     }
   }
@@ -12061,15 +12061,15 @@
       reporter.push('syncKind');
       try {
         if (!obj.containsKey('syncKind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['syncKind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentSyncKind.canParse(obj['syncKind'], reporter))) {
-          reporter.reportError("must be of type TextDocumentSyncKind");
+          reporter.reportError('must be of type TextDocumentSyncKind');
           return false;
         }
       } finally {
@@ -12078,14 +12078,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -12094,7 +12094,7 @@
       return true;
     } else {
       reporter
-          .reportError("must be of type TextDocumentChangeRegistrationOptions");
+          .reportError('must be of type TextDocumentChangeRegistrationOptions');
       return false;
     }
   }
@@ -12398,7 +12398,7 @@
             !(TextDocumentClientCapabilitiesSynchronization.canParse(
                 obj['synchronization'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesSynchronization");
+              'must be of type TextDocumentClientCapabilitiesSynchronization');
           return false;
         }
       } finally {
@@ -12410,7 +12410,7 @@
             !(TextDocumentClientCapabilitiesCompletion.canParse(
                 obj['completion'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesCompletion");
+              'must be of type TextDocumentClientCapabilitiesCompletion');
           return false;
         }
       } finally {
@@ -12422,7 +12422,7 @@
             !(TextDocumentClientCapabilitiesHover.canParse(
                 obj['hover'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesHover");
+              'must be of type TextDocumentClientCapabilitiesHover');
           return false;
         }
       } finally {
@@ -12434,7 +12434,7 @@
             !(TextDocumentClientCapabilitiesSignatureHelp.canParse(
                 obj['signatureHelp'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesSignatureHelp");
+              'must be of type TextDocumentClientCapabilitiesSignatureHelp');
           return false;
         }
       } finally {
@@ -12446,7 +12446,7 @@
             !(TextDocumentClientCapabilitiesReferences.canParse(
                 obj['references'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesReferences");
+              'must be of type TextDocumentClientCapabilitiesReferences');
           return false;
         }
       } finally {
@@ -12458,7 +12458,7 @@
             !(TextDocumentClientCapabilitiesDocumentHighlight.canParse(
                 obj['documentHighlight'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesDocumentHighlight");
+              'must be of type TextDocumentClientCapabilitiesDocumentHighlight');
           return false;
         }
       } finally {
@@ -12470,7 +12470,7 @@
             !(TextDocumentClientCapabilitiesDocumentSymbol.canParse(
                 obj['documentSymbol'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesDocumentSymbol");
+              'must be of type TextDocumentClientCapabilitiesDocumentSymbol');
           return false;
         }
       } finally {
@@ -12482,7 +12482,7 @@
             !(TextDocumentClientCapabilitiesFormatting.canParse(
                 obj['formatting'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesFormatting");
+              'must be of type TextDocumentClientCapabilitiesFormatting');
           return false;
         }
       } finally {
@@ -12494,7 +12494,7 @@
             !(TextDocumentClientCapabilitiesRangeFormatting.canParse(
                 obj['rangeFormatting'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesRangeFormatting");
+              'must be of type TextDocumentClientCapabilitiesRangeFormatting');
           return false;
         }
       } finally {
@@ -12506,7 +12506,7 @@
             !(TextDocumentClientCapabilitiesOnTypeFormatting.canParse(
                 obj['onTypeFormatting'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesOnTypeFormatting");
+              'must be of type TextDocumentClientCapabilitiesOnTypeFormatting');
           return false;
         }
       } finally {
@@ -12518,7 +12518,7 @@
             !(TextDocumentClientCapabilitiesDeclaration.canParse(
                 obj['declaration'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesDeclaration");
+              'must be of type TextDocumentClientCapabilitiesDeclaration');
           return false;
         }
       } finally {
@@ -12530,7 +12530,7 @@
             !(TextDocumentClientCapabilitiesDefinition.canParse(
                 obj['definition'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesDefinition");
+              'must be of type TextDocumentClientCapabilitiesDefinition');
           return false;
         }
       } finally {
@@ -12542,7 +12542,7 @@
             !(TextDocumentClientCapabilitiesTypeDefinition.canParse(
                 obj['typeDefinition'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesTypeDefinition");
+              'must be of type TextDocumentClientCapabilitiesTypeDefinition');
           return false;
         }
       } finally {
@@ -12554,7 +12554,7 @@
             !(TextDocumentClientCapabilitiesImplementation.canParse(
                 obj['implementation'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesImplementation");
+              'must be of type TextDocumentClientCapabilitiesImplementation');
           return false;
         }
       } finally {
@@ -12566,7 +12566,7 @@
             !(TextDocumentClientCapabilitiesCodeAction.canParse(
                 obj['codeAction'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesCodeAction");
+              'must be of type TextDocumentClientCapabilitiesCodeAction');
           return false;
         }
       } finally {
@@ -12578,7 +12578,7 @@
             !(TextDocumentClientCapabilitiesCodeLens.canParse(
                 obj['codeLens'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesCodeLens");
+              'must be of type TextDocumentClientCapabilitiesCodeLens');
           return false;
         }
       } finally {
@@ -12590,7 +12590,7 @@
             !(TextDocumentClientCapabilitiesDocumentLink.canParse(
                 obj['documentLink'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesDocumentLink");
+              'must be of type TextDocumentClientCapabilitiesDocumentLink');
           return false;
         }
       } finally {
@@ -12602,7 +12602,7 @@
             !(TextDocumentClientCapabilitiesColorProvider.canParse(
                 obj['colorProvider'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesColorProvider");
+              'must be of type TextDocumentClientCapabilitiesColorProvider');
           return false;
         }
       } finally {
@@ -12614,7 +12614,7 @@
             !(TextDocumentClientCapabilitiesRename.canParse(
                 obj['rename'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesRename");
+              'must be of type TextDocumentClientCapabilitiesRename');
           return false;
         }
       } finally {
@@ -12626,7 +12626,7 @@
             !(TextDocumentClientCapabilitiesPublishDiagnostics.canParse(
                 obj['publishDiagnostics'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesPublishDiagnostics");
+              'must be of type TextDocumentClientCapabilitiesPublishDiagnostics');
           return false;
         }
       } finally {
@@ -12638,7 +12638,7 @@
             !(TextDocumentClientCapabilitiesFoldingRange.canParse(
                 obj['foldingRange'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesFoldingRange");
+              'must be of type TextDocumentClientCapabilitiesFoldingRange');
           return false;
         }
       } finally {
@@ -12646,7 +12646,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentClientCapabilities");
+      reporter.reportError('must be of type TextDocumentClientCapabilities');
       return false;
     }
   }
@@ -12756,7 +12756,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -12768,7 +12768,7 @@
             !(TextDocumentClientCapabilitiesCodeActionLiteralSupport.canParse(
                 obj['codeActionLiteralSupport'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesCodeActionLiteralSupport");
+              'must be of type TextDocumentClientCapabilitiesCodeActionLiteralSupport');
           return false;
         }
       } finally {
@@ -12777,7 +12777,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesCodeAction");
+          'must be of type TextDocumentClientCapabilitiesCodeAction');
       return false;
     }
   }
@@ -12840,17 +12840,17 @@
       reporter.push('valueSet');
       try {
         if (!obj.containsKey('valueSet')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['valueSet'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['valueSet'] is List &&
             (obj['valueSet']
                 .every((item) => CodeActionKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<CodeActionKind>");
+          reporter.reportError('must be of type List<CodeActionKind>');
           return false;
         }
       } finally {
@@ -12859,7 +12859,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesCodeActionKind");
+          'must be of type TextDocumentClientCapabilitiesCodeActionKind');
       return false;
     }
   }
@@ -12921,17 +12921,17 @@
       reporter.push('codeActionKind');
       try {
         if (!obj.containsKey('codeActionKind')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['codeActionKind'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentClientCapabilitiesCodeActionKind.canParse(
             obj['codeActionKind'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesCodeActionKind");
+              'must be of type TextDocumentClientCapabilitiesCodeActionKind');
           return false;
         }
       } finally {
@@ -12940,7 +12940,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesCodeActionLiteralSupport");
+          'must be of type TextDocumentClientCapabilitiesCodeActionLiteralSupport');
       return false;
     }
   }
@@ -12993,7 +12993,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13002,7 +13002,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesCodeLens");
+          'must be of type TextDocumentClientCapabilitiesCodeLens');
       return false;
     }
   }
@@ -13058,7 +13058,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13067,7 +13067,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesColorProvider");
+          'must be of type TextDocumentClientCapabilitiesColorProvider');
       return false;
     }
   }
@@ -13148,7 +13148,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13160,7 +13160,7 @@
             !(TextDocumentClientCapabilitiesCompletionItem.canParse(
                 obj['completionItem'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesCompletionItem");
+              'must be of type TextDocumentClientCapabilitiesCompletionItem');
           return false;
         }
       } finally {
@@ -13172,7 +13172,7 @@
             !(TextDocumentClientCapabilitiesCompletionItemKind.canParse(
                 obj['completionItemKind'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesCompletionItemKind");
+              'must be of type TextDocumentClientCapabilitiesCompletionItemKind');
           return false;
         }
       } finally {
@@ -13181,7 +13181,7 @@
       reporter.push('contextSupport');
       try {
         if (obj['contextSupport'] != null && !(obj['contextSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13190,7 +13190,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesCompletion");
+          'must be of type TextDocumentClientCapabilitiesCompletion');
       return false;
     }
   }
@@ -13296,7 +13296,7 @@
       reporter.push('snippetSupport');
       try {
         if (obj['snippetSupport'] != null && !(obj['snippetSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13306,7 +13306,7 @@
       try {
         if (obj['commitCharactersSupport'] != null &&
             !(obj['commitCharactersSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13318,7 +13318,7 @@
             !((obj['documentationFormat'] is List &&
                 (obj['documentationFormat']
                     .every((item) => MarkupKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<MarkupKind>");
+          reporter.reportError('must be of type List<MarkupKind>');
           return false;
         }
       } finally {
@@ -13328,7 +13328,7 @@
       try {
         if (obj['deprecatedSupport'] != null &&
             !(obj['deprecatedSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13338,7 +13338,7 @@
       try {
         if (obj['preselectSupport'] != null &&
             !(obj['preselectSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13347,7 +13347,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesCompletionItem");
+          'must be of type TextDocumentClientCapabilitiesCompletionItem');
       return false;
     }
   }
@@ -13421,7 +13421,7 @@
             !((obj['valueSet'] is List &&
                 (obj['valueSet'].every(
                     (item) => CompletionItemKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<CompletionItemKind>");
+          reporter.reportError('must be of type List<CompletionItemKind>');
           return false;
         }
       } finally {
@@ -13430,7 +13430,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesCompletionItemKind");
+          'must be of type TextDocumentClientCapabilitiesCompletionItemKind');
       return false;
     }
   }
@@ -13499,7 +13499,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13508,7 +13508,7 @@
       reporter.push('linkSupport');
       try {
         if (obj['linkSupport'] != null && !(obj['linkSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13517,7 +13517,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesDeclaration");
+          'must be of type TextDocumentClientCapabilitiesDeclaration');
       return false;
     }
   }
@@ -13582,7 +13582,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13591,7 +13591,7 @@
       reporter.push('linkSupport');
       try {
         if (obj['linkSupport'] != null && !(obj['linkSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13600,7 +13600,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesDefinition");
+          'must be of type TextDocumentClientCapabilitiesDefinition');
       return false;
     }
   }
@@ -13656,7 +13656,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13665,7 +13665,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesDocumentHighlight");
+          'must be of type TextDocumentClientCapabilitiesDocumentHighlight');
       return false;
     }
   }
@@ -13718,7 +13718,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13727,7 +13727,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesDocumentLink");
+          'must be of type TextDocumentClientCapabilitiesDocumentLink');
       return false;
     }
   }
@@ -13800,7 +13800,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13812,7 +13812,7 @@
             !(TextDocumentClientCapabilitiesSymbolKind.canParse(
                 obj['symbolKind'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesSymbolKind");
+              'must be of type TextDocumentClientCapabilitiesSymbolKind');
           return false;
         }
       } finally {
@@ -13822,7 +13822,7 @@
       try {
         if (obj['hierarchicalDocumentSymbolSupport'] != null &&
             !(obj['hierarchicalDocumentSymbolSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13831,7 +13831,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesDocumentSymbol");
+          'must be of type TextDocumentClientCapabilitiesDocumentSymbol');
       return false;
     }
   }
@@ -13915,7 +13915,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13924,7 +13924,7 @@
       reporter.push('rangeLimit');
       try {
         if (obj['rangeLimit'] != null && !(obj['rangeLimit'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -13934,7 +13934,7 @@
       try {
         if (obj['lineFoldingOnly'] != null &&
             !(obj['lineFoldingOnly'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -13943,7 +13943,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesFoldingRange");
+          'must be of type TextDocumentClientCapabilitiesFoldingRange');
       return false;
     }
   }
@@ -14001,7 +14001,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14010,7 +14010,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesFormatting");
+          'must be of type TextDocumentClientCapabilitiesFormatting');
       return false;
     }
   }
@@ -14076,7 +14076,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14088,7 +14088,7 @@
             !((obj['contentFormat'] is List &&
                 (obj['contentFormat']
                     .every((item) => MarkupKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<MarkupKind>");
+          reporter.reportError('must be of type List<MarkupKind>');
           return false;
         }
       } finally {
@@ -14097,7 +14097,7 @@
       return true;
     } else {
       reporter
-          .reportError("must be of type TextDocumentClientCapabilitiesHover");
+          .reportError('must be of type TextDocumentClientCapabilitiesHover');
       return false;
     }
   }
@@ -14168,7 +14168,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14177,7 +14177,7 @@
       reporter.push('linkSupport');
       try {
         if (obj['linkSupport'] != null && !(obj['linkSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14186,7 +14186,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesImplementation");
+          'must be of type TextDocumentClientCapabilitiesImplementation');
       return false;
     }
   }
@@ -14242,7 +14242,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14251,7 +14251,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesOnTypeFormatting");
+          'must be of type TextDocumentClientCapabilitiesOnTypeFormatting');
       return false;
     }
   }
@@ -14308,7 +14308,7 @@
       try {
         if (obj['labelOffsetSupport'] != null &&
             !(obj['labelOffsetSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14317,7 +14317,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesParameterInformation");
+          'must be of type TextDocumentClientCapabilitiesParameterInformation');
       return false;
     }
   }
@@ -14370,7 +14370,7 @@
       try {
         if (obj['relatedInformation'] != null &&
             !(obj['relatedInformation'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14379,7 +14379,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesPublishDiagnostics");
+          'must be of type TextDocumentClientCapabilitiesPublishDiagnostics');
       return false;
     }
   }
@@ -14432,7 +14432,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14441,7 +14441,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesRangeFormatting");
+          'must be of type TextDocumentClientCapabilitiesRangeFormatting');
       return false;
     }
   }
@@ -14494,7 +14494,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14503,7 +14503,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesReferences");
+          'must be of type TextDocumentClientCapabilitiesReferences');
       return false;
     }
   }
@@ -14566,7 +14566,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14575,7 +14575,7 @@
       reporter.push('prepareSupport');
       try {
         if (obj['prepareSupport'] != null && !(obj['prepareSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14584,7 +14584,7 @@
       return true;
     } else {
       reporter
-          .reportError("must be of type TextDocumentClientCapabilitiesRename");
+          .reportError('must be of type TextDocumentClientCapabilitiesRename');
       return false;
     }
   }
@@ -14653,7 +14653,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14665,7 +14665,7 @@
             !(TextDocumentClientCapabilitiesSignatureInformation.canParse(
                 obj['signatureInformation'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesSignatureInformation");
+              'must be of type TextDocumentClientCapabilitiesSignatureInformation');
           return false;
         }
       } finally {
@@ -14674,7 +14674,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesSignatureHelp");
+          'must be of type TextDocumentClientCapabilitiesSignatureHelp');
       return false;
     }
   }
@@ -14748,7 +14748,7 @@
             !((obj['documentationFormat'] is List &&
                 (obj['documentationFormat']
                     .every((item) => MarkupKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<MarkupKind>");
+          reporter.reportError('must be of type List<MarkupKind>');
           return false;
         }
       } finally {
@@ -14760,7 +14760,7 @@
             !(TextDocumentClientCapabilitiesParameterInformation.canParse(
                 obj['parameterInformation'], reporter))) {
           reporter.reportError(
-              "must be of type TextDocumentClientCapabilitiesParameterInformation");
+              'must be of type TextDocumentClientCapabilitiesParameterInformation');
           return false;
         }
       } finally {
@@ -14769,7 +14769,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesSignatureInformation");
+          'must be of type TextDocumentClientCapabilitiesSignatureInformation');
       return false;
     }
   }
@@ -14836,7 +14836,7 @@
             !((obj['valueSet'] is List &&
                 (obj['valueSet']
                     .every((item) => SymbolKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<SymbolKind>");
+          reporter.reportError('must be of type List<SymbolKind>');
           return false;
         }
       } finally {
@@ -14845,7 +14845,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesSymbolKind");
+          'must be of type TextDocumentClientCapabilitiesSymbolKind');
       return false;
     }
   }
@@ -14925,7 +14925,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14934,7 +14934,7 @@
       reporter.push('willSave');
       try {
         if (obj['willSave'] != null && !(obj['willSave'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14944,7 +14944,7 @@
       try {
         if (obj['willSaveWaitUntil'] != null &&
             !(obj['willSaveWaitUntil'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14953,7 +14953,7 @@
       reporter.push('didSave');
       try {
         if (obj['didSave'] != null && !(obj['didSave'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -14962,7 +14962,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesSynchronization");
+          'must be of type TextDocumentClientCapabilitiesSynchronization');
       return false;
     }
   }
@@ -15036,7 +15036,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -15045,7 +15045,7 @@
       reporter.push('linkSupport');
       try {
         if (obj['linkSupport'] != null && !(obj['linkSupport'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -15054,7 +15054,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type TextDocumentClientCapabilitiesTypeDefinition");
+          'must be of type TextDocumentClientCapabilitiesTypeDefinition');
       return false;
     }
   }
@@ -15127,7 +15127,7 @@
       reporter.push('range');
       try {
         if (obj['range'] != null && !(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -15136,7 +15136,7 @@
       reporter.push('rangeLength');
       try {
         if (obj['rangeLength'] != null && !(obj['rangeLength'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -15145,15 +15145,15 @@
       reporter.push('text');
       try {
         if (!obj.containsKey('text')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['text'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['text'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -15161,7 +15161,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentContentChangeEvent");
+      reporter.reportError('must be of type TextDocumentContentChangeEvent');
       return false;
     }
   }
@@ -15232,17 +15232,17 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(VersionedTextDocumentIdentifier.canParse(
             obj['textDocument'], reporter))) {
           reporter
-              .reportError("must be of type VersionedTextDocumentIdentifier");
+              .reportError('must be of type VersionedTextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -15251,17 +15251,17 @@
       reporter.push('edits');
       try {
         if (!obj.containsKey('edits')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['edits'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['edits'] is List &&
             (obj['edits']
                 .every((item) => TextEdit.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<TextEdit>");
+          reporter.reportError('must be of type List<TextEdit>');
           return false;
         }
       } finally {
@@ -15269,7 +15269,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentEdit");
+      reporter.reportError('must be of type TextDocumentEdit');
       return false;
     }
   }
@@ -15327,15 +15327,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -15343,7 +15343,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentIdentifier");
+      reporter.reportError('must be of type TextDocumentIdentifier');
       return false;
     }
   }
@@ -15422,15 +15422,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -15439,15 +15439,15 @@
       reporter.push('languageId');
       try {
         if (!obj.containsKey('languageId')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['languageId'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['languageId'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -15456,15 +15456,15 @@
       reporter.push('version');
       try {
         if (!obj.containsKey('version')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['version'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['version'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -15473,15 +15473,15 @@
       reporter.push('text');
       try {
         if (!obj.containsKey('text')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['text'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['text'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -15489,7 +15489,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentItem");
+      reporter.reportError('must be of type TextDocumentItem');
       return false;
     }
   }
@@ -15567,15 +15567,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -15584,15 +15584,15 @@
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['position'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Position.canParse(obj['position'], reporter))) {
-          reporter.reportError("must be of type Position");
+          reporter.reportError('must be of type Position');
           return false;
         }
       } finally {
@@ -15600,7 +15600,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentPositionParams");
+      reporter.reportError('must be of type TextDocumentPositionParams');
       return false;
     }
   }
@@ -15686,14 +15686,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -15701,7 +15701,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentRegistrationOptions");
+      reporter.reportError('must be of type TextDocumentRegistrationOptions');
       return false;
     }
   }
@@ -15796,7 +15796,7 @@
       reporter.push('includeText');
       try {
         if (obj['includeText'] != null && !(obj['includeText'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -15805,14 +15805,14 @@
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['documentSelector'] != null &&
             !((obj['documentSelector'] is List &&
                 (obj['documentSelector'].every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<DocumentFilter>");
+          reporter.reportError('must be of type List<DocumentFilter>');
           return false;
         }
       } finally {
@@ -15821,7 +15821,7 @@
       return true;
     } else {
       reporter
-          .reportError("must be of type TextDocumentSaveRegistrationOptions");
+          .reportError('must be of type TextDocumentSaveRegistrationOptions');
       return false;
     }
   }
@@ -15947,7 +15947,7 @@
       reporter.push('openClose');
       try {
         if (obj['openClose'] != null && !(obj['openClose'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -15957,7 +15957,7 @@
       try {
         if (obj['change'] != null &&
             !(TextDocumentSyncKind.canParse(obj['change'], reporter))) {
-          reporter.reportError("must be of type TextDocumentSyncKind");
+          reporter.reportError('must be of type TextDocumentSyncKind');
           return false;
         }
       } finally {
@@ -15966,7 +15966,7 @@
       reporter.push('willSave');
       try {
         if (obj['willSave'] != null && !(obj['willSave'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -15976,7 +15976,7 @@
       try {
         if (obj['willSaveWaitUntil'] != null &&
             !(obj['willSaveWaitUntil'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -15986,7 +15986,7 @@
       try {
         if (obj['save'] != null &&
             !(SaveOptions.canParse(obj['save'], reporter))) {
-          reporter.reportError("must be of type SaveOptions");
+          reporter.reportError('must be of type SaveOptions');
           return false;
         }
       } finally {
@@ -15994,7 +15994,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextDocumentSyncOptions");
+      reporter.reportError('must be of type TextDocumentSyncOptions');
       return false;
     }
   }
@@ -16065,15 +16065,15 @@
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['range'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(Range.canParse(obj['range'], reporter))) {
-          reporter.reportError("must be of type Range");
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -16082,15 +16082,15 @@
       reporter.push('newText');
       try {
         if (!obj.containsKey('newText')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['newText'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['newText'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -16098,7 +16098,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type TextEdit");
+      reporter.reportError('must be of type TextEdit');
       return false;
     }
   }
@@ -16161,15 +16161,15 @@
       reporter.push('id');
       try {
         if (!obj.containsKey('id')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['id'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['id'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -16178,15 +16178,15 @@
       reporter.push('method');
       try {
         if (!obj.containsKey('method')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['method'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['method'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -16194,7 +16194,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type Unregistration");
+      reporter.reportError('must be of type Unregistration');
       return false;
     }
   }
@@ -16250,17 +16250,17 @@
       reporter.push('unregisterations');
       try {
         if (!obj.containsKey('unregisterations')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['unregisterations'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['unregisterations'] is List &&
             (obj['unregisterations']
                 .every((item) => Unregistration.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<Unregistration>");
+          reporter.reportError('must be of type List<Unregistration>');
           return false;
         }
       } finally {
@@ -16268,7 +16268,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type UnregistrationParams");
+      reporter.reportError('must be of type UnregistrationParams');
       return false;
     }
   }
@@ -16336,11 +16336,11 @@
       reporter.push('version');
       try {
         if (!obj.containsKey('version')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['version'] != null && !(obj['version'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -16349,15 +16349,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -16365,7 +16365,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type VersionedTextDocumentIdentifier");
+      reporter.reportError('must be of type VersionedTextDocumentIdentifier');
       return false;
     }
   }
@@ -16460,15 +16460,15 @@
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['textDocument'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
-          reporter.reportError("must be of type TextDocumentIdentifier");
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -16477,15 +16477,15 @@
       reporter.push('reason');
       try {
         if (!obj.containsKey('reason')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['reason'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['reason'] is num)) {
-          reporter.reportError("must be of type num");
+          reporter.reportError('must be of type num');
           return false;
         }
       } finally {
@@ -16493,7 +16493,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type WillSaveTextDocumentParams");
+      reporter.reportError('must be of type WillSaveTextDocumentParams');
       return false;
     }
   }
@@ -16635,7 +16635,7 @@
       reporter.push('applyEdit');
       try {
         if (obj['applyEdit'] != null && !(obj['applyEdit'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -16647,7 +16647,7 @@
             !(WorkspaceClientCapabilitiesWorkspaceEdit.canParse(
                 obj['workspaceEdit'], reporter))) {
           reporter.reportError(
-              "must be of type WorkspaceClientCapabilitiesWorkspaceEdit");
+              'must be of type WorkspaceClientCapabilitiesWorkspaceEdit');
           return false;
         }
       } finally {
@@ -16659,7 +16659,7 @@
             !(WorkspaceClientCapabilitiesDidChangeConfiguration.canParse(
                 obj['didChangeConfiguration'], reporter))) {
           reporter.reportError(
-              "must be of type WorkspaceClientCapabilitiesDidChangeConfiguration");
+              'must be of type WorkspaceClientCapabilitiesDidChangeConfiguration');
           return false;
         }
       } finally {
@@ -16671,7 +16671,7 @@
             !(WorkspaceClientCapabilitiesDidChangeWatchedFiles.canParse(
                 obj['didChangeWatchedFiles'], reporter))) {
           reporter.reportError(
-              "must be of type WorkspaceClientCapabilitiesDidChangeWatchedFiles");
+              'must be of type WorkspaceClientCapabilitiesDidChangeWatchedFiles');
           return false;
         }
       } finally {
@@ -16683,7 +16683,7 @@
             !(WorkspaceClientCapabilitiesSymbol.canParse(
                 obj['symbol'], reporter))) {
           reporter
-              .reportError("must be of type WorkspaceClientCapabilitiesSymbol");
+              .reportError('must be of type WorkspaceClientCapabilitiesSymbol');
           return false;
         }
       } finally {
@@ -16695,7 +16695,7 @@
             !(WorkspaceClientCapabilitiesExecuteCommand.canParse(
                 obj['executeCommand'], reporter))) {
           reporter.reportError(
-              "must be of type WorkspaceClientCapabilitiesExecuteCommand");
+              'must be of type WorkspaceClientCapabilitiesExecuteCommand');
           return false;
         }
       } finally {
@@ -16705,7 +16705,7 @@
       try {
         if (obj['workspaceFolders'] != null &&
             !(obj['workspaceFolders'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -16714,7 +16714,7 @@
       reporter.push('configuration');
       try {
         if (obj['configuration'] != null && !(obj['configuration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -16722,7 +16722,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type WorkspaceClientCapabilities");
+      reporter.reportError('must be of type WorkspaceClientCapabilities');
       return false;
     }
   }
@@ -16791,7 +16791,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -16800,7 +16800,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type WorkspaceClientCapabilitiesDidChangeConfiguration");
+          'must be of type WorkspaceClientCapabilitiesDidChangeConfiguration');
       return false;
     }
   }
@@ -16856,7 +16856,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -16865,7 +16865,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type WorkspaceClientCapabilitiesDidChangeWatchedFiles");
+          'must be of type WorkspaceClientCapabilitiesDidChangeWatchedFiles');
       return false;
     }
   }
@@ -16918,7 +16918,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -16927,7 +16927,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type WorkspaceClientCapabilitiesExecuteCommand");
+          'must be of type WorkspaceClientCapabilitiesExecuteCommand');
       return false;
     }
   }
@@ -16989,7 +16989,7 @@
       try {
         if (obj['dynamicRegistration'] != null &&
             !(obj['dynamicRegistration'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -17001,7 +17001,7 @@
             !(WorkspaceClientCapabilitiesSymbolKind.canParse(
                 obj['symbolKind'], reporter))) {
           reporter.reportError(
-              "must be of type WorkspaceClientCapabilitiesSymbolKind");
+              'must be of type WorkspaceClientCapabilitiesSymbolKind');
           return false;
         }
       } finally {
@@ -17009,7 +17009,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type WorkspaceClientCapabilitiesSymbol");
+      reporter.reportError('must be of type WorkspaceClientCapabilitiesSymbol');
       return false;
     }
   }
@@ -17075,7 +17075,7 @@
             !((obj['valueSet'] is List &&
                 (obj['valueSet']
                     .every((item) => SymbolKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<SymbolKind>");
+          reporter.reportError('must be of type List<SymbolKind>');
           return false;
         }
       } finally {
@@ -17084,7 +17084,7 @@
       return true;
     } else {
       reporter
-          .reportError("must be of type WorkspaceClientCapabilitiesSymbolKind");
+          .reportError('must be of type WorkspaceClientCapabilitiesSymbolKind');
       return false;
     }
   }
@@ -17163,7 +17163,7 @@
       try {
         if (obj['documentChanges'] != null &&
             !(obj['documentChanges'] is bool)) {
-          reporter.reportError("must be of type bool");
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -17175,7 +17175,7 @@
             !((obj['resourceOperations'] is List &&
                 (obj['resourceOperations'].every((item) =>
                     ResourceOperationKind.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<ResourceOperationKind>");
+          reporter.reportError('must be of type List<ResourceOperationKind>');
           return false;
         }
       } finally {
@@ -17185,7 +17185,7 @@
       try {
         if (obj['failureHandling'] != null &&
             !(FailureHandlingKind.canParse(obj['failureHandling'], reporter))) {
-          reporter.reportError("must be of type FailureHandlingKind");
+          reporter.reportError('must be of type FailureHandlingKind');
           return false;
         }
       } finally {
@@ -17194,7 +17194,7 @@
       return true;
     } else {
       reporter.reportError(
-          "must be of type WorkspaceClientCapabilitiesWorkspaceEdit");
+          'must be of type WorkspaceClientCapabilitiesWorkspaceEdit');
       return false;
     }
   }
@@ -17301,7 +17301,7 @@
                     obj['changes'].values.every((item) => (item is List &&
                         (item.every((item) =>
                             TextEdit.canParse(item, reporter)))))))))) {
-          reporter.reportError("must be of type Map<String, List<TextEdit>>");
+          reporter.reportError('must be of type Map<String, List<TextEdit>>');
           return false;
         }
       } finally {
@@ -17320,7 +17320,7 @@
                             RenameFile.canParse(item, reporter) ||
                             DeleteFile.canParse(item, reporter)))))))) {
           reporter.reportError(
-              "must be of type Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>");
+              'must be of type Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>');
           return false;
         }
       } finally {
@@ -17328,7 +17328,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type WorkspaceEdit");
+      reporter.reportError('must be of type WorkspaceEdit');
       return false;
     }
   }
@@ -17393,15 +17393,15 @@
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['uri'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['uri'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -17410,15 +17410,15 @@
       reporter.push('name');
       try {
         if (!obj.containsKey('name')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['name'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['name'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -17426,7 +17426,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type WorkspaceFolder");
+      reporter.reportError('must be of type WorkspaceFolder');
       return false;
     }
   }
@@ -17496,17 +17496,17 @@
       reporter.push('added');
       try {
         if (!obj.containsKey('added')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['added'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['added'] is List &&
             (obj['added']
                 .every((item) => WorkspaceFolder.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<WorkspaceFolder>");
+          reporter.reportError('must be of type List<WorkspaceFolder>');
           return false;
         }
       } finally {
@@ -17515,17 +17515,17 @@
       reporter.push('removed');
       try {
         if (!obj.containsKey('removed')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['removed'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!((obj['removed'] is List &&
             (obj['removed']
                 .every((item) => WorkspaceFolder.canParse(item, reporter)))))) {
-          reporter.reportError("must be of type List<WorkspaceFolder>");
+          reporter.reportError('must be of type List<WorkspaceFolder>');
           return false;
         }
       } finally {
@@ -17533,7 +17533,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type WorkspaceFoldersChangeEvent");
+      reporter.reportError('must be of type WorkspaceFoldersChangeEvent');
       return false;
     }
   }
@@ -17591,15 +17591,15 @@
       reporter.push('query');
       try {
         if (!obj.containsKey('query')) {
-          reporter.reportError("must not be undefined");
+          reporter.reportError('must not be undefined');
           return false;
         }
         if (obj['query'] == null) {
-          reporter.reportError("must not be null");
+          reporter.reportError('must not be null');
           return false;
         }
         if (!(obj['query'] is String)) {
-          reporter.reportError("must be of type String");
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -17607,7 +17607,7 @@
       }
       return true;
     } else {
-      reporter.reportError("must be of type WorkspaceSymbolParams");
+      reporter.reportError('must be of type WorkspaceSymbolParams');
       return false;
     }
   }
diff --git a/pkg/analysis_server/lib/protocol/protocol.dart b/pkg/analysis_server/lib/protocol/protocol.dart
index c41c816..46ce853 100644
--- a/pkg/analysis_server/lib/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/protocol/protocol.dart
@@ -530,7 +530,7 @@
   Response.invalidAnalysisRoot(Request request, String rootPath)
       : this(request.id,
             error: RequestError(RequestErrorCode.INVALID_ANALYSIS_ROOT,
-                "Invalid analysis root: $rootPath"));
+                'Invalid analysis root: $rootPath'));
 
   /**
    * Initialize a newly created instance to represent an error condition caused
@@ -540,7 +540,7 @@
   Response.invalidExecutionContext(Request request, String contextId)
       : this(request.id,
             error: RequestError(RequestErrorCode.INVALID_EXECUTION_CONTEXT,
-                "Invalid execution context: $contextId"));
+                'Invalid execution context: $contextId'));
 
   /**
    * Initialize a newly created instance to represent the
diff --git a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
index c4b28bf..b8ccd3d 100644
--- a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
@@ -62,7 +62,7 @@
     if (node.argumentList != null) {
       String labelText = node.constructorName.type.name.name;
       if (node.constructorName.name != null) {
-        labelText += ".${node.constructorName.name.name}";
+        labelText += '.${node.constructorName.name.name}';
       }
       // We override the node used for doing line calculations because otherwise
       // constructors that split over multiple lines (but have parens on same
@@ -88,7 +88,7 @@
     ClosingLabel label;
 
     if (typeName != null) {
-      label = _addLabel(node, "<$typeName>[]");
+      label = _addLabel(node, '<$typeName>[]');
     }
 
     if (label != null) _pushLabel(label);
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 7d04309..5aa8b4e 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -234,7 +234,7 @@
 
   bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
     String name = node.name;
-    if (name == "void") {
+    if (name == 'void') {
       return _addRegion_node(node, HighlightRegionType.KEYWORD);
     }
     return false;
@@ -770,7 +770,7 @@
   void visitTypeName(TypeName node) {
     DartType type = node.type;
     if (type != null) {
-      if (type.isDynamic && node.name.name == "dynamic") {
+      if (type.isDynamic && node.name.name == 'dynamic') {
         computer._addRegion_node(node, HighlightRegionType.TYPE_NAME_DYNAMIC);
         return null;
       }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index 3aacdcb..37c402f 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -288,7 +288,7 @@
 
   bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
     String name = node.name;
-    if (name == "void") {
+    if (name == 'void') {
       return _addRegion_node(node, HighlightRegionType.KEYWORD);
     }
     return false;
@@ -879,7 +879,7 @@
   void visitTypeName(TypeName node) {
     DartType type = node.type;
     if (type != null) {
-      if (type.isDynamic && node.name.name == "dynamic") {
+      if (type.isDynamic && node.name.name == 'dynamic') {
         computer._addRegion_node(node, HighlightRegionType.TYPE_NAME_DYNAMIC);
         return null;
       }
diff --git a/pkg/analysis_server/lib/src/computer/computer_signature.dart b/pkg/analysis_server/lib/src/computer/computer_signature.dart
index 6242f21..ba70e5c 100644
--- a/pkg/analysis_server/lib/src/computer/computer_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_signature.dart
@@ -58,7 +58,7 @@
       InstanceCreationExpression constructor = args.parent;
       name = constructor.constructorName.type.name.name;
       if (constructor.constructorName.name != null) {
-        name += ".${constructor.constructorName.name.name}";
+        name += '.${constructor.constructorName.name.name}';
       }
       execElement = ElementLocator.locate(constructor) as ExecutableElement;
     }
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 066e877..7e27b6b 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -1079,7 +1079,7 @@
         return PackageMapDisposition(packageMap, packageRoot: packageRoot);
       } else if (packagesDirOrFile.isFile()) {
         File packageSpecFile = resourceProvider.getFile(packageRoot);
-        Packages packages = parseDotPackagesFile(
+        Packages packages = parsePackagesFile(
           resourceProvider,
           packageSpecFile,
         );
@@ -1096,7 +1096,7 @@
     } else {
       // Try .packages first.
       if (pathContext.basename(packagespecFile.path) == PACKAGE_SPEC_NAME) {
-        Packages packages = parseDotPackagesFile(
+        Packages packages = parsePackagesFile(
           resourceProvider,
           packagespecFile,
         );
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index d75faef..60364ac 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -324,7 +324,7 @@
       PostfixCompletion completion = await processor.compute();
       change = completion?.change;
     }
-    change ??= SourceChange("", edits: []);
+    change ??= SourceChange('', edits: []);
 
     Response response =
         EditGetPostfixCompletionResult(change).toResponse(request.id);
@@ -352,7 +352,7 @@
       StatementCompletion completion = await processor.compute();
       change = completion.change;
     }
-    change ??= SourceChange("", edits: []);
+    change ??= SourceChange('', edits: []);
 
     Response response =
         EditGetStatementCompletionResult(change, false).toResponse(request.id);
diff --git a/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart b/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart
index 5f029ff..58a111c 100644
--- a/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart
@@ -22,13 +22,13 @@
   //
   DartFixInfo(
     'fix-named-constructor-type-arguments',
-    "Move named constructor type arguments from the name to the type.",
+    'Move named constructor type arguments from the name to the type.',
     FixErrorTask.fixNamedConstructorTypeArgs,
     isRequired: true,
   ),
   DartFixInfo(
     'use-mixin',
-    "Convert classes used as a mixin to the new mixin syntax.",
+    'Convert classes used as a mixin to the new mixin syntax.',
     PreferMixinFix.task,
     isRequired: true,
   ),
@@ -98,25 +98,25 @@
     // TODO(brianwilkerson) This duplicates `LintFixInfo.preferIntLiterals` and
     //  should be removed.
     'double-to-int',
-    "Find double literals ending in .0 and remove the .0 wherever double context can be inferred.",
+    'Find double literals ending in .0 and remove the .0 wherever double context can be inferred.',
     BasicFixLintAssistTask.preferIntLiterals,
     isDefault: false,
   ),
   DartFixInfo(
     'use-spread-collections',
-    "Convert to using collection spread operators.",
+    'Convert to using collection spread operators.',
     BasicFixLintAssistTask.preferSpreadCollections,
     isDefault: false,
   ),
   DartFixInfo(
     'collection-if-elements',
-    "Convert to using if elements when building collections.",
+    'Convert to using if elements when building collections.',
     BasicFixLintAssistTask.preferIfElementsToConditionalExpressions,
     isDefault: false,
   ),
   DartFixInfo(
     'map-for-elements',
-    "Convert to for elements when building maps from iterables.",
+    'Convert to for elements when building maps from iterables.',
     BasicFixLintAssistTask.preferForElementsToMapFromIterable,
     isDefault: false,
   ),
@@ -194,7 +194,7 @@
   static final alwaysDeclareReturnTypes = LintFixInfo(
     'always_declare_return_types',
     DartFixKind.ADD_RETURN_TYPE,
-    "Add a return type where possible.",
+    'Add a return type where possible.',
     isDefault: false,
     isPedantic: true,
   );
@@ -202,7 +202,7 @@
   static final alwaysRequireNonNullNamedParameters = LintFixInfo(
     'always_require_non_null_named_parameters',
     DartFixKind.ADD_REQUIRED,
-    "Add an @required annotation.",
+    'Add an @required annotation.',
     isDefault: false,
     isPedantic: true,
   );
@@ -210,14 +210,14 @@
   static final alwaysSpecifyTypes = LintFixInfo(
     'always_specify_types',
     DartFixKind.ADD_TYPE_ANNOTATION,
-    "Add a type annotation.",
+    'Add a type annotation.',
     isDefault: false,
   );
 
   static final annotateOverrides = LintFixInfo(
     'annotate_overrides',
     DartFixKind.ADD_OVERRIDE,
-    "Add an @override annotation.",
+    'Add an @override annotation.',
     isDefault: false,
     isPedantic: true,
   );
@@ -225,14 +225,14 @@
   static final avoidAnnotatingWithDynamic = LintFixInfo(
     'avoid_annotating_with_dynamic',
     DartFixKind.REMOVE_TYPE_ANNOTATION,
-    "Remove the type annotation.",
+    'Remove the type annotation.',
     isDefault: false,
   );
 
   static final avoidEmptyElse = LintFixInfo(
     'avoid_empty_else',
     DartFixKind.REMOVE_EMPTY_ELSE,
-    "Remove the empty else.",
+    'Remove the empty else.',
     isDefault: false,
     isPedantic: true,
   );
@@ -240,7 +240,7 @@
   static final avoidInitToNull = LintFixInfo(
     'avoid_init_to_null',
     DartFixKind.REMOVE_INITIALIZER,
-    "Remove the initializer.",
+    'Remove the initializer.',
     isDefault: false,
     isPedantic: true,
   );
@@ -248,14 +248,14 @@
   static final avoidRedundantArgumentValues = LintFixInfo(
     'avoid_redundant_argument_values',
     DartFixKind.REMOVE_ARGUMENT,
-    "Remove the redundant argument.",
+    'Remove the redundant argument.',
     isDefault: false,
   );
 
   static final avoidRelativeLibImports = LintFixInfo(
     'avoid_relative_lib_imports',
     DartFixKind.CONVERT_TO_PACKAGE_IMPORT,
-    "Convert the import to a package: import.",
+    'Convert the import to a package: import.',
     isDefault: false,
     isPedantic: true,
   );
@@ -263,7 +263,7 @@
   static final avoidReturnTypesOnSetters = LintFixInfo(
     'avoid_return_types_on_setters',
     DartFixKind.REMOVE_TYPE_ANNOTATION,
-    "Remove the return type.",
+    'Remove the return type.',
     isDefault: false,
     isPedantic: true,
   );
@@ -272,7 +272,7 @@
     'avoid_types_on_closure_parameters',
     // Also sometimes fixed by DartFixKind.REPLACE_WITH_IDENTIFIER
     DartFixKind.REMOVE_TYPE_ANNOTATION,
-    "Remove the type annotation.",
+    'Remove the type annotation.',
     isDefault: false,
   );
 
@@ -286,7 +286,7 @@
   static final curlyBracesInFlowControlStructures = LintFixInfo(
     'curly_braces_in_flow_control_structures',
     DartFixKind.ADD_CURLY_BRACES,
-    "Add curly braces.",
+    'Add curly braces.',
     isDefault: false,
     isPedantic: true,
   );
@@ -294,14 +294,14 @@
   static final diagnosticDescribeAllProperties = LintFixInfo(
     'diagnostic_describe_all_properties',
     DartFixKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE,
-    "Add a debug reference to this property.",
+    'Add a debug reference to this property.',
     isDefault: false,
   );
 
   static final emptyCatches = LintFixInfo(
     'empty_catches',
     DartFixKind.REMOVE_EMPTY_CATCH,
-    "Remove the empty catch clause.",
+    'Remove the empty catch clause.',
     isDefault: false,
     isPedantic: true,
   );
@@ -309,7 +309,7 @@
   static final emptyConstructorBodies = LintFixInfo(
     'empty_constructor_bodies',
     DartFixKind.REMOVE_EMPTY_CONSTRUCTOR_BODY,
-    "Remove the empoty catch clause.",
+    'Remove the empoty catch clause.',
     isDefault: false,
     isPedantic: true,
   );
@@ -318,21 +318,21 @@
     'empty_statements',
     // Also sometimes fixed by DartFixKind.REPLACE_WITH_BRACKETS
     DartFixKind.REMOVE_EMPTY_STATEMENT,
-    "Remove the empty statement.",
+    'Remove the empty statement.',
     isDefault: false,
   );
 
   static final hashAndEquals = LintFixInfo(
     'hash_and_equals',
     DartFixKind.CREATE_METHOD,
-    "Create the missing method.",
+    'Create the missing method.',
     isDefault: false,
   );
 
   static final noDuplicateCaseValues = LintFixInfo(
     'no_duplicate_case_values',
     DartFixKind.REMOVE_DUPLICATE_CASE,
-    "Remove the duplicate case clause.",
+    'Remove the duplicate case clause.',
     isDefault: false,
     isPedantic: true,
   );
@@ -340,14 +340,14 @@
   static final nonConstantIdentifierNames = LintFixInfo(
     'non_constant_identifier_names',
     DartFixKind.RENAME_TO_CAMEL_CASE,
-    "Change the name to be camelCase.",
+    'Change the name to be camelCase.',
     isDefault: false,
   );
 
   static final nullClosures = LintFixInfo(
     'null_closures',
     DartFixKind.REPLACE_NULL_WITH_CLOSURE,
-    "Convert nulls to closures that return null where expected.",
+    'Convert nulls to closures that return null where expected.',
     isPedantic: true,
   );
 
@@ -370,7 +370,7 @@
   static final preferCollectionLiterals = LintFixInfo(
     'prefer_collection_literals',
     DartFixKind.CONVERT_TO_LIST_LITERAL,
-    "Replace with a collection literal.",
+    'Replace with a collection literal.',
     isDefault: false,
     isPedantic: true,
   );
@@ -378,7 +378,7 @@
   static final preferConditionalAssignment = LintFixInfo(
     'prefer_conditional_assignment',
     DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT,
-    "Replace with a conditional assignment.",
+    'Replace with a conditional assignment.',
     isDefault: false,
     isPedantic: true,
   );
@@ -386,14 +386,14 @@
   static final preferEqualForDefaultValues = LintFixInfo(
     'prefer_equal_for_default_values',
     DartFixKind.REPLACE_COLON_WITH_EQUALS,
-    "Convert declarations to use = to separate a named parameter from its default value.",
+    'Convert declarations to use = to separate a named parameter from its default value.',
     isPedantic: true,
   );
 
   static final preferFinalFields = LintFixInfo(
     'prefer_final_fields',
     DartFixKind.MAKE_FINAL,
-    "Make the field final.",
+    'Make the field final.',
     isDefault: false,
     isPedantic: true,
   );
@@ -408,7 +408,7 @@
   static final preferForElementsToMapFromIterable = LintFixInfo(
     'prefer_for_elements_to_map_fromIterable',
     DartFixKind.CONVERT_TO_FOR_ELEMENT,
-    "Convert to a for element.",
+    'Convert to a for element.',
     isDefault: false,
     isPedantic: true,
   );
@@ -432,14 +432,14 @@
   static final preferInlinedAdds = LintFixInfo(
     'prefer_inlined_adds',
     DartFixKind.INLINE_INVOCATION,
-    "Inline the invocation.",
+    'Inline the invocation.',
     isDefault: false,
   );
 
   static final preferIntLiterals = LintFixInfo(
     'prefer_int_literals',
     DartFixKind.CONVERT_TO_INT_LITERAL,
-    "Convert to an int literal",
+    'Convert to an int literal',
     isDefault: false,
   );
 
@@ -462,7 +462,7 @@
   static final preferIterableWhereType = LintFixInfo(
     'prefer_iterable_whereType',
     DartFixKind.CONVERT_TO_WHERE_TYPE,
-    "Add a return type where possible.",
+    'Add a return type where possible.',
     isDefault: false,
     isPedantic: true,
   );
@@ -477,14 +477,14 @@
   static final preferRelativeImports = LintFixInfo(
     'prefer_relative_imports',
     DartFixKind.CONVERT_TO_RELATIVE_IMPORT,
-    "Convert to a relative import.",
+    'Convert to a relative import.',
     isDefault: false,
   );
 
   static final preferSingleQuotes = LintFixInfo(
     'prefer_single_quotes',
     DartFixKind.CONVERT_TO_SINGLE_QUOTED_STRING,
-    "Convert strings using a dobule quote to use a single quote.",
+    'Convert strings using a dobule quote to use a single quote.',
     isDefault: false,
     isPedantic: true,
   );
@@ -494,7 +494,7 @@
     // TODO(brianwilkerson) There are two possible fixes here, but not under
     //  user control.
     DartFixKind.CONVERT_TO_SPREAD,
-    "Convert to a spread operator.",
+    'Convert to a spread operator.',
     isDefault: false,
     isPedantic: true,
   );
@@ -502,7 +502,7 @@
   static final slashForDocComments = LintFixInfo(
     'slash_for_doc_comments',
     DartFixKind.CONVERT_TO_LINE_COMMENT,
-    "Convert to a line comment.",
+    'Convert to a line comment.',
     isDefault: false,
     isPedantic: true,
   );
@@ -517,14 +517,14 @@
   static final typeAnnotatePublicApis = LintFixInfo(
     'type_annotate_public_apis',
     DartFixKind.ADD_TYPE_ANNOTATION,
-    "Add a type annotation.",
+    'Add a type annotation.',
     isDefault: false,
   );
 
   static final typeInitFormals = LintFixInfo(
     'type_init_formals',
     DartFixKind.REMOVE_TYPE_ANNOTATION,
-    "Remove the type annotation.",
+    'Remove the type annotation.',
     isDefault: false,
     isPedantic: true,
   );
@@ -532,7 +532,7 @@
   static final unawaitedFutures = LintFixInfo(
     'unawaited_futures',
     DartFixKind.ADD_AWAIT,
-    "Add await.",
+    'Add await.',
     isDefault: false,
     isPedantic: true,
   );
@@ -540,7 +540,7 @@
   static final unnecessaryBraceInStringInterps = LintFixInfo(
     'unnecessary_brace_in_string_interps',
     DartFixKind.REMOVE_INTERPOLATION_BRACES,
-    "Remove the unnecessary interpolation braces.",
+    'Remove the unnecessary interpolation braces.',
     isDefault: false,
   );
 
@@ -555,7 +555,7 @@
   static final unnecessaryLambdas = LintFixInfo(
     'unnecessary_lambdas',
     DartFixKind.REPLACE_WITH_TEAR_OFF,
-    "Replace the function literal with a tear-off.",
+    'Replace the function literal with a tear-off.',
     isDefault: false,
   );
 
@@ -578,14 +578,14 @@
   static final unnecessaryOverrides = LintFixInfo(
     'unnecessary_overrides',
     DartFixKind.REMOVE_METHOD_DECLARATION,
-    "Remove the unnecessary override.",
+    'Remove the unnecessary override.',
     isDefault: false,
   );
 
   static final unnecessaryThis = LintFixInfo(
     'unnecessary_this',
     DartFixKind.REMOVE_THIS_EXPRESSION,
-    "Remove this.",
+    'Remove this.',
     isDefault: false,
     isPedantic: true,
   );
@@ -601,7 +601,7 @@
   static final useRethrowWhenPossible = LintFixInfo(
     'use_rethrow_when_possible',
     DartFixKind.USE_RETHROW,
-    "Replace with rethrow.",
+    'Replace with rethrow.',
     isDefault: false,
     isPedantic: true,
   );
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_css.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_css.dart
index 1dbdb96..064be3c 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_css.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_css.dart
@@ -19,7 +19,7 @@
 import 'dart:convert';
 
 const _highlightCss =
-    "LyoKRGF0ZTogMjQgRmV2IDIwMTUKQXV0aG9yOiBQZWRybyBPbGl2ZWlyYSA8a2FueXR1QGdtYWlsIC4gY29tPgoqLwoKLmhsanMgewogIGNvbG9yOiAjYTliN2M2OwogIGJhY2tncm91bmQ6ICMyODJiMmU7CiAgZGlzcGxheTogYmxvY2s7CiAgb3ZlcmZsb3cteDogYXV0bzsKICBwYWRkaW5nOiAwLjVlbTsKfQoKLmhsanMtbnVtYmVyLAouaGxqcy1saXRlcmFsLAouaGxqcy1zeW1ib2wsCi5obGpzLWJ1bGxldCB7CiAgY29sb3I6ICM2ODk3QkI7Cn0KCi5obGpzLWtleXdvcmQsCi5obGpzLXNlbGVjdG9yLXRhZywKLmhsanMtZGVsZXRpb24gewogIGNvbG9yOiAjY2M3ODMyOwp9CgouaGxqcy12YXJpYWJsZSwKLmhsanMtdGVtcGxhdGUtdmFyaWFibGUsCi5obGpzLWxpbmsgewogIGNvbG9yOiAjNjI5NzU1Owp9CgouaGxqcy1jb21tZW50LAouaGxqcy1xdW90ZSB7CiAgY29sb3I6ICM4MDgwODA7Cn0KCi5obGpzLW1ldGEgewogIGNvbG9yOiAjYmJiNTI5Owp9CgouaGxqcy1zdHJpbmcsCi5obGpzLWF0dHJpYnV0ZSwKLmhsanMtYWRkaXRpb24gewogIGNvbG9yOiAjNkE4NzU5Owp9CgouaGxqcy1zZWN0aW9uLAouaGxqcy10aXRsZSwKLmhsanMtdHlwZSB7CiAgY29sb3I6ICNmZmM2NmQ7Cn0KCi5obGpzLW5hbWUsCi5obGpzLXNlbGVjdG9yLWlkLAouaGxqcy1zZWxlY3Rvci1jbGFzcyB7CiAgY29sb3I6ICNlOGJmNmE7Cn0KCi5obGpzLWVtcGhhc2lzIHsKICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5obGpzLXN0cm9uZyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0K";
+    'LyoKRGF0ZTogMjQgRmV2IDIwMTUKQXV0aG9yOiBQZWRybyBPbGl2ZWlyYSA8a2FueXR1QGdtYWlsIC4gY29tPgoqLwoKLmhsanMgewogIGNvbG9yOiAjYTliN2M2OwogIGJhY2tncm91bmQ6ICMyODJiMmU7CiAgZGlzcGxheTogYmxvY2s7CiAgb3ZlcmZsb3cteDogYXV0bzsKICBwYWRkaW5nOiAwLjVlbTsKfQoKLmhsanMtbnVtYmVyLAouaGxqcy1saXRlcmFsLAouaGxqcy1zeW1ib2wsCi5obGpzLWJ1bGxldCB7CiAgY29sb3I6ICM2ODk3QkI7Cn0KCi5obGpzLWtleXdvcmQsCi5obGpzLXNlbGVjdG9yLXRhZywKLmhsanMtZGVsZXRpb24gewogIGNvbG9yOiAjY2M3ODMyOwp9CgouaGxqcy12YXJpYWJsZSwKLmhsanMtdGVtcGxhdGUtdmFyaWFibGUsCi5obGpzLWxpbmsgewogIGNvbG9yOiAjNjI5NzU1Owp9CgouaGxqcy1jb21tZW50LAouaGxqcy1xdW90ZSB7CiAgY29sb3I6ICM4MDgwODA7Cn0KCi5obGpzLW1ldGEgewogIGNvbG9yOiAjYmJiNTI5Owp9CgouaGxqcy1zdHJpbmcsCi5obGpzLWF0dHJpYnV0ZSwKLmhsanMtYWRkaXRpb24gewogIGNvbG9yOiAjNkE4NzU5Owp9CgouaGxqcy1zZWN0aW9uLAouaGxqcy10aXRsZSwKLmhsanMtdHlwZSB7CiAgY29sb3I6ICNmZmM2NmQ7Cn0KCi5obGpzLW5hbWUsCi5obGpzLXNlbGVjdG9yLWlkLAouaGxqcy1zZWxlY3Rvci1jbGFzcyB7CiAgY29sb3I6ICNlOGJmNmE7Cn0KCi5obGpzLWVtcGhhc2lzIHsKICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5obGpzLXN0cm9uZyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0K';
 
 String decodeHighlightCss() =>
     String.fromCharCodes(base64Decode(_highlightCss));
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_js.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_js.dart
index fdec128..26b67ee 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_js.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/highlight_js.dart
@@ -19,6 +19,6 @@
 import 'dart:convert';
 
 const _highlightJs =
-    "LyohIGhpZ2hsaWdodC5qcyB2OS4xNS4xMCB8IEJTRDMgTGljZW5zZSB8IGdpdC5pby9obGpzbGljZW5zZSAqLwohZnVuY3Rpb24oZSl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmOyJ1bmRlZmluZWQiPT10eXBlb2YgZXhwb3J0c3x8ZXhwb3J0cy5ub2RlVHlwZT9uJiYobi5obGpzPWUoe30pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBuLmhsanN9KSk6ZShleHBvcnRzKX0oZnVuY3Rpb24oYSl7dmFyIGY9W10sdT1PYmplY3Qua2V5cyxOPXt9LGM9e30sbj0vXihuby0/aGlnaGxpZ2h0fHBsYWlufHRleHQpJC9pLHM9L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksdD0vKCheKDxbXj5dKz58XHR8KSt8KD86XG4pKSkvZ20scj17Y2FzZV9pbnNlbnNpdGl2ZToiY0kiLGxleGVtZXM6ImwiLGNvbnRhaW5zOiJjIixrZXl3b3JkczoiayIsc3ViTGFuZ3VhZ2U6InNMIixjbGFzc05hbWU6ImNOIixiZWdpbjoiYiIsYmVnaW5LZXl3b3JkczoiYksiLGVuZDoiZSIsZW5kc1dpdGhQYXJlbnQ6ImVXIixpbGxlZ2FsOiJpIixleGNsdWRlQmVnaW46ImVCIixleGNsdWRlRW5kOiJlRSIscmV0dXJuQmVnaW46InJCIixyZXR1cm5FbmQ6InJFIixyZWxldmFuY2U6InIiLHZhcmlhbnRzOiJ2IixJREVOVF9SRToiSVIiLFVOREVSU0NPUkVfSURFTlRfUkU6IlVJUiIsTlVNQkVSX1JFOiJOUiIsQ19OVU1CRVJfUkU6IkNOUiIsQklOQVJZX05VTUJFUl9SRToiQk5SIixSRV9TVEFSVEVSU19SRToiUlNSIixCQUNLU0xBU0hfRVNDQVBFOiJCRSIsQVBPU19TVFJJTkdfTU9ERToiQVNNIixRVU9URV9TVFJJTkdfTU9ERToiUVNNIixQSFJBU0FMX1dPUkRTX01PREU6IlBXTSIsQ19MSU5FX0NPTU1FTlRfTU9ERToiQ0xDTSIsQ19CTE9DS19DT01NRU5UX01PREU6IkNCQ00iLEhBU0hfQ09NTUVOVF9NT0RFOiJIQ00iLE5VTUJFUl9NT0RFOiJOTSIsQ19OVU1CRVJfTU9ERToiQ05NIixCSU5BUllfTlVNQkVSX01PREU6IkJOTSIsQ1NTX05VTUJFUl9NT0RFOiJDU1NOTSIsUkVHRVhQX01PREU6IlJNIixUSVRMRV9NT0RFOiJUTSIsVU5ERVJTQ09SRV9USVRMRV9NT0RFOiJVVE0iLENPTU1FTlQ6IkMiLGJlZ2luUmU6ImJSIixlbmRSZToiZVIiLGlsbGVnYWxSZToiaVIiLGxleGVtZXNSZToibFIiLHRlcm1pbmF0b3JzOiJ0Iix0ZXJtaW5hdG9yX2VuZDoidEUifSxiPSI8L3NwYW4+IixoPXtjbGFzc1ByZWZpeDoiaGxqcy0iLHRhYlJlcGxhY2U6bnVsbCx1c2VCUjohMSxsYW5ndWFnZXM6dm9pZCAwfTtmdW5jdGlvbiBfKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiBFKGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdihlLG4pe3ZhciB0PWUmJmUuZXhlYyhuKTtyZXR1cm4gdCYmMD09PXQuaW5kZXh9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbi50ZXN0KGUpfWZ1bmN0aW9uIGcoZSl7dmFyIG4sdD17fSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IobiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihuIGluIGUpdFtuXT1lW25dfSksdH1mdW5jdGlvbiBSKGUpe3ZhciBhPVtdO3JldHVybiBmdW5jdGlvbiBlKG4sdCl7Zm9yKHZhciByPW4uZmlyc3RDaGlsZDtyO3I9ci5uZXh0U2libGluZykzPT09ci5ub2RlVHlwZT90Kz1yLm5vZGVWYWx1ZS5sZW5ndGg6MT09PXIubm9kZVR5cGUmJihhLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OnQsbm9kZTpyfSksdD1lKHIsdCksRShyKS5tYXRjaCgvYnJ8aHJ8aW1nfGlucHV0Lyl8fGEucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDp0LG5vZGU6cn0pKTtyZXR1cm4gdH0oZSwwKSxhfWZ1bmN0aW9uIGkoZSl7aWYociYmIWUubGFuZ0FwaVJlc3RvcmVkKXtmb3IodmFyIG4gaW4gZS5sYW5nQXBpUmVzdG9yZWQ9ITAscillW25dJiYoZVtyW25dXT1lW25dKTsoZS5jfHxbXSkuY29uY2F0KGUudnx8W10pLmZvckVhY2goaSl9fWZ1bmN0aW9uIG0obyl7ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZSYmZS5zb3VyY2V8fGV9ZnVuY3Rpb24gYyhlLG4pe3JldHVybiBuZXcgUmVnRXhwKHMoZSksIm0iKyhvLmNJPyJpIjoiIikrKG4/ImciOiIiKSl9IWZ1bmN0aW9uIG4odCxlKXtpZighdC5jb21waWxlZCl7aWYodC5jb21waWxlZD0hMCx0Lms9dC5rfHx0LmJLLHQuayl7ZnVuY3Rpb24gcih0LGUpe28uY0kmJihlPWUudG9Mb3dlckNhc2UoKSksZS5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdCgifCIpO2FbblswXV09W3QsblsxXT9OdW1iZXIoblsxXSk6MV19KX12YXIgYT17fTsic3RyaW5nIj09dHlwZW9mIHQuaz9yKCJrZXl3b3JkIix0LmspOnUodC5rKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IoZSx0LmtbZV0pfSksdC5rPWF9dC5sUj1jKHQubHx8L1x3Ky8sITApLGUmJih0LmJLJiYodC5iPSJcXGIoIit0LmJLLnNwbGl0KCIgIikuam9pbigifCIpKyIpXFxiIiksdC5ifHwodC5iPS9cQnxcYi8pLHQuYlI9Yyh0LmIpLHQuZW5kU2FtZUFzQmVnaW4mJih0LmU9dC5iKSx0LmV8fHQuZVd8fCh0LmU9L1xCfFxiLyksdC5lJiYodC5lUj1jKHQuZSkpLHQudEU9cyh0LmUpfHwiIix0LmVXJiZlLnRFJiYodC50RSs9KHQuZT8ifCI6IiIpK2UudEUpKSx0LmkmJih0LmlSPWModC5pKSksbnVsbD09dC5yJiYodC5yPTEpLHQuY3x8KHQuYz1bXSksdC5jPUFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sdC5jLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4udiYmIW4uY2FjaGVkX3ZhcmlhbnRzJiYobi5jYWNoZWRfdmFyaWFudHM9bi52Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZyhuLHt2Om51bGx9LGUpfSkpLG4uY2FjaGVkX3ZhcmlhbnRzfHxuLmVXJiZbZyhuKV18fFtuXX0oInNlbGYiPT09ZT90OmUpfSkpLHQuYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe24oZSx0KX0pLHQuc3RhcnRzJiZuKHQuc3RhcnRzLGUpO3ZhciBpPXQuYy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYks/IlxcLj8oPzoiK2UuYisiKVxcLj8iOmUuYn0pLmNvbmNhdChbdC50RSx0LmldKS5tYXAocykuZmlsdGVyKEJvb2xlYW4pO3QudD1pLmxlbmd0aD9jKGZ1bmN0aW9uKGUsbil7Zm9yKHZhciB0PS9cWyg/OlteXFxcXV18XFwuKSpcXXxcKFw/P3xcXChbMS05XVswLTldKil8XFwuLyxyPTAsYT0iIixpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPXIsYz1zKGVbaV0pO2ZvcigwPGkmJihhKz1uKTswPGMubGVuZ3RoOyl7dmFyIHU9dC5leGVjKGMpO2lmKG51bGw9PXUpe2ErPWM7YnJlYWt9YSs9Yy5zdWJzdHJpbmcoMCx1LmluZGV4KSxjPWMuc3Vic3RyaW5nKHUuaW5kZXgrdVswXS5sZW5ndGgpLCJcXCI9PXVbMF1bMF0mJnVbMV0/YSs9IlxcIitTdHJpbmcoTnVtYmVyKHVbMV0pK28pOihhKz11WzBdLCIoIj09dVswXSYmcisrKX19cmV0dXJuIGF9KGksInwiKSwhMCk6e2V4ZWM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19fX0obyl9ZnVuY3Rpb24gQyhlLG4saSx0KXtmdW5jdGlvbiBjKGUsbix0LHIpe3ZhciBhPSc8c3BhbiBjbGFzcz0iJysocj8iIjpoLmNsYXNzUHJlZml4KTtyZXR1cm4gZT8oYSs9ZSsnIj4nKStuKyh0PyIiOmIpOm59ZnVuY3Rpb24gbygpe0UrPW51bGwhPWwuc0w/ZnVuY3Rpb24oKXt2YXIgZT0ic3RyaW5nIj09dHlwZW9mIGwuc0w7aWYoZSYmIU5bbC5zTF0pcmV0dXJuIF8oZyk7dmFyIG49ZT9DKGwuc0wsZywhMCxmW2wuc0xdKTpPKGcsbC5zTC5sZW5ndGg/bC5zTDp2b2lkIDApO3JldHVybiAwPGwuciYmKFIrPW4uciksZSYmKGZbbC5zTF09bi50b3ApLGMobi5sYW5ndWFnZSxuLnZhbHVlLCExLCEwKX0oKTpmdW5jdGlvbigpe3ZhciBlLG4sdCxyLGEsaSxvO2lmKCFsLmspcmV0dXJuIF8oZyk7Zm9yKHI9IiIsbj0wLGwubFIubGFzdEluZGV4PTAsdD1sLmxSLmV4ZWMoZyk7dDspcis9XyhnLnN1YnN0cmluZyhuLHQuaW5kZXgpKSxhPWwsaT10LHZvaWQgMCxvPXMuY0k/aVswXS50b0xvd2VyQ2FzZSgpOmlbMF0sKGU9YS5rLmhhc093blByb3BlcnR5KG8pJiZhLmtbb10pPyhSKz1lWzFdLHIrPWMoZVswXSxfKHRbMF0pKSk6cis9Xyh0WzBdKSxuPWwubFIubGFzdEluZGV4LHQ9bC5sUi5leGVjKGcpO3JldHVybiByK18oZy5zdWJzdHIobikpfSgpLGc9IiJ9ZnVuY3Rpb24gdShlKXtFKz1lLmNOP2MoZS5jTiwiIiwhMCk6IiIsbD1PYmplY3QuY3JlYXRlKGUse3BhcmVudDp7dmFsdWU6bH19KX1mdW5jdGlvbiByKGUsbil7aWYoZys9ZSxudWxsPT1uKXJldHVybiBvKCksMDt2YXIgdD1mdW5jdGlvbihlLG4pe3ZhciB0LHIsYTtmb3IodD0wLHI9bi5jLmxlbmd0aDt0PHI7dCsrKWlmKHYobi5jW3RdLmJSLGUpKXJldHVybiBuLmNbdF0uZW5kU2FtZUFzQmVnaW4mJihuLmNbdF0uZVI9KGE9bi5jW3RdLmJSLmV4ZWMoZSlbMF0sbmV3IFJlZ0V4cChhLnJlcGxhY2UoL1stXC9cXF4kKis/LigpfFtcXXt9XS9nLCJcXCQmIiksIm0iKSkpLG4uY1t0XX0obixsKTtpZih0KXJldHVybiB0LnNraXA/Zys9bjoodC5lQiYmKGcrPW4pLG8oKSx0LnJCfHx0LmVCfHwoZz1uKSksdSh0KSx0LnJCPzA6bi5sZW5ndGg7dmFyIHI9ZnVuY3Rpb24gZShuLHQpe2lmKHYobi5lUix0KSl7Zm9yKDtuLmVuZHNQYXJlbnQmJm4ucGFyZW50OyluPW4ucGFyZW50O3JldHVybiBufWlmKG4uZVcpcmV0dXJuIGUobi5wYXJlbnQsdCl9KGwsbik7aWYocil7dmFyIGE9bDtmb3IoYS5za2lwP2crPW46KGEuckV8fGEuZUV8fChnKz1uKSxvKCksYS5lRSYmKGc9bikpO2wuY04mJihFKz1iKSxsLnNraXB8fGwuc0x8fChSKz1sLnIpLChsPWwucGFyZW50KSE9PXIucGFyZW50Oyk7cmV0dXJuIHIuc3RhcnRzJiYoci5lbmRTYW1lQXNCZWdpbiYmKHIuc3RhcnRzLmVSPXIuZVIpLHUoci5zdGFydHMpKSxhLnJFPzA6bi5sZW5ndGh9aWYoZnVuY3Rpb24oZSxuKXtyZXR1cm4haSYmdihuLmlSLGUpfShuLGwpKXRocm93IG5ldyBFcnJvcignSWxsZWdhbCBsZXhlbWUgIicrbisnIiBmb3IgbW9kZSAiJysobC5jTnx8Ijx1bm5hbWVkPiIpKyciJyk7cmV0dXJuIGcrPW4sbi5sZW5ndGh8fDF9dmFyIHM9QihlKTtpZighcyl0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGFuZ3VhZ2U6ICInK2UrJyInKTttKHMpO3ZhciBhLGw9dHx8cyxmPXt9LEU9IiI7Zm9yKGE9bDthIT09czthPWEucGFyZW50KWEuY04mJihFPWMoYS5jTiwiIiwhMCkrRSk7dmFyIGc9IiIsUj0wO3RyeXtmb3IodmFyIGQscCxNPTA7bC50Lmxhc3RJbmRleD1NLGQ9bC50LmV4ZWMobik7KXA9cihuLnN1YnN0cmluZyhNLGQuaW5kZXgpLGRbMF0pLE09ZC5pbmRleCtwO2ZvcihyKG4uc3Vic3RyKE0pKSxhPWw7YS5wYXJlbnQ7YT1hLnBhcmVudClhLmNOJiYoRSs9Yik7cmV0dXJue3I6Uix2YWx1ZTpFLGxhbmd1YWdlOmUsdG9wOmx9fWNhdGNoKGUpe2lmKGUubWVzc2FnZSYmLTEhPT1lLm1lc3NhZ2UuaW5kZXhPZigiSWxsZWdhbCIpKXJldHVybntyOjAsdmFsdWU6XyhuKX07dGhyb3cgZX19ZnVuY3Rpb24gTyh0LGUpe2U9ZXx8aC5sYW5ndWFnZXN8fHUoTik7dmFyIHI9e3I6MCx2YWx1ZTpfKHQpfSxhPXI7cmV0dXJuIGUuZmlsdGVyKEIpLmZpbHRlcihNKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPUMoZSx0LCExKTtuLmxhbmd1YWdlPWUsbi5yPmEuciYmKGE9biksbi5yPnIuciYmKGE9cixyPW4pfSksYS5sYW5ndWFnZSYmKHIuc2Vjb25kX2Jlc3Q9YSkscn1mdW5jdGlvbiBkKGUpe3JldHVybiBoLnRhYlJlcGxhY2V8fGgudXNlQlI/ZS5yZXBsYWNlKHQsZnVuY3Rpb24oZSxuKXtyZXR1cm4gaC51c2VCUiYmIlxuIj09PWU/Ijxicj4iOmgudGFiUmVwbGFjZT9uLnJlcGxhY2UoL1x0L2csaC50YWJSZXBsYWNlKToiIn0pOmV9ZnVuY3Rpb24gbyhlKXt2YXIgbix0LHIsYSxpLG89ZnVuY3Rpb24oZSl7dmFyIG4sdCxyLGEsaT1lLmNsYXNzTmFtZSsiICI7aWYoaSs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIsdD1zLmV4ZWMoaSkpcmV0dXJuIEIodFsxXSk/dFsxXToibm8taGlnaGxpZ2h0Ijtmb3Iobj0wLHI9KGk9aS5zcGxpdCgvXHMrLykpLmxlbmd0aDtuPHI7bisrKWlmKGwoYT1pW25dKXx8QihhKSlyZXR1cm4gYX0oZSk7bChvKXx8KGgudXNlQlI/KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IikpLmlubmVySFRNTD1lLmlubmVySFRNTC5yZXBsYWNlKC9cbi9nLCIiKS5yZXBsYWNlKC88YnJbIFwvXSo+L2csIlxuIik6bj1lLGk9bi50ZXh0Q29udGVudCxyPW8/QyhvLGksITApOk8oaSksKHQ9UihuKSkubGVuZ3RoJiYoKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IikpLmlubmVySFRNTD1yLnZhbHVlLHIudmFsdWU9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPTAsYT0iIixpPVtdO2Z1bmN0aW9uIG8oKXtyZXR1cm4gZS5sZW5ndGgmJm4ubGVuZ3RoP2VbMF0ub2Zmc2V0IT09blswXS5vZmZzZXQ/ZVswXS5vZmZzZXQ8blswXS5vZmZzZXQ/ZTpuOiJzdGFydCI9PT1uWzBdLmV2ZW50P2U6bjplLmxlbmd0aD9lOm59ZnVuY3Rpb24gYyhlKXthKz0iPCIrRShlKStmLm1hcC5jYWxsKGUuYXR0cmlidXRlcyxmdW5jdGlvbihlKXtyZXR1cm4iICIrZS5ub2RlTmFtZSsnPSInK18oZS52YWx1ZSkucmVwbGFjZSgnIicsIiZxdW90OyIpKyciJ30pLmpvaW4oIiIpKyI+In1mdW5jdGlvbiB1KGUpe2ErPSI8LyIrRShlKSsiPiJ9ZnVuY3Rpb24gcyhlKXsoInN0YXJ0Ij09PWUuZXZlbnQ/Yzp1KShlLm5vZGUpfWZvcig7ZS5sZW5ndGh8fG4ubGVuZ3RoOyl7dmFyIGw9bygpO2lmKGErPV8odC5zdWJzdHJpbmcocixsWzBdLm9mZnNldCkpLHI9bFswXS5vZmZzZXQsbD09PWUpe2ZvcihpLnJldmVyc2UoKS5mb3JFYWNoKHUpO3MobC5zcGxpY2UoMCwxKVswXSksKGw9bygpKT09PWUmJmwubGVuZ3RoJiZsWzBdLm9mZnNldD09PXI7KTtpLnJldmVyc2UoKS5mb3JFYWNoKGMpfWVsc2Uic3RhcnQiPT09bFswXS5ldmVudD9pLnB1c2gobFswXS5ub2RlKTppLnBvcCgpLHMobC5zcGxpY2UoMCwxKVswXSl9cmV0dXJuIGErXyh0LnN1YnN0cihyKSl9KHQsUihhKSxpKSksci52YWx1ZT1kKHIudmFsdWUpLGUuaW5uZXJIVE1MPXIudmFsdWUsZS5jbGFzc05hbWU9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPW4/Y1tuXTp0LGE9W2UudHJpbSgpXTtyZXR1cm4gZS5tYXRjaCgvXGJobGpzXGIvKXx8YS5wdXNoKCJobGpzIiksLTE9PT1lLmluZGV4T2YocikmJmEucHVzaChyKSxhLmpvaW4oIiAiKS50cmltKCl9KGUuY2xhc3NOYW1lLG8sci5sYW5ndWFnZSksZS5yZXN1bHQ9e2xhbmd1YWdlOnIubGFuZ3VhZ2UscmU6ci5yfSxyLnNlY29uZF9iZXN0JiYoZS5zZWNvbmRfYmVzdD17bGFuZ3VhZ2U6ci5zZWNvbmRfYmVzdC5sYW5ndWFnZSxyZTpyLnNlY29uZF9iZXN0LnJ9KSl9ZnVuY3Rpb24gcCgpe2lmKCFwLmNhbGxlZCl7cC5jYWxsZWQ9ITA7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicHJlIGNvZGUiKTtmLmZvckVhY2guY2FsbChlLG8pfX1mdW5jdGlvbiBCKGUpe3JldHVybiBlPShlfHwiIikudG9Mb3dlckNhc2UoKSxOW2VdfHxOW2NbZV1dfWZ1bmN0aW9uIE0oZSl7dmFyIG49QihlKTtyZXR1cm4gbiYmIW4uZGlzYWJsZUF1dG9kZXRlY3R9cmV0dXJuIGEuaGlnaGxpZ2h0PUMsYS5oaWdobGlnaHRBdXRvPU8sYS5maXhNYXJrdXA9ZCxhLmhpZ2hsaWdodEJsb2NrPW8sYS5jb25maWd1cmU9ZnVuY3Rpb24oZSl7aD1nKGgsZSl9LGEuaW5pdEhpZ2hsaWdodGluZz1wLGEuaW5pdEhpZ2hsaWdodGluZ09uTG9hZD1mdW5jdGlvbigpe2FkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHAsITEpLGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHAsITEpfSxhLnJlZ2lzdGVyTGFuZ3VhZ2U9ZnVuY3Rpb24obixlKXt2YXIgdD1OW25dPWUoYSk7aSh0KSx0LmFsaWFzZXMmJnQuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2NbZV09bn0pfSxhLmxpc3RMYW5ndWFnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdShOKX0sYS5nZXRMYW5ndWFnZT1CLGEuYXV0b0RldGVjdGlvbj1NLGEuaW5oZXJpdD1nLGEuSVI9YS5JREVOVF9SRT0iW2EtekEtWl1cXHcqIixhLlVJUj1hLlVOREVSU0NPUkVfSURFTlRfUkU9IlthLXpBLVpfXVxcdyoiLGEuTlI9YS5OVU1CRVJfUkU9IlxcYlxcZCsoXFwuXFxkKyk/IixhLkNOUj1hLkNfTlVNQkVSX1JFPSIoLT8pKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIixhLkJOUj1hLkJJTkFSWV9OVU1CRVJfUkU9IlxcYigwYlswMV0rKSIsYS5SU1I9YS5SRV9TVEFSVEVSU19SRT0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8LXwtPXwvPXwvfDp8O3w8PHw8PD18PD18PHw9PT18PT18PXw+Pj49fD4+PXw+PXw+Pj58Pj58PnxcXD98XFxbfFxce3xcXCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iLGEuQkU9YS5CQUNLU0xBU0hfRVNDQVBFPXtiOiJcXFxcW1xcc1xcU10iLHI6MH0sYS5BU009YS5BUE9TX1NUUklOR19NT0RFPXtjTjoic3RyaW5nIixiOiInIixlOiInIixpOiJcXG4iLGM6W2EuQkVdfSxhLlFTTT1hLlFVT1RFX1NUUklOR19NT0RFPXtjTjoic3RyaW5nIixiOiciJyxlOiciJyxpOiJcXG4iLGM6W2EuQkVdfSxhLlBXTT1hLlBIUkFTQUxfV09SRFNfTU9ERT17YjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlvdXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiL30sYS5DPWEuQ09NTUVOVD1mdW5jdGlvbihlLG4sdCl7dmFyIHI9YS5pbmhlcml0KHtjTjoiY29tbWVudCIsYjplLGU6bixjOltdfSx0fHx7fSk7cmV0dXJuIHIuYy5wdXNoKGEuUFdNKSxyLmMucHVzaCh7Y046ImRvY3RhZyIsYjoiKD86VE9ET3xGSVhNRXxOT1RFfEJVR3xYWFgpOiIscjowfSkscn0sYS5DTENNPWEuQ19MSU5FX0NPTU1FTlRfTU9ERT1hLkMoIi8vIiwiJCIpLGEuQ0JDTT1hLkNfQkxPQ0tfQ09NTUVOVF9NT0RFPWEuQygiL1xcKiIsIlxcKi8iKSxhLkhDTT1hLkhBU0hfQ09NTUVOVF9NT0RFPWEuQygiIyIsIiQiKSxhLk5NPWEuTlVNQkVSX01PREU9e2NOOiJudW1iZXIiLGI6YS5OUixyOjB9LGEuQ05NPWEuQ19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLkNOUixyOjB9LGEuQk5NPWEuQklOQVJZX05VTUJFUl9NT0RFPXtjTjoibnVtYmVyIixiOmEuQk5SLHI6MH0sYS5DU1NOTT1hLkNTU19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLk5SKyIoJXxlbXxleHxjaHxyZW18dnd8dmh8dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjfHB4fGRlZ3xncmFkfHJhZHx0dXJufHN8bXN8SHp8a0h6fGRwaXxkcGNtfGRwcHgpPyIscjowfSxhLlJNPWEuUkVHRVhQX01PREU9e2NOOiJyZWdleHAiLGI6L1wvLyxlOi9cL1tnaW11eV0qLyxpOi9cbi8sYzpbYS5CRSx7YjovXFsvLGU6L1xdLyxyOjAsYzpbYS5CRV19XX0sYS5UTT1hLlRJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLklSLHI6MH0sYS5VVE09YS5VTkRFUlNDT1JFX1RJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLlVJUixyOjB9LGEuTUVUSE9EX0dVQVJEPXtiOiJcXC5cXHMqIithLlVJUixyOjB9LGF9KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInhtbCIsZnVuY3Rpb24ocyl7dmFyIGU9e2VXOiEwLGk6LzwvLHI6MCxjOlt7Y046ImF0dHIiLGI6IltBLVphLXowLTlcXC5fOi1dKyIscjowfSx7YjovPVxzKi8scjowLGM6W3tjTjoic3RyaW5nIixlbmRzUGFyZW50OiEwLHY6W3tiOi8iLyxlOi8iL30se2I6LycvLGU6LycvfSx7YjovW15ccyInPTw+YF0rL31dfV19XX07cmV0dXJue2FsaWFzZXM6WyJodG1sIiwieGh0bWwiLCJyc3MiLCJhdG9tIiwieGpiIiwieHNkIiwieHNsIiwicGxpc3QiLCJ3c2YiXSxjSTohMCxjOlt7Y046Im1ldGEiLGI6IjwhRE9DVFlQRSIsZToiPiIscjoxMCxjOlt7YjoiXFxbIixlOiJcXF0ifV19LHMuQygiXHgzYyEtLSIsIi0tXHgzZSIse3I6MTB9KSx7YjoiPFxcIVxcW0NEQVRBXFxbIixlOiJcXF1cXF0+IixyOjEwfSx7Y046Im1ldGEiLGI6LzxcP3htbC8sZTovXD8+LyxyOjEwfSx7YjovPFw/KHBocCk/LyxlOi9cPz4vLHNMOiJwaHAiLGM6W3tiOiIvXFwqIixlOiJcXCovIixza2lwOiEwfSx7YjonYiInLGU6JyInLHNraXA6ITB9LHtiOiJiJyIsZToiJyIsc2tpcDohMH0scy5pbmhlcml0KHMuQVNNLHtpOm51bGwsY046bnVsbCxjOm51bGwsc2tpcDohMH0pLHMuaW5oZXJpdChzLlFTTSx7aTpudWxsLGNOOm51bGwsYzpudWxsLHNraXA6ITB9KV19LHtjTjoidGFnIixiOiI8c3R5bGUoPz1cXHN8PnwkKSIsZToiPiIsazp7bmFtZToic3R5bGUifSxjOltlXSxzdGFydHM6e2U6Ijwvc3R5bGU+IixyRTohMCxzTDpbImNzcyIsInhtbCJdfX0se2NOOiJ0YWciLGI6IjxzY3JpcHQoPz1cXHN8PnwkKSIsZToiPiIsazp7bmFtZToic2NyaXB0In0sYzpbZV0sc3RhcnRzOntlOiI8XC9zY3JpcHQ+IixyRTohMCxzTDpbImFjdGlvbnNjcmlwdCIsImphdmFzY3JpcHQiLCJoYW5kbGViYXJzIiwieG1sIiwidmJzY3JpcHQiXX19LHtjTjoidGFnIixiOiI8Lz8iLGU6Ii8/PiIsYzpbe2NOOiJuYW1lIixiOi9bXlwvPjxcc10rLyxyOjB9LGVdfV19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJtYXJrZG93biIsZnVuY3Rpb24oZSl7cmV0dXJue2FsaWFzZXM6WyJtZCIsIm1rZG93biIsIm1rZCJdLGM6W3tjTjoic2VjdGlvbiIsdjpbe2I6Il4jezEsNn0iLGU6IiQifSx7YjoiXi4rP1xcbls9LV17Mix9JCJ9XX0se2I6IjwiLGU6Ij4iLHNMOiJ4bWwiLHI6MH0se2NOOiJidWxsZXQiLGI6Il5cXHMqKFsqKy1dfChcXGQrXFwuKSlcXHMrIn0se2NOOiJzdHJvbmciLGI6IlsqX117Mn0uKz9bKl9dezJ9In0se2NOOiJlbXBoYXNpcyIsdjpbe2I6IlxcKi4rP1xcKiJ9LHtiOiJfLis/XyIscjowfV19LHtjTjoicXVvdGUiLGI6Il4+XFxzKyIsZToiJCJ9LHtjTjoiY29kZSIsdjpbe2I6Il5gYGB3KnMqJCIsZToiXmBgYHMqJCJ9LHtiOiJgLis/YCJ9LHtiOiJeKCB7NH18XHQpIixlOiIkIixyOjB9XX0se2I6Il5bLVxcKl17Myx9IixlOiIkIn0se2I6IlxcWy4rP1xcXVtcXChcXFtdLio/W1xcKVxcXV0iLHJCOiEwLGM6W3tjTjoic3RyaW5nIixiOiJcXFsiLGU6IlxcXSIsZUI6ITAsckU6ITAscjowfSx7Y046ImxpbmsiLGI6IlxcXVxcKCIsZToiXFwpIixlQjohMCxlRTohMH0se2NOOiJzeW1ib2wiLGI6IlxcXVxcWyIsZToiXFxdIixlQjohMCxlRTohMH1dLHI6MTB9LHtiOi9eXFtbXlxuXStcXTovLHJCOiEwLGM6W3tjTjoic3ltYm9sIixiOi9cWy8sZTovXF0vLGVCOiEwLGVFOiEwfSx7Y046ImxpbmsiLGI6LzpccyovLGU6LyQvLGVCOiEwfV19XX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImRhcnQiLGZ1bmN0aW9uKGUpe3ZhciB0PXtjTjoic3Vic3QiLHY6W3tiOiJcXCRbQS1aYS16MC05X10rIn1dfSxyPXtjTjoic3Vic3QiLHY6W3tiOiJcXCR7IixlOiJ9In1dLGs6InRydWUgZmFsc2UgbnVsbCB0aGlzIGlzIG5ldyBzdXBlciJ9LG49e2NOOiJzdHJpbmciLHY6W3tiOiJyJycnIixlOiInJycifSx7YjonciIiIicsZTonIiIiJ30se2I6InInIixlOiInIixpOiJcXG4ifSx7YjonciInLGU6JyInLGk6IlxcbiJ9LHtiOiInJyciLGU6IicnJyIsYzpbZS5CRSx0LHJdfSx7YjonIiIiJyxlOiciIiInLGM6W2UuQkUsdCxyXX0se2I6IiciLGU6IiciLGk6IlxcbiIsYzpbZS5CRSx0LHJdfSx7YjonIicsZTonIicsaToiXFxuIixjOltlLkJFLHQscl19XX07ci5jPVtlLkNOTSxuXTtyZXR1cm57azp7a2V5d29yZDoiYXNzZXJ0IGFzeW5jIGF3YWl0IGJyZWFrIGNhc2UgY2F0Y2ggY2xhc3MgY29uc3QgY29udGludWUgZGVmYXVsdCBkbyBlbHNlIGVudW0gZXh0ZW5kcyBmYWxzZSBmaW5hbCBmaW5hbGx5IGZvciBpZiBpbiBpcyBuZXcgbnVsbCByZXRocm93IHJldHVybiBzdXBlciBzd2l0Y2ggc3luYyB0aGlzIHRocm93IHRydWUgdHJ5IHZhciB2b2lkIHdoaWxlIHdpdGggeWllbGQgYWJzdHJhY3QgYXMgZHluYW1pYyBleHBvcnQgZXh0ZXJuYWwgZmFjdG9yeSBnZXQgaW1wbGVtZW50cyBpbXBvcnQgbGlicmFyeSBvcGVyYXRvciBwYXJ0IHNldCBzdGF0aWMgdHlwZWRlZiIsYnVpbHRfaW46InByaW50IENvbXBhcmFibGUgRGF0ZVRpbWUgRHVyYXRpb24gRnVuY3Rpb24gSXRlcmFibGUgSXRlcmF0b3IgTGlzdCBNYXAgTWF0Y2ggTnVsbCBPYmplY3QgUGF0dGVybiBSZWdFeHAgU2V0IFN0b3B3YXRjaCBTdHJpbmcgU3RyaW5nQnVmZmVyIFN0cmluZ1NpbmsgU3ltYm9sIFR5cGUgVXJpIGJvb2wgZG91YmxlIGludCBudW0gZG9jdW1lbnQgd2luZG93IHF1ZXJ5U2VsZWN0b3IgcXVlcnlTZWxlY3RvckFsbCBFbGVtZW50IEVsZW1lbnRMaXN0In0sYzpbbixlLkMoIi9cXCpcXCoiLCJcXCovIix7c0w6Im1hcmtkb3duIn0pLGUuQygiLy8vIiwiJCIse3NMOiJtYXJrZG93biJ9KSxlLkNMQ00sZS5DQkNNLHtjTjoiY2xhc3MiLGJLOiJjbGFzcyBpbnRlcmZhY2UiLGU6InsiLGVFOiEwLGM6W3tiSzoiZXh0ZW5kcyBpbXBsZW1lbnRzIn0sZS5VVE1dfSxlLkNOTSx7Y046Im1ldGEiLGI6IkBbQS1aYS16XSsifSx7YjoiPT4ifV19fSk7";
+    'LyohIGhpZ2hsaWdodC5qcyB2OS4xNS4xMCB8IEJTRDMgTGljZW5zZSB8IGdpdC5pby9obGpzbGljZW5zZSAqLwohZnVuY3Rpb24oZSl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmOyJ1bmRlZmluZWQiPT10eXBlb2YgZXhwb3J0c3x8ZXhwb3J0cy5ub2RlVHlwZT9uJiYobi5obGpzPWUoe30pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBuLmhsanN9KSk6ZShleHBvcnRzKX0oZnVuY3Rpb24oYSl7dmFyIGY9W10sdT1PYmplY3Qua2V5cyxOPXt9LGM9e30sbj0vXihuby0/aGlnaGxpZ2h0fHBsYWlufHRleHQpJC9pLHM9L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksdD0vKCheKDxbXj5dKz58XHR8KSt8KD86XG4pKSkvZ20scj17Y2FzZV9pbnNlbnNpdGl2ZToiY0kiLGxleGVtZXM6ImwiLGNvbnRhaW5zOiJjIixrZXl3b3JkczoiayIsc3ViTGFuZ3VhZ2U6InNMIixjbGFzc05hbWU6ImNOIixiZWdpbjoiYiIsYmVnaW5LZXl3b3JkczoiYksiLGVuZDoiZSIsZW5kc1dpdGhQYXJlbnQ6ImVXIixpbGxlZ2FsOiJpIixleGNsdWRlQmVnaW46ImVCIixleGNsdWRlRW5kOiJlRSIscmV0dXJuQmVnaW46InJCIixyZXR1cm5FbmQ6InJFIixyZWxldmFuY2U6InIiLHZhcmlhbnRzOiJ2IixJREVOVF9SRToiSVIiLFVOREVSU0NPUkVfSURFTlRfUkU6IlVJUiIsTlVNQkVSX1JFOiJOUiIsQ19OVU1CRVJfUkU6IkNOUiIsQklOQVJZX05VTUJFUl9SRToiQk5SIixSRV9TVEFSVEVSU19SRToiUlNSIixCQUNLU0xBU0hfRVNDQVBFOiJCRSIsQVBPU19TVFJJTkdfTU9ERToiQVNNIixRVU9URV9TVFJJTkdfTU9ERToiUVNNIixQSFJBU0FMX1dPUkRTX01PREU6IlBXTSIsQ19MSU5FX0NPTU1FTlRfTU9ERToiQ0xDTSIsQ19CTE9DS19DT01NRU5UX01PREU6IkNCQ00iLEhBU0hfQ09NTUVOVF9NT0RFOiJIQ00iLE5VTUJFUl9NT0RFOiJOTSIsQ19OVU1CRVJfTU9ERToiQ05NIixCSU5BUllfTlVNQkVSX01PREU6IkJOTSIsQ1NTX05VTUJFUl9NT0RFOiJDU1NOTSIsUkVHRVhQX01PREU6IlJNIixUSVRMRV9NT0RFOiJUTSIsVU5ERVJTQ09SRV9USVRMRV9NT0RFOiJVVE0iLENPTU1FTlQ6IkMiLGJlZ2luUmU6ImJSIixlbmRSZToiZVIiLGlsbGVnYWxSZToiaVIiLGxleGVtZXNSZToibFIiLHRlcm1pbmF0b3JzOiJ0Iix0ZXJtaW5hdG9yX2VuZDoidEUifSxiPSI8L3NwYW4+IixoPXtjbGFzc1ByZWZpeDoiaGxqcy0iLHRhYlJlcGxhY2U6bnVsbCx1c2VCUjohMSxsYW5ndWFnZXM6dm9pZCAwfTtmdW5jdGlvbiBfKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiBFKGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdihlLG4pe3ZhciB0PWUmJmUuZXhlYyhuKTtyZXR1cm4gdCYmMD09PXQuaW5kZXh9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbi50ZXN0KGUpfWZ1bmN0aW9uIGcoZSl7dmFyIG4sdD17fSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtmb3IobiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZvcihuIGluIGUpdFtuXT1lW25dfSksdH1mdW5jdGlvbiBSKGUpe3ZhciBhPVtdO3JldHVybiBmdW5jdGlvbiBlKG4sdCl7Zm9yKHZhciByPW4uZmlyc3RDaGlsZDtyO3I9ci5uZXh0U2libGluZykzPT09ci5ub2RlVHlwZT90Kz1yLm5vZGVWYWx1ZS5sZW5ndGg6MT09PXIubm9kZVR5cGUmJihhLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OnQsbm9kZTpyfSksdD1lKHIsdCksRShyKS5tYXRjaCgvYnJ8aHJ8aW1nfGlucHV0Lyl8fGEucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDp0LG5vZGU6cn0pKTtyZXR1cm4gdH0oZSwwKSxhfWZ1bmN0aW9uIGkoZSl7aWYociYmIWUubGFuZ0FwaVJlc3RvcmVkKXtmb3IodmFyIG4gaW4gZS5sYW5nQXBpUmVzdG9yZWQ9ITAscillW25dJiYoZVtyW25dXT1lW25dKTsoZS5jfHxbXSkuY29uY2F0KGUudnx8W10pLmZvckVhY2goaSl9fWZ1bmN0aW9uIG0obyl7ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZSYmZS5zb3VyY2V8fGV9ZnVuY3Rpb24gYyhlLG4pe3JldHVybiBuZXcgUmVnRXhwKHMoZSksIm0iKyhvLmNJPyJpIjoiIikrKG4/ImciOiIiKSl9IWZ1bmN0aW9uIG4odCxlKXtpZighdC5jb21waWxlZCl7aWYodC5jb21waWxlZD0hMCx0Lms9dC5rfHx0LmJLLHQuayl7ZnVuY3Rpb24gcih0LGUpe28uY0kmJihlPWUudG9Mb3dlckNhc2UoKSksZS5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdCgifCIpO2FbblswXV09W3QsblsxXT9OdW1iZXIoblsxXSk6MV19KX12YXIgYT17fTsic3RyaW5nIj09dHlwZW9mIHQuaz9yKCJrZXl3b3JkIix0LmspOnUodC5rKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IoZSx0LmtbZV0pfSksdC5rPWF9dC5sUj1jKHQubHx8L1x3Ky8sITApLGUmJih0LmJLJiYodC5iPSJcXGIoIit0LmJLLnNwbGl0KCIgIikuam9pbigifCIpKyIpXFxiIiksdC5ifHwodC5iPS9cQnxcYi8pLHQuYlI9Yyh0LmIpLHQuZW5kU2FtZUFzQmVnaW4mJih0LmU9dC5iKSx0LmV8fHQuZVd8fCh0LmU9L1xCfFxiLyksdC5lJiYodC5lUj1jKHQuZSkpLHQudEU9cyh0LmUpfHwiIix0LmVXJiZlLnRFJiYodC50RSs9KHQuZT8ifCI6IiIpK2UudEUpKSx0LmkmJih0LmlSPWModC5pKSksbnVsbD09dC5yJiYodC5yPTEpLHQuY3x8KHQuYz1bXSksdC5jPUFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sdC5jLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4udiYmIW4uY2FjaGVkX3ZhcmlhbnRzJiYobi5jYWNoZWRfdmFyaWFudHM9bi52Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZyhuLHt2Om51bGx9LGUpfSkpLG4uY2FjaGVkX3ZhcmlhbnRzfHxuLmVXJiZbZyhuKV18fFtuXX0oInNlbGYiPT09ZT90OmUpfSkpLHQuYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe24oZSx0KX0pLHQuc3RhcnRzJiZuKHQuc3RhcnRzLGUpO3ZhciBpPXQuYy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYks/IlxcLj8oPzoiK2UuYisiKVxcLj8iOmUuYn0pLmNvbmNhdChbdC50RSx0LmldKS5tYXAocykuZmlsdGVyKEJvb2xlYW4pO3QudD1pLmxlbmd0aD9jKGZ1bmN0aW9uKGUsbil7Zm9yKHZhciB0PS9cWyg/OlteXFxcXV18XFwuKSpcXXxcKFw/P3xcXChbMS05XVswLTldKil8XFwuLyxyPTAsYT0iIixpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPXIsYz1zKGVbaV0pO2ZvcigwPGkmJihhKz1uKTswPGMubGVuZ3RoOyl7dmFyIHU9dC5leGVjKGMpO2lmKG51bGw9PXUpe2ErPWM7YnJlYWt9YSs9Yy5zdWJzdHJpbmcoMCx1LmluZGV4KSxjPWMuc3Vic3RyaW5nKHUuaW5kZXgrdVswXS5sZW5ndGgpLCJcXCI9PXVbMF1bMF0mJnVbMV0/YSs9IlxcIitTdHJpbmcoTnVtYmVyKHVbMV0pK28pOihhKz11WzBdLCIoIj09dVswXSYmcisrKX19cmV0dXJuIGF9KGksInwiKSwhMCk6e2V4ZWM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19fX0obyl9ZnVuY3Rpb24gQyhlLG4saSx0KXtmdW5jdGlvbiBjKGUsbix0LHIpe3ZhciBhPSc8c3BhbiBjbGFzcz0iJysocj8iIjpoLmNsYXNzUHJlZml4KTtyZXR1cm4gZT8oYSs9ZSsnIj4nKStuKyh0PyIiOmIpOm59ZnVuY3Rpb24gbygpe0UrPW51bGwhPWwuc0w/ZnVuY3Rpb24oKXt2YXIgZT0ic3RyaW5nIj09dHlwZW9mIGwuc0w7aWYoZSYmIU5bbC5zTF0pcmV0dXJuIF8oZyk7dmFyIG49ZT9DKGwuc0wsZywhMCxmW2wuc0xdKTpPKGcsbC5zTC5sZW5ndGg/bC5zTDp2b2lkIDApO3JldHVybiAwPGwuciYmKFIrPW4uciksZSYmKGZbbC5zTF09bi50b3ApLGMobi5sYW5ndWFnZSxuLnZhbHVlLCExLCEwKX0oKTpmdW5jdGlvbigpe3ZhciBlLG4sdCxyLGEsaSxvO2lmKCFsLmspcmV0dXJuIF8oZyk7Zm9yKHI9IiIsbj0wLGwubFIubGFzdEluZGV4PTAsdD1sLmxSLmV4ZWMoZyk7dDspcis9XyhnLnN1YnN0cmluZyhuLHQuaW5kZXgpKSxhPWwsaT10LHZvaWQgMCxvPXMuY0k/aVswXS50b0xvd2VyQ2FzZSgpOmlbMF0sKGU9YS5rLmhhc093blByb3BlcnR5KG8pJiZhLmtbb10pPyhSKz1lWzFdLHIrPWMoZVswXSxfKHRbMF0pKSk6cis9Xyh0WzBdKSxuPWwubFIubGFzdEluZGV4LHQ9bC5sUi5leGVjKGcpO3JldHVybiByK18oZy5zdWJzdHIobikpfSgpLGc9IiJ9ZnVuY3Rpb24gdShlKXtFKz1lLmNOP2MoZS5jTiwiIiwhMCk6IiIsbD1PYmplY3QuY3JlYXRlKGUse3BhcmVudDp7dmFsdWU6bH19KX1mdW5jdGlvbiByKGUsbil7aWYoZys9ZSxudWxsPT1uKXJldHVybiBvKCksMDt2YXIgdD1mdW5jdGlvbihlLG4pe3ZhciB0LHIsYTtmb3IodD0wLHI9bi5jLmxlbmd0aDt0PHI7dCsrKWlmKHYobi5jW3RdLmJSLGUpKXJldHVybiBuLmNbdF0uZW5kU2FtZUFzQmVnaW4mJihuLmNbdF0uZVI9KGE9bi5jW3RdLmJSLmV4ZWMoZSlbMF0sbmV3IFJlZ0V4cChhLnJlcGxhY2UoL1stXC9cXF4kKis/LigpfFtcXXt9XS9nLCJcXCQmIiksIm0iKSkpLG4uY1t0XX0obixsKTtpZih0KXJldHVybiB0LnNraXA/Zys9bjoodC5lQiYmKGcrPW4pLG8oKSx0LnJCfHx0LmVCfHwoZz1uKSksdSh0KSx0LnJCPzA6bi5sZW5ndGg7dmFyIHI9ZnVuY3Rpb24gZShuLHQpe2lmKHYobi5lUix0KSl7Zm9yKDtuLmVuZHNQYXJlbnQmJm4ucGFyZW50OyluPW4ucGFyZW50O3JldHVybiBufWlmKG4uZVcpcmV0dXJuIGUobi5wYXJlbnQsdCl9KGwsbik7aWYocil7dmFyIGE9bDtmb3IoYS5za2lwP2crPW46KGEuckV8fGEuZUV8fChnKz1uKSxvKCksYS5lRSYmKGc9bikpO2wuY04mJihFKz1iKSxsLnNraXB8fGwuc0x8fChSKz1sLnIpLChsPWwucGFyZW50KSE9PXIucGFyZW50Oyk7cmV0dXJuIHIuc3RhcnRzJiYoci5lbmRTYW1lQXNCZWdpbiYmKHIuc3RhcnRzLmVSPXIuZVIpLHUoci5zdGFydHMpKSxhLnJFPzA6bi5sZW5ndGh9aWYoZnVuY3Rpb24oZSxuKXtyZXR1cm4haSYmdihuLmlSLGUpfShuLGwpKXRocm93IG5ldyBFcnJvcignSWxsZWdhbCBsZXhlbWUgIicrbisnIiBmb3IgbW9kZSAiJysobC5jTnx8Ijx1bm5hbWVkPiIpKyciJyk7cmV0dXJuIGcrPW4sbi5sZW5ndGh8fDF9dmFyIHM9QihlKTtpZighcyl0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGFuZ3VhZ2U6ICInK2UrJyInKTttKHMpO3ZhciBhLGw9dHx8cyxmPXt9LEU9IiI7Zm9yKGE9bDthIT09czthPWEucGFyZW50KWEuY04mJihFPWMoYS5jTiwiIiwhMCkrRSk7dmFyIGc9IiIsUj0wO3RyeXtmb3IodmFyIGQscCxNPTA7bC50Lmxhc3RJbmRleD1NLGQ9bC50LmV4ZWMobik7KXA9cihuLnN1YnN0cmluZyhNLGQuaW5kZXgpLGRbMF0pLE09ZC5pbmRleCtwO2ZvcihyKG4uc3Vic3RyKE0pKSxhPWw7YS5wYXJlbnQ7YT1hLnBhcmVudClhLmNOJiYoRSs9Yik7cmV0dXJue3I6Uix2YWx1ZTpFLGxhbmd1YWdlOmUsdG9wOmx9fWNhdGNoKGUpe2lmKGUubWVzc2FnZSYmLTEhPT1lLm1lc3NhZ2UuaW5kZXhPZigiSWxsZWdhbCIpKXJldHVybntyOjAsdmFsdWU6XyhuKX07dGhyb3cgZX19ZnVuY3Rpb24gTyh0LGUpe2U9ZXx8aC5sYW5ndWFnZXN8fHUoTik7dmFyIHI9e3I6MCx2YWx1ZTpfKHQpfSxhPXI7cmV0dXJuIGUuZmlsdGVyKEIpLmZpbHRlcihNKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPUMoZSx0LCExKTtuLmxhbmd1YWdlPWUsbi5yPmEuciYmKGE9biksbi5yPnIuciYmKGE9cixyPW4pfSksYS5sYW5ndWFnZSYmKHIuc2Vjb25kX2Jlc3Q9YSkscn1mdW5jdGlvbiBkKGUpe3JldHVybiBoLnRhYlJlcGxhY2V8fGgudXNlQlI/ZS5yZXBsYWNlKHQsZnVuY3Rpb24oZSxuKXtyZXR1cm4gaC51c2VCUiYmIlxuIj09PWU/Ijxicj4iOmgudGFiUmVwbGFjZT9uLnJlcGxhY2UoL1x0L2csaC50YWJSZXBsYWNlKToiIn0pOmV9ZnVuY3Rpb24gbyhlKXt2YXIgbix0LHIsYSxpLG89ZnVuY3Rpb24oZSl7dmFyIG4sdCxyLGEsaT1lLmNsYXNzTmFtZSsiICI7aWYoaSs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIsdD1zLmV4ZWMoaSkpcmV0dXJuIEIodFsxXSk/dFsxXToibm8taGlnaGxpZ2h0Ijtmb3Iobj0wLHI9KGk9aS5zcGxpdCgvXHMrLykpLmxlbmd0aDtuPHI7bisrKWlmKGwoYT1pW25dKXx8QihhKSlyZXR1cm4gYX0oZSk7bChvKXx8KGgudXNlQlI/KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IikpLmlubmVySFRNTD1lLmlubmVySFRNTC5yZXBsYWNlKC9cbi9nLCIiKS5yZXBsYWNlKC88YnJbIFwvXSo+L2csIlxuIik6bj1lLGk9bi50ZXh0Q29udGVudCxyPW8/QyhvLGksITApOk8oaSksKHQ9UihuKSkubGVuZ3RoJiYoKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IikpLmlubmVySFRNTD1yLnZhbHVlLHIudmFsdWU9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPTAsYT0iIixpPVtdO2Z1bmN0aW9uIG8oKXtyZXR1cm4gZS5sZW5ndGgmJm4ubGVuZ3RoP2VbMF0ub2Zmc2V0IT09blswXS5vZmZzZXQ/ZVswXS5vZmZzZXQ8blswXS5vZmZzZXQ/ZTpuOiJzdGFydCI9PT1uWzBdLmV2ZW50P2U6bjplLmxlbmd0aD9lOm59ZnVuY3Rpb24gYyhlKXthKz0iPCIrRShlKStmLm1hcC5jYWxsKGUuYXR0cmlidXRlcyxmdW5jdGlvbihlKXtyZXR1cm4iICIrZS5ub2RlTmFtZSsnPSInK18oZS52YWx1ZSkucmVwbGFjZSgnIicsIiZxdW90OyIpKyciJ30pLmpvaW4oIiIpKyI+In1mdW5jdGlvbiB1KGUpe2ErPSI8LyIrRShlKSsiPiJ9ZnVuY3Rpb24gcyhlKXsoInN0YXJ0Ij09PWUuZXZlbnQ/Yzp1KShlLm5vZGUpfWZvcig7ZS5sZW5ndGh8fG4ubGVuZ3RoOyl7dmFyIGw9bygpO2lmKGErPV8odC5zdWJzdHJpbmcocixsWzBdLm9mZnNldCkpLHI9bFswXS5vZmZzZXQsbD09PWUpe2ZvcihpLnJldmVyc2UoKS5mb3JFYWNoKHUpO3MobC5zcGxpY2UoMCwxKVswXSksKGw9bygpKT09PWUmJmwubGVuZ3RoJiZsWzBdLm9mZnNldD09PXI7KTtpLnJldmVyc2UoKS5mb3JFYWNoKGMpfWVsc2Uic3RhcnQiPT09bFswXS5ldmVudD9pLnB1c2gobFswXS5ub2RlKTppLnBvcCgpLHMobC5zcGxpY2UoMCwxKVswXSl9cmV0dXJuIGErXyh0LnN1YnN0cihyKSl9KHQsUihhKSxpKSksci52YWx1ZT1kKHIudmFsdWUpLGUuaW5uZXJIVE1MPXIudmFsdWUsZS5jbGFzc05hbWU9ZnVuY3Rpb24oZSxuLHQpe3ZhciByPW4/Y1tuXTp0LGE9W2UudHJpbSgpXTtyZXR1cm4gZS5tYXRjaCgvXGJobGpzXGIvKXx8YS5wdXNoKCJobGpzIiksLTE9PT1lLmluZGV4T2YocikmJmEucHVzaChyKSxhLmpvaW4oIiAiKS50cmltKCl9KGUuY2xhc3NOYW1lLG8sci5sYW5ndWFnZSksZS5yZXN1bHQ9e2xhbmd1YWdlOnIubGFuZ3VhZ2UscmU6ci5yfSxyLnNlY29uZF9iZXN0JiYoZS5zZWNvbmRfYmVzdD17bGFuZ3VhZ2U6ci5zZWNvbmRfYmVzdC5sYW5ndWFnZSxyZTpyLnNlY29uZF9iZXN0LnJ9KSl9ZnVuY3Rpb24gcCgpe2lmKCFwLmNhbGxlZCl7cC5jYWxsZWQ9ITA7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicHJlIGNvZGUiKTtmLmZvckVhY2guY2FsbChlLG8pfX1mdW5jdGlvbiBCKGUpe3JldHVybiBlPShlfHwiIikudG9Mb3dlckNhc2UoKSxOW2VdfHxOW2NbZV1dfWZ1bmN0aW9uIE0oZSl7dmFyIG49QihlKTtyZXR1cm4gbiYmIW4uZGlzYWJsZUF1dG9kZXRlY3R9cmV0dXJuIGEuaGlnaGxpZ2h0PUMsYS5oaWdobGlnaHRBdXRvPU8sYS5maXhNYXJrdXA9ZCxhLmhpZ2hsaWdodEJsb2NrPW8sYS5jb25maWd1cmU9ZnVuY3Rpb24oZSl7aD1nKGgsZSl9LGEuaW5pdEhpZ2hsaWdodGluZz1wLGEuaW5pdEhpZ2hsaWdodGluZ09uTG9hZD1mdW5jdGlvbigpe2FkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHAsITEpLGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHAsITEpfSxhLnJlZ2lzdGVyTGFuZ3VhZ2U9ZnVuY3Rpb24obixlKXt2YXIgdD1OW25dPWUoYSk7aSh0KSx0LmFsaWFzZXMmJnQuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2NbZV09bn0pfSxhLmxpc3RMYW5ndWFnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdShOKX0sYS5nZXRMYW5ndWFnZT1CLGEuYXV0b0RldGVjdGlvbj1NLGEuaW5oZXJpdD1nLGEuSVI9YS5JREVOVF9SRT0iW2EtekEtWl1cXHcqIixhLlVJUj1hLlVOREVSU0NPUkVfSURFTlRfUkU9IlthLXpBLVpfXVxcdyoiLGEuTlI9YS5OVU1CRVJfUkU9IlxcYlxcZCsoXFwuXFxkKyk/IixhLkNOUj1hLkNfTlVNQkVSX1JFPSIoLT8pKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIixhLkJOUj1hLkJJTkFSWV9OVU1CRVJfUkU9IlxcYigwYlswMV0rKSIsYS5SU1I9YS5SRV9TVEFSVEVSU19SRT0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8LXwtPXwvPXwvfDp8O3w8PHw8PD18PD18PHw9PT18PT18PXw+Pj49fD4+PXw+PXw+Pj58Pj58PnxcXD98XFxbfFxce3xcXCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iLGEuQkU9YS5CQUNLU0xBU0hfRVNDQVBFPXtiOiJcXFxcW1xcc1xcU10iLHI6MH0sYS5BU009YS5BUE9TX1NUUklOR19NT0RFPXtjTjoic3RyaW5nIixiOiInIixlOiInIixpOiJcXG4iLGM6W2EuQkVdfSxhLlFTTT1hLlFVT1RFX1NUUklOR19NT0RFPXtjTjoic3RyaW5nIixiOiciJyxlOiciJyxpOiJcXG4iLGM6W2EuQkVdfSxhLlBXTT1hLlBIUkFTQUxfV09SRFNfTU9ERT17YjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlvdXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiL30sYS5DPWEuQ09NTUVOVD1mdW5jdGlvbihlLG4sdCl7dmFyIHI9YS5pbmhlcml0KHtjTjoiY29tbWVudCIsYjplLGU6bixjOltdfSx0fHx7fSk7cmV0dXJuIHIuYy5wdXNoKGEuUFdNKSxyLmMucHVzaCh7Y046ImRvY3RhZyIsYjoiKD86VE9ET3xGSVhNRXxOT1RFfEJVR3xYWFgpOiIscjowfSkscn0sYS5DTENNPWEuQ19MSU5FX0NPTU1FTlRfTU9ERT1hLkMoIi8vIiwiJCIpLGEuQ0JDTT1hLkNfQkxPQ0tfQ09NTUVOVF9NT0RFPWEuQygiL1xcKiIsIlxcKi8iKSxhLkhDTT1hLkhBU0hfQ09NTUVOVF9NT0RFPWEuQygiIyIsIiQiKSxhLk5NPWEuTlVNQkVSX01PREU9e2NOOiJudW1iZXIiLGI6YS5OUixyOjB9LGEuQ05NPWEuQ19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLkNOUixyOjB9LGEuQk5NPWEuQklOQVJZX05VTUJFUl9NT0RFPXtjTjoibnVtYmVyIixiOmEuQk5SLHI6MH0sYS5DU1NOTT1hLkNTU19OVU1CRVJfTU9ERT17Y046Im51bWJlciIsYjphLk5SKyIoJXxlbXxleHxjaHxyZW18dnd8dmh8dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjfHB4fGRlZ3xncmFkfHJhZHx0dXJufHN8bXN8SHp8a0h6fGRwaXxkcGNtfGRwcHgpPyIscjowfSxhLlJNPWEuUkVHRVhQX01PREU9e2NOOiJyZWdleHAiLGI6L1wvLyxlOi9cL1tnaW11eV0qLyxpOi9cbi8sYzpbYS5CRSx7YjovXFsvLGU6L1xdLyxyOjAsYzpbYS5CRV19XX0sYS5UTT1hLlRJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLklSLHI6MH0sYS5VVE09YS5VTkRFUlNDT1JFX1RJVExFX01PREU9e2NOOiJ0aXRsZSIsYjphLlVJUixyOjB9LGEuTUVUSE9EX0dVQVJEPXtiOiJcXC5cXHMqIithLlVJUixyOjB9LGF9KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoInhtbCIsZnVuY3Rpb24ocyl7dmFyIGU9e2VXOiEwLGk6LzwvLHI6MCxjOlt7Y046ImF0dHIiLGI6IltBLVphLXowLTlcXC5fOi1dKyIscjowfSx7YjovPVxzKi8scjowLGM6W3tjTjoic3RyaW5nIixlbmRzUGFyZW50OiEwLHY6W3tiOi8iLyxlOi8iL30se2I6LycvLGU6LycvfSx7YjovW15ccyInPTw+YF0rL31dfV19XX07cmV0dXJue2FsaWFzZXM6WyJodG1sIiwieGh0bWwiLCJyc3MiLCJhdG9tIiwieGpiIiwieHNkIiwieHNsIiwicGxpc3QiLCJ3c2YiXSxjSTohMCxjOlt7Y046Im1ldGEiLGI6IjwhRE9DVFlQRSIsZToiPiIscjoxMCxjOlt7YjoiXFxbIixlOiJcXF0ifV19LHMuQygiXHgzYyEtLSIsIi0tXHgzZSIse3I6MTB9KSx7YjoiPFxcIVxcW0NEQVRBXFxbIixlOiJcXF1cXF0+IixyOjEwfSx7Y046Im1ldGEiLGI6LzxcP3htbC8sZTovXD8+LyxyOjEwfSx7YjovPFw/KHBocCk/LyxlOi9cPz4vLHNMOiJwaHAiLGM6W3tiOiIvXFwqIixlOiJcXCovIixza2lwOiEwfSx7YjonYiInLGU6JyInLHNraXA6ITB9LHtiOiJiJyIsZToiJyIsc2tpcDohMH0scy5pbmhlcml0KHMuQVNNLHtpOm51bGwsY046bnVsbCxjOm51bGwsc2tpcDohMH0pLHMuaW5oZXJpdChzLlFTTSx7aTpudWxsLGNOOm51bGwsYzpudWxsLHNraXA6ITB9KV19LHtjTjoidGFnIixiOiI8c3R5bGUoPz1cXHN8PnwkKSIsZToiPiIsazp7bmFtZToic3R5bGUifSxjOltlXSxzdGFydHM6e2U6Ijwvc3R5bGU+IixyRTohMCxzTDpbImNzcyIsInhtbCJdfX0se2NOOiJ0YWciLGI6IjxzY3JpcHQoPz1cXHN8PnwkKSIsZToiPiIsazp7bmFtZToic2NyaXB0In0sYzpbZV0sc3RhcnRzOntlOiI8XC9zY3JpcHQ+IixyRTohMCxzTDpbImFjdGlvbnNjcmlwdCIsImphdmFzY3JpcHQiLCJoYW5kbGViYXJzIiwieG1sIiwidmJzY3JpcHQiXX19LHtjTjoidGFnIixiOiI8Lz8iLGU6Ii8/PiIsYzpbe2NOOiJuYW1lIixiOi9bXlwvPjxcc10rLyxyOjB9LGVdfV19fSk7aGxqcy5yZWdpc3Rlckxhbmd1YWdlKCJtYXJrZG93biIsZnVuY3Rpb24oZSl7cmV0dXJue2FsaWFzZXM6WyJtZCIsIm1rZG93biIsIm1rZCJdLGM6W3tjTjoic2VjdGlvbiIsdjpbe2I6Il4jezEsNn0iLGU6IiQifSx7YjoiXi4rP1xcbls9LV17Mix9JCJ9XX0se2I6IjwiLGU6Ij4iLHNMOiJ4bWwiLHI6MH0se2NOOiJidWxsZXQiLGI6Il5cXHMqKFsqKy1dfChcXGQrXFwuKSlcXHMrIn0se2NOOiJzdHJvbmciLGI6IlsqX117Mn0uKz9bKl9dezJ9In0se2NOOiJlbXBoYXNpcyIsdjpbe2I6IlxcKi4rP1xcKiJ9LHtiOiJfLis/XyIscjowfV19LHtjTjoicXVvdGUiLGI6Il4+XFxzKyIsZToiJCJ9LHtjTjoiY29kZSIsdjpbe2I6Il5gYGB3KnMqJCIsZToiXmBgYHMqJCJ9LHtiOiJgLis/YCJ9LHtiOiJeKCB7NH18XHQpIixlOiIkIixyOjB9XX0se2I6Il5bLVxcKl17Myx9IixlOiIkIn0se2I6IlxcWy4rP1xcXVtcXChcXFtdLio/W1xcKVxcXV0iLHJCOiEwLGM6W3tjTjoic3RyaW5nIixiOiJcXFsiLGU6IlxcXSIsZUI6ITAsckU6ITAscjowfSx7Y046ImxpbmsiLGI6IlxcXVxcKCIsZToiXFwpIixlQjohMCxlRTohMH0se2NOOiJzeW1ib2wiLGI6IlxcXVxcWyIsZToiXFxdIixlQjohMCxlRTohMH1dLHI6MTB9LHtiOi9eXFtbXlxuXStcXTovLHJCOiEwLGM6W3tjTjoic3ltYm9sIixiOi9cWy8sZTovXF0vLGVCOiEwLGVFOiEwfSx7Y046ImxpbmsiLGI6LzpccyovLGU6LyQvLGVCOiEwfV19XX19KTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImRhcnQiLGZ1bmN0aW9uKGUpe3ZhciB0PXtjTjoic3Vic3QiLHY6W3tiOiJcXCRbQS1aYS16MC05X10rIn1dfSxyPXtjTjoic3Vic3QiLHY6W3tiOiJcXCR7IixlOiJ9In1dLGs6InRydWUgZmFsc2UgbnVsbCB0aGlzIGlzIG5ldyBzdXBlciJ9LG49e2NOOiJzdHJpbmciLHY6W3tiOiJyJycnIixlOiInJycifSx7YjonciIiIicsZTonIiIiJ30se2I6InInIixlOiInIixpOiJcXG4ifSx7YjonciInLGU6JyInLGk6IlxcbiJ9LHtiOiInJyciLGU6IicnJyIsYzpbZS5CRSx0LHJdfSx7YjonIiIiJyxlOiciIiInLGM6W2UuQkUsdCxyXX0se2I6IiciLGU6IiciLGk6IlxcbiIsYzpbZS5CRSx0LHJdfSx7YjonIicsZTonIicsaToiXFxuIixjOltlLkJFLHQscl19XX07ci5jPVtlLkNOTSxuXTtyZXR1cm57azp7a2V5d29yZDoiYXNzZXJ0IGFzeW5jIGF3YWl0IGJyZWFrIGNhc2UgY2F0Y2ggY2xhc3MgY29uc3QgY29udGludWUgZGVmYXVsdCBkbyBlbHNlIGVudW0gZXh0ZW5kcyBmYWxzZSBmaW5hbCBmaW5hbGx5IGZvciBpZiBpbiBpcyBuZXcgbnVsbCByZXRocm93IHJldHVybiBzdXBlciBzd2l0Y2ggc3luYyB0aGlzIHRocm93IHRydWUgdHJ5IHZhciB2b2lkIHdoaWxlIHdpdGggeWllbGQgYWJzdHJhY3QgYXMgZHluYW1pYyBleHBvcnQgZXh0ZXJuYWwgZmFjdG9yeSBnZXQgaW1wbGVtZW50cyBpbXBvcnQgbGlicmFyeSBvcGVyYXRvciBwYXJ0IHNldCBzdGF0aWMgdHlwZWRlZiIsYnVpbHRfaW46InByaW50IENvbXBhcmFibGUgRGF0ZVRpbWUgRHVyYXRpb24gRnVuY3Rpb24gSXRlcmFibGUgSXRlcmF0b3IgTGlzdCBNYXAgTWF0Y2ggTnVsbCBPYmplY3QgUGF0dGVybiBSZWdFeHAgU2V0IFN0b3B3YXRjaCBTdHJpbmcgU3RyaW5nQnVmZmVyIFN0cmluZ1NpbmsgU3ltYm9sIFR5cGUgVXJpIGJvb2wgZG91YmxlIGludCBudW0gZG9jdW1lbnQgd2luZG93IHF1ZXJ5U2VsZWN0b3IgcXVlcnlTZWxlY3RvckFsbCBFbGVtZW50IEVsZW1lbnRMaXN0In0sYzpbbixlLkMoIi9cXCpcXCoiLCJcXCovIix7c0w6Im1hcmtkb3duIn0pLGUuQygiLy8vIiwiJCIse3NMOiJtYXJrZG93biJ9KSxlLkNMQ00sZS5DQkNNLHtjTjoiY2xhc3MiLGJLOiJjbGFzcyBpbnRlcmZhY2UiLGU6InsiLGVFOiEwLGM6W3tiSzoiZXh0ZW5kcyBpbXBsZW1lbnRzIn0sZS5VVE1dfSxlLkNOTSx7Y046Im1ldGEiLGI6IkBbQS1aYS16XSsifSx7YjoiPT4ifV19fSk7';
 
 String decodeHighlightJs() => String.fromCharCodes(base64Decode(_highlightJs));
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
index eef5729..5b95cea 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
@@ -126,27 +126,27 @@
       } else if (defaultValue is NullLiteral) {
         return "an explicit default value of 'null'";
       }
-      return "a nullable default value";
+      return 'a nullable default value';
     }
 
     if (node is DefaultFormalParameter) {
       if (fixKind == NullabilityFixKind.addRequired) {
-        return "This parameter is non-nullable, so cannot have "
-            "${aNullableDefault(node)}";
+        return 'This parameter is non-nullable, so cannot have '
+            '${aNullableDefault(node)}';
       } else {
-        return "This parameter has ${aNullableDefault(node)}";
+        return 'This parameter has ${aNullableDefault(node)}';
       }
     } else if (node is FieldFormalParameter) {
       if (parent is DefaultFormalParameter) {
-        return "This field is initialized by an optional field formal "
-            "parameter that has ${aNullableDefault(parent)}";
+        return 'This field is initialized by an optional field formal '
+            'parameter that has ${aNullableDefault(parent)}';
       }
-      return "This field is initialized by a field formal parameter and a "
-          "nullable value is passed as an argument";
+      return 'This field is initialized by a field formal parameter and a '
+          'nullable value is passed as an argument';
     } else if (parent is DefaultFormalParameter) {
-      return "This parameter has ${aNullableDefault(parent)}";
+      return 'This parameter has ${aNullableDefault(parent)}';
     } else if (parent is AsExpression) {
-      return "The value of the expression is nullable";
+      return 'The value of the expression is nullable';
     }
 
     // Text indicating the type of nullable value found.
@@ -154,25 +154,25 @@
     if (node is NullLiteral) {
       nullableValue = "an explicit 'null'";
     } else if (origin.kind == EdgeOriginKind.dynamicAssignment) {
-      nullableValue = "a dynamic value, which is nullable";
+      nullableValue = 'a dynamic value, which is nullable';
     } else {
-      nullableValue = "a nullable value";
+      nullableValue = 'a nullable value';
     }
 
     if (origin.kind == EdgeOriginKind.listLengthConstructor) {
-      return "List value type must be nullable because a length is specified,"
-          " and the list items are initialized as null.";
+      return 'List value type must be nullable because a length is specified,'
+          ' and the list items are initialized as null.';
     }
 
     CompilationUnit unit = node.thisOrAncestorOfType<CompilationUnit>();
     int lineNumber = unit.lineInfo.getLocation(node.offset).lineNumber;
 
     if (origin.kind == EdgeOriginKind.uninitializedRead) {
-      return "Used on line $lineNumber, when it is possibly uninitialized";
+      return 'Used on line $lineNumber, when it is possibly uninitialized';
     }
 
     if (parent is ArgumentList) {
-      return capitalize("$nullableValue is passed as an argument");
+      return capitalize('$nullableValue is passed as an argument');
     }
 
     /// If the [node] is inside the return expression for a function body,
@@ -205,50 +205,50 @@
       AstNode function = functionBody.parent;
       if (function is MethodDeclaration) {
         if (function.isGetter) {
-          return "This getter returns $nullableValue on line $lineNumber";
+          return 'This getter returns $nullableValue on line $lineNumber';
         }
-        return "This method returns $nullableValue on line $lineNumber";
+        return 'This method returns $nullableValue on line $lineNumber';
       }
-      return "This function returns $nullableValue on line $lineNumber";
+      return 'This function returns $nullableValue on line $lineNumber';
     }
 
     TypedLiteral collectionLiteral = findCollectionLiteral();
     if (collectionLiteral != null) {
       if (collectionLiteral is ListLiteral) {
-        return "This list is initialized with $nullableValue on line "
-            "$lineNumber";
+        return 'This list is initialized with $nullableValue on line '
+            '$lineNumber';
       } else if (collectionLiteral is SetOrMapLiteral) {
         var mapOrSet = collectionLiteral.isMap ? 'map' : 'set';
-        return "This $mapOrSet is initialized with $nullableValue on line "
-            "$lineNumber";
+        return 'This $mapOrSet is initialized with $nullableValue on line '
+            '$lineNumber';
       }
     } else if (node is InvocationExpression &&
         origin.kind == EdgeOriginKind.namedParameterNotSupplied) {
-      return "This named parameter was omitted in a call to this function";
+      return 'This named parameter was omitted in a call to this function';
     } else if (parent is VariableDeclaration) {
       AstNode grandparent = parent.parent?.parent;
       if (grandparent is FieldDeclaration) {
-        return "This field is initialized to $nullableValue";
+        return 'This field is initialized to $nullableValue';
       }
-      return "This variable is initialized to $nullableValue";
+      return 'This variable is initialized to $nullableValue';
     } else if (node is ConstructorDeclaration &&
         origin.kind == EdgeOriginKind.fieldNotInitialized) {
       String constructorName =
           node.declaredElement.enclosingElement.displayName;
       if (node.declaredElement.displayName.isNotEmpty) {
         constructorName =
-            "$constructorName.${node.declaredElement.displayName}";
+            '$constructorName.${node.declaredElement.displayName}';
       }
       return "The constructor '$constructorName' does not initialize this "
-          "field in its initializer list";
+          'field in its initializer list';
     }
 
     String enclosingMemberDescription = buildEnclosingMemberDescription(node);
     if (enclosingMemberDescription != null) {
       return capitalize(
-          "$nullableValue is assigned in $enclosingMemberDescription");
+          '$nullableValue is assigned in $enclosingMemberDescription');
     } else {
-      return capitalize("$nullableValue is assigned");
+      return capitalize('$nullableValue is assigned');
     }
   }
 
@@ -259,7 +259,7 @@
     if (_inTestCode(origin.node)) {
       // TODO(brianwilkerson) Don't add this if the graph node with which the
       //  origin is associated is also in test code.
-      description += " in test code";
+      description += ' in test code';
     }
     return description;
   }
@@ -300,7 +300,7 @@
   String _buildInheritanceDescriptionForOrigin(
       EdgeOriginInfo origin, TypeAnnotation type) {
     if (origin.kind == EdgeOriginKind.parameterInheritance) {
-      String overriddenName = "the overridden method";
+      String overriddenName = 'the overridden method';
       if (type != null && type.parent is FormalParameter) {
         FormalParameter parameter = type.parent;
         if (parameter.parent is DefaultFormalParameter) {
@@ -312,17 +312,17 @@
           String methodName = method.name.name;
           ClassOrMixinDeclaration cls = method.parent;
           String className = cls.name.name;
-          overriddenName += ", $className.$methodName,";
+          overriddenName += ', $className.$methodName,';
         }
       }
-      return "The corresponding parameter in $overriddenName is nullable";
+      return 'The corresponding parameter in $overriddenName is nullable';
     } else {
-      return "An overridding method has a nullable return value";
+      return 'An overridding method has a nullable return value';
     }
   }
 
   /// Compute the details for the fix with the given [edit].
-  List<RegionDetail> _computeDetails(AtomicEditWithInfo edit) {
+  List<RegionDetail> _computeDetails(AtomicEdit edit) {
     List<RegionDetail> details = [];
     var fixInfo = edit.info;
     for (FixReasonInfo reason in fixInfo.fixReasons) {
@@ -408,6 +408,7 @@
       case NullabilityFixKind.discardCondition:
       case NullabilityFixKind.discardElse:
       case NullabilityFixKind.discardThen:
+      case NullabilityFixKind.removeAs:
         // There's no need for hints around code that is being removed.
         break;
       case NullabilityFixKind.makeTypeNullable:
@@ -484,13 +485,13 @@
     final parent = astNode.parent;
     if (parent is PropertyAccess && parent.target == astNode ||
         parent is PrefixedIdentifier && parent.prefix == astNode) {
-      return "This value must be null-checked before accessing its properties.";
+      return 'This value must be null-checked before accessing its properties.';
     }
     if (parent is MethodInvocation && parent.target == astNode) {
-      return "This value must be null-checked before calling its methods.";
+      return 'This value must be null-checked before calling its methods.';
     }
 
-    return "This value must be null-checked before use here.";
+    return 'This value must be null-checked before use here.';
   }
 
   /// Explain the type annotations that were not changed because they were
@@ -516,7 +517,7 @@
               RegionType.nonNullableType,
               mapper.map(node.offset),
               node.length,
-              "This type is not changed; it is determined to be non-nullable",
+              'This type is not changed; it is determined to be non-nullable',
               details));
         }
       }
@@ -553,12 +554,11 @@
         int end = offset + length;
         // Insert the replacement text without deleting the replaced text.
         content = content.replaceRange(end, end, replacement);
-        String explanation = edit is AtomicEditWithInfo
-            ? '${edit.info.description.appliedMessage}.'
-            : null;
-        List<EditDetail> edits = edit is AtomicEditWithInfo
-            ? _computeEdits(edit.info, sourceOffset)
-            : [];
+        var info = edit.info;
+        String explanation =
+            info != null ? '${info.description.appliedMessage}.' : null;
+        List<EditDetail> edits =
+            info != null ? _computeEdits(info, sourceOffset) : [];
         List<RegionDetail> details = _computeDetails(edit);
         if (length > 0) {
           if (explanation != null) {
@@ -679,39 +679,39 @@
     void describeFunction(AstNode node) {
       if (node is ConstructorDeclaration) {
         if (node.name == null) {
-          baseDescription = "the default constructor of";
-          functionName = "";
+          baseDescription = 'the default constructor of';
+          functionName = '';
         } else {
-          baseDescription = "the constructor";
+          baseDescription = 'the constructor';
           functionName = node.name.name;
         }
       } else if (node is MethodDeclaration) {
         functionName = node.name.name;
         if (node.isGetter) {
-          baseDescription = "the getter";
+          baseDescription = 'the getter';
         } else if (node.isOperator) {
-          baseDescription = "the operator";
+          baseDescription = 'the operator';
         } else if (node.isSetter) {
-          baseDescription = "the setter";
-          functionName += "=";
+          baseDescription = 'the setter';
+          functionName += '=';
         } else {
-          baseDescription = "the method";
+          baseDescription = 'the method';
         }
       } else if (node is FunctionDeclaration) {
         functionName = node.name.name;
         if (node.isGetter) {
-          baseDescription = "the getter";
+          baseDescription = 'the getter';
         } else if (node.isSetter) {
-          baseDescription = "the setter";
-          functionName += "=";
+          baseDescription = 'the setter';
+          functionName += '=';
         } else {
-          baseDescription = "the function";
+          baseDescription = 'the function';
         }
       } else if (node is FieldDeclaration) {
         var field = node.thisOrAncestorOfType<VariableDeclaration>();
         field ??= node.fields.variables[0];
         functionName = field.name.name;
-        baseDescription = "the field";
+        baseDescription = 'the field';
       } else {
         // Throwing here allows us to gather more information. Not throwing here
         // causes an NPE on line 709.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
index cf08cf6..018e384 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
@@ -80,11 +80,11 @@
     LineInfo lineInfo,
     Outline outline,
   ) {
-    final name = outline.element.name != null && outline.element.name != ""
+    final name = outline.element.name != null && outline.element.name != ''
         ? outline.element.name
         : (outline.element.kind == ElementKind.EXTENSION
-            ? "<unnamed extension>"
-            : "<unnamed>");
+            ? '<unnamed extension>'
+            : '<unnamed>');
     return DocumentSymbol(
       name,
       outline.element.parameters,
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 68f75be..40e2bae 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -427,7 +427,7 @@
                     suggestion.element.parameters.isNotEmpty
                 // Extract the type part from '(MyType value)`
                 ? suggestion.element.parameters.substring(
-                    1, suggestion.element.parameters.lastIndexOf(" "))
+                    1, suggestion.element.parameters.lastIndexOf(' '))
                 : '');
   } else if (hasParameters && hasReturnType) {
     return '$prefix${suggestion.element.parameters} → ${suggestion.element.returnType}';
@@ -468,7 +468,7 @@
                     declaration.parameters.isNotEmpty
                 // Extract the type part from '(MyType value)`
                 ? declaration.parameters
-                    .substring(1, declaration.parameters.lastIndexOf(" "))
+                    .substring(1, declaration.parameters.lastIndexOf(' '))
                 : '');
   } else if (hasParameters && hasReturnType) {
     return '$prefix${declaration.parameters} → ${declaration.returnType}';
@@ -898,13 +898,13 @@
         .toList();
     final params = [];
     if (req.isNotEmpty) {
-      params.add(req.map(getParamLabel).join(", "));
+      params.add(req.map(getParamLabel).join(', '));
     }
     if (opt.isNotEmpty) {
-      params.add("[" + opt.map(getParamLabel).join(", ") + "]");
+      params.add('[' + opt.map(getParamLabel).join(', ') + ']');
     }
     if (named.isNotEmpty) {
-      params.add("{" + named.map(getParamLabel).join(", ") + "}");
+      params.add('{' + named.map(getParamLabel).join(', ') + '}');
     }
     return '${resp.name}(${params.join(", ")})';
   }
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 1275476..def78bb 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -108,7 +108,7 @@
       List<String> allowed,
       Map<String, String> allowedHelp,
       String defaultsTo,
-      void callback(value)}) {
+      void Function(Object) callback}) {
     _knownFlags.add(name);
     _parser.addOption(name,
         abbr: abbr,
@@ -141,7 +141,7 @@
         while (i < count) {
           remainingArgs.add(args[i++]);
         }
-      } else if (arg.startsWith("-D")) {
+      } else if (arg.startsWith('-D')) {
         definedVariables[arg.substring(2)] = args[++i];
       } else {
         remainingArgs.add(arg);
@@ -208,34 +208,34 @@
   /**
    * The name of the application that is used to start a server.
    */
-  static const BINARY_NAME = "server";
+  static const BINARY_NAME = 'server';
 
   /**
    * The name of the option used to set the identifier for the client.
    */
-  static const String CLIENT_ID = "client-id";
+  static const String CLIENT_ID = 'client-id';
 
   /**
    * The name of the option used to set the version for the client.
    */
-  static const String CLIENT_VERSION = "client-version";
+  static const String CLIENT_VERSION = 'client-version';
 
   /**
    * The name of the option used to enable DartPad specific functionality.
    */
-  static const String DARTPAD_OPTION = "dartpad";
+  static const String DARTPAD_OPTION = 'dartpad';
 
   /**
    * The name of the option to disable the completion feature.
    */
   static const String DISABLE_SERVER_FEATURE_COMPLETION =
-      "disable-server-feature-completion";
+      'disable-server-feature-completion';
 
   /**
    * The name of the option to disable the search feature.
    */
   static const String DISABLE_SERVER_FEATURE_SEARCH =
-      "disable-server-feature-search";
+      'disable-server-feature-search';
 
   /**
    * The name of the option used to enable experiments.
@@ -245,39 +245,39 @@
   /**
    * The name of the option used to enable instrumentation.
    */
-  static const String ENABLE_INSTRUMENTATION_OPTION = "enable-instrumentation";
+  static const String ENABLE_INSTRUMENTATION_OPTION = 'enable-instrumentation';
 
   /**
    * The name of the option used to set the file read mode.
    */
-  static const String FILE_READ_MODE = "file-read-mode";
+  static const String FILE_READ_MODE = 'file-read-mode';
 
   /**
    * The name of the option used to print usage information.
    */
-  static const String HELP_OPTION = "help";
+  static const String HELP_OPTION = 'help';
 
   /**
    * The name of the flag used to configure reporting analytics.
    */
-  static const String ANALYTICS_FLAG = "analytics";
+  static const String ANALYTICS_FLAG = 'analytics';
 
   /**
    * Suppress analytics for this session.
    */
-  static const String SUPPRESS_ANALYTICS_FLAG = "suppress-analytics";
+  static const String SUPPRESS_ANALYTICS_FLAG = 'suppress-analytics';
 
   /**
    * The name of the option used to cause instrumentation to also be written to
    * a local file.
    */
-  static const String INSTRUMENTATION_LOG_FILE = "instrumentation-log-file";
+  static const String INSTRUMENTATION_LOG_FILE = 'instrumentation-log-file';
 
   /**
    * The name of the option used to specify if [print] should print to the
    * console instead of being intercepted.
    */
-  static const String INTERNAL_PRINT_TO_CONSOLE = "internal-print-to-console";
+  static const String INTERNAL_PRINT_TO_CONSOLE = 'internal-print-to-console';
 
   /**
    * The name of the option used to describe the new analysis driver logger.
@@ -288,50 +288,50 @@
    * The name of the flag used to enable version 2 of semantic highlight
    * notification.
    */
-  static const String USE_ANALYSIS_HIGHLIGHT2 = "useAnalysisHighlight2";
+  static const String USE_ANALYSIS_HIGHLIGHT2 = 'useAnalysisHighlight2';
 
   /**
    * The option for specifying the http diagnostic port.
    * If specified, users can review server status and performance information
    * by opening a web browser on http://localhost:<port>
    */
-  static const String PORT_OPTION = "port";
+  static const String PORT_OPTION = 'port';
 
   /**
    * The path to the SDK.
    */
-  static const String SDK_OPTION = "sdk";
+  static const String SDK_OPTION = 'sdk';
 
   /**
    * The path to the data cache.
    */
-  static const String CACHE_FOLDER = "cache";
+  static const String CACHE_FOLDER = 'cache';
 
   /**
    * Whether to enable parsing via the Fasta parser.
    */
-  static const String USE_FASTA_PARSER = "use-fasta-parser";
+  static const String USE_FASTA_PARSER = 'use-fasta-parser';
 
   /**
    * The name of the flag to use the Language Server Protocol (LSP).
    */
-  static const String USE_LSP = "lsp";
+  static const String USE_LSP = 'lsp';
 
   /**
    * Whether or not to enable ML ranking for code completion.
    */
-  static const String ENABLE_COMPLETION_MODEL = "enable-completion-model";
+  static const String ENABLE_COMPLETION_MODEL = 'enable-completion-model';
 
   /**
    * The path on disk to a directory containing language model files for smart
    * code completion.
    */
-  static const String COMPLETION_MODEL_FOLDER = "completion-model";
+  static const String COMPLETION_MODEL_FOLDER = 'completion-model';
 
   /**
    * A directory to analyze in order to train an analysis server snapshot.
    */
-  static const String TRAIN_USING = "train-using";
+  static const String TRAIN_USING = 'train-using';
 
   /**
    * The instrumentation service that is to be used by the analysis server.
@@ -727,8 +727,8 @@
   CommandLineParser _createArgParser() {
     CommandLineParser parser = CommandLineParser();
     parser.addOption(CLIENT_ID,
-        help: "an identifier used to identify the client");
-    parser.addOption(CLIENT_VERSION, help: "the version of the client");
+        help: 'an identifier used to identify the client');
+    parser.addOption(CLIENT_VERSION, help: 'the version of the client');
     parser.addFlag(DARTPAD_OPTION,
         help: 'enable DartPad specific functionality',
         defaultsTo: false,
@@ -743,18 +743,18 @@
         hide: true,
         splitCommas: true);
     parser.addFlag(ENABLE_INSTRUMENTATION_OPTION,
-        help: "enable sending instrumentation information to a server",
+        help: 'enable sending instrumentation information to a server',
         defaultsTo: false,
         negatable: false);
     parser.addFlag(HELP_OPTION,
-        help: "print this help message without starting a server",
+        help: 'print this help message without starting a server',
         abbr: 'h',
         defaultsTo: false,
         negatable: false);
     parser.addOption(INSTRUMENTATION_LOG_FILE,
-        help: "write instrumentation data to the given file");
+        help: 'write instrumentation data to the given file');
     parser.addFlag(INTERNAL_PRINT_TO_CONSOLE,
-        help: "enable sending `print` output to the console",
+        help: 'enable sending `print` output to the console',
         defaultsTo: false,
         negatable: false);
     parser.addOption(NEW_ANALYSIS_DRIVER_LOG,
@@ -767,40 +767,40 @@
         help: 'suppress analytics for this session',
         hide: !telemetry.SHOW_ANALYTICS_UI);
     parser.addOption(PORT_OPTION,
-        help: "the http diagnostic port on which the server provides"
-            " status and performance information");
-    parser.addOption(SDK_OPTION, help: "[path] the path to the sdk");
+        help: 'the http diagnostic port on which the server provides'
+            ' status and performance information');
+    parser.addOption(SDK_OPTION, help: '[path] the path to the sdk');
     parser.addFlag(USE_ANALYSIS_HIGHLIGHT2,
-        help: "enable version 2 of semantic highlight",
+        help: 'enable version 2 of semantic highlight',
         defaultsTo: false,
         negatable: false);
     parser.addOption(FILE_READ_MODE,
-        help: "an option for reading files (some clients normalize eol "
-            "characters, which make the file offset and range information "
-            "incorrect)",
-        allowed: ["as-is", "normalize-eol-always"],
+        help: 'an option for reading files (some clients normalize eol '
+            'characters, which make the file offset and range information '
+            'incorrect)',
+        allowed: ['as-is', 'normalize-eol-always'],
         allowedHelp: {
-          "as-is": "file contents are read as-is",
-          "normalize-eol-always":
+          'as-is': 'file contents are read as-is',
+          'normalize-eol-always':
               r"eol characters normalized to the single character new line ('\n')"
         },
-        defaultsTo: "as-is");
+        defaultsTo: 'as-is');
     parser.addOption(CACHE_FOLDER,
-        help: "[path] path to the location where to cache data");
-    parser.addFlag("preview-dart-2",
-        help: "Enable the Dart 2.0 preview (deprecated)", hide: true);
+        help: '[path] path to the location where to cache data');
+    parser.addFlag('preview-dart-2',
+        help: 'Enable the Dart 2.0 preview (deprecated)', hide: true);
     parser.addFlag(USE_FASTA_PARSER,
         defaultsTo: true,
-        help: "Whether to enable parsing via the Fasta parser");
+        help: 'Whether to enable parsing via the Fasta parser');
     parser.addFlag(USE_LSP,
-        defaultsTo: false, help: "Whether to use the Language Server Protocol");
+        defaultsTo: false, help: 'Whether to use the Language Server Protocol');
     parser.addFlag(ENABLE_COMPLETION_MODEL,
-        help: "Whether or not to turn on ML ranking for code completion");
+        help: 'Whether or not to turn on ML ranking for code completion');
     parser.addOption(COMPLETION_MODEL_FOLDER,
-        help: "[path] path to the location of a code completion model");
+        help: '[path] path to the location of a code completion model');
     parser.addOption(TRAIN_USING,
-        help: "Pass in a directory to analyze for purposes of training an "
-            "analysis server snapshot.");
+        help: 'Pass in a directory to analyze for purposes of training an '
+            'analysis server snapshot.');
 
     return parser;
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index 184da5f..140c6b3 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -26,45 +26,45 @@
   static const NO_TEMPLATE = PostfixCompletionKind('', 'no change', null, null);
 
   static const List<PostfixCompletionKind> ALL_TEMPLATES = [
-    PostfixCompletionKind("assert", "expr.assert -> assert(expr);",
+    PostfixCompletionKind('assert', 'expr.assert -> assert(expr);',
         isAssertContext, expandAssert),
     PostfixCompletionKind(
-        "fori",
-        "limit.fori -> for(var i = 0; i < limit; i++) {}",
+        'fori',
+        'limit.fori -> for(var i = 0; i < limit; i++) {}',
         isIntContext,
         expandFori),
-    PostfixCompletionKind("for", "values.for -> for(var value in values) {}",
+    PostfixCompletionKind('for', 'values.for -> for(var value in values) {}',
         isIterableContext, expandFor),
-    PostfixCompletionKind("iter", "values.iter -> for(var value in values) {}",
+    PostfixCompletionKind('iter', 'values.iter -> for(var value in values) {}',
         isIterableContext, expandFor),
     PostfixCompletionKind(
-        "not", "bool.not -> !bool", isBoolContext, expandNegate),
-    PostfixCompletionKind("!", "bool! -> !bool", isBoolContext, expandNegate),
+        'not', 'bool.not -> !bool', isBoolContext, expandNegate),
+    PostfixCompletionKind('!', 'bool! -> !bool', isBoolContext, expandNegate),
     PostfixCompletionKind(
-        "else", "bool.else -> if (!bool) {}", isBoolContext, expandElse),
+        'else', 'bool.else -> if (!bool) {}', isBoolContext, expandElse),
     PostfixCompletionKind(
-        "if", "bool.if -> if (bool) {}", isBoolContext, expandIf),
-    PostfixCompletionKind("nn", "expr.nn -> if (expr != null) {}",
+        'if', 'bool.if -> if (bool) {}', isBoolContext, expandIf),
+    PostfixCompletionKind('nn', 'expr.nn -> if (expr != null) {}',
         isObjectContext, expandNotNull),
-    PostfixCompletionKind("notnull", "expr.notnull -> if (expr != null) {}",
+    PostfixCompletionKind('notnull', 'expr.notnull -> if (expr != null) {}',
         isObjectContext, expandNotNull),
-    PostfixCompletionKind("null", "expr.null -> if (expr == null) {}",
+    PostfixCompletionKind('null', 'expr.null -> if (expr == null) {}',
         isObjectContext, expandNull),
     PostfixCompletionKind(
-        "par", "expr.par -> (expr)", isObjectContext, expandParen),
+        'par', 'expr.par -> (expr)', isObjectContext, expandParen),
     PostfixCompletionKind(
-        "return", "expr.return -> return expr", isObjectContext, expandReturn),
-    PostfixCompletionKind("switch", "expr.switch -> switch (expr) {}",
+        'return', 'expr.return -> return expr', isObjectContext, expandReturn),
+    PostfixCompletionKind('switch', 'expr.switch -> switch (expr) {}',
         isSwitchContext, expandSwitch),
-    PostfixCompletionKind("try", "stmt.try -> try {stmt} catch (e,s) {}",
+    PostfixCompletionKind('try', 'stmt.try -> try {stmt} catch (e,s) {}',
         isStatementContext, expandTry),
     PostfixCompletionKind(
-        "tryon",
-        "stmt.try -> try {stmt} on Exception catch (e,s) {}",
+        'tryon',
+        'stmt.try -> try {stmt} on Exception catch (e,s) {}',
         isStatementContext,
         expandTryon),
     PostfixCompletionKind(
-        "while", "expr.while -> while (expr) {}", isBoolContext, expandWhile),
+        'while', 'expr.while -> while (expr) {}', isBoolContext, expandWhile),
   ];
 
   static Future<PostfixCompletion> expandAssert(
@@ -72,7 +72,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findAssertExpression, (expr) {
-      return "assert(${processor.utils.getNodeText(expr)});";
+      return 'assert(${processor.utils.getNodeText(expr)});';
     }, withBraces: false);
   }
 
@@ -81,7 +81,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findBoolExpression,
-        (expr) => "if (${processor.makeNegatedBoolExpr(expr)})");
+        (expr) => 'if (${processor.makeNegatedBoolExpr(expr)})');
   }
 
   static Future<PostfixCompletion> expandFor(
@@ -89,8 +89,8 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findIterableExpression, (expr) {
-      String value = processor.newVariable("value");
-      return "for (var $value in ${processor.utils.getNodeText(expr)})";
+      String value = processor.newVariable('value');
+      return 'for (var $value in ${processor.utils.getNodeText(expr)})';
     });
   }
 
@@ -99,8 +99,8 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findIntExpression, (expr) {
-      String index = processor.newVariable("i");
-      return "for (int $index = 0; $index < ${processor.utils.getNodeText(expr)}; $index++)";
+      String index = processor.newVariable('i');
+      return 'for (int $index = 0; $index < ${processor.utils.getNodeText(expr)}; $index++)';
     });
   }
 
@@ -109,7 +109,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findBoolExpression,
-        (expr) => "if (${processor.utils.getNodeText(expr)})");
+        (expr) => 'if (${processor.utils.getNodeText(expr)})');
   }
 
   static Future<PostfixCompletion> expandNegate(
@@ -127,8 +127,8 @@
     await null;
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
-          ? "if (false)"
-          : "if (${processor.utils.getNodeText(expr)} != null)";
+          ? 'if (false)'
+          : 'if (${processor.utils.getNodeText(expr)} != null)';
     });
   }
 
@@ -138,8 +138,8 @@
     await null;
     return processor.expand(kind, processor.findObjectExpression, (expr) {
       return expr is NullLiteral
-          ? "if (true)"
-          : "if (${processor.utils.getNodeText(expr)} == null)";
+          ? 'if (true)'
+          : 'if (${processor.utils.getNodeText(expr)} == null)';
     });
   }
 
@@ -148,7 +148,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findObjectExpression,
-        (expr) => "(${processor.utils.getNodeText(expr)})",
+        (expr) => '(${processor.utils.getNodeText(expr)})',
         withBraces: false);
   }
 
@@ -157,7 +157,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findObjectExpression,
-        (expr) => "return ${processor.utils.getNodeText(expr)};",
+        (expr) => 'return ${processor.utils.getNodeText(expr)};',
         withBraces: false);
   }
 
@@ -166,7 +166,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findObjectExpression,
-        (expr) => "switch (${processor.utils.getNodeText(expr)})");
+        (expr) => 'switch (${processor.utils.getNodeText(expr)})');
   }
 
   static Future<PostfixCompletion> expandTry(
@@ -188,7 +188,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return processor.expand(kind, processor.findBoolExpression,
-        (expr) => "while (${processor.utils.getNodeText(expr)})");
+        (expr) => 'while (${processor.utils.getNodeText(expr)})');
   }
 
   static PostfixCompletionKind forKey(String key) =>
@@ -285,7 +285,7 @@
  */
 class PostfixCompletionProcessor {
   static final NO_COMPLETION = PostfixCompletion(
-      DartPostfixCompletion.NO_TEMPLATE, SourceChange("", edits: []));
+      DartPostfixCompletion.NO_TEMPLATE, SourceChange('', edits: []));
 
   final PostfixCompletionContext completionContext;
   final CorrectionUtils utils;
@@ -344,7 +344,7 @@
         }
         builder.write(newSrc);
         if (withBraces) {
-          builder.write(" {");
+          builder.write(' {');
           builder.write(eol);
           String indent = utils.getNodePrefix(expr);
           builder.write(indent);
@@ -352,7 +352,7 @@
           builder.selectHere();
           builder.write(eol);
           builder.write(indent);
-          builder.write("}");
+          builder.write('}');
         } else {
           builder.selectHere();
         }
@@ -388,8 +388,8 @@
         builder.write(indent);
         builder.write('try {');
         builder.write(eol);
-        builder.write(src.replaceAll(RegExp("^$indent", multiLine: true),
-            "$indent${utils.getIndent(1)}"));
+        builder.write(src.replaceAll(RegExp('^$indent', multiLine: true),
+            '$indent${utils.getIndent(1)}'));
         builder.selectHere();
         builder.write(indent);
         builder.write('}');
@@ -404,7 +404,7 @@
         builder.write('print(s);');
         builder.write(eol);
         builder.write(indent);
-        builder.write("}");
+        builder.write('}');
         builder.write(eol);
       });
     });
@@ -486,7 +486,7 @@
     if (newSrc != originalSrc) {
       return newSrc;
     } else {
-      return "!${utils.getNodeText(expr)}";
+      return '!${utils.getNodeText(expr)}';
     }
   }
 
@@ -508,7 +508,7 @@
     Set<String> vars =
         utils.findPossibleLocalVariableConflicts(selectionOffset);
     while (vars.contains(name)) {
-      name = "$base${i++}";
+      name = '$base${i++}';
     }
     return name;
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index 4199bc8..1be2f37 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -29,31 +29,31 @@
   static const NO_COMPLETION =
       StatementCompletionKind('No_COMPLETION', 'No completion available');
   static const SIMPLE_ENTER = StatementCompletionKind(
-      'SIMPLE_ENTER', "Insert a newline at the end of the current line");
+      'SIMPLE_ENTER', 'Insert a newline at the end of the current line');
   static const SIMPLE_SEMICOLON = StatementCompletionKind(
-      'SIMPLE_SEMICOLON', "Add a semicolon and newline");
+      'SIMPLE_SEMICOLON', 'Add a semicolon and newline');
   static const COMPLETE_CLASS_DECLARATION = StatementCompletionKind(
-      'COMPLETE_CLASS_DECLARATION', "Complete class declaration");
+      'COMPLETE_CLASS_DECLARATION', 'Complete class declaration');
   static const COMPLETE_CONTROL_FLOW_BLOCK = StatementCompletionKind(
-      'COMPLETE_CONTROL_FLOW_BLOCK', "Complete control flow block");
+      'COMPLETE_CONTROL_FLOW_BLOCK', 'Complete control flow block');
   static const COMPLETE_DO_STMT =
-      StatementCompletionKind('COMPLETE_DO_STMT', "Complete do-statement");
+      StatementCompletionKind('COMPLETE_DO_STMT', 'Complete do-statement');
   static const COMPLETE_IF_STMT =
-      StatementCompletionKind('COMPLETE_IF_STMT', "Complete if-statement");
+      StatementCompletionKind('COMPLETE_IF_STMT', 'Complete if-statement');
   static const COMPLETE_FOR_STMT =
-      StatementCompletionKind('COMPLETE_FOR_STMT', "Complete for-statement");
+      StatementCompletionKind('COMPLETE_FOR_STMT', 'Complete for-statement');
   static const COMPLETE_FOR_EACH_STMT = StatementCompletionKind(
-      'COMPLETE_FOR_EACH_STMT', "Complete for-each-statement");
+      'COMPLETE_FOR_EACH_STMT', 'Complete for-each-statement');
   static const COMPLETE_FUNCTION_DECLARATION = StatementCompletionKind(
-      'COMPLETE_FUNCTION_DECLARATION', "Complete function declaration");
+      'COMPLETE_FUNCTION_DECLARATION', 'Complete function declaration');
   static const COMPLETE_SWITCH_STMT = StatementCompletionKind(
-      'COMPLETE_SWITCH_STMT', "Complete switch-statement");
+      'COMPLETE_SWITCH_STMT', 'Complete switch-statement');
   static const COMPLETE_TRY_STMT =
-      StatementCompletionKind('COMPLETE_TRY_STMT', "Complete try-statement");
+      StatementCompletionKind('COMPLETE_TRY_STMT', 'Complete try-statement');
   static const COMPLETE_VARIABLE_DECLARATION = StatementCompletionKind(
-      'COMPLETE_VARIABLE_DECLARATION', "Complete variable declaration");
+      'COMPLETE_VARIABLE_DECLARATION', 'Complete variable declaration');
   static const COMPLETE_WHILE_STMT = StatementCompletionKind(
-      'COMPLETE_WHILE_STMT', "Complete while-statement");
+      'COMPLETE_WHILE_STMT', 'Complete while-statement');
 }
 
 /**
@@ -122,7 +122,7 @@
  */
 class StatementCompletionProcessor {
   static final NO_COMPLETION = StatementCompletion(
-      DartStatementCompletion.NO_COMPLETION, SourceChange("", edits: []));
+      DartStatementCompletion.NO_COMPLETION, SourceChange('', edits: []));
 
   final StatementCompletionContext statementContext;
   final CorrectionUtils utils;
@@ -441,7 +441,7 @@
     // an exception further downstream.
     // TODO(danrubel): change `statement.whileKeyword?.lexeme == "while"`
     // to `statement.whileKeyword != null` once the fasta parser is the default.
-    bool hasWhileKeyword = statement.whileKeyword?.lexeme == "while" &&
+    bool hasWhileKeyword = statement.whileKeyword?.lexeme == 'while' &&
         !statement.whileKeyword.isSynthetic;
     int exitDelta = 0;
     if (!_statementHasValidBody(statement.doKeyword, statement.body)) {
@@ -502,9 +502,9 @@
         }
       }
     } else {
-      sb.append(" while (");
+      sb.append(' while (');
       sb.setExitOffset();
-      sb.append(");");
+      sb.append(');');
     }
     _insertBuilder(sb);
     if (exitDelta != 0) {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 94662dd..e8f4bf4 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -34,77 +34,77 @@
   static const ADD_DIAGNOSTIC_PROPERTY_REFERENCE = AssistKind(
       'ADD_DIAGNOSTIC_PROPERTY_REFERENCE',
       30,
-      "Add a debug reference to this property");
+      'Add a debug reference to this property');
   static const ADD_NOT_NULL_ASSERT = AssistKind(
-      'dart.assist.addNotNullAssert', 30, "Add a not-null assertion");
+      'dart.assist.addNotNullAssert', 30, 'Add a not-null assertion');
   static const ADD_RETURN_TYPE =
-      AssistKind('dart.assist.addReturnType', 30, "Add return type");
+      AssistKind('dart.assist.addReturnType', 30, 'Add return type');
   static const ADD_TYPE_ANNOTATION =
-      AssistKind('dart.assist.addTypeAnnotation', 30, "Add type annotation");
+      AssistKind('dart.assist.addTypeAnnotation', 30, 'Add type annotation');
   static const ASSIGN_TO_LOCAL_VARIABLE = AssistKind(
-      'dart.assist.assignToVariable', 30, "Assign value to new local variable");
+      'dart.assist.assignToVariable', 30, 'Assign value to new local variable');
   static const CONVERT_CLASS_TO_MIXIN = AssistKind(
-      'dart.assist.convert.classToMixin', 30, "Convert class to a mixin");
+      'dart.assist.convert.classToMixin', 30, 'Convert class to a mixin');
   static const CONVERT_DOCUMENTATION_INTO_BLOCK = AssistKind(
       'dart.assist.convert.blockComment',
       30,
-      "Convert to block documentation comment");
+      'Convert to block documentation comment');
   static const CONVERT_DOCUMENTATION_INTO_LINE = AssistKind(
       'dart.assist.convert.lineComment',
       30,
-      "Convert to line documentation comment");
+      'Convert to line documentation comment');
   static const CONVERT_INTO_ASYNC_BODY = AssistKind(
-      'dart.assist.convert.bodyToAsync', 29, "Convert to async function body");
+      'dart.assist.convert.bodyToAsync', 29, 'Convert to async function body');
   static const CONVERT_INTO_BLOCK_BODY = AssistKind(
-      'dart.assist.convert.bodyToBlock', 30, "Convert to block body");
+      'dart.assist.convert.bodyToBlock', 30, 'Convert to block body');
   static const CONVERT_INTO_EXPRESSION_BODY = AssistKind(
-      'dart.assist.convert.bodyToExpression', 30, "Convert to expression body");
+      'dart.assist.convert.bodyToExpression', 30, 'Convert to expression body');
   static const CONVERT_INTO_FINAL_FIELD = AssistKind(
-      'dart.assist.convert.getterToFinalField', 30, "Convert to final field");
+      'dart.assist.convert.getterToFinalField', 30, 'Convert to final field');
   static const CONVERT_INTO_FOR_INDEX = AssistKind(
-      'dart.assist.convert.forEachToForIndex', 30, "Convert to for-index loop");
+      'dart.assist.convert.forEachToForIndex', 30, 'Convert to for-index loop');
   static const CONVERT_INTO_GENERIC_FUNCTION_SYNTAX = AssistKind(
       'dart.assist.convert.toGenericFunctionSyntax',
       30,
       "Convert into 'Function' syntax");
   static const CONVERT_INTO_GETTER = AssistKind(
-      'dart.assist.convert.finalFieldToGetter', 30, "Convert to getter");
+      'dart.assist.convert.finalFieldToGetter', 30, 'Convert to getter');
   static const CONVERT_INTO_IS_NOT =
-      AssistKind('dart.assist.convert.isNot', 30, "Convert to is!");
+      AssistKind('dart.assist.convert.isNot', 30, 'Convert to is!');
   static const CONVERT_INTO_IS_NOT_EMPTY = AssistKind(
       'dart.assist.convert.isNotEmpty', 30, "Convert to 'isNotEmpty'",
       // todo (pq): unify w/ fix
       associatedErrorCodes: <String>['prefer_is_not_empty']);
   static const CONVERT_PART_OF_TO_URI = AssistKind(
-      'dart.assist.convert.partOfToPartUri', 30, "Convert to use a URI");
+      'dart.assist.convert.partOfToPartUri', 30, 'Convert to use a URI');
   static const CONVERT_TO_DOUBLE_QUOTED_STRING = AssistKind(
       'dart.assist.convert.toDoubleQuotedString',
       30,
-      "Convert to double quoted string");
+      'Convert to double quoted string');
   static const CONVERT_TO_FIELD_PARAMETER = AssistKind(
       'dart.assist.convert.toConstructorFieldParameter',
       30,
-      "Convert to field formal parameter");
+      'Convert to field formal parameter');
   static const CONVERT_TO_FOR_ELEMENT = AssistKind(
       'dart.assist.convertToForElement', 30, "Convert to a 'for' element");
   static const CONVERT_TO_IF_ELEMENT = AssistKind(
       'dart.assist.convertToIfElement', 30, "Convert to an 'if' element");
   static const CONVERT_TO_INT_LITERAL = AssistKind(
-      'dart.assist.convert.toIntLiteral', 30, "Convert to an int literal");
+      'dart.assist.convert.toIntLiteral', 30, 'Convert to an int literal');
   static const CONVERT_TO_LIST_LITERAL = AssistKind(
-      'dart.assist.convert.toListLiteral', 30, "Convert to list literal",
+      'dart.assist.convert.toListLiteral', 30, 'Convert to list literal',
       associatedErrorCodes: <String>['prefer_collection_literals']);
   static const CONVERT_TO_MAP_LITERAL = AssistKind(
-      'dart.assist.convert.toMapLiteral', 30, "Convert to map literal",
+      'dart.assist.convert.toMapLiteral', 30, 'Convert to map literal',
       associatedErrorCodes: <String>['prefer_collection_literals']);
   static const CONVERT_TO_MULTILINE_STRING = AssistKind(
       'dart.assist.convert.toMultilineString',
       30,
-      "Convert to multiline string");
+      'Convert to multiline string');
   static const CONVERT_TO_NORMAL_PARAMETER = AssistKind(
       'dart.assist.convert.toConstructorNormalParameter',
       30,
-      "Convert to normal parameter");
+      'Convert to normal parameter');
   static const CONVERT_TO_NULL_AWARE =
       AssistKind('dart.assist.convert.toNullAware', 30, "Convert to use '?.'");
   static const CONVERT_TO_PACKAGE_IMPORT = AssistKind(
@@ -112,59 +112,59 @@
       30,
       "Convert to 'package:' import");
   static const CONVERT_TO_SET_LITERAL = AssistKind(
-      'dart.assist.convert.toSetLiteral', 30, "Convert to set literal",
+      'dart.assist.convert.toSetLiteral', 30, 'Convert to set literal',
       associatedErrorCodes: <String>['prefer_collection_literals']);
   static const CONVERT_TO_SINGLE_QUOTED_STRING = AssistKind(
       'dart.assist.convert.toSingleQuotedString',
       30,
-      "Convert to single quoted string");
+      'Convert to single quoted string');
   static const CONVERT_TO_SPREAD =
-      AssistKind('dart.assist.convertToSpread', 30, "Convert to a spread");
+      AssistKind('dart.assist.convertToSpread', 30, 'Convert to a spread');
   static const ENCAPSULATE_FIELD =
-      AssistKind('dart.assist.encapsulateField', 30, "Encapsulate field");
+      AssistKind('dart.assist.encapsulateField', 30, 'Encapsulate field');
   static const EXCHANGE_OPERANDS =
-      AssistKind('dart.assist.exchangeOperands', 30, "Exchange operands");
+      AssistKind('dart.assist.exchangeOperands', 30, 'Exchange operands');
 
   // Flutter assists
   static const FLUTTER_CONVERT_TO_CHILDREN = AssistKind(
       'dart.assist.flutter.convert.childToChildren',
       30,
-      "Convert to children:");
+      'Convert to children:');
   static const FLUTTER_CONVERT_TO_STATEFUL_WIDGET = AssistKind(
       'dart.assist.flutter.convert.toStatefulWidget',
       30,
-      "Convert to StatefulWidget");
+      'Convert to StatefulWidget');
 
   // Flutter wrap specific assists
   static const FLUTTER_WRAP_GENERIC =
-      AssistKind('dart.assist.flutter.wrap.generic', 31, "Wrap with widget...");
+      AssistKind('dart.assist.flutter.wrap.generic', 31, 'Wrap with widget...');
 
   static const FLUTTER_WRAP_CENTER =
-      AssistKind('dart.assist.flutter.wrap.center', 32, "Wrap with Center");
+      AssistKind('dart.assist.flutter.wrap.center', 32, 'Wrap with Center');
   static const FLUTTER_WRAP_COLUMN =
-      AssistKind('dart.assist.flutter.wrap.column', 32, "Wrap with Column");
+      AssistKind('dart.assist.flutter.wrap.column', 32, 'Wrap with Column');
   static const FLUTTER_WRAP_CONTAINER = AssistKind(
-      'dart.assist.flutter.wrap.container', 32, "Wrap with Container");
+      'dart.assist.flutter.wrap.container', 32, 'Wrap with Container');
   static const FLUTTER_WRAP_PADDING =
-      AssistKind('dart.assist.flutter.wrap.padding', 32, "Wrap with Padding");
+      AssistKind('dart.assist.flutter.wrap.padding', 32, 'Wrap with Padding');
   static const FLUTTER_WRAP_ROW =
-      AssistKind('dart.assist.flutter.wrap.row', 32, "Wrap with Row");
+      AssistKind('dart.assist.flutter.wrap.row', 32, 'Wrap with Row');
   static const FLUTTER_WRAP_STREAM_BUILDER = AssistKind(
-      'dart.assist.flutter.wrap.streamBuilder', 32, "Wrap with StreamBuilder");
+      'dart.assist.flutter.wrap.streamBuilder', 32, 'Wrap with StreamBuilder');
 
   // Flutter re-order assists
   static const FLUTTER_SWAP_WITH_CHILD =
-      AssistKind('dart.assist.flutter.swap.withChild', 33, "Swap with child");
+      AssistKind('dart.assist.flutter.swap.withChild', 33, 'Swap with child');
   static const FLUTTER_SWAP_WITH_PARENT =
-      AssistKind('dart.assist.flutter.swap.withParent', 33, "Swap with parent");
+      AssistKind('dart.assist.flutter.swap.withParent', 33, 'Swap with parent');
   static const FLUTTER_MOVE_DOWN =
-      AssistKind('dart.assist.flutter.move.down', 34, "Move widget down");
+      AssistKind('dart.assist.flutter.move.down', 34, 'Move widget down');
   static const FLUTTER_MOVE_UP =
-      AssistKind('dart.assist.flutter.move.up', 34, "Move widget up");
+      AssistKind('dart.assist.flutter.move.up', 34, 'Move widget up');
 
   // Flutter remove assist
   static const FLUTTER_REMOVE_WIDGET =
-      AssistKind('dart.assist.flutter.removeWidget', 35, "Remove this widget");
+      AssistKind('dart.assist.flutter.removeWidget', 35, 'Remove this widget');
 
   static const IMPORT_ADD_SHOW = AssistKind(
       'dart.assist.addShowCombinator', 30, "Add explicit 'show' combinator");
@@ -173,7 +173,7 @@
   static const INTRODUCE_LOCAL_CAST_TYPE = AssistKind(
       'dart.assist.introduceLocalCast',
       30,
-      "Introduce new local with tested type");
+      'Introduce new local with tested type');
   static const INVERT_IF_STATEMENT =
       AssistKind('dart.assist.invertIf', 30, "Invert 'if' statement");
   static const JOIN_IF_WITH_INNER = AssistKind('dart.assist.joinWithInnerIf',
@@ -181,12 +181,12 @@
   static const JOIN_IF_WITH_OUTER = AssistKind('dart.assist.joinWithOuterIf',
       30, "Join 'if' statement with outer 'if' statement");
   static const JOIN_VARIABLE_DECLARATION = AssistKind(
-      'dart.assist.joinVariableDeclaration', 30, "Join variable declaration");
+      'dart.assist.joinVariableDeclaration', 30, 'Join variable declaration');
   static const REMOVE_TYPE_ANNOTATION = AssistKind(
       // todo (pq): unify w/ fix
       'dart.assist.removeTypeAnnotation',
       29,
-      "Remove type annotation");
+      'Remove type annotation');
   static const REPLACE_CONDITIONAL_WITH_IF_ELSE = AssistKind(
       'dart.assist.convert.conditionalToIfElse',
       30,
@@ -202,13 +202,13 @@
   static const SORT_CHILD_PROPERTY_LAST = AssistKind(
       'dart.assist.sort.child.properties.last',
       30,
-      "Move child property to end of arguments");
+      'Move child property to end of arguments');
   static const SPLIT_AND_CONDITION =
-      AssistKind('dart.assist.splitIfConjunction', 30, "Split && condition");
+      AssistKind('dart.assist.splitIfConjunction', 30, 'Split && condition');
   static const SPLIT_VARIABLE_DECLARATION = AssistKind(
-      'dart.assist.splitVariableDeclaration', 30, "Split variable declaration");
+      'dart.assist.splitVariableDeclaration', 30, 'Split variable declaration');
   static const SURROUND_WITH_BLOCK =
-      AssistKind('dart.assist.surround.block', 22, "Surround with block");
+      AssistKind('dart.assist.surround.block', 22, 'Surround with block');
   static const SURROUND_WITH_DO_WHILE = AssistKind(
       'dart.assist.surround.doWhile', 27, "Surround with 'do-while'");
   static const SURROUND_WITH_FOR =
@@ -226,5 +226,5 @@
   static const SURROUND_WITH_WHILE =
       AssistKind('dart.assist.surround.while', 24, "Surround with 'while'");
   static const USE_CURLY_BRACES =
-      AssistKind('USE_CURLY_BRACES', 30, "Use curly braces");
+      AssistKind('USE_CURLY_BRACES', 30, 'Use curly braces');
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index e379cc2..25823b5 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -1779,7 +1779,7 @@
         builder.writeln('builder: (context, snapshot) {');
 
         widgetSrc = widgetSrc.replaceAll(
-          RegExp("^$indentOld", multiLine: true),
+          RegExp('^$indentOld', multiLine: true),
           indentNew2,
         );
         builder.write(indentNew2);
@@ -1874,8 +1874,8 @@
           builder.write(eol);
           builder.write(indentNew);
           widgetSrc = widgetSrc.replaceAll(
-              RegExp("^$indentOld", multiLine: true), indentNew);
-          widgetSrc += ",$eol$indentOld";
+              RegExp('^$indentOld', multiLine: true), indentNew);
+          widgetSrc += ',$eol$indentOld';
         }
         if (parentClassElement == null) {
           builder.addSimpleLinkedEdit('CHILD', 'child');
@@ -2429,7 +2429,7 @@
         // Linked editing not needed since arg is always a list.
         builder.write('children: ');
         builder.write(literalSrc.replaceAll(
-            RegExp("^$indentOld", multiLine: true), "$indentList"));
+            RegExp('^$indentOld', multiLine: true), '$indentList'));
         builder.write(',');
         builder.write(eol);
         builder.write(indentArg);
@@ -3012,7 +3012,7 @@
       // The separator includes 'child:' but that has no newlines.
       String separator =
           getText(namedExp.offset, childArg.offset - namedExp.offset);
-      String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
+      String prefix = separator.contains(eol) ? '' : '$eol$indentNew';
       if (prefix.isEmpty) {
         builder.addSimpleInsertion(
             namedExp.offset + 'child:'.length, ' <Widget>[');
@@ -3024,7 +3024,7 @@
       }
       String newChildArgSrc =
           _replaceSourceIndent(childArgSrc, indentOld, indentNew);
-      newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
+      newChildArgSrc = '$prefix$newChildArgSrc,$eol$indentOld]';
       builder.addSimpleReplacement(range.node(childArg), newChildArgSrc);
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/base_processor.dart b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
index 8d6fbad..c8eb22c 100644
--- a/pkg/analysis_server/lib/src/services/correction/base_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
@@ -136,7 +136,7 @@
       @required String prefix,
       @required String builderName,
     }) {
-      builder.write("$prefix$builderName.add($constructorId");
+      builder.write('$prefix$builderName.add($constructorId');
       if (typeArgs != null) {
         builder.write('<');
         builder.writeTypes(typeArgs);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 2d3348d..5fb30cd 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -133,17 +133,17 @@
 class DartFixKind {
   static const ADD_ASYNC = FixKind('ADD_ASYNC', 50, "Add 'async' modifier");
   static const ADD_AWAIT = FixKind('ADD_AWAIT', 50, "Add 'await' keyword");
-  static const ADD_EXPLICIT_CAST = FixKind('ADD_EXPLICIT_CAST', 50, "Add cast",
-      appliedTogetherMessage: "Add all casts in file");
+  static const ADD_EXPLICIT_CAST = FixKind('ADD_EXPLICIT_CAST', 50, 'Add cast',
+      appliedTogetherMessage: 'Add all casts in file');
   static const ADD_CONST = FixKind('ADD_CONST', 50, "Add 'const' modifier");
   static const ADD_CURLY_BRACES =
-      FixKind('ADD_CURLY_BRACES', 50, "Add curly braces");
+      FixKind('ADD_CURLY_BRACES', 50, 'Add curly braces');
   static const ADD_DIAGNOSTIC_PROPERTY_REFERENCE = FixKind(
       'ADD_DIAGNOSTIC_PROPERTY_REFERENCE',
       50,
-      "Add a debug reference to this property");
+      'Add a debug reference to this property');
   static const ADD_FIELD_FORMAL_PARAMETERS = FixKind(
-      'ADD_FIELD_FORMAL_PARAMETERS', 70, "Add final field formal parameters");
+      'ADD_FIELD_FORMAL_PARAMETERS', 70, 'Add final field formal parameters');
   static const ADD_MISSING_ENUM_CASE_CLAUSES =
       FixKind('ADD_MISSING_ENUM_CASE_CLAUSES', 50, 'Add missing case clauses');
   static const ADD_MISSING_PARAMETER_NAMED =
@@ -151,43 +151,43 @@
   static const ADD_MISSING_PARAMETER_POSITIONAL = FixKind(
       'ADD_MISSING_PARAMETER_POSITIONAL',
       69,
-      "Add optional positional parameter");
+      'Add optional positional parameter');
   static const ADD_MISSING_PARAMETER_REQUIRED =
-      FixKind('ADD_MISSING_PARAMETER_REQUIRED', 70, "Add required parameter");
+      FixKind('ADD_MISSING_PARAMETER_REQUIRED', 70, 'Add required parameter');
   static const ADD_MISSING_REQUIRED_ARGUMENT = FixKind(
       'ADD_MISSING_REQUIRED_ARGUMENT', 70, "Add required argument '{0}'");
-  static const ADD_NE_NULL = FixKind('ADD_NE_NULL', 50, "Add != null",
-      appliedTogetherMessage: "Add != null everywhere in file");
+  static const ADD_NE_NULL = FixKind('ADD_NE_NULL', 50, 'Add != null',
+      appliedTogetherMessage: 'Add != null everywhere in file');
   static const ADD_OVERRIDE =
       FixKind('ADD_OVERRIDE', 50, "Add '@override' annotation");
   static const ADD_REQUIRED =
       FixKind('ADD_REQUIRED', 50, "Add '@required' annotation");
   static const ADD_RETURN_TYPE =
-      FixKind('ADD_RETURN_TYPE', 50, "Add return type");
+      FixKind('ADD_RETURN_TYPE', 50, 'Add return type');
   static const ADD_STATIC = FixKind('ADD_STATIC', 50, "Add 'static' modifier");
   static const ADD_SUPER_CONSTRUCTOR_INVOCATION = FixKind(
       'ADD_SUPER_CONSTRUCTOR_INVOCATION',
       50,
-      "Add super constructor {0} invocation");
+      'Add super constructor {0} invocation');
   static const ADD_TYPE_ANNOTATION =
-      FixKind('ADD_TYPE_ANNOTATION', 50, "Add type annotation");
+      FixKind('ADD_TYPE_ANNOTATION', 50, 'Add type annotation');
   static const CHANGE_ARGUMENT_NAME =
       FixKind('CHANGE_ARGUMENT_NAME', 60, "Change to '{0}'");
   static const CHANGE_TO = FixKind('CHANGE_TO', 51, "Change to '{0}'");
   static const CHANGE_TO_NEAREST_PRECISE_VALUE = FixKind(
       'CHANGE_TO_NEAREST_PRECISE_VALUE',
       50,
-      "Change to nearest precise int-as-double value: {0}");
+      'Change to nearest precise int-as-double value: {0}');
   static const CHANGE_TO_STATIC_ACCESS = FixKind(
       'CHANGE_TO_STATIC_ACCESS', 50, "Change access to static using '{0}'");
   static const CHANGE_TYPE_ANNOTATION = FixKind(
       'CHANGE_TYPE_ANNOTATION', 50, "Change '{0}' to '{1}' type annotation");
   static const CONVERT_FLUTTER_CHILD =
-      FixKind('CONVERT_FLUTTER_CHILD', 50, "Convert to children:");
+      FixKind('CONVERT_FLUTTER_CHILD', 50, 'Convert to children:');
   static const CONVERT_FLUTTER_CHILDREN =
-      FixKind('CONVERT_FLUTTER_CHILDREN', 50, "Convert to child:");
+      FixKind('CONVERT_FLUTTER_CHILDREN', 50, 'Convert to child:');
   static const CONVERT_INTO_EXPRESSION_BODY =
-      FixKind('CONVERT_INTO_EXPRESSION_BODY', 50, "Convert to expression body");
+      FixKind('CONVERT_INTO_EXPRESSION_BODY', 50, 'Convert to expression body');
   static const CONVERT_TO_FOR_ELEMENT =
       FixKind('CONVERT_TO_FOR_ELEMENT', 50, "Convert to a 'for' element");
   static const CONVERT_TO_GENERIC_FUNCTION_SYNTAX = FixKind(
@@ -199,27 +199,27 @@
   static const CONVERT_TO_IF_NULL =
       FixKind('CONVERT_TO_IF_NULL', 50, "Convert to use '??'");
   static const CONVERT_TO_INT_LITERAL =
-      FixKind('CONVERT_TO_INT_LITERAL', 50, "Convert to an int literal");
+      FixKind('CONVERT_TO_INT_LITERAL', 50, 'Convert to an int literal');
   static const CONVERT_TO_LINE_COMMENT = FixKind(
-      'CONVERT_TO_LINE_COMMENT', 50, "Convert to line documentation comment");
+      'CONVERT_TO_LINE_COMMENT', 50, 'Convert to line documentation comment');
   static const CONVERT_TO_LIST_LITERAL =
-      FixKind('CONVERT_TO_LIST_LITERAL', 50, "Convert to list literal");
+      FixKind('CONVERT_TO_LIST_LITERAL', 50, 'Convert to list literal');
   static const CONVERT_TO_MAP_LITERAL =
-      FixKind('CONVERT_TO_MAP_LITERAL', 50, "Convert to map literal");
+      FixKind('CONVERT_TO_MAP_LITERAL', 50, 'Convert to map literal');
   static const CONVERT_TO_NAMED_ARGUMENTS =
-      FixKind('CONVERT_TO_NAMED_ARGUMENTS', 50, "Convert to named arguments");
+      FixKind('CONVERT_TO_NAMED_ARGUMENTS', 50, 'Convert to named arguments');
   static const CONVERT_TO_NULL_AWARE =
       FixKind('CONVERT_TO_NULL_AWARE', 50, "Convert to use '?.'");
   static const CONVERT_TO_PACKAGE_IMPORT =
       FixKind('CONVERT_TO_PACKAGE_IMPORT', 50, "Convert to 'package:' import");
   static const CONVERT_TO_RELATIVE_IMPORT =
-      FixKind('CONVERT_TO_RELATIVE_IMPORT', 50, "Convert to relative import");
+      FixKind('CONVERT_TO_RELATIVE_IMPORT', 50, 'Convert to relative import');
   static const CONVERT_TO_SET_LITERAL =
-      FixKind('CONVERT_TO_SET_LITERAL', 50, "Convert to set literal");
+      FixKind('CONVERT_TO_SET_LITERAL', 50, 'Convert to set literal');
   static const CONVERT_TO_SINGLE_QUOTED_STRING = FixKind(
-      'CONVERT_TO_SINGLE_QUOTED_STRING', 50, "Convert to single quoted string");
+      'CONVERT_TO_SINGLE_QUOTED_STRING', 50, 'Convert to single quoted string');
   static const CONVERT_TO_SPREAD =
-      FixKind('CONVERT_TO_SPREAD', 50, "Convert to a spread");
+      FixKind('CONVERT_TO_SPREAD', 50, 'Convert to a spread');
   static const CONVERT_TO_WHERE_TYPE =
       FixKind('CONVERT_TO_WHERE_TYPE', 50, "Convert to a use 'whereType'");
   static const CREATE_CLASS = FixKind('CREATE_CLASS', 50, "Create class '{0}'");
@@ -228,9 +228,9 @@
   static const CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS = FixKind(
       'CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS',
       50,
-      "Create constructor for final fields");
+      'Create constructor for final fields');
   static const CREATE_CONSTRUCTOR_SUPER =
-      FixKind('CREATE_CONSTRUCTOR_SUPER', 50, "Create constructor to call {0}");
+      FixKind('CREATE_CONSTRUCTOR_SUPER', 50, 'Create constructor to call {0}');
   static const CREATE_FIELD = FixKind('CREATE_FIELD', 49, "Create field '{0}'");
   static const CREATE_FILE = FixKind('CREATE_FILE', 50, "Create file '{0}'");
   static const CREATE_FUNCTION =
@@ -242,7 +242,7 @@
   static const CREATE_METHOD =
       FixKind('CREATE_METHOD', 50, "Create method '{0}'");
   static const CREATE_MISSING_OVERRIDES =
-      FixKind('CREATE_MISSING_OVERRIDES', 51, "Create {0} missing override(s)");
+      FixKind('CREATE_MISSING_OVERRIDES', 51, 'Create {0} missing override(s)');
   static const CREATE_MIXIN = FixKind('CREATE_MIXIN', 50, "Create mixin '{0}'");
   static const CREATE_NO_SUCH_METHOD =
       FixKind('CREATE_NO_SUCH_METHOD', 49, "Create 'noSuchMethod' method");
@@ -271,11 +271,11 @@
       FixKind('MAKE_CLASS_ABSTRACT', 50, "Make class '{0}' abstract");
   static const MAKE_FIELD_NOT_FINAL =
       FixKind('MAKE_FIELD_NOT_FINAL', 50, "Make field '{0}' not final");
-  static const MAKE_FINAL = FixKind('MAKE_FINAL', 50, "Make final");
+  static const MAKE_FINAL = FixKind('MAKE_FINAL', 50, 'Make final');
   static const MOVE_TYPE_ARGUMENTS_TO_CLASS = FixKind(
       'MOVE_TYPE_ARGUMENTS_TO_CLASS',
       50,
-      "Move type arguments to after class name");
+      'Move type arguments to after class name');
   static const MAKE_VARIABLE_NOT_FINAL =
       FixKind('MAKE_VARIABLE_NOT_FINAL', 50, "Make variable '{0}' not final");
   static const QUALIFY_REFERENCE =
@@ -283,70 +283,70 @@
   static const REMOVE_ANNOTATION =
       FixKind('REMOVE_ANNOTATION', 50, "Remove the '{0}' annotation");
   static const REMOVE_ARGUMENT =
-      FixKind('REMOVE_ARGUMENT', 50, "Remove argument");
-  static const REMOVE_AWAIT = FixKind('REMOVE_AWAIT', 50, "Remove await");
+      FixKind('REMOVE_ARGUMENT', 50, 'Remove argument');
+  static const REMOVE_AWAIT = FixKind('REMOVE_AWAIT', 50, 'Remove await');
   static const REMOVE_DEAD_CODE =
-      FixKind('REMOVE_DEAD_CODE', 50, "Remove dead code");
+      FixKind('REMOVE_DEAD_CODE', 50, 'Remove dead code');
   static const REMOVE_DUPLICATE_CASE =
-      FixKind('REMOVE_DUPLICATE_CASE', 50, "Remove duplicate case statement");
+      FixKind('REMOVE_DUPLICATE_CASE', 50, 'Remove duplicate case statement');
   static const REMOVE_EMPTY_CATCH =
-      FixKind('REMOVE_EMPTY_CATCH', 50, "Remove empty catch clause");
+      FixKind('REMOVE_EMPTY_CATCH', 50, 'Remove empty catch clause');
   static const REMOVE_EMPTY_CONSTRUCTOR_BODY = FixKind(
-      'REMOVE_EMPTY_CONSTRUCTOR_BODY', 50, "Remove empty constructor body");
+      'REMOVE_EMPTY_CONSTRUCTOR_BODY', 50, 'Remove empty constructor body');
   static const REMOVE_EMPTY_ELSE =
-      FixKind('REMOVE_EMPTY_ELSE', 50, "Remove empty else clause");
+      FixKind('REMOVE_EMPTY_ELSE', 50, 'Remove empty else clause');
   static const REMOVE_EMPTY_STATEMENT =
-      FixKind('REMOVE_EMPTY_STATEMENT', 50, "Remove empty statement");
+      FixKind('REMOVE_EMPTY_STATEMENT', 50, 'Remove empty statement');
   static const REMOVE_IF_NULL_OPERATOR =
       FixKind('REMOVE_IF_NULL_OPERATOR', 50, "Remove the '??' operator");
   static const REMOVE_INITIALIZER =
-      FixKind('REMOVE_INITIALIZER', 50, "Remove initializer");
+      FixKind('REMOVE_INITIALIZER', 50, 'Remove initializer');
   static const REMOVE_INTERPOLATION_BRACES = FixKind(
       'REMOVE_INTERPOLATION_BRACES',
       50,
-      "Remove unnecessary interpolation braces");
+      'Remove unnecessary interpolation braces');
   static const REMOVE_METHOD_DECLARATION =
-      FixKind('REMOVE_METHOD_DECLARATION', 50, "Remove method declaration");
+      FixKind('REMOVE_METHOD_DECLARATION', 50, 'Remove method declaration');
   static const REMOVE_NAME_FROM_COMBINATOR =
       FixKind('REMOVE_NAME_FROM_COMBINATOR', 50, "Remove name from '{0}'");
   static const REMOVE_OPERATOR =
-      FixKind('REMOVE_OPERATOR', 50, "Remove the operator");
+      FixKind('REMOVE_OPERATOR', 50, 'Remove the operator');
   static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION = FixKind(
       'REMOVE_PARAMETERS_IN_GETTER_DECLARATION',
       50,
-      "Remove parameters in getter declaration");
+      'Remove parameters in getter declaration');
   static const REMOVE_PARENTHESIS_IN_GETTER_INVOCATION = FixKind(
       'REMOVE_PARENTHESIS_IN_GETTER_INVOCATION',
       50,
-      "Remove parentheses in getter invocation");
+      'Remove parentheses in getter invocation');
   static const REMOVE_THIS_EXPRESSION =
-      FixKind('REMOVE_THIS_EXPRESSION', 50, "Remove this expression");
+      FixKind('REMOVE_THIS_EXPRESSION', 50, 'Remove this expression');
   static const REMOVE_TYPE_ANNOTATION =
-      FixKind('REMOVE_TYPE_ANNOTATION', 50, "Remove type annotation");
+      FixKind('REMOVE_TYPE_ANNOTATION', 50, 'Remove type annotation');
   static const REMOVE_TYPE_ARGUMENTS =
-      FixKind('REMOVE_TYPE_ARGUMENTS', 49, "Remove type arguments");
+      FixKind('REMOVE_TYPE_ARGUMENTS', 49, 'Remove type arguments');
   static const REMOVE_UNNECESSARY_CAST = FixKind(
-      'REMOVE_UNNECESSARY_CAST', 50, "Remove unnecessary cast",
-      appliedTogetherMessage: "Remove all unnecessary casts in file");
+      'REMOVE_UNNECESSARY_CAST', 50, 'Remove unnecessary cast',
+      appliedTogetherMessage: 'Remove all unnecessary casts in file');
   static const REMOVE_UNNECESSARY_CONST = FixKind(
-      'REMOVE_UNNECESSARY_CONST', 50, "Remove unnecessary const keyword");
+      'REMOVE_UNNECESSARY_CONST', 50, 'Remove unnecessary const keyword');
   static const REMOVE_UNNECESSARY_NEW =
-      FixKind('REMOVE_UNNECESSARY_NEW', 50, "Remove unnecessary new keyword");
+      FixKind('REMOVE_UNNECESSARY_NEW', 50, 'Remove unnecessary new keyword');
   static const REMOVE_UNUSED_CATCH_CLAUSE =
       FixKind('REMOVE_UNUSED_CATCH_CLAUSE', 50, "Remove unused 'catch' clause");
   static const REMOVE_UNUSED_CATCH_STACK = FixKind(
-      'REMOVE_UNUSED_CATCH_STACK', 50, "Remove unused stack trace variable");
+      'REMOVE_UNUSED_CATCH_STACK', 50, 'Remove unused stack trace variable');
   static const REMOVE_UNUSED_ELEMENT =
-      FixKind('REMOVE_UNUSED_ELEMENT', 50, "Remove unused element");
+      FixKind('REMOVE_UNUSED_ELEMENT', 50, 'Remove unused element');
   static const REMOVE_UNUSED_FIELD =
-      FixKind('REMOVE_UNUSED_FIELD', 50, "Remove unused field");
+      FixKind('REMOVE_UNUSED_FIELD', 50, 'Remove unused field');
   static const REMOVE_UNUSED_IMPORT = FixKind(
-      'REMOVE_UNUSED_IMPORT', 50, "Remove unused import",
-      appliedTogetherMessage: "Remove all unused imports in this file");
+      'REMOVE_UNUSED_IMPORT', 50, 'Remove unused import',
+      appliedTogetherMessage: 'Remove all unused imports in this file');
   static const REMOVE_UNUSED_LABEL =
-      FixKind('REMOVE_UNUSED_LABEL', 50, "Remove unused label");
+      FixKind('REMOVE_UNUSED_LABEL', 50, 'Remove unused label');
   static const REMOVE_UNUSED_LOCAL_VARIABLE = FixKind(
-      'REMOVE_UNUSED_LOCAL_VARIABLE', 50, "Remove unused local variable");
+      'REMOVE_UNUSED_LOCAL_VARIABLE', 50, 'Remove unused local variable');
   static const RENAME_TO_CAMEL_CASE =
       FixKind('RENAME_TO_CAMEL_CASE', 50, "Rename to '{0}'");
   static const REPLACE_BOOLEAN_WITH_BOOL = FixKind(
@@ -367,13 +367,13 @@
   static const REPLACE_VAR_WITH_DYNAMIC =
       FixKind('REPLACE_VAR_WITH_DYNAMIC', 50, "Replace 'var' with 'dynamic'");
   static const REPLACE_WITH_BRACKETS =
-      FixKind('REPLACE_WITH_BRACKETS', 50, "Replace with { }");
+      FixKind('REPLACE_WITH_BRACKETS', 50, 'Replace with { }');
   static const REPLACE_WITH_CONDITIONAL_ASSIGNMENT =
-      FixKind('REPLACE_WITH_CONDITIONAL_ASSIGNMENT', 50, "Replace with ??=");
+      FixKind('REPLACE_WITH_CONDITIONAL_ASSIGNMENT', 50, 'Replace with ??=');
   static const REPLACE_WITH_EXTENSION_NAME =
       FixKind('REPLACE_WITH_EXTENSION_NAME', 50, "Replace with '{0}'");
   static const REPLACE_WITH_IDENTIFIER =
-      FixKind('REPLACE_WITH_IDENTIFIER', 50, "Replace with identifier");
+      FixKind('REPLACE_WITH_IDENTIFIER', 50, 'Replace with identifier');
   static const REPLACE_WITH_IS_EMPTY =
       FixKind('REPLACE_WITH_IS_EMPTY', 50, "Replace with 'isEmpty'");
   static const REPLACE_WITH_IS_NOT_EMPTY =
@@ -381,18 +381,18 @@
   static const REPLACE_WITH_NULL_AWARE = FixKind('REPLACE_WITH_NULL_AWARE', 50,
       "Replace the '.' with a '?.' in the invocation");
   static const REPLACE_WITH_TEAR_OFF = FixKind(
-      'REPLACE_WITH_TEAR_OFF', 50, "Replace function literal with tear-off");
+      'REPLACE_WITH_TEAR_OFF', 50, 'Replace function literal with tear-off');
   static const REPLACE_WITH_VAR =
       FixKind('REPLACE_WITH_VAR', 50, "Replace type annotation with 'var'");
   static const SORT_CHILD_PROPERTY_LAST = FixKind('SORT_CHILD_PROPERTY_LAST',
-      50, "Move child property to end of arguments");
+      50, 'Move child property to end of arguments');
   static const UPDATE_SDK_CONSTRAINTS =
-      FixKind('UPDATE_SDK_CONSTRAINTS', 50, "Update the SDK constraints");
-  static const USE_CONST = FixKind('USE_CONST', 50, "Change to constant");
+      FixKind('UPDATE_SDK_CONSTRAINTS', 50, 'Update the SDK constraints');
+  static const USE_CONST = FixKind('USE_CONST', 50, 'Change to constant');
   static const USE_EFFECTIVE_INTEGER_DIVISION = FixKind(
       'USE_EFFECTIVE_INTEGER_DIVISION',
       50,
-      "Use effective integer division ~/");
+      'Use effective integer division ~/');
   static const USE_EQ_EQ_NULL = FixKind(
       'USE_EQ_EQ_NULL', 50, "Use == null instead of 'is Null'",
       appliedTogetherMessage:
@@ -404,7 +404,7 @@
       appliedTogetherMessage:
           "Use != null instead of 'is! Null' everywhere in file");
   static const USE_RETHROW =
-      FixKind('USE_RETHROW', 50, "Replace throw with rethrow");
+      FixKind('USE_RETHROW', 50, 'Replace throw with rethrow');
 }
 
 /// An enumeration of quick fix kinds for the errors found in an Android
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 3501f4c..d1b1801 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -5104,26 +5104,26 @@
 
   bool _isDartCoreIterableElement(ClassElement element) =>
       element != null &&
-      element.name == "Iterable" &&
+      element.name == 'Iterable' &&
       element.library.isDartCore;
 
   bool _isDartCoreList(DartType type) =>
       type is InterfaceType && _isDartCoreListElement(type.element);
 
   bool _isDartCoreListElement(ClassElement element) =>
-      element != null && element.name == "List" && element.library.isDartCore;
+      element != null && element.name == 'List' && element.library.isDartCore;
 
   bool _isDartCoreMap(DartType type) =>
       type is InterfaceType && _isDartCoreMapElement(type.element);
 
   bool _isDartCoreMapElement(ClassElement element) =>
-      element != null && element.name == "Map" && element.library.isDartCore;
+      element != null && element.name == 'Map' && element.library.isDartCore;
 
   bool _isDartCoreSet(DartType type) =>
       type is InterfaceType && _isDartCoreSetElement(type.element);
 
   bool _isDartCoreSetElement(ClassElement element) =>
-      element != null && element.name == "Set" && element.library.isDartCore;
+      element != null && element.name == 'Set' && element.library.isDartCore;
 
   bool _isLibSrcPath(String path) {
     List<String> parts = resourceProvider.pathContext.split(path);
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
index a4bf02d..b4c4414 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
@@ -137,9 +137,9 @@
   static _DirectivePriority getDirectivePriority(UriBasedDirective directive) {
     String uriContent = directive.uri.stringValue;
     if (directive is ImportDirective) {
-      if (uriContent.startsWith("dart:")) {
+      if (uriContent.startsWith('dart:')) {
         return _DirectivePriority.IMPORT_SDK;
-      } else if (uriContent.startsWith("package:")) {
+      } else if (uriContent.startsWith('package:')) {
         return _DirectivePriority.IMPORT_PKG;
       } else if (uriContent.contains('://')) {
         return _DirectivePriority.IMPORT_OTHER;
@@ -148,9 +148,9 @@
       }
     }
     if (directive is ExportDirective) {
-      if (uriContent.startsWith("dart:")) {
+      if (uriContent.startsWith('dart:')) {
         return _DirectivePriority.EXPORT_SDK;
-      } else if (uriContent.startsWith("package:")) {
+      } else if (uriContent.startsWith('package:')) {
         return _DirectivePriority.EXPORT_PKG;
       } else if (uriContent.contains('://')) {
         return _DirectivePriority.EXPORT_OTHER;
diff --git a/pkg/analysis_server/lib/src/services/correction/sort_members.dart b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
index a7730c0..2647bf9 100644
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
@@ -109,7 +109,7 @@
         kind = _MemberKind.CLASS_CONSTRUCTOR;
         SimpleIdentifier nameNode = member.name;
         if (nameNode == null) {
-          name = "";
+          name = '';
         } else {
           name = nameNode.name;
         }
@@ -129,10 +129,10 @@
         name = method.name.name;
         if (method.isGetter) {
           kind = _MemberKind.CLASS_ACCESSOR;
-          name += " getter";
+          name += ' getter';
         } else if (method.isSetter) {
           kind = _MemberKind.CLASS_ACCESSOR;
-          name += " setter";
+          name += ' setter';
         } else {
           kind = _MemberKind.CLASS_METHOD;
         }
@@ -166,9 +166,9 @@
       String uriContent = uriDirective.uri.stringValue;
       _DirectivePriority kind;
       if (directive is ImportDirective) {
-        if (uriContent.startsWith("dart:")) {
+        if (uriContent.startsWith('dart:')) {
           kind = _DirectivePriority.IMPORT_SDK;
-        } else if (uriContent.startsWith("package:")) {
+        } else if (uriContent.startsWith('package:')) {
           kind = _DirectivePriority.IMPORT_PKG;
         } else if (uriContent.contains('://')) {
           kind = _DirectivePriority.IMPORT_OTHER;
@@ -177,9 +177,9 @@
         }
       }
       if (directive is ExportDirective) {
-        if (uriContent.startsWith("dart:")) {
+        if (uriContent.startsWith('dart:')) {
           kind = _DirectivePriority.EXPORT_SDK;
-        } else if (uriContent.startsWith("package:")) {
+        } else if (uriContent.startsWith('package:')) {
           kind = _DirectivePriority.EXPORT_PKG;
         } else if (uriContent.contains('://')) {
           kind = _DirectivePriority.EXPORT_OTHER;
@@ -291,10 +291,10 @@
         name = function.name.name;
         if (function.isGetter) {
           kind = _MemberKind.UNIT_ACCESSOR;
-          name += " getter";
+          name += ' getter';
         } else if (function.isSetter) {
           kind = _MemberKind.UNIT_ACCESSOR;
-          name += " setter";
+          name += ' setter';
         } else {
           if (name == 'main') {
             kind = _MemberKind.UNIT_FUNCTION_MAIN;
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 a2c3911..e95c296 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -81,10 +81,10 @@
       List<SourceRange> commentRanges = getCommentRanges(resolveResult.unit);
       for (SourceRange commentRange in commentRanges) {
         if (commentRange.contains(selectionStart)) {
-          invalidSelection("Selection begins inside a comment.");
+          invalidSelection('Selection begins inside a comment.');
         }
         if (commentRange.containsExclusive(selectionEnd)) {
-          invalidSelection("Selection ends inside a comment.");
+          invalidSelection('Selection ends inside a comment.');
         }
       }
     }
@@ -146,7 +146,7 @@
     for (AstNode selectedNode in selectedNodes) {
       if (switchMembers.contains(selectedNode)) {
         invalidSelection(
-            "Selection must either cover whole switch statement or parts of a single case block.");
+            'Selection must either cover whole switch statement or parts of a single case block.');
         break;
       }
     }
@@ -161,7 +161,7 @@
       if (firstSelectedNode == node.body ||
           firstSelectedNode == node.finallyBlock) {
         invalidSelection(
-            "Selection must either cover whole try statement or parts of try, catch, or finally block.");
+            'Selection must either cover whole try statement or parts of try, catch, or finally block.');
       } else {
         List<CatchClause> catchClauses = node.catchClauses;
         for (CatchClause catchClause in catchClauses) {
@@ -169,7 +169,7 @@
               firstSelectedNode == catchClause.body ||
               firstSelectedNode == catchClause.exceptionParameter) {
             invalidSelection(
-                "Selection must either cover whole try statement or parts of try, catch, or finally block.");
+                'Selection must either cover whole try statement or parts of try, catch, or finally block.');
           }
         }
       }
@@ -201,8 +201,8 @@
           range.startOffsetEndOffset(selection.offset, firstNode.offset);
       if (_hasTokens(rangeBeforeFirstNode)) {
         invalidSelection(
-            "The beginning of the selection contains characters that "
-            "do not belong to a statement.",
+            'The beginning of the selection contains characters that '
+            'do not belong to a statement.',
             newLocation_fromUnit(unit, rangeBeforeFirstNode));
       }
     }
@@ -213,8 +213,8 @@
           range.startOffsetEndOffset(lastNode.end, selection.end);
       if (_hasTokens(rangeAfterLastNode)) {
         invalidSelection(
-            "The end of the selection contains characters that "
-            "do not belong to a statement.",
+            'The end of the selection contains characters that '
+            'do not belong to a statement.',
             newLocation_fromUnit(unit, rangeAfterLastNode));
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/status.dart b/pkg/analysis_server/lib/src/services/correction/status.dart
index 9335d77..64e7c26 100644
--- a/pkg/analysis_server/lib/src/services/correction/status.dart
+++ b/pkg/analysis_server/lib/src/services/correction/status.dart
@@ -149,21 +149,21 @@
   @override
   String toString() {
     StringBuffer sb = StringBuffer();
-    sb.write("<");
+    sb.write('<');
     if (_severity == null) {
       sb.write('OK');
     } else {
       sb.write(_severity.name);
     }
     if (!isOK) {
-      sb.write("\n");
+      sb.write('\n');
       for (RefactoringProblem problem in problems) {
-        sb.write("\t");
+        sb.write('\t');
         sb.write(problem);
-        sb.write("\n");
+        sb.write('\n');
       }
     }
-    sb.write(">");
+    sb.write('>');
     return sb.toString();
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index b9b5e14..fd6cd4f 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -185,20 +185,20 @@
 String getDefaultValueCode(DartType type) {
   if (type != null) {
     if (type.isDartCoreBool) {
-      return "false";
+      return 'false';
     }
     if (type.isDartCoreInt) {
-      return "0";
+      return '0';
     }
     if (type.isDartCoreDouble) {
-      return "0.0";
+      return '0.0';
     }
     if (type.isDartCoreString) {
       return "''";
     }
   }
   // no better guess
-  return "null";
+  return 'null';
 }
 
 /**
@@ -625,10 +625,10 @@
    */
   String get endOfLine {
     if (_endOfLine == null) {
-      if (_buffer.contains("\r\n")) {
-        _endOfLine = "\r\n";
+      if (_buffer.contains('\r\n')) {
+        _endOfLine = '\r\n';
       } else {
-        _endOfLine = "\n";
+        _endOfLine = '\n';
       }
     }
     return _endOfLine;
@@ -674,7 +674,7 @@
     // skip hash-bang
     if (offset < source.length - 2) {
       String linePrefix = getText(offset, 2);
-      if (linePrefix == "#!") {
+      if (linePrefix == '#!') {
         insertEmptyLineBefore = true;
         offset = getLineNext(offset);
         // skip empty lines to first line comment
@@ -685,7 +685,7 @@
           if (line.trim().isEmpty) {
             emptyOffset = nextLineOffset;
             continue;
-          } else if (line.startsWith("//")) {
+          } else if (line.startsWith('//')) {
             offset = emptyOffset;
             break;
           } else {
@@ -697,7 +697,7 @@
     // skip line comments
     while (offset < source.length - 2) {
       String linePrefix = getText(offset, 2);
-      if (linePrefix == "//") {
+      if (linePrefix == '//') {
         insertEmptyLineBefore = true;
         offset = getLineNext(offset);
       } else {
@@ -931,7 +931,7 @@
     // just a Function, not FunctionTypeAliasElement
     if (type is FunctionType && element is! FunctionTypeAliasElement) {
       if (parametersBuffer == null) {
-        return "Function";
+        return 'Function';
       }
       parametersBuffer.write('(');
       for (ParameterElement parameter in type.parameters) {
@@ -969,7 +969,7 @@
       if (importElement != null) {
         if (importElement.prefix != null) {
           sb.write(importElement.prefix.displayName);
-          sb.write(".");
+          sb.write('.');
         }
       } else {
         librariesToImport.add(library.source);
@@ -990,11 +990,11 @@
       }
       // append type arguments
       if (hasArguments && allArgumentsVisible) {
-        sb.write("<");
+        sb.write('<');
         for (int i = 0; i < arguments.length; i++) {
           DartType argument = arguments[i];
           if (i != 0) {
-            sb.write(", ");
+            sb.write(', ');
           }
           String argumentSrc = getTypeSource(argument, librariesToImport);
           if (argumentSrc != null) {
@@ -1003,7 +1003,7 @@
             return null;
           }
         }
-        sb.write(">");
+        sb.write('>');
       }
     }
     // done
@@ -1028,7 +1028,7 @@
       if (indentLeft) {
         line = removeStart(line, indent);
       } else {
-        line = "$indent$line";
+        line = '$indent$line';
       }
       // append line
       sb.write(line);
@@ -1170,7 +1170,7 @@
       lineOffset += line.length + eol.length;
       // update line indent
       if (!inString) {
-        line = "$newIndent${removeStart(line, oldIndent)}";
+        line = '$newIndent${removeStart(line, oldIndent)}';
       }
       // append line
       sb.write(line);
@@ -1268,9 +1268,9 @@
   _InvertedCondition _invertCondition0(Expression expression) {
     if (expression is BooleanLiteral) {
       if (expression.value) {
-        return _InvertedCondition._simple("false");
+        return _InvertedCondition._simple('false');
       } else {
-        return _InvertedCondition._simple("true");
+        return _InvertedCondition._simple('true');
       }
     } else if (expression is BinaryExpression) {
       TokenType operator = expression.operator.type;
@@ -1279,42 +1279,42 @@
       _InvertedCondition ls = _InvertedCondition._simple(getNodeText(le));
       _InvertedCondition rs = _InvertedCondition._simple(getNodeText(re));
       if (operator == TokenType.LT) {
-        return _InvertedCondition._binary2(ls, " >= ", rs);
+        return _InvertedCondition._binary2(ls, ' >= ', rs);
       }
       if (operator == TokenType.GT) {
-        return _InvertedCondition._binary2(ls, " <= ", rs);
+        return _InvertedCondition._binary2(ls, ' <= ', rs);
       }
       if (operator == TokenType.LT_EQ) {
-        return _InvertedCondition._binary2(ls, " > ", rs);
+        return _InvertedCondition._binary2(ls, ' > ', rs);
       }
       if (operator == TokenType.GT_EQ) {
-        return _InvertedCondition._binary2(ls, " < ", rs);
+        return _InvertedCondition._binary2(ls, ' < ', rs);
       }
       if (operator == TokenType.EQ_EQ) {
-        return _InvertedCondition._binary2(ls, " != ", rs);
+        return _InvertedCondition._binary2(ls, ' != ', rs);
       }
       if (operator == TokenType.BANG_EQ) {
-        return _InvertedCondition._binary2(ls, " == ", rs);
+        return _InvertedCondition._binary2(ls, ' == ', rs);
       }
       if (operator == TokenType.AMPERSAND_AMPERSAND) {
         ls = _invertCondition0(le);
         rs = _invertCondition0(re);
         return _InvertedCondition._binary(
-            TokenType.BAR_BAR.precedence, ls, " || ", rs);
+            TokenType.BAR_BAR.precedence, ls, ' || ', rs);
       }
       if (operator == TokenType.BAR_BAR) {
         ls = _invertCondition0(le);
         rs = _invertCondition0(re);
         return _InvertedCondition._binary(
-            TokenType.AMPERSAND_AMPERSAND.precedence, ls, " && ", rs);
+            TokenType.AMPERSAND_AMPERSAND.precedence, ls, ' && ', rs);
       }
     } else if (expression is IsExpression) {
       String expressionSource = getNodeText(expression.expression);
       String typeSource = getNodeText(expression.type);
       if (expression.notOperator == null) {
-        return _InvertedCondition._simple("$expressionSource is! $typeSource");
+        return _InvertedCondition._simple('$expressionSource is! $typeSource');
       } else {
-        return _InvertedCondition._simple("$expressionSource is $typeSource");
+        return _InvertedCondition._simple('$expressionSource is $typeSource');
       }
     } else if (expression is PrefixExpression) {
       TokenType operator = expression.operator.type;
@@ -1327,7 +1327,7 @@
     }
     DartType type = expression.staticType;
     if (type.isDartCoreBool) {
-      return _InvertedCondition._simple("!${getNodeText(expression)}");
+      return _InvertedCondition._simple('!${getNodeText(expression)}');
     }
     return _InvertedCondition._simple(getNodeText(expression));
   }
@@ -1376,8 +1376,8 @@
  */
 class CorrectionUtils_InsertDesc {
   int offset = 0;
-  String prefix = "";
-  String suffix = "";
+  String prefix = '';
+  String suffix = '';
 }
 
 /**
@@ -1481,7 +1481,7 @@
       _InvertedCondition left, String operation, _InvertedCondition right) {
     // TODO(scheglov) consider merging with "_binary()" after testing
     return _InvertedCondition(
-        1 << 20, "${left._source}$operation${right._source}");
+        1 << 20, '${left._source}$operation${right._source}');
   }
 
   /**
@@ -1491,7 +1491,7 @@
   static String _parenthesizeIfRequired(
       _InvertedCondition expr, int newOperatorPrecedence) {
     if (expr._precedence < newOperatorPrecedence) {
-      return "(${expr._source})";
+      return '(${expr._source})';
     }
     return expr._source;
   }
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index dc99a51..b3a757e 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -1206,7 +1206,7 @@
   KytheEntry addEdge(KytheVName source, String edgeKind, KytheVName target,
       {int ordinalIntValue = _notFound}) {
     if (ordinalIntValue == _notFound) {
-      return addEntry(source, edgeKind, target, "/", <int>[]);
+      return addEntry(source, edgeKind, target, '/', <int>[]);
     } else {
       return addEntry(source, edgeKind, target, schema.ORDINAL,
           _encodeInt(ordinalIntValue));
diff --git a/pkg/analysis_server/lib/src/services/kythe/schema.dart b/pkg/analysis_server/lib/src/services/kythe/schema.dart
index 339564a..3016742 100644
--- a/pkg/analysis_server/lib/src/services/kythe/schema.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/schema.dart
@@ -65,18 +65,18 @@
 const EDGE_PREFIX = '/kythe/edge/';
 
 /// Kythe edge kinds
-const ANNOTATED_BY_EDGE = EDGE_PREFIX + "annotatedby";
-const CHILD_OF_EDGE = EDGE_PREFIX + "childof";
-const EXTENDS_EDGE = EDGE_PREFIX + "extends";
-const INSTANTIATES_EDGE = EDGE_PREFIX + "instantiates";
-const OVERRIDES_EDGE = EDGE_PREFIX + "overrides";
-const PARAM_EDGE = EDGE_PREFIX + "param";
-const TYPED_EDGE = EDGE_PREFIX + "typed";
+const ANNOTATED_BY_EDGE = EDGE_PREFIX + 'annotatedby';
+const CHILD_OF_EDGE = EDGE_PREFIX + 'childof';
+const EXTENDS_EDGE = EDGE_PREFIX + 'extends';
+const INSTANTIATES_EDGE = EDGE_PREFIX + 'instantiates';
+const OVERRIDES_EDGE = EDGE_PREFIX + 'overrides';
+const PARAM_EDGE = EDGE_PREFIX + 'param';
+const TYPED_EDGE = EDGE_PREFIX + 'typed';
 
 /// Kythe edge kinds associated with anchors
-const DEFINES_EDGE = EDGE_PREFIX + "defines";
-const DEFINES_BINDING_EDGE = EDGE_PREFIX + "defines/binding";
-const DOCUMENTS_EDGE = EDGE_PREFIX + "documents";
-const REF_EDGE = EDGE_PREFIX + "ref";
-const REF_CALL_EDGE = EDGE_PREFIX + "ref/call";
-const REF_IMPORTS_EDGE = EDGE_PREFIX + "ref/imports";
+const DEFINES_EDGE = EDGE_PREFIX + 'defines';
+const DEFINES_BINDING_EDGE = EDGE_PREFIX + 'defines/binding';
+const DOCUMENTS_EDGE = EDGE_PREFIX + 'documents';
+const REF_EDGE = EDGE_PREFIX + 'ref';
+const REF_CALL_EDGE = EDGE_PREFIX + 'ref/call';
+const REF_IMPORTS_EDGE = EDGE_PREFIX + 'ref/imports';
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
index baed2ce..c835dc6 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -127,7 +127,7 @@
       Element refElement = reference.element;
       SourceRange refRange = reference.range;
       // insert "()"
-      var edit = SourceEdit(refRange.end, 0, "()");
+      var edit = SourceEdit(refRange.end, 0, '()');
       doSourceChange_addElementEdit(change, refElement, edit);
     }
   }
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 2c77a76..17b436a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -25,7 +25,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
-const String _TOKEN_SEPARATOR = "\uFFFF";
+const String _TOKEN_SEPARATOR = '\uFFFF';
 
 /**
  * [ExtractLocalRefactoring] implementation.
@@ -75,11 +75,11 @@
 
   String get _declarationKeyword {
     if (_isPartOfConstantExpression(singleExpression)) {
-      return "const";
+      return 'const';
     } else if (_isLintEnabled(LintNames.prefer_final_locals)) {
-      return "final";
+      return 'final';
     } else {
-      return "var";
+      return 'var';
     }
   }
 
@@ -200,7 +200,7 @@
     // prepare replacement
     String occurrenceReplacement = name;
     if (stringLiteralPart != null) {
-      occurrenceReplacement = "\${$name}";
+      occurrenceReplacement = '\${$name}';
       occurrencesShift += 2;
     }
     // replace occurrences with variable reference
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 4b42d3f..2d9c23c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -617,7 +617,7 @@
     if (element is MethodElement) {
       if (_isMemberOfEnclosingClass(element)) {
         status.addError(
-            "Reference to an enclosing class method cannot be extracted.");
+            'Reference to an enclosing class method cannot be extracted.');
       }
     } else if (element is LocalVariableElement) {
       if (!expressionRange.contains(element.nameOffset)) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index e77eee7..3ace708 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -91,7 +91,7 @@
       // prepare argument source to apply at this occurrence
       String occurrenceArgumentSource;
       if (argumentPrecedence < occurrence.parentPrecedence) {
-        occurrenceArgumentSource = "($argumentSource)";
+        occurrenceArgumentSource = '($argumentSource)';
       } else {
         occurrenceArgumentSource = argumentSource;
       }
@@ -239,9 +239,9 @@
   @override
   String get refactoringName {
     if (_methodElement is MethodElement) {
-      return "Inline Method";
+      return 'Inline Method';
     } else {
-      return "Inline Function";
+      return 'Inline Function';
     }
   }
 
@@ -531,14 +531,14 @@
             ref._methodExpressionPart, _refUtils, usage, target, arguments);
         if (getExpressionPrecedence(ref._methodExpression) <
             getExpressionParentPrecedence(usage)) {
-          source = "($source)";
+          source = '($source)';
         }
         // do replace
         SourceRange methodUsageRange = range.node(usage);
         SourceEdit edit = newSourceEdit_range(methodUsageRange, source);
         _addRefEdit(edit);
       } else {
-        SourceEdit edit = newSourceEdit_range(_refLineRange, "");
+        SourceEdit edit = newSourceEdit_range(_refLineRange, '');
         _addRefEdit(edit);
       }
       return;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index 0d04e86..a50ae70 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -14,7 +14,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateClassName(String name) {
-  return _validateUpperCamelCase(name, "Class");
+  return _validateUpperCamelCase(name, 'Class');
 }
 
 /**
@@ -27,7 +27,7 @@
   if (name != null && name.isEmpty) {
     return RefactoringStatus();
   }
-  return _validateLowerCamelCase(name, "Constructor", allowBuiltIn: true);
+  return _validateLowerCamelCase(name, 'Constructor', allowBuiltIn: true);
 }
 
 /**
@@ -37,7 +37,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFieldName(String name) {
-  return _validateLowerCamelCase(name, "Field", allowBuiltIn: true);
+  return _validateLowerCamelCase(name, 'Field', allowBuiltIn: true);
 }
 
 /**
@@ -47,7 +47,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFunctionName(String name) {
-  return _validateLowerCamelCase(name, "Function", allowBuiltIn: true);
+  return _validateLowerCamelCase(name, 'Function', allowBuiltIn: true);
 }
 
 /**
@@ -57,7 +57,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFunctionTypeAliasName(String name) {
-  return _validateUpperCamelCase(name, "Function type alias");
+  return _validateUpperCamelCase(name, 'Function type alias');
 }
 
 /**
@@ -70,7 +70,7 @@
   if (name != null && name.isEmpty) {
     return RefactoringStatus();
   }
-  return _validateLowerCamelCase(name, "Import prefix");
+  return _validateLowerCamelCase(name, 'Import prefix');
 }
 
 /**
@@ -80,7 +80,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateLabelName(String name) {
-  return _validateLowerCamelCase(name, "Label", allowBuiltIn: true);
+  return _validateLowerCamelCase(name, 'Label', allowBuiltIn: true);
 }
 
 /**
@@ -92,17 +92,17 @@
 RefactoringStatus validateLibraryName(String name) {
   // null
   if (name == null) {
-    return RefactoringStatus.fatal("Library name must not be null.");
+    return RefactoringStatus.fatal('Library name must not be null.');
   }
   // blank
   if (isBlank(name)) {
-    return RefactoringStatus.fatal("Library name must not be blank.");
+    return RefactoringStatus.fatal('Library name must not be blank.');
   }
   // check identifiers
   List<String> identifiers = name.split('.');
   for (String identifier in identifiers) {
     RefactoringStatus status = _validateIdentifier(identifier,
-        "Library name identifier", "a lowercase letter or underscore");
+        'Library name identifier', 'a lowercase letter or underscore');
     if (!status.isOK) {
       return status;
     }
@@ -112,7 +112,7 @@
     for (int c in identifier.codeUnits) {
       if (isUpperCase(c)) {
         return RefactoringStatus.warning(
-            "Library name should consist of lowercase identifier separated by dots.");
+            'Library name should consist of lowercase identifier separated by dots.');
       }
     }
   }
@@ -127,7 +127,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateMethodName(String name) {
-  return _validateLowerCamelCase(name, "Method", allowBuiltIn: true);
+  return _validateLowerCamelCase(name, 'Method', allowBuiltIn: true);
 }
 
 /**
@@ -137,7 +137,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateParameterName(String name) {
-  return _validateLowerCamelCase(name, "Parameter", allowBuiltIn: true);
+  return _validateLowerCamelCase(name, 'Parameter', allowBuiltIn: true);
 }
 
 /**
@@ -147,7 +147,7 @@
  *   FATAL if the name is illegal.
  */
 RefactoringStatus validateVariableName(String name) {
-  return _validateLowerCamelCase(name, "Variable", allowBuiltIn: true);
+  return _validateLowerCamelCase(name, 'Variable', allowBuiltIn: true);
 }
 
 RefactoringStatus _validateIdentifier(
@@ -156,13 +156,13 @@
   // has leading/trailing spaces
   String trimmed = identifier.trim();
   if (identifier != trimmed) {
-    String message = "$desc must not start or end with a blank.";
+    String message = '$desc must not start or end with a blank.';
     return RefactoringStatus.fatal(message);
   }
   // empty
   int length = identifier.length;
   if (length == 0) {
-    String message = "$desc must not be empty.";
+    String message = '$desc must not be empty.';
     return RefactoringStatus.fatal(message);
   }
   // keyword
@@ -170,10 +170,10 @@
     Keyword keyword = Keyword.keywords[identifier];
     if (keyword != null) {
       if (keyword.isBuiltInOrPseudo && allowBuiltIn) {
-        String message = "Avoid using built-in identifiers as names.";
+        String message = 'Avoid using built-in identifiers as names.';
         return RefactoringStatus.warning(message);
       } else {
-        String message = "$desc must not be a keyword.";
+        String message = '$desc must not be a keyword.';
         return RefactoringStatus.fatal(message);
       }
     }
@@ -194,7 +194,7 @@
   if (!isLetter(currentChar) &&
       currentChar != CHAR_UNDERSCORE &&
       currentChar != CHAR_DOLLAR) {
-    String message = "$desc must begin with $beginDesc.";
+    String message = '$desc must begin with $beginDesc.';
     return RefactoringStatus.fatal(message);
   }
   // OK
@@ -209,12 +209,12 @@
   desc += ' name';
   // null
   if (identifier == null) {
-    String message = "$desc must not be null.";
+    String message = '$desc must not be null.';
     return RefactoringStatus.fatal(message);
   }
   // is not identifier
   RefactoringStatus status = _validateIdentifier(
-      identifier, desc, "a lowercase letter or underscore",
+      identifier, desc, 'a lowercase letter or underscore',
       allowBuiltIn: allowBuiltIn);
   if (!status.isOK) {
     return status;
@@ -229,7 +229,7 @@
   }
   // does not start with lower case
   if (!isLowerCase(identifier.codeUnitAt(0))) {
-    String message = "$desc should start with a lowercase letter.";
+    String message = '$desc should start with a lowercase letter.';
     return RefactoringStatus.warning(message);
   }
   // OK
@@ -243,12 +243,12 @@
   desc += ' name';
   // null
   if (identifier == null) {
-    String message = "$desc must not be null.";
+    String message = '$desc must not be null.';
     return RefactoringStatus.fatal(message);
   }
   // is not identifier
   RefactoringStatus status = _validateIdentifier(
-      identifier, desc, "an uppercase letter or underscore");
+      identifier, desc, 'an uppercase letter or underscore');
   if (!status.isOK) {
     return status;
   }
@@ -263,7 +263,7 @@
   // does not start with upper case
   if (!isUpperCase(identifier.codeUnitAt(0))) {
     // By convention, class names usually start with an uppercase letter
-    String message = "$desc should start with an uppercase letter.";
+    String message = '$desc should start with an uppercase letter.';
     return RefactoringStatus.warning(message);
   }
   // OK
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 0eb0e4b..9441004 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -108,7 +108,7 @@
     RefactoringStatus result = RefactoringStatus();
     if (newName == oldName) {
       result.addFatalError(
-          "The new name must be different than the current name.");
+          'The new name must be different than the current name.');
     }
     return result;
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 11beace..2ccb2d1 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -53,12 +53,12 @@
   @override
   String get refactoringName {
     if (element is TypeParameterElement) {
-      return "Rename Type Parameter";
+      return 'Rename Type Parameter';
     }
     if (element is FieldElement) {
-      return "Rename Field";
+      return 'Rename Field';
     }
-    return "Rename Method";
+    return 'Rename Method';
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index f6daa23..93623ed 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -37,7 +37,7 @@
 
   @override
   String get refactoringName {
-    return "Rename Constructor";
+    return 'Rename Constructor';
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart
index 15323f3..93a587d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_extension_member.dart
@@ -38,12 +38,12 @@
   @override
   String get refactoringName {
     if (element is TypeParameterElement) {
-      return "Rename Type Parameter";
+      return 'Rename Type Parameter';
     }
     if (element is FieldElement) {
-      return "Rename Field";
+      return 'Rename Field';
     }
-    return "Rename Method";
+    return 'Rename Method';
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 80f05cd..516d9fb 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -33,7 +33,7 @@
 
   @override
   String get refactoringName {
-    return "Rename Import Prefix";
+    return 'Rename Import Prefix';
   }
 
   @override
@@ -62,12 +62,12 @@
         int uriEnd = node.uri.end;
         int prefixEnd = element.prefixOffset + prefix.nameLength;
         edit = newSourceEdit_range(
-            range.startOffsetEndOffset(uriEnd, prefixEnd), "");
+            range.startOffsetEndOffset(uriEnd, prefixEnd), '');
       } else {
         if (prefix == null) {
           ImportDirective node = _findNode();
           int uriEnd = node.uri.end;
-          edit = newSourceEdit_range(SourceRange(uriEnd, 0), " as $newName");
+          edit = newSourceEdit_range(SourceRange(uriEnd, 0), ' as $newName');
         } else {
           int offset = element.prefixOffset;
           int length = prefix.nameLength;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
index 22b0c7e..b51b906 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -22,7 +22,7 @@
   LabelElement get element => super.element as LabelElement;
 
   @override
-  String get refactoringName => "Rename Label";
+  String get refactoringName => 'Rename Label';
 
   @override
   Future<RefactoringStatus> checkFinalConditions() {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index 07ff496..9b99779 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -23,7 +23,7 @@
 
   @override
   String get refactoringName {
-    return "Rename Library";
+    return 'Rename Library';
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index 2d3c138..2646ae3 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -38,12 +38,12 @@
   @override
   String get refactoringName {
     if (element is ParameterElement) {
-      return "Rename Parameter";
+      return 'Rename Parameter';
     }
     if (element is FunctionElement) {
-      return "Rename Local Function";
+      return 'Rename Local Function';
     }
-    return "Rename Local Variable";
+    return 'Rename Local Variable';
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index 37c7967..16f1c02 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -60,15 +60,15 @@
   @override
   String get refactoringName {
     if (element is FunctionElement) {
-      return "Rename Top-Level Function";
+      return 'Rename Top-Level Function';
     }
     if (element is FunctionTypeAliasElement) {
-      return "Rename Function Type Alias";
+      return 'Rename Function Type Alias';
     }
     if (element is TopLevelVariableElement) {
-      return "Rename Top-Level Variable";
+      return 'Rename Top-Level Variable';
     }
-    return "Rename Class";
+    return 'Rename Class';
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 74af165..2b783a0 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -213,19 +213,19 @@
   @override
   String toString() {
     StringBuffer buffer = StringBuffer();
-    buffer.write("SearchMatch(kind=");
+    buffer.write('SearchMatch(kind=');
     buffer.write(kind);
-    buffer.write(", libraryUri=");
+    buffer.write(', libraryUri=');
     buffer.write(librarySource.uri);
-    buffer.write(", unitUri=");
+    buffer.write(', unitUri=');
     buffer.write(unitSource.uri);
-    buffer.write(", range=");
+    buffer.write(', range=');
     buffer.write(sourceRange);
-    buffer.write(", isResolved=");
+    buffer.write(', isResolved=');
     buffer.write(isResolved);
-    buffer.write(", isQualified=");
+    buffer.write(', isQualified=');
     buffer.write(isQualified);
-    buffer.write(")");
+    buffer.write(')');
     return buffer.toString();
   }
 
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 1fbd016..daf1bf6 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -63,7 +63,7 @@
   void createAnalysisServer(ServerCommunicationChannel serverChannel) {
     if (analysisServer != null) {
       RequestError error = RequestError(
-          RequestErrorCode.SERVER_ALREADY_STARTED, "Server already started");
+          RequestErrorCode.SERVER_ALREADY_STARTED, 'Server already started');
       serverChannel.sendResponse(Response('', error: error));
       serverChannel.listen((Request request) {
         serverChannel.sendResponse(Response(request.id, error: error));
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 0d6cbec..6ef178f 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -288,7 +288,7 @@
   @override
   Future generateContent(Map<String, String> params) async {
     void writeRow(List<String> data, {List<String> classes}) {
-      buf.write("<tr>");
+      buf.write('<tr>');
       for (int i = 0; i < data.length; i++) {
         String c = classes == null ? null : classes[i];
         if (c != null) {
@@ -297,7 +297,7 @@
           buf.write('<td>${escape(data[i])}</td>');
         }
       }
-      buf.writeln("</tr>");
+      buf.writeln('</tr>');
     }
 
     buf.writeln('<div class="columns">');
@@ -346,16 +346,16 @@
 
     buf.write('<table>');
     writeRow([printInteger(requestCount), 'requests'],
-        classes: ["right", null]);
+        classes: ['right', null]);
     writeRow([printInteger(latencyCount), 'requests with latency information'],
-        classes: ["right", null]);
+        classes: ['right', null]);
     if (latencyCount > 0) {
       writeRow([printMilliseconds(averageLatency), 'average latency'],
-          classes: ["right", null]);
+          classes: ['right', null]);
       writeRow([printMilliseconds(maximumLatency), 'maximum latency'],
-          classes: ["right", null]);
+          classes: ['right', null]);
       writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'],
-          classes: ["right", null]);
+          classes: ['right', null]);
     }
     buf.write('</table>');
   }
@@ -512,11 +512,14 @@
     void writeFile(String file) {
       String astPath = '/ast?file=${Uri.encodeQueryComponent(file)}';
       String elementPath = '/element?file=${Uri.encodeQueryComponent(file)}';
+      String contentsPath = '/contents?file=${Uri.encodeQueryComponent(file)}';
+      bool hasOverlay = server.resourceProvider.hasOverlay(file);
 
       buf.write(file);
       buf.writeln(' <a href="$astPath">ast</a>');
-      buf.write(' ');
-      buf.writeln('<a href="$elementPath">element</a>');
+      buf.writeln(' <a href="$elementPath">element</a>');
+      buf.writeln(
+          ' <a href="$contentsPath">contents${hasOverlay ? '*' : ''}</a>');
     }
 
     h4('Priority files ${lenCounter(priorityFiles)}', raw: true);
@@ -591,6 +594,62 @@
   }
 }
 
+class ContentsPage extends DiagnosticPageWithNav {
+  String _description;
+
+  ContentsPage(DiagnosticsSite site)
+      : super(site, 'contents', 'Contents',
+            description: 'The Contents/Overlay of a file.');
+
+  @override
+  String get description => _description ?? super.description;
+
+  @override
+  bool get showInNav => false;
+
+  @override
+  Future<void> generateContent(Map<String, String> params) async {
+    String filePath = params['file'];
+    if (filePath == null) {
+      p('No file path provided.');
+      return;
+    }
+    AnalysisDriver driver = server.getAnalysisDriver(filePath);
+    if (driver == null) {
+      p('The file <code>${escape(filePath)}</code> is not being analyzed.',
+          raw: true);
+      return;
+    }
+    File file = await server.resourceProvider.getFile(filePath);
+    if (!file.exists) {
+      p('The file <code>${escape(filePath)}</code> does not exist.', raw: true);
+      return;
+    }
+
+    if (server.resourceProvider.hasOverlay(filePath)) {
+      p('Showing overlay for file.');
+    } else {
+      p('Showing file system contents for file.');
+    }
+
+    pre(() {
+      buf.write('<code>');
+      buf.write(escape(file.readAsStringSync()));
+      buf.writeln('</code>');
+    });
+  }
+
+  @override
+  Future<void> generatePage(Map<String, String> params) async {
+    try {
+      _description = params['file'];
+      await super.generatePage(params);
+    } finally {
+      _description = null;
+    }
+  }
+}
+
 /// A page with a proscriptive notion of layout.
 abstract class DiagnosticPage extends Page {
   final DiagnosticsSite site;
@@ -764,6 +823,7 @@
     pages.add(FeedbackPage(this));
     pages.add(AstPage(this));
     pages.add(ElementModelPage(this));
+    pages.add(ContentsPage(this));
   }
 
   @override
@@ -878,7 +938,7 @@
             raw: true);
         pre(() {
           buf.writeln('<code>${escape(ex.stackTrace.toString())}</code>');
-        }, classes: "scroll-table");
+        }, classes: 'scroll-table');
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/utilities/file_string_sink.dart b/pkg/analysis_server/lib/src/utilities/file_string_sink.dart
index fb7a5ea..70a92d5 100644
--- a/pkg/analysis_server/lib/src/utilities/file_string_sink.dart
+++ b/pkg/analysis_server/lib/src/utilities/file_string_sink.dart
@@ -20,7 +20,7 @@
   }
 
   @override
-  void writeAll(Iterable objects, [String separator = ""]) {
+  void writeAll(Iterable objects, [String separator = '']) {
     throw UnimplementedError();
   }
 
@@ -30,7 +30,7 @@
   }
 
   @override
-  void writeln([Object obj = ""]) {
+  void writeln([Object obj = '']) {
     var currentTimeMillis = DateTime.now().millisecondsSinceEpoch;
     _sink.writeln('$currentTimeMillis $obj');
   }
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 7d419f4..bbac385 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -128,7 +128,7 @@
       // The separator includes 'child:' but that has no newlines.
       String separator =
           getText(namedExp.offset, childArg.offset - namedExp.offset);
-      String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
+      String prefix = separator.contains(eol) ? '' : '$eol$indentNew';
       if (prefix.isEmpty) {
         _addInsertEdit(namedExp.offset + 'child:'.length, ' <Widget>[');
         _addRemoveEdit(SourceRange(childArg.offset - 2, 2));
@@ -136,8 +136,8 @@
         _addInsertEdit(listLoc, '<Widget>[');
       }
       String newChildArgSrc = childArgSrc.replaceAll(
-          RegExp("^$indentOld", multiLine: true), "$indentNew");
-      newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
+          RegExp('^$indentOld', multiLine: true), '$indentNew');
+      newChildArgSrc = '$prefix$newChildArgSrc,$eol$indentOld]';
       _addReplaceEdit(rangeNode(childArg), newChildArgSrc);
     }
   }
@@ -169,7 +169,7 @@
       // The separator includes 'child:' but that has no newlines.
       String separator =
           getText(namedExp.offset, childArg.offset - namedExp.offset);
-      String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
+      String prefix = separator.contains(eol) ? '' : '$eol$indentNew';
       if (prefix.isEmpty) {
         builder.addSimpleInsertion(
             namedExp.offset + 'child:'.length, ' <Widget>[');
@@ -178,8 +178,8 @@
         builder.addSimpleInsertion(listLoc, '<Widget>[');
       }
       String newChildArgSrc = childArgSrc.replaceAll(
-          RegExp("^$indentOld", multiLine: true), "$indentNew");
-      newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
+          RegExp('^$indentOld', multiLine: true), '$indentNew');
+      newChildArgSrc = '$prefix$newChildArgSrc,$eol$indentOld]';
       builder.addSimpleReplacement(rangeNode(childArg), newChildArgSrc);
     }
   }
diff --git a/pkg/analysis_server/lib/src/utilities/mocks.dart b/pkg/analysis_server/lib/src/utilities/mocks.dart
index a1b08ea..fc583aa 100644
--- a/pkg/analysis_server/lib/src/utilities/mocks.dart
+++ b/pkg/analysis_server/lib/src/utilities/mocks.dart
@@ -134,7 +134,7 @@
 
   @override
   String toString() {
-    return "Server Error: $message";
+    return 'Server Error: $message';
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/utilities/null_string_sink.dart b/pkg/analysis_server/lib/src/utilities/null_string_sink.dart
index d858600..fd6f22c 100644
--- a/pkg/analysis_server/lib/src/utilities/null_string_sink.dart
+++ b/pkg/analysis_server/lib/src/utilities/null_string_sink.dart
@@ -9,9 +9,9 @@
   @override
   void write(Object obj) {}
   @override
-  void writeAll(Iterable objects, [String separator = ""]) {}
+  void writeAll(Iterable objects, [String separator = '']) {}
   @override
   void writeCharCode(int charCode) {}
   @override
-  void writeln([Object obj = ""]) {}
+  void writeln([Object obj = '']) {}
 }
diff --git a/pkg/analysis_server/lib/src/utilities/tee_string_sink.dart b/pkg/analysis_server/lib/src/utilities/tee_string_sink.dart
index 5e02e2c..81c3d3d 100644
--- a/pkg/analysis_server/lib/src/utilities/tee_string_sink.dart
+++ b/pkg/analysis_server/lib/src/utilities/tee_string_sink.dart
@@ -18,7 +18,7 @@
   }
 
   @override
-  void writeAll(Iterable objects, [String separator = ""]) {
+  void writeAll(Iterable objects, [String separator = '']) {
     sink1.writeAll(objects, separator);
     sink2.writeAll(objects, separator);
   }
@@ -30,7 +30,7 @@
   }
 
   @override
-  void writeln([Object obj = ""]) {
+  void writeln([Object obj = '']) {
     sink1.writeln(obj);
     sink2.writeln(obj);
   }
diff --git a/pkg/analysis_server/test/analysis/get_signature_test.dart b/pkg/analysis_server/test/analysis/get_signature_test.dart
index 021baf1..b990b53 100644
--- a/pkg/analysis_server/test/analysis/get_signature_test.dart
+++ b/pkg/analysis_server/test/analysis/get_signature_test.dart
@@ -62,13 +62,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("MyClass"));
-    expect(result.dartdoc, equals("MyClass constructor doc"));
+    expect(result.name, equals('MyClass'));
+    expect(result.dartdoc, equals('MyClass constructor doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.NAMED, 'length', 'int')));
   }
 
   test_constructor_factory() async {
@@ -87,13 +87,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("MyClass"));
-    expect(result.dartdoc, equals("MyClass factory constructor doc"));
+    expect(result.name, equals('MyClass'));
+    expect(result.dartdoc, equals('MyClass factory constructor doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.NAMED, 'length', 'int')));
   }
 
   test_constructor_named() async {
@@ -108,13 +108,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("MyClass.foo"));
-    expect(result.dartdoc, equals("MyClass.foo constructor doc"));
+    expect(result.name, equals('MyClass.foo'));
+    expect(result.dartdoc, equals('MyClass.foo constructor doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.NAMED, 'length', 'int')));
   }
 
   test_does_not_walk_up_over_closure() async {
@@ -169,11 +169,11 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("f"));
-    expect(result.dartdoc, equals("f doc"));
+    expect(result.name, equals('f'));
+    expect(result.dartdoc, equals('f doc'));
     expect(result.parameters, hasLength(1));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "s", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 's', 'String')));
   }
 
   test_function_from_other_file() async {
@@ -191,13 +191,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'length', 'int')));
   }
 
   test_function_irrelevant_parens() async {
@@ -209,13 +209,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'length', 'int')));
   }
 
   test_function_named() async {
@@ -227,13 +227,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.NAMED, 'length', 'int')));
   }
 
   test_function_named_with_default_int() async {
@@ -245,15 +245,15 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(
         result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "length", "int",
-            defaultValue: "1")));
+        equals(ParameterInfo(ParameterKind.NAMED, 'length', 'int',
+            defaultValue: '1')));
   }
 
   test_function_named_with_default_string() async {
@@ -265,14 +265,14 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(
         result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "email", "String",
+        equals(ParameterInfo(ParameterKind.NAMED, 'email', 'String',
             defaultValue: '"a@b.c"')));
   }
 
@@ -288,11 +288,11 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("two"));
-    expect(result.dartdoc, equals("two doc"));
+    expect(result.name, equals('two'));
+    expect(result.dartdoc, equals('two doc'));
     expect(result.parameters, hasLength(1));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "two", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'two', 'String')));
   }
 
   test_function_nested_call_outer() async {
@@ -307,11 +307,11 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(1));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "one", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'one', 'String')));
   }
 
   test_function_no_dart_doc() async {
@@ -322,13 +322,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
+    expect(result.name, equals('one'));
     expect(result.dartdoc, isNull);
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'length', 'int')));
   }
 
   test_function_optional() async {
@@ -340,13 +340,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.OPTIONAL, "length", "int")));
+        equals(ParameterInfo(ParameterKind.OPTIONAL, 'length', 'int')));
   }
 
   test_function_optional_with_default() async {
@@ -358,15 +358,15 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(
         result.parameters[1],
-        equals(ParameterInfo(ParameterKind.OPTIONAL, "length", "int",
-            defaultValue: "11")));
+        equals(ParameterInfo(ParameterKind.OPTIONAL, 'length', 'int',
+            defaultValue: '11')));
   }
 
   test_function_required() async {
@@ -378,13 +378,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'length', 'int')));
   }
 
   test_function_zero_arguments() async {
@@ -396,8 +396,8 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("one"));
-    expect(result.dartdoc, equals("one doc"));
+    expect(result.name, equals('one'));
+    expect(result.dartdoc, equals('one doc'));
     expect(result.parameters, hasLength(0));
   }
 
@@ -436,13 +436,13 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("myMethod"));
-    expect(result.dartdoc, equals("MyClass instance method"));
+    expect(result.name, equals('myMethod'));
+    expect(result.dartdoc, equals('MyClass instance method'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.NAMED, 'length', 'int')));
   }
 
   test_method_static() async {
@@ -459,12 +459,12 @@
 }
 ''');
     var result = await prepareSignature('/*^*/');
-    expect(result.name, equals("myStaticMethod"));
-    expect(result.dartdoc, equals("MyClass static method"));
+    expect(result.name, equals('myStaticMethod'));
+    expect(result.dartdoc, equals('MyClass static method'));
     expect(result.parameters, hasLength(2));
     expect(result.parameters[0],
-        equals(ParameterInfo(ParameterKind.REQUIRED, "name", "String")));
+        equals(ParameterInfo(ParameterKind.REQUIRED, 'name', 'String')));
     expect(result.parameters[1],
-        equals(ParameterInfo(ParameterKind.NAMED, "length", "int")));
+        equals(ParameterInfo(ParameterKind.NAMED, 'length', 'int')));
   }
 }
diff --git a/pkg/analysis_server/test/analysis/notification_closing_labels_test.dart b/pkg/analysis_server/test/analysis/notification_closing_labels_test.dart
index 78d5c35..f234b5b 100644
--- a/pkg/analysis_server/test/analysis/notification_closing_labels_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_closing_labels_test.dart
@@ -32,8 +32,8 @@
 ''';
 
   static final expectedResults = [
-    ClosingLabel(51, 96, "Row"),
-    ClosingLabel(79, 57, "<Widget>[]")
+    ClosingLabel(51, 96, 'Row'),
+    ClosingLabel(79, 57, '<Widget>[]')
   ];
 
   List<ClosingLabel> lastLabels;
@@ -50,7 +50,7 @@
       }
     } else if (notification.event == SERVER_NOTIFICATION_ERROR) {
       var params = ServerErrorParams.fromNotification(notification);
-      throw "${params.message}\n${params.stackTrace}";
+      throw '${params.message}\n${params.stackTrace}';
     }
   }
 
@@ -93,7 +93,7 @@
     expect(lastLabels, expectedResults);
   }
 
-  Future waitForLabels(action()) {
+  Future waitForLabels(void Function() action) {
     _labelsReceived = Completer();
     action();
     return _labelsReceived.future;
diff --git a/pkg/analysis_server/test/analysis/notification_folding_test.dart b/pkg/analysis_server/test/analysis/notification_folding_test.dart
index e866182..5fe6591 100644
--- a/pkg/analysis_server/test/analysis/notification_folding_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_folding_test.dart
@@ -48,7 +48,7 @@
       }
     } else if (notification.event == SERVER_NOTIFICATION_ERROR) {
       var params = ServerErrorParams.fromNotification(notification);
-      throw "${params.message}\n${params.stackTrace}";
+      throw '${params.message}\n${params.stackTrace}';
     }
   }
 
@@ -91,7 +91,7 @@
     expect(lastRegions, expectedResults);
   }
 
-  Future waitForFolding(action()) {
+  Future waitForFolding(void Function() action) {
     _regionsReceived = Completer();
     action();
     return _regionsReceived.future;
diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
index 99b13dd..d11be59 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
@@ -466,7 +466,7 @@
 part 'part.dart';
 ''');
     await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, "library lib;");
+    assertHasStringRegion(HighlightRegionType.DIRECTIVE, 'library lib;');
     assertHasStringRegion(HighlightRegionType.DIRECTIVE, "import 'dart:math';");
     assertHasStringRegion(HighlightRegionType.DIRECTIVE, "export 'dart:math';");
     assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part 'part.dart';");
@@ -478,7 +478,7 @@
 ''');
     _addLibraryForTestPart();
     await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part of lib;");
+    assertHasStringRegion(HighlightRegionType.DIRECTIVE, 'part of lib;');
   }
 
   test_DYNAMIC_LOCAL_VARIABLE() async {
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
index 07be848..46dc6f6 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
@@ -466,7 +466,7 @@
 part 'part.dart';
 ''');
     await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, "library lib;");
+    assertHasStringRegion(HighlightRegionType.DIRECTIVE, 'library lib;');
     assertHasStringRegion(HighlightRegionType.DIRECTIVE, "import 'dart:math';");
     assertHasStringRegion(HighlightRegionType.DIRECTIVE, "export 'dart:math';");
     assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part 'part.dart';");
@@ -478,7 +478,7 @@
 ''');
     _addLibraryForTestPart();
     await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part of lib;");
+    assertHasStringRegion(HighlightRegionType.DIRECTIVE, 'part of lib;');
   }
 
   test_DYNAMIC_TYPE() async {
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index d479a4c..6ddeec3 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -358,8 +358,8 @@
 ''');
     await prepareNavigation();
     // has region for complete "A.named"
-    assertHasRegion("A(BBB");
-    assertHasTarget("A(BBB", 0);
+    assertHasRegion('A(BBB');
+    assertHasTarget('A(BBB', 0);
     // validate that we don't forget to resolve parameters
     assertHasRegionTarget('BBB p', 'BBB {}');
   }
diff --git a/pkg/analysis_server/test/analysis/update_content_test.dart b/pkg/analysis_server/test/analysis/update_content_test.dart
index 68470c1..832daf8 100644
--- a/pkg/analysis_server/test/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -33,7 +33,7 @@
     if (notification.event == ANALYSIS_NOTIFICATION_ERRORS) {
       var decoded = AnalysisErrorsParams.fromNotification(notification);
       String _format(AnalysisError e) =>
-          "${e.location.startLine}: ${e.message}";
+          '${e.location.startLine}: ${e.message}';
       filesErrors[decoded.file] = decoded.errors.map(_format).toList();
     }
     if (notification.event == ANALYSIS_NOTIFICATION_NAVIGATION) {
@@ -144,7 +144,7 @@
         {'/project/target.dart': AddContentOverlay('import "none.dart";')});
     await server.onAnalysisComplete;
     expect(filesErrors, {
-      '/project/main.dart': ["1: Unused import."],
+      '/project/main.dart': ['1: Unused import.'],
       '/project/target.dart': ["1: Target of URI doesn't exist: 'none.dart'."],
       '/project/none.dart': []
     });
diff --git a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
index 9050f25..1f181bc 100644
--- a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
+++ b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
@@ -216,8 +216,8 @@
         .flush()
         .then((_) => requestStream.first.timeout(Duration(seconds: 1)))
         .then((Request request) {
-      expect(request.id, equals("0"));
-      expect(request.method, equals("server.version"));
+      expect(request.id, equals('0'));
+      expect(request.method, equals('server.version'));
     });
   }
 
@@ -286,13 +286,13 @@
   void write(Object obj) {}
 
   @override
-  void writeAll(Iterable objects, [String separator = ""]) {}
+  void writeAll(Iterable objects, [String separator = '']) {}
 
   @override
   void writeCharCode(int charCode) {}
 
   @override
-  void writeln([Object obj = ""]) {
+  void writeln([Object obj = '']) {
     Timer(Duration(milliseconds: 10), () {
       throw '42';
     });
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index d4205cd..ec85f5e 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -42,26 +42,26 @@
   void buildCommentSnippetTests() {
     buildTests('testCommentSnippets001', '''
 class X {static final num MAX = 0;num yc,xc;mth() {xc = yc = MA!1X;x!2c.abs();num f = M!3AX;}}''',
-        <String>["1+MAX", "2+xc", "3+MAX"]);
+        <String>['1+MAX', '2+xc', '3+MAX']);
 
     buildTests('testCommentSnippets002', '''
 class Y {String x='hi';mth() {x.l!1ength;int n = 0;x!2.codeUnitAt(n!3);}}''',
-        <String>["1+length", "2+x", "3+n"]);
+        <String>['1+length', '2+x', '3+n']);
 
     buildTests('testCommentSnippets004', '''
 class A {!1int x; !2mth() {!3int y = this.!5x!6;}}class B{}''',
-        <String>["1+A", "2+B", "3+x", "3-y", "5+mth", "6+x"]);
+        <String>['1+A', '2+B', '3+x', '3-y', '5+mth', '6+x']);
 
     buildTests('testCommentSnippets005', '''
 class Date { static Date JUN, JUL;}class X { m() { return Da!1te.JU!2L; }}''',
-        <String>["1+Date", "2+JUN", "2+JUL"]);
+        <String>['1+Date', '2+JUN', '2+JUL']);
 
     buildTests('testCommentSnippets007', '''
 class C {mth(Map x, !1) {}mtf(!2, Map x) {}m() {for (in!3t i=0; i<5; i++); A!4 x;}}class int{}class Arrays{}''',
-        <String>["1+bool", "2+bool", "3+int", "4+Arrays"]);
+        <String>['1+bool', '2+bool', '3+int', '4+Arrays']);
 
     buildTests('testCommentSnippets008', '''
-class Date{}final num M = Dat!1''', <String>["1+Date"]);
+class Date{}final num M = Dat!1''', <String>['1+Date']);
 
     // space, char, eol are important
     buildTests(
@@ -69,181 +69,181 @@
         '''
 class Maps{}class x extends!5 !2M!3 !4implements!6 !1\n{}''',
         <String>[
-          "1+Map",
-          "2+Maps",
-          "3+Maps",
-          "4-Maps",
-          "4+implements",
-          "5-Maps",
-          "6-Map",
-          "6+implements"
+          '1+Map',
+          '2+Maps',
+          '3+Maps',
+          '4-Maps',
+          '4+implements',
+          '5-Maps',
+          '6-Map',
+          '6+implements'
         ],
         failingTests: '46');
 
     // space, char, eol are important
     buildTests('testCommentSnippets010', '''
-class x implements !1{}''', <String>["1+Map"]);
+class x implements !1{}''', <String>['1+Map']);
 
     // space, char, eol are important
     buildTests('testCommentSnippets011', '''
-class x implements M!1{}''', <String>["1+Map"]);
+class x implements M!1{}''', <String>['1+Map']);
 
     // space, char, eol are important
     buildTests('testCommentSnippets012', '''
-class x implements M!1\n{}''', <String>["1+Map"]);
+class x implements M!1\n{}''', <String>['1+Map']);
 
     buildTests('testCommentSnippets013', '''
-class x !2{!1}!3''', <String>["1+num", "2-num", "3+num"]);
+class x !2{!1}!3''', <String>['1+num', '2-num', '3+num']);
 
     // trailing space is important
     buildTests('testCommentSnippets014', '''
-typedef n!1 ;''', <String>["1+num"]);
+typedef n!1 ;''', <String>['1+num']);
 
     buildTests('testCommentSnippets015', '''
-class D {f(){} g(){f!1(f!2);}}''', <String>["1+f", "2+f"]);
+class D {f(){} g(){f!1(f!2);}}''', <String>['1+f', '2+f']);
 
     buildTests('testCommentSnippets016', '''
-class F {m() { m(); !1}}''', <String>["1+m"]);
+class F {m() { m(); !1}}''', <String>['1+m']);
 
     buildTests('testCommentSnippets017', '''
-class F {var x = !1false;}''', <String>["1+true"]);
+class F {var x = !1false;}''', <String>['1+true']);
 
     buildTests('testCommentSnippets018', '''
 class Map{}class Arrays{}class C{ m(!1){} n(!2 x, q)''',
-        <String>["1+Map", "1-void", "1-null", "2+Arrays", "2-void", "2-null"]);
+        <String>['1+Map', '1-void', '1-null', '2+Arrays', '2-void', '2-null']);
 
     buildTests('testCommentSnippets019', '''
-class A{m(){Object x;x.!1/**/clear()''', <String>["1+toString"]);
+class A{m(){Object x;x.!1/**/clear()''', <String>['1+toString']);
 
     buildTests('testCommentSnippets020', '''
 classMap{}class tst {var newt;void newf(){}test() {var newz;new!1/**/;}}''',
-        <String>["1+newt", "1+newf", "1+newz", "1-Map"]);
+        <String>['1+newt', '1+newf', '1+newz', '1-Map']);
 
     buildTests('testCommentSnippets021', '''
 class Map{}class tst {var newt;void newf(){}test() {var newz;new !1/**/;}}''',
-        <String>["1+Map", "1-newt"]);
+        <String>['1+Map', '1-newt']);
 
     buildTests('testCommentSnippets022', '''
-class Map{}class F{m(){new !1;}}''', <String>["1+Map"]);
+class Map{}class F{m(){new !1;}}''', <String>['1+Map']);
 
     buildTests('testCommentSnippets022a', '''
-class Map{}class F{m(){new !1''', <String>["1+Map"]);
+class Map{}class F{m(){new !1''', <String>['1+Map']);
 
     buildTests('testCommentSnippets022b', '''
 class Map{factory Map.qq(){return null;}}class F{m(){new Map.!1qq();}}''',
-        <String>["1+qq"]);
+        <String>['1+qq']);
 
     buildTests('testCommentSnippets023', '''
 class X {X c; X(this.!1c!3) : super() {c.!2}}''',
-        <String>["1+c", "2+c", "3+c"]);
+        <String>['1+c', '2+c', '3+c']);
 
     buildTests('testCommentSnippets024', '''
-class q {m(Map q){var x;m(!1)}n(){var x;n(!2)}}''', <String>["1+x", "2+x"]);
+class q {m(Map q){var x;m(!1)}n(){var x;n(!2)}}''', <String>['1+x', '2+x']);
 
     buildTests('testCommentSnippets025', '''
 class q {num m() {var q; num x=!1 q!3 + !2/**/;}}''',
-        <String>["1+q", "2+q", "3+q"]);
+        <String>['1+q', '2+q', '3+q']);
 
     buildTests('testCommentSnippets026', '''
-class List{}class a implements !1{}''', <String>["1+List"]);
+class List{}class a implements !1{}''', <String>['1+List']);
 
     buildTests('testCommentSnippets027', '''
 class String{}class List{}class test <X extends !1String!2> {}''',
-        <String>["1+List", "2+String", "2-List"]);
+        <String>['1+List', '2+String', '2-List']);
 
     buildTests('testCommentSnippets028', '''
 class String{}class List{}class DateTime{}typedef T Y<T extends !1>(List input);''',
-        <String>["1+DateTime", "1+String"]);
+        <String>['1+DateTime', '1+String']);
 
     // https://github.com/dart-lang/sdk/issues/33992
     buildTests(
         'testCommentSnippets029',
         '''
 interface A<X> default B<X extends !1List!2> {}''',
-        <String>["1+DateTime", "2+List"],
+        <String>['1+DateTime', '2+List'],
         failingTests: '12');
 
     buildTests('testCommentSnippets030', '''
 class Bar<T extends Foo> {const Bar(!1T!2 k);T!3 m(T!4 a, T!5 b){}final T!6 f = null;}''',
-        <String>["1+T", "2+T", "3+T", "4+T", "5+T", "6+T"]);
+        <String>['1+T', '2+T', '3+T', '4+T', '5+T', '6+T']);
 
     buildTests('testCommentSnippets031', '''
 class Bar<T extends Foo> {m(x){if (x is !1) return;if (x is!!!2)}}''',
-        <String>["1+Bar", "1+T", "2+T", "2+Bar"]);
+        <String>['1+Bar', '1+T', '2+T', '2+Bar']);
 
     buildTests(
         'testCommentSnippets032',
         '''
 class Fit{}class Bar<T extends Fooa> {const !2F!1ara();}''',
-        <String>["1+Fit", "1+Fara", "1-Bar", "2+Fit"],
+        <String>['1+Fit', '1+Fara', '1-Bar', '2+Fit'],
         failingTests: '1');
 
     // Type propagation
     buildTests('testCommentSnippets033', '''
 class List{add(){}length(){}}t1() {var x;if (x is List) {x.!1add(3);}}''',
-        <String>["1+add", "1+length"]);
+        <String>['1+add', '1+length']);
 
     // Type propagation
     buildTests('testCommentSnippets035', '''
 class List{clear(){}length(){}}t3() {var x=new List(), y=x.!1length();x.!2clear();}''',
-        <String>["1+length", "2+clear"]);
+        <String>['1+length', '2+clear']);
 
     buildTests('testCommentSnippets036', '''
-class List{}t3() {var x=new List!1}''', <String>["1+List"]);
+class List{}t3() {var x=new List!1}''', <String>['1+List']);
 
     buildTests('testCommentSnippets037', '''
 class List{factory List.from(){}}t3() {var x=new List.!1}''',
-        <String>["1+from"]);
+        <String>['1+from']);
 
     buildTests('testCommentSnippets038', '''
-f(){int xa; String s = '\$x!1';}''', <String>["1+xa"]);
+f(){int xa; String s = '\$x!1';}''', <String>['1+xa']);
 
     buildTests('testCommentSnippets038a', '''
-int xa; String s = '\$x!1\'''', <String>["1+xa"]);
+int xa; String s = '\$x!1\'''', <String>['1+xa']);
 
     buildTests('testCommentSnippets039', '''
-f(){int xa; String s = '\$!1';}''', <String>["1+xa"]);
+f(){int xa; String s = '\$!1';}''', <String>['1+xa']);
 
     buildTests('testCommentSnippets039a', '''
-int xa; String s = '\$!1\'''', <String>["1+xa"]);
+int xa; String s = '\$!1\'''', <String>['1+xa']);
 
     buildTests('testCommentSnippets040', '''
 class List{add(){}}class Map{}class X{m(){List list; list.!1 Map map;}}''',
-        <String>["1+add"]);
+        <String>['1+add']);
 
     buildTests('testCommentSnippets041', '''
 class List{add(){}length(){}}class X{m(){List list; list.!1 zox();}}''',
-        <String>["1+add"]);
+        <String>['1+add']);
 
     buildTests('testCommentSnippets042', '''
 class DateTime{static const int WED=3;int get day;}fd(){DateTime d=new DateTime.now();d.!1WED!2;}''',
-        <String>["1+day", "2-WED"]);
+        <String>['1+day', '2-WED']);
 
     buildTests('testCommentSnippets043', '''
-class L{var k;void.!1}''', <String>["1-k"]);
+class L{var k;void.!1}''', <String>['1-k']);
 
     buildTests('testCommentSnippets044', '''
 class List{}class XXX {XXX.fisk();}main() {main(); new !1}}''',
-        <String>["1+List", "1+XXX.fisk"]);
+        <String>['1+List', '1+XXX.fisk']);
 
     buildTests('testCommentSnippets047', '''
-f(){int x;int y=!1;}''', <String>["1+x"]);
+f(){int x;int y=!1;}''', <String>['1+x']);
 
     buildTests('testCommentSnippets048', '''
-import 'dart:convert' as json;f() {var x=new js!1}''', <String>["1+json"]);
+import 'dart:convert' as json;f() {var x=new js!1}''', <String>['1+json']);
 
     buildTests('testCommentSnippets049', '''
 import 'dart:convert' as json;
 import 'dart:convert' as jxx;
 class JsonDecoderX{}
 f1() {var x=new !2j!1s!3}''', <String>[
-      "1+json",
-      "1+jxx",
-      "2+json",
-      "2+jxx",
-      "2-JsonDecoder",
-      "3+json",
-      "3-jxx"
+      '1+json',
+      '1+jxx',
+      '2+json',
+      '2+jxx',
+      '2-JsonDecoder',
+      '3+json',
+      '3-jxx'
     ]);
 
     buildTests('testCommentSnippets050', '''
@@ -258,16 +258,16 @@
   new x!1dr().f();
   const x!2dr.!3a(1, 2, 3);
 }''', <String>[
-      "1+xdr",
-      "1+xa",
-      "1+xdr.a",
-      "1+xdr.b",
-      "2+xa", // suggest default constructor
-      "2+xdr", // suggest normal constructor
-      "2+xdr.a",
-      "2+xdr.b", // suggest named constructor
-      "3+b", // suggest named constructor
-      "3+a"
+      '1+xdr',
+      '1+xa',
+      '1+xdr.a',
+      '1+xdr.b',
+      '2+xa', // suggest default constructor
+      '2+xdr', // suggest normal constructor
+      '2+xdr.a',
+      '2+xdr.b', // suggest named constructor
+      '3+b', // suggest named constructor
+      '3+a'
     ]);
 
     // Type propagation.
@@ -279,7 +279,7 @@
     v.!1length;
     v.!2getKeys;
   }
-}''', <String>["1+length", "2-getKeys"]);
+}''', <String>['1+length', '2-getKeys']);
 
     // Type propagation.
     buildTests('testCommentSnippets052', '''
@@ -290,7 +290,7 @@
     v.!1toUpperCase;
     v.!2getKeys;
   }
-}''', <String>["1+toUpperCase", "2-getKeys"]);
+}''', <String>['1+toUpperCase', '2-getKeys']);
 
     buildTests('testCommentSnippets055', '''
 class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
@@ -299,7 +299,7 @@
   if (v is Object) {
     v.!1toUpperCase;
   }
-}''', <String>["1+toUpperCase"]);
+}''', <String>['1+toUpperCase']);
 
     buildTests(
         'testCommentSnippets058',
@@ -310,11 +310,11 @@
   callback v;
   x(!1);
 }''',
-        <String>["1+v", "2+void"],
+        <String>['1+v', '2+void'],
         failingTests: '2');
 
     buildTests('testCommentSnippets059', '''
-f(){((int x) => x+4).!1call(1);}''', <String>["1-call"]);
+f(){((int x) => x+4).!1call(1);}''', <String>['1-call']);
 
     buildTests('testCommentSnippets060', '''
 class Map{}
@@ -324,11 +324,11 @@
   f() {
     x!1
   }
-}''', <String>["1+x", "1-x[]"]);
+}''', <String>['1+x', '1-x[]']);
 
     buildTests('testCommentSnippets061', '''
 class A{m(){!1f(3);!2}}n(){!3f(3);!4}f(x)=>x*3;''',
-        <String>["1+f", "1+n", "2+f", "2+n", "3+f", "3+n", "4+f", "4+n"]);
+        <String>['1+f', '1+n', '2+f', '2+n', '3+f', '3+n', '4+f', '4+n']);
 
     buildTests('testCommentSnippets064', '''
 class Spline {
@@ -354,17 +354,17 @@
     return null;
   }
 }''', <String>[
-      "1+a",
-      "2+b",
-      "1-g",
-      "2-h",
-      "3+b",
-      "4+c",
-      "5+a",
-      "6+c",
-      "7+g",
-      "8+j",
-      "9+h"
+      '1+a',
+      '2+b',
+      '1-g',
+      '2-h',
+      '3+b',
+      '4+c',
+      '5+a',
+      '6+c',
+      '7+g',
+      '8+j',
+      '9+h'
     ]);
 
     buildTests('testCommentSnippets065', '''
@@ -389,7 +389,7 @@
   Spline h() {
     return null;
   }
-}''', <String>["1+a"]);
+}''', <String>['1+a']);
 
     buildTests('testCommentSnippets066', '''
 class Spline {
@@ -413,7 +413,7 @@
   Spline h() {
     return null;
   }
-}''', <String>["1+b"]);
+}''', <String>['1+b']);
 
     buildTests('testCommentSnippets067', '''
 class Spline {
@@ -437,7 +437,7 @@
   Spline h() {
     return null;
   }
-}''', <String>["1+b"]);
+}''', <String>['1+b']);
 
     buildTests('testCommentSnippets068', '''
 class Spline {
@@ -461,7 +461,7 @@
   Spline h() {
     return null;
   }
-}''', <String>["1+c"]);
+}''', <String>['1+c']);
 
     buildTests('testCommentSnippets069', '''
 class Spline {
@@ -485,7 +485,7 @@
   Spline h() {
     return null;
   }
-}''', <String>["1+c"]);
+}''', <String>['1+c']);
 
     buildTests('testCommentSnippets070', '''
 class Spline {
@@ -509,7 +509,7 @@
   Spline h() {
     return null;
   }
-}''', <String>["1+b"]);
+}''', <String>['1+b']);
 
     buildTests('testCommentSnippets072', '''
 class X {
@@ -519,7 +519,7 @@
 f() {
   X x = new X();
   x.!1p = 3;
-}''', <String>["1+p"]);
+}''', <String>['1+p']);
 
     buildTests('testCommentSnippets073', '''
 class X {
@@ -530,7 +530,7 @@
 }
 class JSON {
   static stringify() {}
-}''', <String>["1+stringify"]);
+}''', <String>['1+stringify']);
 
     buildTests('testCommentSnippets074', '''
 class X {
@@ -538,18 +538,18 @@
     _x!1
   }
   _x1(){}
-}''', <String>["1+_x1"]);
+}''', <String>['1+_x1']);
 
     buildTests('testCommentSnippets075', '''
-p(x)=>0;var E;f(q)=>!1p(!2E);''', <String>["1+p", "2+E"]);
+p(x)=>0;var E;f(q)=>!1p(!2E);''', <String>['1+p', '2+E']);
 
     buildTests('testCommentSnippets076', '''
 class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3int>>();}''',
-        <String>["1+List", "2+int", "3+int"]);
+        <String>['1+List', '2+int', '3+int']);
 
     buildTests('testCommentSnippets076a', '''
 class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3>>();}''',
-        <String>["1+List", "2+int", "3+int"]);
+        <String>['1+List', '2+int', '3+int']);
 
     buildTests('testCommentSnippets077', '''
 class FileMode {
@@ -566,30 +566,30 @@
   factory File.fromPath(Path path) => null;
 }
 f() => new Fil!1''', <String>[
-      "1+File",
-      "1+File.fromPath",
-      "1+FileMode",
-      "1+FileMode._internal1",
-      "1+FileMode._internal"
+      '1+File',
+      '1+File.fromPath',
+      '1+FileMode',
+      '1+FileMode._internal1',
+      '1+FileMode._internal'
     ]);
 
     buildTests('testCommentSnippets078', '''
 class Map{static from()=>null;clear(){}}void main() { Map.!1 }''',
-        <String>["1+from", "1-clear"]); // static method, instance method
+        <String>['1+from', '1-clear']); // static method, instance method
 
     buildTests('testCommentSnippets079', '''
 class Map{static from()=>null;clear(){}}void main() { Map s; s.!1 }''',
-        <String>["1-from", "1+clear"]); // static method, instance method
+        <String>['1-from', '1+clear']); // static method, instance method
 
     buildTests('testCommentSnippets080', '''
 class RuntimeError{var message;}void main() { RuntimeError.!1 }''',
-        <String>["1-message"]); // field
+        <String>['1-message']); // field
 
     buildTests(
         'testCommentSnippets081',
         '''
 class Foo {this.!1}''',
-        <String>["1-Object"],
+        <String>['1-Object'],
         failingTests: '1');
 
     // https://github.com/dart-lang/sdk/issues/33992
@@ -601,32 +601,32 @@
         main() {
           var v = (HttpRequest req, HttpResp!1)
         }''',
-        <String>["1+HttpResponse"],
+        <String>['1+HttpResponse'],
         failingTests: '1');
 
     buildTests('testCommentSnippets083', '''
-main() {(.!1)}''', <String>["1-toString"]);
+main() {(.!1)}''', <String>['1-toString']);
 
     buildTests('testCommentSnippets083a', '''
-main() { .!1 }''', <String>["1-toString"]);
+main() { .!1 }''', <String>['1-toString']);
 
     buildTests('testCommentSnippets083b', '''
-main() { null.!1 }''', <String>["1+toString"]);
+main() { null.!1 }''', <String>['1+toString']);
 
     buildTests('testCommentSnippets085', '''
 class List{}class Map{}class Z extends List with !1Ma!2p {}''',
-        <String>["1+List", "1+Map", "2+Map", "2-List"]);
+        <String>['1+List', '1+Map', '2+Map', '2-List']);
 
     buildTests(
         'testCommentSnippets086',
         '''
 class Q{f(){xy() {!2};x!1y();}}''',
-        <String>["1+xy", "2+f", "2-xy"],
+        <String>['1+xy', '2+f', '2-xy'],
         failingTests: '2');
 
     buildTests('testCommentSnippets087', '''
 class Map{}class Q extends Object with !1Map {}''',
-        <String>["1+Map", "1-HashMap"]);
+        <String>['1+Map', '1-HashMap']);
 
     buildTests('testCommentSnippets088', '''
 class A {
@@ -640,7 +640,7 @@
 class Z {
   B q;
   f() {q.!1}
-}''', <String>["1+f", "1+m"]); // f->num, m()->A
+}''', <String>['1+f', '1+m']); // f->num, m()->A
 
     buildTests(
         'testCommentSnippets089',
@@ -664,46 +664,46 @@
   }
 }''',
         <String>[
-          "1+fqe",
-          "1+fqi",
-          "1+Q",
-          "1-xya",
-          "1-xyb",
-          "1-xza",
-          "2+fqe",
-          "2+fqi",
-          "2+Q",
-          "2-xya",
-          "2-xyb",
-          "2-xza",
-          "3+fqe",
-          "3+fqi",
-          "3+Q",
-          "3-xya",
-          "3+xyb",
-          "3-xza",
-          "4+fqe",
-          "4+fqi",
-          "4+Q",
-          "4+xya",
-          "4-xyb",
-          "4+xza",
-          "5+fqe",
-          "5+fqi",
-          "5+Q",
-          "5-xya",
-          "5-xyb",
-          "5-xza"
+          '1+fqe',
+          '1+fqi',
+          '1+Q',
+          '1-xya',
+          '1-xyb',
+          '1-xza',
+          '2+fqe',
+          '2+fqi',
+          '2+Q',
+          '2-xya',
+          '2-xyb',
+          '2-xza',
+          '3+fqe',
+          '3+fqi',
+          '3+Q',
+          '3-xya',
+          '3+xyb',
+          '3-xza',
+          '4+fqe',
+          '4+fqi',
+          '4+Q',
+          '4+xya',
+          '4-xyb',
+          '4+xza',
+          '5+fqe',
+          '5+fqi',
+          '5+Q',
+          '5-xya',
+          '5-xyb',
+          '5-xza'
         ],
         failingTests: '123');
 
     buildTests('testCommentSnippets090', '''
-class X { f() { var a = 'x'; a.!1 }}''', <String>["1+length"]);
+class X { f() { var a = 'x'; a.!1 }}''', <String>['1+length']);
   }
 
   void buildCompletionTests() {
     buildTests('testCompletion_alias_field', '''
-typedef int fnint(int k); fn!1int x;''', <String>["1+fnint"]);
+typedef int fnint(int k); fn!1int x;''', <String>['1+fnint']);
 
     buildTests(
         'testCompletion_annotation_argumentList',
@@ -716,9 +716,9 @@
 main() {
 }''',
         <String>[
-          "1+AAA" /*":" + ProposalKind.ARGUMENT_LIST*/,
-          "1+aaa",
-          "1+bbb"
+          '1+AAA' /*":" + ProposalKind.ARGUMENT_LIST*/,
+          '1+aaa',
+          '1+bbb'
         ],
         failingTests: '1');
 
@@ -732,7 +732,7 @@
 @foo!1
 main() {
 }''',
-        <String>["1+fooConst", "1-fooNotConst", "1-bar"],
+        <String>['1+fooConst', '1-fooNotConst', '1-bar'],
         failingTests: '1');
 
     buildTests('testCompletion_annotation_type', '''
@@ -743,8 +743,8 @@
 @AAA!1
 main() {
 }''', <String>[
-      "1+AAA" /*":" + ProposalKind.CONSTRUCTOR*/,
-      "1+AAA.nnn" /*":" + ProposalKind.CONSTRUCTOR*/
+      '1+AAA' /*":" + ProposalKind.CONSTRUCTOR*/,
+      '1+AAA.nnn' /*":" + ProposalKind.CONSTRUCTOR*/
     ]);
 
     buildTests('testCompletion_annotation_type_inClass_withoutMember', '''
@@ -755,7 +755,7 @@
 class C {
   @A!1
 }''', <String>[
-      "1+AAA" /*":" + ProposalKind.CONSTRUCTOR*/
+      '1+AAA' /*":" + ProposalKind.CONSTRUCTOR*/
     ]);
 
     buildTests('testCompletion_argument_typeName', '''
@@ -765,7 +765,7 @@
 f(Enum e) {}
 main() {
   f(En!1);
-}''', <String>["1+Enum"]);
+}''', <String>['1+Enum']);
 
     buildTests('testCompletion_arguments_ignoreEmpty', '''
 class A {
@@ -773,13 +773,13 @@
 }
 main(A a) {
   a.test(!1);
-}''', <String>["1-test"]);
+}''', <String>['1-test']);
 
     buildTests('testCompletion_as_asIdentifierPrefix', '''
 main(p) {
   var asVisible;
   var v = as!1;
-}''', <String>["1+asVisible"]);
+}''', <String>['1+asVisible']);
 
     buildTests('testCompletion_as_asPrefixedIdentifierStart', '''
 class A {
@@ -788,14 +788,14 @@
 
 main(A p) {
   var v = p.as!1;
-}''', <String>["1+asVisible"]);
+}''', <String>['1+asVisible']);
 
     buildTests('testCompletion_as_incompleteStatement', '''
 class MyClass {}
 main(p) {
   var justSomeVar;
   var v = p as !1
-}''', <String>["1+MyClass", "1-justSomeVar"]);
+}''', <String>['1+MyClass', '1-justSomeVar']);
 
     buildTests('testCompletion_cascade', '''
 class A {
@@ -805,37 +805,37 @@
 
 main(A a) {
   a..!1 aaa();
-}''', <String>["1+aaa", "1-main"]);
+}''', <String>['1+aaa', '1-main']);
 
     buildTests('testCompletion_combinator_afterComma', '''
 import 'dart:math' show cos, !1;''',
-        <String>["1+PI", "1+sin", "1+Random", "1-String"]);
+        <String>['1+PI', '1+sin', '1+Random', '1-String']);
 
     buildTests('testCompletion_combinator_ended', '''
 import 'dart:math' show !1;"''',
-        <String>["1+PI", "1+sin", "1+Random", "1-String"]);
+        <String>['1+PI', '1+sin', '1+Random', '1-String']);
 
     buildTests('testCompletion_combinator_export', '''
 export 'dart:math' show !1;"''',
-        <String>["1+PI", "1+sin", "1+Random", "1-String"]);
+        <String>['1+PI', '1+sin', '1+Random', '1-String']);
 
     buildTests('testCompletion_combinator_hide', '''
 import 'dart:math' hide !1;"''',
-        <String>["1+PI", "1+sin", "1+Random", "1-String"]);
+        <String>['1+PI', '1+sin', '1+Random', '1-String']);
 
     buildTests('testCompletion_combinator_notEnded', '''
 import 'dart:math' show !1"''',
-        <String>["1+PI", "1+sin", "1+Random", "1-String"]);
+        <String>['1+PI', '1+sin', '1+Random', '1-String']);
 
     buildTests('testCompletion_combinator_usePrefix', '''
 import 'dart:math' show s!1"''',
-        <String>["1+sin", "1+sqrt", "1-cos", "1-String"]);
+        <String>['1+sin', '1+sqrt', '1-cos', '1-String']);
 
     buildTests(
         'testCompletion_constructor_field',
         '''
 class X { X(this.field); int f!1ield;}''',
-        <String>["1+field"],
+        <String>['1+field'],
         failingTests: '1');
 
     buildTests(
@@ -848,7 +848,7 @@
 main() {
   new A.first(!1);
 }''',
-        <String>["1+A.first", "1-A.second"],
+        <String>['1+A.first', '1-A.second'],
         failingTests: '1');
 
     buildTests(
@@ -858,7 +858,7 @@
 main() {
   new m.Random(!1);
 }''',
-        <String>["1+Random:ARGUMENT_LIST"],
+        <String>['1+Random:ARGUMENT_LIST'],
         failingTests: '1');
 
     buildTests('testCompletion_dartDoc_reference_forClass', '''
@@ -868,7 +868,7 @@
  */
 class AAA {
   methodA() {}
-}''', <String>["1+int", "1-method", "2+methodA", "2-int"]);
+}''', <String>['1+int', '1-method', '2+methodA', '2-int']);
 
     buildTests('testCompletion_dartDoc_reference_forConstructor', '''
 class A {
@@ -879,7 +879,7 @@
    */
   A.named(aaa, bbb) {}
   methodA() {}
-}''', <String>["1+aaa", "1-bbb", "2+int", "2-double", "3+methodA"]);
+}''', <String>['1+aaa', '1-bbb', '2+int', '2-double', '3+methodA']);
 
     buildTests(
         'testCompletion_dartDoc_reference_forFunction',
@@ -892,13 +892,13 @@
 functionA(aaa, bbb) {}
 functionB() {}''',
         <String>[
-          "1+aaa",
-          "1-bbb",
-          "2+int",
-          "2-double",
-          "3+functionA",
-          "3+functionB",
-          "3-int"
+          '1+aaa',
+          '1-bbb',
+          '2+int',
+          '2-double',
+          '3+functionA',
+          '3+functionB',
+          '3-int'
         ],
         failingTests: '1');
 
@@ -913,13 +913,13 @@
 typedef FunctionA(aaa, bbb) {}
 typedef FunctionB() {}''',
         <String>[
-          "1+aaa",
-          "1-bbb",
-          "2+int",
-          "2-double",
-          "3+FunctionA",
-          "3+FunctionB",
-          "3-int"
+          '1+aaa',
+          '1-bbb',
+          '2+int',
+          '2-double',
+          '3+FunctionA',
+          '3+FunctionB',
+          '3-int'
         ],
         failingTests: '1');
 
@@ -933,13 +933,13 @@
   methodA(aaa, bbb) {}
   methodB() {}
 }''', <String>[
-      "1+aaa",
-      "1-bbb",
-      "2+int",
-      "2-double",
-      "3+methodA",
-      "3+methodB",
-      "3-int"
+      '1+aaa',
+      '1-bbb',
+      '2+int',
+      '2-double',
+      '3+methodA',
+      '3+methodB',
+      '3-int'
     ]);
 
     buildTests('testCompletion_dartDoc_reference_incomplete', '''
@@ -957,24 +957,24 @@
  * [!3] some text
  */
 class C {}''', <String>[
-      "1+double",
-      "1-int",
-      "2+int",
-      "2+String",
-      "3+int",
-      "3+String"
+      '1+double',
+      '1-int',
+      '2+int',
+      '2+String',
+      '3+int',
+      '3+String'
     ]);
 
     buildTests('testCompletion_double_inFractionPart', '''
 main() {
   1.0!1
-}''', <String>["1-abs", "1-main"]);
+}''', <String>['1-abs', '1-main']);
 
     buildTests('testCompletion_enum', '''
 enum MyEnum {A, B, C}
 main() {
   MyEnum.!1;
-}''', <String>["1+values", "1+A", "1+B", "1+C"]);
+}''', <String>['1+values', '1+A', '1+B', '1+C']);
 
     buildTests('testCompletion_exactPrefix_hasHigherRelevance', '''
 var STR;
@@ -984,22 +984,22 @@
   STR!2;
   Str!3;
 }''', <String>[
-      "1+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
-      "1+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
-      "2+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
-      "2+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
-      "3+String" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
-      "3+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
-      "3+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/
+      '1+str' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+      '1+STR' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+      '2+STR' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+      '2+str' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+      '3+String' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+      '3+STR' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+      '3+str' /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/
     ]);
 
     buildTests('testCompletion_export_dart', '''
 import 'dart:math
 import 'dart:_collection.dev
 export 'dart:!1''', <String>[
-      "1+dart:core",
-      "1+dart:math",
-      "1-dart:_collection.dev",
+      '1+dart:core',
+      '1+dart:math',
+      '1-dart:_collection.dev',
     ]);
 
     buildTests(
@@ -1013,18 +1013,18 @@
 
     buildTests('testCompletion_forStmt_vars', '''
 class int{}class Foo { mth() { for (in!1t i = 0; i!2 < 5; i!3++); }}''',
-        <String>["1+int", "2+i", "3+i"]);
+        <String>['1+int', '2+i', '3+i']);
 
     buildTests('testCompletion_function', '''
 class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1) => a.compareTo(b)); }}''',
-        <String>["1+String"]);
+        <String>['1+String']);
 
     // https://github.com/dart-lang/sdk/issues/33992
     buildTests(
         'testCompletion_function_partial',
         '''
 class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1)); }}''',
-        <String>["1+String"],
+        <String>['1+String'],
         failingTests: '1');
 
     buildTests(
@@ -1034,35 +1034,35 @@
 main(FFF fff) {
   fff(1, 2, !1)!2;
 }''',
-        <String>["1+x1", "2-x2"],
+        <String>['1+x1', '2-x2'],
         failingTests: '1');
 
     buildTests('testCompletion_ifStmt_field1', '''
-class Foo { int myField = 7; mth() { if (!1) {}}}''', <String>["1+myField"]);
+class Foo { int myField = 7; mth() { if (!1) {}}}''', <String>['1+myField']);
 
     buildTests('testCompletion_ifStmt_field1a', '''
-class Foo { int myField = 7; mth() { if (!1) }}''', <String>["1+myField"]);
+class Foo { int myField = 7; mth() { if (!1) }}''', <String>['1+myField']);
 
     buildTests('testCompletion_ifStmt_field2', '''
-class Foo { int myField = 7; mth() { if (m!1) {}}}''', <String>["1+myField"]);
+class Foo { int myField = 7; mth() { if (m!1) {}}}''', <String>['1+myField']);
 
     buildTests('testCompletion_ifStmt_field2a', '''
-class Foo { int myField = 7; mth() { if (m!1) }}''', <String>["1+myField"]);
+class Foo { int myField = 7; mth() { if (m!1) }}''', <String>['1+myField']);
 
     buildTests('testCompletion_ifStmt_field2b', '''
-class Foo { myField = 7; mth() { if (m!1) {}}}''', <String>["1+myField"]);
+class Foo { myField = 7; mth() { if (m!1) {}}}''', <String>['1+myField']);
 
     buildTests('testCompletion_ifStmt_localVar', '''
-class Foo { mth() { int value = 7; if (v!1) {}}}''', <String>["1+value"]);
+class Foo { mth() { int value = 7; if (v!1) {}}}''', <String>['1+value']);
 
     buildTests('testCompletion_ifStmt_localVara', '''
-class Foo { mth() { value = 7; if (v!1) {}}}''', <String>["1-value"]);
+class Foo { mth() { value = 7; if (v!1) {}}}''', <String>['1-value']);
 
     buildTests('testCompletion_ifStmt_topLevelVar', '''
-int topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>["1+topValue"]);
+int topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>['1+topValue']);
 
     buildTests('testCompletion_ifStmt_topLevelVara', '''
-topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>["1+topValue"]);
+topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>['1+topValue']);
 
     buildTests(
         'testCompletion_ifStmt_unionType_nonStrict',
@@ -1079,7 +1079,7 @@
   }
   x.!1;
 }''',
-        <String>["1+a", "1+x", "1+y"],
+        <String>['1+a', '1+x', '1+y'],
         failingTests: '1');
 
     buildTests(
@@ -1097,25 +1097,25 @@
   }
   x.!1;
 }''',
-        <String>["1+a", "1-x", "1-y"],
+        <String>['1+a', '1-x', '1-y'],
         failingTests: '1');
 
     buildTests('testCompletion_import', '''
-import '!1';''', <String>["1+dart:!", "1+package:!"]);
+import '!1';''', <String>['1+dart:!', '1+package:!']);
 
     buildTests('testCompletion_import_dart', '''
 import 'dart:math
 import 'dart:_collection.dev
 import 'dart:!1''', <String>[
-      "1+dart:core",
-      "1+dart:math",
-      "1-dart:_collection.dev",
+      '1+dart:core',
+      '1+dart:math',
+      '1-dart:_collection.dev',
     ]);
 
     buildTests('testCompletion_import_hasStringLiteral_noSemicolon', '''
 import '!1'
 
-class A {}''', <String>["1+dart:!", "1+package:!"]);
+class A {}''', <String>['1+dart:!', '1+package:!']);
 
     buildTests(
         'testCompletion_import_noSpace',
@@ -1144,7 +1144,7 @@
 class A {
   Str!1
   final f = null;
-}''', <String>["1+String", "1-bool"]);
+}''', <String>['1+String', '1-bool']);
 
     buildTests('testCompletion_incompleteClosure_parameterType', '''
 f1(cb(String s)) {}
@@ -1152,7 +1152,7 @@
 main() {
   f1((Str!1));
   f2((Str!2));
-}''', <String>["1+String", "1-bool", "2+String", "2-bool"]);
+}''', <String>['1+String', '1-bool', '2+String', '2-bool']);
 
     buildTests(
         'testCompletion_inPeriodPeriod',
@@ -1162,7 +1162,7 @@
   1 + str.!2.length;
   1 + 2 * str.!3.length;
 }''',
-        <String>["1+codeUnits", "2+codeUnits", "3+codeUnits"],
+        <String>['1+codeUnits', '2+codeUnits', '3+codeUnits'],
         failingTests: '123');
 
     // no checks, but no exceptions
@@ -1172,14 +1172,14 @@
 main() {
   new NoSuchClass(!1);
   new A.noSuchConstructor(!2);
-}''', <String>["1+int", "2+int"]);
+}''', <String>['1+int', '2+int']);
 
     buildTests(
         'testCompletion_import_lib',
         '''
 import '!1''',
-        <String>["1+my_lib.dart"],
-        extraFiles: <String, String>{"/my_lib.dart": ""},
+        <String>['1+my_lib.dart'],
+        extraFiles: <String, String>{'/my_lib.dart': ''},
         failingTests: '1');
 
     buildTests('testCompletion_is', '''
@@ -1191,12 +1191,12 @@
   var v2 = p is !3;
   var v2 = p is!4;
 }''', <String>[
-      "1+MyClass",
-      "2+MyClass",
-      "3+MyClass",
-      "3-v1",
-      "4+is",
-      "4-isVariable"
+      '1+MyClass',
+      '2+MyClass',
+      '3+MyClass',
+      '3-v1',
+      '4+is',
+      '4-isVariable'
     ]);
 
     // https://github.com/dart-lang/sdk/issues/33992
@@ -1208,7 +1208,7 @@
   var v1 = is!1;
   var v2 = is!2
 }''',
-        <String>["1+isVisible", "2+isVisible"],
+        <String>['1+isVisible', '2+isVisible'],
         failingTests: '12');
 
     buildTests('testCompletion_is_asPrefixedIdentifierStart', '''
@@ -1219,37 +1219,37 @@
 main(A p) {
   var v1 = p.is!1;
   var v2 = p.is!2
-}''', <String>["1+isVisible", "2+isVisible"]);
+}''', <String>['1+isVisible', '2+isVisible']);
 
     buildTests('testCompletion_is_incompleteStatement1', '''
 class MyClass {}
 main(p) {
   var justSomeVar;
   var v = p is !1
-}''', <String>["1+MyClass", "1-justSomeVar"]);
+}''', <String>['1+MyClass', '1-justSomeVar']);
 
     buildTests('testCompletion_is_incompleteStatement2', '''
 class MyClass {}
 main(p) {
   var isVariable;
   var v = p is!1
-}''', <String>["1+is", "1-isVariable"]);
+}''', <String>['1+is', '1-isVariable']);
 
     buildTests('testCompletion_keyword_in', '''
-class Foo { int input = 7; mth() { if (in!1) {}}}''', <String>["1+input"]);
+class Foo { int input = 7; mth() { if (in!1) {}}}''', <String>['1+input']);
 
     buildTests('testCompletion_keyword_syntheticIdentifier', '''
 main() {
   var caseVar;
   var otherVar;
   var v = case!1
-}''', <String>["1+caseVar", "1-otherVar"]);
+}''', <String>['1+caseVar', '1-otherVar']);
 
     buildTests('testCompletion_libraryIdentifier_atEOF', '''
-library int.!1''', <String>["1-parse", "1-bool"]);
+library int.!1''', <String>['1-parse', '1-bool']);
 
     buildTests('testCompletion_libraryIdentifier_notEOF', '''
-library int.!1''', <String>["1-parse", "1-bool"]);
+library int.!1''', <String>['1-parse', '1-bool']);
 
     buildTests(
         'testCompletion_methodRef_asArg_incompatibleFunctionType',
@@ -1264,8 +1264,8 @@
   foo( Functions.!1; );
 }''',
         <String>[
-          "1+myFuncInt" /*":" + ProposalKind.METHOD_NAME*/,
-          "1-myFuncDouble" /*":" + ProposalKind.METHOD_NAME*/
+          '1+myFuncInt' /*":" + ProposalKind.METHOD_NAME*/,
+          '1-myFuncDouble' /*":" + ProposalKind.METHOD_NAME*/
         ],
         failingTests: '1');
 
@@ -1281,8 +1281,8 @@
   foo( (int p) => Functions.!1; );
 }''',
         <String>[
-          "1+myFunc" /*":" + ProposalKind.METHOD*/,
-          "1-myFunc" /*":" + ProposalKind.METHOD_NAME*/
+          '1+myFunc' /*":" + ProposalKind.METHOD*/,
+          '1-myFunc' /*":" + ProposalKind.METHOD_NAME*/
         ],
         failingTests: '1');
 
@@ -1294,18 +1294,18 @@
 main(p) {
   foo(Functions.!1);
 }''', <String>[
-      "1+myFunc" /*":" + ProposalKind.METHOD*/,
-      "1+myFunc" /*":" + ProposalKind.METHOD_NAME*/
+      '1+myFunc' /*":" + ProposalKind.METHOD*/,
+      '1+myFunc' /*":" + ProposalKind.METHOD_NAME*/
     ]);
 
     buildTests('testCompletion_namedArgument_alreadyUsed', '''
-func({foo}) {} main() { func(foo: 0, fo!1); }''', <String>["1-foo"]);
+func({foo}) {} main() { func(foo: 0, fo!1); }''', <String>['1-foo']);
 
     buildTests(
         'testCompletion_namedArgument_constructor',
         '''
 class A {A({foo, bar}) {}} main() { new A(fo!1); }''',
-        <String>["1+foo", "1-bar"],
+        <String>['1+foo', '1-bar'],
         failingTests: '1');
 
     buildTests(
@@ -1313,8 +1313,8 @@
         '''
 func({foo, bar}) {} main() { func(!1); }''',
         <String>[
-          "1+foo" /*":" + ProposalKind.NAMED_ARGUMENT*/,
-          "1-foo" /*":" + ProposalKind.OPTIONAL_ARGUMENT*/
+          '1+foo' /*":" + ProposalKind.NAMED_ARGUMENT*/,
+          '1-foo' /*":" + ProposalKind.OPTIONAL_ARGUMENT*/
         ],
         failingTests: '1');
 
@@ -1322,30 +1322,30 @@
         'testCompletion_namedArgument_function',
         '''
 func({foo, bar}) {} main() { func(fo!1); }''',
-        <String>["1+foo", "1-bar"],
+        <String>['1+foo', '1-bar'],
         failingTests: '1');
 
     buildTests('testCompletion_namedArgument_notNamed', '''
-func([foo]) {} main() { func(fo!1); }''', <String>["1-foo"]);
+func([foo]) {} main() { func(fo!1); }''', <String>['1-foo']);
 
     buildTests('testCompletion_namedArgument_unresolvedFunction', '''
-main() { func(fo!1); }''', <String>["1-foo"]);
+main() { func(fo!1); }''', <String>['1-foo']);
 
     buildTests('testCompletion_newMemberType1', '''
 class Collection{}class List extends Collection{}class Foo { !1 }''',
-        <String>["1+Collection", "1+List"]);
+        <String>['1+Collection', '1+List']);
 
     buildTests('testCompletion_newMemberType2', '''
 class Collection{}class List extends Collection{}class Foo {!1}''',
-        <String>["1+Collection", "1+List"]);
+        <String>['1+Collection', '1+List']);
 
     buildTests('testCompletion_newMemberType3', '''
 class Collection{}class List extends Collection{}class Foo {L!1}''',
-        <String>["1-Collection", "1+List"]);
+        <String>['1-Collection', '1+List']);
 
     buildTests('testCompletion_newMemberType4', '''
 class Collection{}class List extends Collection{}class Foo {C!1}''',
-        <String>["1+Collection", "1-List"]);
+        <String>['1+Collection', '1-List']);
 
     buildTests(
         'testCompletion_positionalArgument_constructor',
@@ -1358,10 +1358,10 @@
   new A(0, !2);
 }''',
         <String>[
-          "1+foo" /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
-          "1-bar",
-          "2-foo",
-          "2+bar" /*":"
+          '1+foo' /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
+          '1-bar',
+          '2-foo',
+          '2+bar' /*":"
         + ProposalKind.OPTIONAL_ARGUMENT*/
         ],
         failingTests: '12');
@@ -1375,10 +1375,10 @@
   func(0, !2);
 }''',
         <String>[
-          "1+foo" /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
-          "1-bar",
-          "2-foo",
-          "2+bar" /*":"
+          '1+foo' /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
+          '1-bar',
+          '2-foo',
+          '2+bar' /*":"
         + ProposalKind.OPTIONAL_ARGUMENT*/
         ],
         failingTests: '12');
@@ -1397,9 +1397,9 @@
   v.!1
 }''',
         <String>[
-          "1+foo",
-          "1-bar,potential=false,declaringType=B",
-          "1+bar,potential=true,declaringType=B"
+          '1+foo',
+          '1-bar,potential=false,declaringType=B',
+          '1+bar,potential=true,declaringType=B'
         ],
         failingTests: '1');
 
@@ -1410,7 +1410,7 @@
 }
 main() {
   new A.!1
-}''', <String>["1+_c", "1+c"]);
+}''', <String>['1+_c', '1+c']);
 
     buildTests('testCompletion_privateElement_sameLibrary_member', '''
 class A {
@@ -1419,7 +1419,7 @@
 }
 main(A a) {
   a.!1
-}''', <String>["1+_m", "1+m"]);
+}''', <String>['1+_m', '1+m']);
 
     buildTests('testCompletion_propertyAccess_whenClassTarget', '''
 class A {
@@ -1428,7 +1428,7 @@
 }
 main() {
   A.!1
-}''', <String>["1+FIELD", "1-field"]);
+}''', <String>['1+FIELD', '1-field']);
 
     buildTests('testCompletion_propertyAccess_whenClassTarget_excludeSuper', '''
 class A {
@@ -1441,7 +1441,7 @@
 }
 main() {
   B.!1;
-}''', <String>["1+FIELD_B", "1-FIELD_A", "1+methodB", "1-methodA"]);
+}''', <String>['1+FIELD_B', '1-FIELD_A', '1+methodB', '1-methodA']);
 
     buildTests('testCompletion_propertyAccess_whenInstanceTarget', '''
 class A {
@@ -1457,17 +1457,17 @@
 main(B b, C c) {
   b.a.!1;
   c.!2;
-}''', <String>["1-FIELD", "1+fieldA", "2+fieldC", "2+fieldA"]);
+}''', <String>['1-FIELD', '1+fieldA', '2+fieldC', '2+fieldA']);
 
     buildTests('testCompletion_return_withIdentifierPrefix', '''
-f() { var vvv = 42; return v!1 }''', <String>["1+vvv"]);
+f() { var vvv = 42; return v!1 }''', <String>['1+vvv']);
 
     buildTests('testCompletion_return_withoutExpression', '''
-f() { var vvv = 42; return !1 }''', <String>["1+vvv"]);
+f() { var vvv = 42; return !1 }''', <String>['1+vvv']);
 
     buildTests('testCompletion_staticField1', '''
 class num{}class Sunflower {static final n!2um MAX_D = 300;nu!3m xc, yc;Sun!4flower() {x!Xc = y!Yc = MA!1 }}''',
-        <String>["1+MAX_D", "X+xc", "Y+yc", "2+num", "3+num", "4+Sunflower"]);
+        <String>['1+MAX_D', 'X+xc', 'Y+yc', '2+num', '3+num', '4+Sunflower']);
 
     buildTests('testCompletion_super_superType', '''
 class A {
@@ -1480,7 +1480,7 @@
   main() {
     super.!1
   }
-}''', <String>["1+fa", "1-fb", "1+ma", "1-mb"]);
+}''', <String>['1+fa', '1-fb', '1+ma', '1-mb']);
 
     buildTests(
         'testCompletion_superConstructorInvocation_noNamePrefix',
@@ -1493,7 +1493,7 @@
 class B extends A {
   B() : super.!1
 }''',
-        <String>["1+fooA", "1+fooB", "1+bar"],
+        <String>['1+fooA', '1+fooB', '1+bar'],
         failingTests: '1');
 
     buildTests(
@@ -1507,7 +1507,7 @@
 class B extends A {
   B() : super.f!1
 }''',
-        <String>["1+fooA", "1+fooB", "1-bar"],
+        <String>['1+fooA', '1+fooB', '1-bar'],
         failingTests: '1');
 
     buildTests(
@@ -1517,7 +1517,7 @@
   var f;
   A() : f = this.!1;
 }''',
-        <String>["1-toString"],
+        <String>['1-toString'],
         failingTests: '1');
 
     buildTests(
@@ -1526,7 +1526,7 @@
 class A {
   var f = this.!1;
 }''',
-        <String>["1-toString"],
+        <String>['1-toString'],
         failingTests: '1');
 
     buildTests(
@@ -1537,7 +1537,7 @@
     this.!1;
   }
 }''',
-        <String>["1-toString"],
+        <String>['1-toString'],
         failingTests: '1');
 
     buildTests(
@@ -1546,14 +1546,14 @@
 main() {
   this.!1;
 }''',
-        <String>["1-toString"],
+        <String>['1-toString'],
         failingTests: '1');
 
     buildTests(
         'testCompletion_this_bad_inTopLevelVariableDeclaration',
         '''
 var v = this.!1;''',
-        <String>["1-toString"],
+        <String>['1-toString'],
         failingTests: '1');
 
     buildTests('testCompletion_this_OK_inConstructorBody', '''
@@ -1563,7 +1563,7 @@
   A() {
     this.!1;
   }
-}''', <String>["1+f", "1+m"]);
+}''', <String>['1+f', '1+m']);
 
     buildTests('testCompletion_this_OK_localAndSuper', '''
 class A {
@@ -1576,14 +1576,14 @@
   main() {
     this.!1
   }
-}''', <String>["1+fa", "1+fb", "1+ma", "1+mb"]);
+}''', <String>['1+fa', '1+fb', '1+ma', '1+mb']);
 
     buildTests('testCompletion_topLevelField_init2', '''
 class DateTime{static var JUN;}final num M = Dat!1eTime.JUN;''',
-        <String>["1+DateTime", "1-void"]);
+        <String>['1+DateTime', '1-void']);
 
     buildTests('testCompletion_while', '''
-class Foo { int boo = 7; mth() { while (b!1) {} }}''', <String>["1+boo"]);
+class Foo { int boo = 7; mth() { while (b!1) {} }}''', <String>['1+boo']);
   }
 
   void buildLibraryTests() {
@@ -1594,10 +1594,10 @@
 libFunction() {};
 main() {
   !1
-}''', <String>["1-cos", "1+libFunction"]);
+}''', <String>['1-cos', '1+libFunction']);
 
     sources.clear();
-    sources["/lib.dart"] = '''
+    sources['/lib.dart'] = '''
 library lib;
 export 'dart:math' hide sin;
 libFunction() {};''';
@@ -1608,7 +1608,7 @@
 main() {
   p.!1
 }''',
-        <String>["1+cos", "1-sin", "1+libFunction"],
+        <String>['1+cos', '1-sin', '1+libFunction'],
         extraFiles: sources,
         failingTests: '1');
 
@@ -1616,16 +1616,16 @@
 import 'dart:math' as math hide PI;
 main() {
   math.!1
-}''', <String>["1-PI", "1+LN10"]);
+}''', <String>['1-PI', '1+LN10']);
 
     buildTests('test_importPrefix_showCombinator', '''
 import 'dart:math' as math show PI;
 main() {
   math.!1
-}''', <String>["1+PI", "1-LN10"]);
+}''', <String>['1+PI', '1-LN10']);
 
     sources.clear();
-    sources["/lib.dart"] = '''
+    sources['/lib.dart'] = '''
 library lib
 class _A
   foo() {}
@@ -1639,12 +1639,12 @@
 main(A a) {
   a.!1
 }''',
-        <String>["1+foo"],
+        <String>['1+foo'],
         extraFiles: sources,
         failingTests: '1');
 
     sources.clear();
-    sources["/lib.dart"] = '''
+    sources['/lib.dart'] = '''
 library lib;
 class A {
   A.c();
@@ -1657,11 +1657,11 @@
 main() {
   new A.!1
 }''',
-        <String>["1-_c", "1+c"],
+        <String>['1-_c', '1+c'],
         failingTests: '1');
 
     sources.clear();
-    sources["/lib.dart"] = '''
+    sources['/lib.dart'] = '''
 library lib;
 class A {
   var f;
@@ -1674,12 +1674,12 @@
               main(A a) {
                 a.!1
               }''',
-        <String>["1-_f", "1+f"],
+        <String>['1-_f', '1+f'],
         extraFiles: sources,
         failingTests: '1');
 
     sources.clear();
-    sources["/firth.dart"] = '''
+    sources['/firth.dart'] = '''
 library firth;
 class SerializationException {
   const SerializationException();
@@ -1690,7 +1690,7 @@
 import 'firth.dart';
 main() {
 throw new Seria!1lizationException();}''',
-        <String>["1+SerializationException"],
+        <String>['1+SerializationException'],
         extraFiles: sources,
         failingTests: '1');
 
@@ -1699,11 +1699,11 @@
     buildTests(
         'testLibrary002',
         '''t2() {var q=[0],z=q.!1length;q.!2clear();}''',
-        <String>["1+length", "1+isEmpty", "2+clear"]);
+        <String>['1+length', '1+isEmpty', '2+clear']);
 
     // TODO Include corelib analysis
     buildTests('testLibrary003', '''class X{var q; f() {q.!1a!2}}''',
-        <String>["1+end", "2+abs", "2-end"],
+        <String>['1+end', '2+abs', '2-end'],
         failingTests: '12');
 
     // TODO Include corelib analysis
@@ -1715,38 +1715,38 @@
             f1() {var x=new json.!1}
             f2() {var x=new json.JsonDe!2}
             f3() {var x=new json.JsonDecoder!3}''', <String>[
-      "1+JsonDecoder",
-      "1-JsonDecoderX",
-      "2+JsonDecoder",
-      "2-JsonDecoderX",
-      "3+JsonDecoder",
-      "3-JsonDecoderX"
+      '1+JsonDecoder',
+      '1-JsonDecoderX',
+      '2+JsonDecoder',
+      '2-JsonDecoderX',
+      '3+JsonDecoder',
+      '3-JsonDecoderX'
     ]);
 
     // TODO Enable after type propagation is implemented. Not yet.
     // TODO Include corelib analysis
     buildTests('testLibrary005',
-        '''var PHI;main(){PHI=5.3;PHI.abs().!1 Object x;}''', <String>["1+abs"],
+        '''var PHI;main(){PHI=5.3;PHI.abs().!1 Object x;}''', <String>['1+abs'],
         failingTests: '1');
 
     // Exercise import and export handling.
     // Libraries are defined in partial order of increasing dependency.
     sources.clear();
-    sources["/exp2a.dart"] = '''
+    sources['/exp2a.dart'] = '''
 library exp2a;
 e2a() {}''';
-    sources["/exp1b.dart"] = '''
+    sources['/exp1b.dart'] = '''
 library exp1b;",
 e1b() {}''';
-    sources["/exp1a.dart"] = '''
+    sources['/exp1a.dart'] = '''
 library exp1a;",
 export 'exp1b.dart';",
 e1a() {}''';
-    sources["/imp1.dart"] = '''
+    sources['/imp1.dart'] = '''
 library imp1;
 export 'exp1a.dart';
 i1() {}''';
-    sources["/imp2.dart"] = '''
+    sources['/imp2.dart'] = '''
 library imp2;
 export 'exp2a.dart';
 i2() {}''';
@@ -1762,14 +1762,14 @@
   e1b();
   e2a();
 }''',
-        <String>["1+i1", "1+i2", "1+e1a", "1+e2a", "1+e1b"],
+        <String>['1+i1', '1+i2', '1+e1a', '1+e2a', '1+e1b'],
         extraFiles: sources,
         failingTests: '1');
 
     // Exercise import and export handling.
     // Libraries are defined in partial order of increasing dependency.
     sources.clear();
-    sources["/l1.dart"] = '''
+    sources['/l1.dart'] = '''
 library l1;
 var _l1t; var l1t;''';
     buildTests(
@@ -1780,19 +1780,19 @@
   var x = l!1
   var y = _!2
 }''',
-        <String>["1+l1t", "1-_l1t", "2-_l1t"],
+        <String>['1+l1t', '1-_l1t', '2-_l1t'],
         extraFiles: sources,
         failingTests: '1');
 
     // Check private library exclusion
     sources.clear();
-    sources["/public.dart"] = '''
+    sources['/public.dart'] = '''
 library public;
 class NonPrivate {
   void publicMethod() {
   }
 }''';
-    sources["/private.dart"] = '''
+    sources['/private.dart'] = '''
 library _private;
 import 'public.dart';
 class Private extends NonPrivate {
@@ -1810,13 +1810,13 @@
     x.!1 //publicMethod but not privateMethod should appear
   }
 }''',
-        <String>["1-privateMethod", "1+publicMethod"],
+        <String>['1-privateMethod', '1+publicMethod'],
         extraFiles: sources,
         failingTests: '1');
 
     // Exercise library prefixes.
     sources.clear();
-    sources["/lib.dart"] = '''
+    sources['/lib.dart'] = '''
 library lib;
 int X = 1;
 void m(){}
@@ -1838,18 +1838,18 @@
   new Q.!4
 }''',
         <String>[
-          "1+X",
-          "1+m",
-          "1+Y",
-          "2+X",
-          "2+m",
-          "2+Y",
-          "3+X",
-          "3+m",
-          "3+Y",
-          "4+Y",
-          "4-m",
-          "4-X"
+          '1+X',
+          '1+m',
+          '1+Y',
+          '2+X',
+          '2+m',
+          '2+Y',
+          '3+X',
+          '3+m',
+          '3+Y',
+          '4+Y',
+          '4-m',
+          '4-X'
         ],
         extraFiles: sources,
         failingTests: '1234');
@@ -1860,25 +1860,25 @@
 void r1(var v) {
   v.!1toString!2().!3hash!4Code
 }''', <String>[
-      "1+toString",
-      "1-==",
-      "2+toString",
-      "3+hashCode",
-      "3+toString",
-      "4+hashCode",
-      "4-toString"
+      '1+toString',
+      '1-==',
+      '2+toString',
+      '3+hashCode',
+      '3+toString',
+      '4+hashCode',
+      '4-toString'
     ]);
 
     buildTests('test002', '''
 void r2(var vim) {
   v!1.toString()
-}''', <String>["1+vim"]);
+}''', <String>['1+vim']);
 
     buildTests('test003', '''
 class A {
   int a() => 3;
   int b() => this.!1a();
-}''', <String>["1+a"]);
+}''', <String>['1+a']);
 
     buildTests(
         'test004',
@@ -1890,7 +1890,7 @@
   A.c() : this.!2b();
   g() => new A.!3c();
 }''',
-        <String>["1+x", "2+b", "3+c"],
+        <String>['1+x', '2+b', '3+c'],
         failingTests: '12');
 
     buildTests(
@@ -1903,38 +1903,38 @@
   v!3.toString();
 }''',
         <String>[
-          "1-A",
-          "1-vim",
-          "1+vq",
-          "1-vf",
-          "1-this",
-          "1-void",
-          "1-null",
-          "1-false",
-          "2-A",
-          "2+vim",
-          "2-vf",
-          "2-vq",
-          "2-this",
-          "2-void",
-          "2-null",
-          "2-false",
-          "3+vf",
-          "3+vq",
-          "3+vim",
-          "3-A"
+          '1-A',
+          '1-vim',
+          '1+vq',
+          '1-vf',
+          '1-this',
+          '1-void',
+          '1-null',
+          '1-false',
+          '2-A',
+          '2+vim',
+          '2-vf',
+          '2-vq',
+          '2-this',
+          '2-void',
+          '2-null',
+          '2-false',
+          '3+vf',
+          '3+vq',
+          '3+vim',
+          '3-A'
         ],
         failingTests: '1');
 
     buildTests('test006', '''
 void r2(var vim, {va: 2, b: 3}) {
   v!1.toString()
-}''', <String>["1+va", "1-b"]);
+}''', <String>['1+va', '1-b']);
 
     buildTests('test007', '''
 void r2(var vim, [va: 2, b: 3]) {
   v!1.toString()
-}''', <String>["1+va", "1-b"]);
+}''', <String>['1+va', '1-b']);
 
     // keywords
     buildTests(
@@ -1945,19 +1945,19 @@
 !5abstract class Eclass implements Aclass, Bclass {}
 class Fclass extends Bclass !6with !7 Eclass {}''',
         <String>[
-          "1+class",
-          "1-implements",
-          "1-extends",
-          "1-with",
-          "2+extends",
-          "3+extends",
-          "4+Aclass",
-          "4-Bclass",
-          "5+abstract",
-          "6+with",
-          "7+Eclass",
-          "7-Dclass",
-          "7-Ctype",
+          '1+class',
+          '1-implements',
+          '1-extends',
+          '1-with',
+          '2+extends',
+          '3+extends',
+          '4+Aclass',
+          '4-Bclass',
+          '5+abstract',
+          '6+with',
+          '7+Eclass',
+          '7-Dclass',
+          '7-Ctype',
         ],
         failingTests: '2346');
 
@@ -1969,16 +1969,16 @@
 typedef !3vo!4id TestFn2();
 typ!7edef !5n!6''',
         <String>[
-          "1+void",
-          "1+TestFn2",
-          "2+dynamic",
-          "2-void",
-          "3+dynamic",
-          "4+void",
-          "4-dynamic",
-          "5+TestFn2",
-          "6+num",
-          "7+typedef"
+          '1+void',
+          '1+TestFn2',
+          '2+dynamic',
+          '2-void',
+          '3+dynamic',
+          '4+void',
+          '4-dynamic',
+          '5+TestFn2',
+          '6+num',
+          '7+typedef'
         ],
         failingTests: '1234');
 
@@ -1988,31 +1988,31 @@
 class test !8<!1t !2 !3extends String,!4 List,!5 !6>!7 {}
 class tezetst !9<!BString,!C !DList>!A {}''',
         <String>[
-          "1-String",
-          "1-List",
-          "1-test",
-          "2-String",
-          "2-test",
-          "3+extends",
-          "4-tezetst",
-          "4-test",
-          "5-String",
-          "6-List",
-          "7-List",
-          "8-List",
-          "9-String",
-          "A-String",
-          "B-String",
-          "C-List",
-          "C-tezetst",
-          "D-List",
-          "D-test"
+          '1-String',
+          '1-List',
+          '1-test',
+          '2-String',
+          '2-test',
+          '3+extends',
+          '4-tezetst',
+          '4-test',
+          '5-String',
+          '6-List',
+          '7-List',
+          '8-List',
+          '9-String',
+          'A-String',
+          'B-String',
+          'C-List',
+          'C-tezetst',
+          'D-List',
+          'D-test'
         ],
         failingTests: '23');
 
     // name generation with conflicts
     buildTests('test011', '''r2(var object, Object object1, Object !1);''',
-        <String>["1+object2"],
+        <String>['1+object2'],
         failingTests: '1');
 
     // reserved words
@@ -2025,14 +2025,14 @@
   }
 }''',
         <String>[
-          "1+var",
-          "1+dynamic",
-          "1-f",
-          "2+var",
-          "2-dynamic",
-          "3+false",
-          "3+true",
-          "4+toString"
+          '1+var',
+          '1+dynamic',
+          '1-f',
+          '2+var',
+          '2-dynamic',
+          '3+false',
+          '3+true',
+          '4+toString'
         ],
         failingTests: '123');
 
@@ -2056,17 +2056,17 @@
   }
 }''',
         <String>[
-          "1+x",
-          "2+x",
-          "3+zs",
-          "4+k",
-          "5+Q",
-          "5-a",
-          "6+==",
-          "7+x",
-          "8+==",
-          "9+==",
-          "0+k"
+          '1+x',
+          '2+x',
+          '3+zs',
+          '4+k',
+          '5+Q',
+          '5-a',
+          '6+==',
+          '7+x',
+          '8+==',
+          '9+==',
+          '0+k'
         ],
         failingTests: '689');
 
@@ -2093,38 +2093,38 @@
   }
 }''',
         <String>[
-          "1+while",
-          "2+do",
-          "3+while",
-          "4+for",
-          "5+in",
-          "6+for",
-          "7+switch",
-          "8+case",
-          "9+default:",
-          "A+try",
-          "B+on",
-          "C+catch",
-          "D+var",
-          "E+void",
-          "F+assert",
-          "G+continue",
-          "H+break",
-          "J+if",
-          "K+else",
-          "L+return"
+          '1+while',
+          '2+do',
+          '3+while',
+          '4+for',
+          '5+in',
+          '6+for',
+          '7+switch',
+          '8+case',
+          '9+default:',
+          'A+try',
+          'B+on',
+          'C+catch',
+          'D+var',
+          'E+void',
+          'F+assert',
+          'G+continue',
+          'H+break',
+          'J+if',
+          'K+else',
+          'L+return'
         ],
         failingTests: '3CK');
 
     // operators in function
-    buildTests('test015', '''f(a,b,c) => a + b * c !1;''', <String>["1+=="],
+    buildTests('test015', '''f(a,b,c) => a + b * c !1;''', <String>['1+=='],
         failingTests: '1');
 
     // operators in return
     buildTests(
         'test016',
         '''class X {dynamic f(a,b,c) {return a + b * c !1;}}''',
-        <String>["1+=="],
+        <String>['1+=='],
         failingTests: '1');
 
     // keywords
@@ -2135,20 +2135,20 @@
 !3export '!8uri' !6hide Q !7show X;
 !4part 'x';''',
         <String>[
-          "1+library",
+          '1+library',
           "2+import \'\';",
           "3+export \'\';",
           "4+part \'\';",
-          "5+as",
-          "6+hide",
-          "7+show",
-          "8-null"
+          '5+as',
+          '6+hide',
+          '7+show',
+          '8-null'
         ],
         failingTests: '234567'); //TODO(jwren) 234 failing as correct selection
     // offset assertions can't be passed into buildTests(..)
 
     // keywords
-    buildTests('test018', '''!1part !2of foo;''', <String>["1+part", "2+of"],
+    buildTests('test018', '''!1part !2of foo;''', <String>['1+part', '2+of'],
         failingTests: '12');
 
     buildTests('test019', '''
@@ -2156,13 +2156,13 @@
 var falsetrue = 1;
 main() {
   var foo = true!1
-}''', <String>["1+true", "1+truefalse", "1-falsetrue"]);
+}''', <String>['1+true', '1+truefalse', '1-falsetrue']);
 
-    buildTests('test020', '''var x = null.!1''', <String>["1+toString"]);
+    buildTests('test020', '''var x = null.!1''', <String>['1+toString']);
 
-    buildTests('test021', '''var x = .!1''', <String>["1-toString"]);
+    buildTests('test021', '''var x = .!1''', <String>['1-toString']);
 
-    buildTests('test022', '''var x = .!1;''', <String>["1-toString"]);
+    buildTests('test022', '''var x = .!1;''', <String>['1-toString']);
 
     buildTests('test023', '''
 class Map{getKeys(){}}
@@ -2173,7 +2173,7 @@
   x2(Map m) {
     m.!2getKeys;
   }
-}''', <String>["1+getKeys", "2+getKeys"]);
+}''', <String>['1+getKeys', '2+getKeys']);
 
 // Note lack of semicolon following completion location
     buildTests('test024', '''
@@ -2182,7 +2182,7 @@
   f() {
     new List.!1
   }
-}''', <String>["1+from"]);
+}''', <String>['1+from']);
 
     buildTests('test025', '''
 class R {
@@ -2217,40 +2217,40 @@
     var h = R.!Fg();
   }
 }''', <String>[
-      "1+m",
-      "2+_m",
-      "3+g",
-      "4+m",
-      "5+_m",
-      "6+g",
-      "7-g",
-      "8-m",
-      "9-_m",
-      "A+_m",
-      "B+m",
-      "C+g",
-      "D+_m",
-      "E+m",
-      "F+g"
+      '1+m',
+      '2+_m',
+      '3+g',
+      '4+m',
+      '5+_m',
+      '6+g',
+      '7-g',
+      '8-m',
+      '9-_m',
+      'A+_m',
+      'B+m',
+      'C+g',
+      'D+_m',
+      'E+m',
+      'F+g'
     ]);
 
-    buildTests('test026', '''var aBcD; var x=ab!1''', <String>["1+aBcD"]);
+    buildTests('test026', '''var aBcD; var x=ab!1''', <String>['1+aBcD']);
 
     buildTests(
-        'test027', '''m(){try{}catch(eeee,ssss){s!1}''', <String>["1+ssss"]);
+        'test027', '''m(){try{}catch(eeee,ssss){s!1}''', <String>['1+ssss']);
 
     // https://github.com/dart-lang/sdk/issues/33992
-    buildTests('test028', '''m(){var isX=3;if(is!1)''', <String>["1+isX"],
+    buildTests('test028', '''m(){var isX=3;if(is!1)''', <String>['1+isX'],
         failingTests: '1');
 
-    buildTests('test029', '''m(){[1].forEach((x)=>!1x);}''', <String>["1+x"]);
+    buildTests('test029', '''m(){[1].forEach((x)=>!1x);}''', <String>['1+x']);
 
-    buildTests('test030', '''n(){[1].forEach((x){!1});}''', <String>["1+x"]);
+    buildTests('test030', '''n(){[1].forEach((x){!1});}''', <String>['1+x']);
 
     buildTests(
         'test031',
         '''class Caster {} m() {try {} on Cas!1ter catch (CastBlock) {!2}}''',
-        <String>["1+Caster", "1-CastBlock", "2+Caster", "2+CastBlock"]);
+        <String>['1+Caster', '1-CastBlock', '2+Caster', '2+CastBlock']);
 
     buildTests('test032', '''
 const ONE = 1;
@@ -2267,20 +2267,20 @@
     default: return;
   }
 }''', <String>[
-      "1+ONE",
-      "1-UKSI",
-      "2+EIN",
-      "2-ICHI",
-      "3+ICHI",
-      "3+UKSI",
-      "3+EIN",
-      "3+ONE"
+      '1+ONE',
+      '1-UKSI',
+      '2+EIN',
+      '2-ICHI',
+      '3+ICHI',
+      '3+UKSI',
+      '3+EIN',
+      '3+ONE'
     ]);
 
     buildTests(
         'test033',
         '''class A{}class B extends A{b(){}}class C implements A {c(){}}class X{x(){A f;f.!1}}''',
-        <String>["1+b", "1-c"],
+        <String>['1+b', '1-c'],
         failingTests: '1');
 
     // TODO(scheglov) decide what to do with Type for untyped field (not
@@ -2312,12 +2312,12 @@
     field.!2top();
   }
 }''',
-        <String>["1+top", "2+top"],
+        <String>['1+top', '2+top'],
         failingTests: '12');
 
     // test analysis of untyped fields and top-level vars
     buildTests('test035', '''class Y {final x='hi';mth() {x.!1length;}}''',
-        <String>["1+length"]);
+        <String>['1+length']);
 
     // TODO(scheglov) decide what to do with Type for untyped field (not
     // supported by the new store)
@@ -2337,7 +2337,7 @@
   A1 a = new A1();
   a.field.!2
 }''',
-        <String>["1+round", "2+round"],
+        <String>['1+round', '2+round'],
         failingTests: '12');
 
     buildTests(
@@ -2348,7 +2348,7 @@
 main() {
   new HtS!1
 }''',
-        <String>["1+HttpServer", "1-HttpClient"],
+        <String>['1+HttpServer', '1-HttpClient'],
         failingTests: '1');
 
     buildTests(
@@ -2368,37 +2368,37 @@
     az.!2x;
   }
 }''',
-        <String>["1+y", "1-x", "2+x", "2-y"],
+        <String>['1+y', '1-x', '2+x', '2-y'],
         failingTests: '2');
 
     // test analysis of untyped fields and top-level vars
     buildTests(
-        'test039', '''class X{}var x = null as !1X;''', <String>["1-void"]);
+        'test039', '''class X{}var x = null as !1X;''', <String>['1-void']);
 
     // test arg lists with named params
     buildTests('test040', '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1)!2;}''',
-        <String>["1+x1", "2-x2"],
+        <String>['1+x1', '2-x2'],
         failingTests: '1');
 
     // test arg lists with named params
     buildTests('test041', '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1''',
-        <String>["1+x1", "1+x2", "1+y"],
+        <String>['1+x1', '1+x2', '1+y'],
         failingTests: '1');
 
     // test arg lists with named params
     buildTests('test042', '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1;!2''',
-        <String>["1+x1", "1+x2", "2-y"],
+        <String>['1+x1', '1+x2', '2-y'],
         failingTests: '1');
   }
 
   void buildOtherTests() {
     buildTests('test_classMembers_inGetter',
-        '''class A { var fff; get z {ff!1}}''', <String>["1+fff"]);
+        '''class A { var fff; get z {ff!1}}''', <String>['1+fff']);
 
     buildTests(
         'testSingle',
         '''class A {int x; !2mth() {int y = this.x;}}class B{}''',
-        <String>["2+B"]);
+        <String>['2+B']);
   }
 
   /**
@@ -2431,14 +2431,14 @@
     if (completionTests.isEmpty) {
       test(baseName, () {
         fail("Expected exclamation point ('!') within the source denoting the"
-            "position at which code completion should occur");
+            'position at which code completion should occur');
       });
     }
     Set<String> allSpecIds =
         completionTests.map((LocationSpec spec) => spec.id).toSet();
     for (String id in failingTests.split('')) {
       if (!allSpecIds.contains(id)) {
-        test("$baseName-$id", () {
+        test('$baseName-$id', () {
           fail(
               "Test case '$id' included in failingTests, but this id does not exist.");
         });
@@ -2448,7 +2448,7 @@
       String testName = '$baseName-${spec.id}';
       if (failingTests.contains(spec.id)) {
         ++expectedFailCount;
-        test("$testName (expected failure $expectedFailCount)", () {
+        test('$testName (expected failure $expectedFailCount)', () {
           CompletionTestCase test = CompletionTestCase();
           return Future(() => test.runTest(spec, extraFiles)).then((_) {
             fail('Test passed - expected to fail.');
diff --git a/pkg/analysis_server/test/completion_test_support.dart b/pkg/analysis_server/test/completion_test_support.dart
index 29596f7..f4e49b7 100644
--- a/pkg/analysis_server/test/completion_test_support.dart
+++ b/pkg/analysis_server/test/completion_test_support.dart
@@ -155,18 +155,18 @@
           modifiedSource.substring(index + n);
     }
     if (modifiedSource == originalSource) {
-      throw StateError("No tests in source: " + originalSource);
+      throw StateError('No tests in source: ' + originalSource);
     }
     for (String result in validationStrings) {
       if (result.length < 3) {
-        throw StateError("Invalid location result: " + result);
+        throw StateError('Invalid location result: ' + result);
       }
       String id = result.substring(0, 1);
       String sign = result.substring(1, 2);
       String value = result.substring(2);
       LocationSpec test = tests[id];
       if (test == null) {
-        throw StateError("Invalid location result id: $id for: $result");
+        throw StateError('Invalid location result id: $id for: $result');
       }
       test.source = modifiedSource;
       if (sign == '+') {
@@ -174,7 +174,7 @@
       } else if (sign == '-') {
         test.negativeResults.add(value);
       } else {
-        String err = "Invalid location result sign: $sign for: $result";
+        String err = 'Invalid location result sign: $sign for: $result';
         throw StateError(err);
       }
     }
@@ -191,14 +191,14 @@
     if (!(badPoints.isEmpty && badResults.isEmpty)) {
       StringBuffer err = StringBuffer();
       if (badPoints.isNotEmpty) {
-        err.write("No test location for tests:");
+        err.write('No test location for tests:');
         for (String ch in badPoints) {
           err..write(' ')..write(ch);
         }
         err.write(' ');
       }
       if (badResults.isNotEmpty) {
-        err.write("No results for tests:");
+        err.write('No results for tests:');
         for (String ch in badResults) {
           err..write(' ')..write(ch);
         }
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index e9d249d..02c722e 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -1009,7 +1009,7 @@
           ['declaration']), //token('x', 4, 'dart:core;List', ['declaration']),
       token('=', 6, null, null),
       token('<', 8, null, null),
-      token("int", 9, 'dart:core;Type<int>', [
+      token('int', 9, 'dart:core;Type<int>', [
         'reference'
       ]), //token("int", 9, 'dart:core;Type<dart:core;int>', ['reference']),
       token('>', 12, null, null),
@@ -1028,11 +1028,11 @@
           ['declaration']), //token('x', 4, 'dart:core;Map', ['declaration']),
       token('=', 6, null, null),
       token('<', 8, null, null),
-      token("int", 9, 'dart:core;Type<int>', [
+      token('int', 9, 'dart:core;Type<int>', [
         'reference'
       ]), //token("int", 9, 'dart:core;Type<dart:core;int>', ['reference']),
 //      token(',', null, null),
-      token("int", 14, 'dart:core;Type<int>', [
+      token('int', 14, 'dart:core;Type<int>', [
         'reference'
       ]), //token("int", 14, 'dart:core;Type<dart:core;int>', ['reference']),
       token('>', 17, null, null),
@@ -1063,7 +1063,7 @@
           ['declaration']), //token('x', 4, 'dart:core;Set', ['declaration']),
       token('=', 6, null, null),
       token('<', 8, null, null),
-      token("int", 9, 'dart:core;Type<int>', [
+      token('int', 9, 'dart:core;Type<int>', [
         'reference'
       ]), //token("int", 9, 'dart:core;Type<dart:core;int>', ['reference']),
       token('>', 12, null, null),
diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
index 554365b..7f61e9c 100644
--- a/pkg/analysis_server/test/edit/assists_test.dart
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -149,6 +149,6 @@
         return;
       }
     }
-    fail("Expected to find |$message| in\n" + changes.join('\n'));
+    fail('Expected to find |$message| in\n' + changes.join('\n'));
   }
 }
diff --git a/pkg/analysis_server/test/edit/postfix_completion_test.dart b/pkg/analysis_server/test/edit/postfix_completion_test.dart
index 9c285de..e270972 100644
--- a/pkg/analysis_server/test/edit/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/edit/postfix_completion_test.dart
@@ -85,7 +85,7 @@
       }
       return;
     }
-    fail("Expected to find |$message| but got: " + change.message);
+    fail('Expected to find |$message| but got: ' + change.message);
   }
 
   _prepareCompletion(String key,
@@ -99,12 +99,12 @@
   _prepareCompletionAt(int offset, String key) async {
     var params = EditGetPostfixCompletionParams(testFile, key, offset);
     var request =
-        Request('0', "edit.isPostfixCompletionApplicable", params.toJson());
+        Request('0', 'edit.isPostfixCompletionApplicable', params.toJson());
     Response response = await waitResponse(request, throwOnError: false);
     var isApplicable =
         EditIsPostfixCompletionApplicableResult.fromResponse(response);
     if (!isApplicable.value) {
-      fail("Postfix completion not applicable at given location");
+      fail('Postfix completion not applicable at given location');
     }
     request =
         EditGetPostfixCompletionParams(testFile, key, offset).toRequest('1');
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 1fe373f..dc2284b 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -439,7 +439,7 @@
 }
 ''');
 
-    Future<void> checkUpdate(doUpdate()) async {
+    Future<void> checkUpdate(void Function() doUpdate) async {
       await getRefactoringResult(() {
         return sendStringRequest('1 + 2', 'res', true);
       });
@@ -2183,7 +2183,7 @@
   }
 
   Future assertSuccessfulRefactoring(
-      Future<Response> requestSender(), String expectedCode,
+      Future<Response> Function() requestSender, String expectedCode,
       {void Function(RefactoringFeedback) feedbackValidator}) async {
     EditGetRefactoringResult result = await getRefactoringResult(requestSender);
     assertResultProblemsOK(result);
@@ -2212,7 +2212,7 @@
   }
 
   Future<EditGetRefactoringResult> getRefactoringResult(
-      Future<Response> requestSender()) async {
+      Future<Response> Function() requestSender) async {
     if (shouldWaitForFullAnalysis) {
       await waitForTasksFinished();
     }
diff --git a/pkg/analysis_server/test/edit/statement_completion_test.dart b/pkg/analysis_server/test/edit/statement_completion_test.dart
index 6dd37f7..1c0d1da 100644
--- a/pkg/analysis_server/test/edit/statement_completion_test.dart
+++ b/pkg/analysis_server/test/edit/statement_completion_test.dart
@@ -120,7 +120,7 @@
       }
       return;
     }
-    fail("Expected to find |$message| but got: " + change.message);
+    fail('Expected to find |$message| but got: ' + change.message);
   }
 
   _prepareCompletion(String search,
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
index 6088003..31073f1 100644
--- a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -72,6 +72,6 @@
     expect(error.location.startLine, 1);
     expect(error.location.startColumn, 1);
     expect(error.message,
-        "The name of the analysis options file .analysis_options is deprecated; consider renaming it to analysis_options.yaml.");
+        'The name of the analysis options file .analysis_options is deprecated; consider renaming it to analysis_options.yaml.');
   }
 }
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 09c94a4..46f961c 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -35,11 +35,11 @@
   f();
 }
 """;
-    String fooBarText = """
+    String fooBarText = '''
 library foo.bar;
 
 f() {}
-""";
+''';
     writeFile(mainPath, mainText);
     String normalizedFooBarPath = writeFile(fooBarPath, fooBarText);
     sendServerSetSubscriptions([ServerService.STATUS]);
diff --git a/pkg/analysis_server/test/integration/edit/sort_members_test.dart b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
index 1896537..b928b6f 100644
--- a/pkg/analysis_server/test/integration/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
@@ -29,7 +29,7 @@
     EditSortMembersResult result = await sendEditSortMembers(pathname);
     SourceFileEdit edit = result.edit;
     expect(edit.edits, hasLength(1));
-    expect(edit.edits.first.replacement, "bar;\nint foo");
+    expect(edit.edits.first.replacement, 'bar;\nint foo');
   }
 
   test_sort_no_changes() async {
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
index 6bfde08..51dc047 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
@@ -19,7 +19,7 @@
   test_setSubscriptions_invalidService() {
     // TODO(paulberry): verify that if an invalid service is specified, the
     // current subscriptions are unchanged.
-    return server.send("server.setSubscriptions", {
+    return server.send('server.setSubscriptions', {
       'subscriptions': ['bogus']
     }).then((_) {
       fail('setSubscriptions should have produced an error');
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index c5beb46..812fe9d 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -650,7 +650,7 @@
     _pendingCommands[id] = completer;
     String line = json.encode(command);
     _recordStdio('==> $line');
-    _process.stdin.add(utf8.encoder.convert("$line\n"));
+    _process.stdin.add(utf8.encoder.convert('$line\n'));
     return completer.future;
   }
 
@@ -770,7 +770,7 @@
    */
   void _recordStdio(String line) {
     double elapsedTime = currentElapseTime;
-    line = "$elapsedTime: $line";
+    line = '$elapsedTime: $line';
     if (_debuggingStdio) {
       print(line);
     }
@@ -939,7 +939,7 @@
    * substructure did not match.
    */
   checkSubstructure(item, Matcher matcher, List<MismatchDescriber> mismatches,
-      Description describeSubstructure(Description description)) {
+      Description Function(Description) describeSubstructure) {
     Map subState = {};
     if (!matcher.matches(item, subState)) {
       mismatches.add((Description mismatchDescription) {
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index f37d6ce..909e178 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -162,6 +162,31 @@
     return WorkspaceClientCapabilities.fromJson(json);
   }
 
+  TextDocumentClientCapabilities withAllSupportedDynamicRegistrations(
+    TextDocumentClientCapabilities source,
+  ) {
+    // This list should match all of the fields listed in
+    // `ClientDynamicRegistrations.supported`.
+    return extendTextDocumentCapabilities(source, {
+      'synchronization': {'dynamicRegistration': true},
+      'completion': {'dynamicRegistration': true},
+      'hover': {'dynamicRegistration': true},
+      'signatureHelp': {'dynamicRegistration': true},
+      'references': {'dynamicRegistration': true},
+      'documentHighlight': {'dynamicRegistration': true},
+      'documentSymbol': {'dynamicRegistration': true},
+      'synchronization': {'dynamicRegistration': true},
+      'formatting': {'dynamicRegistration': true},
+      'onTypeFormatting': {'dynamicRegistration': true},
+      'declaration': {'dynamicRegistration': true},
+      'definition': {'dynamicRegistration': true},
+      'implementation': {'dynamicRegistration': true},
+      'codeAction': {'dynamicRegistration': true},
+      'rename': {'dynamicRegistration': true},
+      'foldingRange': {'dynamicRegistration': true},
+    });
+  }
+
   WorkspaceClientCapabilities withApplyEditSupport(
     WorkspaceClientCapabilities source,
   ) {
@@ -267,31 +292,6 @@
       'synchronization': {'dynamicRegistration': true}
     });
   }
-
-  TextDocumentClientCapabilities withAllSupportedDynamicRegistrations(
-    TextDocumentClientCapabilities source,
-  ) {
-    // This list should match all of the fields listed in
-    // `ClientDynamicRegistrations.supported`.
-    return extendTextDocumentCapabilities(source, {
-      'synchronization': {'dynamicRegistration': true},
-      'completion': {'dynamicRegistration': true},
-      'hover': {'dynamicRegistration': true},
-      'signatureHelp': {'dynamicRegistration': true},
-      'references': {'dynamicRegistration': true},
-      'documentHighlight': {'dynamicRegistration': true},
-      'documentSymbol': {'dynamicRegistration': true},
-      'synchronization': {'dynamicRegistration': true},
-      'formatting': {'dynamicRegistration': true},
-      'onTypeFormatting': {'dynamicRegistration': true},
-      'declaration': {'dynamicRegistration': true},
-      'definition': {'dynamicRegistration': true},
-      'implementation': {'dynamicRegistration': true},
-      'codeAction': {'dynamicRegistration': true},
-      'rename': {'dynamicRegistration': true},
-      'foldingRange': {'dynamicRegistration': true},
-    });
-  }
 }
 
 mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
@@ -540,7 +540,7 @@
   }
 
   Future<T> expectErrorNotification<T>(
-    FutureOr<void> f(), {
+    FutureOr<void> Function() f, {
     Duration timeout = const Duration(seconds: 5),
   }) async {
     final firstError = errorNotificationsFromServer.first;
@@ -554,7 +554,7 @@
 
   Future<T> expectNotification<T>(
     bool Function(NotificationMessage) test,
-    FutureOr<void> f(), {
+    FutureOr<void> Function() f, {
     Duration timeout = const Duration(seconds: 5),
   }) async {
     final firstError = notificationsFromServer.firstWhere(test);
@@ -569,7 +569,7 @@
   /// Expects a [method] request from the server after executing [f].
   Future<RequestMessage> expectRequest(
     Method method,
-    FutureOr<void> f(), {
+    FutureOr<void> Function() f, {
     Duration timeout = const Duration(seconds: 5),
   }) async {
     final firstRequest =
@@ -782,8 +782,8 @@
   /// response to the request it sends (3).
   Future<T> handleExpectedRequest<T, R, RR>(
     Method method,
-    Future<T> f(), {
-    @required FutureOr<RR> handler(R params),
+    Future<T> Function() f, {
+    @required FutureOr<RR> Function(R) handler,
     Duration timeout = const Duration(seconds: 5),
   }) async {
     FutureOr<T> outboundRequest;
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index 627a3d3..f4e6b3d 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -256,7 +256,7 @@
    * If the corresponding value is an [ApiEnum], then we check that converting
    * the given key results in the given value.
    */
-  void run(ApiEnum convert(EngineEnum value),
+  void run(ApiEnum Function(EngineEnum) convert,
       {Map<EngineEnum, ApiEnum> exceptions = const {}}) {
     ClassMirror engineClass = reflectClass(EngineEnum);
     engineClass.staticMembers.forEach((Symbol symbol, MethodMirror method) {
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 8ecb4a9..7844b03 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -62,8 +62,8 @@
   void test_create() {
     RequestError error = RequestError(RequestErrorCode.INVALID_REQUEST, 'msg');
     expect(error.code, RequestErrorCode.INVALID_REQUEST);
-    expect(error.message, "msg");
-    expect(error.toJson(), equals({CODE: 'INVALID_REQUEST', MESSAGE: "msg"}));
+    expect(error.message, 'msg');
+    expect(error.toJson(), equals({CODE: 'INVALID_REQUEST', MESSAGE: 'msg'}));
   }
 
   void test_fromJson() {
@@ -75,7 +75,7 @@
     };
     RequestError error = RequestError.fromJson(ResponseDecoder(null), '', json);
     expect(error.code, RequestErrorCode.INVALID_PARAMETER);
-    expect(error.message, "foo");
+    expect(error.message, 'foo');
     expect(error.stackTrace, trace);
   }
 
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index 40e52d1..de7f04e 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -764,7 +764,7 @@
   ppp.Stream b;
 }
 ''');
-    await findElementReferences("ppp;", false);
+    await findElementReferences('ppp;', false);
     expect(searchElement.kind, ElementKind.PREFIX);
     expect(searchElement.name, 'ppp');
     expect(searchElement.location.startLine, 1);
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index aa7ee21..a83ad3c 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
@@ -48,7 +48,7 @@
       }
       return;
     }
-    fail("Expected to find |$message| but got: " + change.message);
+    fail('Expected to find |$message| but got: ' + change.message);
   }
 
   Future<void> _assertNotApplicable(String key, String code) async {
@@ -63,7 +63,7 @@
 
     bool isApplicable = await processor.isApplicable();
     if (!isApplicable) {
-      fail("Postfix completion not applicable at given location");
+      fail('Postfix completion not applicable at given location');
     }
 
     if (isApplicable) {
diff --git a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
index 68ad884..1f6ebf7 100644
--- a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
@@ -58,7 +58,7 @@
       }
       return;
     }
-    fail("Expected to find |$message| but got: " + change.message);
+    fail('Expected to find |$message| but got: ' + change.message);
   }
 
   _computeCompletion(int offset) async {
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index ba2d1e0..7c9e180 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -118,7 +118,7 @@
     expect(problems[0].location.offset, 1);
     expect(problems[0].location.length, 2);
     // add WARNING, resulting severity is still FATAL
-    refactoringStatus.addWarning("warning");
+    refactoringStatus.addWarning('warning');
     expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL);
   }
 
@@ -141,12 +141,12 @@
 
   void test_addStatus_Error_withWarning() {
     RefactoringStatus refactoringStatus = RefactoringStatus();
-    refactoringStatus.addError("err");
+    refactoringStatus.addError('err');
     expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
     // merge with OK
     {
       RefactoringStatus other = RefactoringStatus();
-      other.addWarning("warn");
+      other.addWarning('warn');
       refactoringStatus.addStatus(other);
     }
     expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
@@ -155,7 +155,7 @@
 
   void test_addStatus_Warning_null() {
     RefactoringStatus refactoringStatus = RefactoringStatus();
-    refactoringStatus.addWarning("warn");
+    refactoringStatus.addWarning('warn');
     expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING);
     // merge with "null"
     refactoringStatus.addStatus(null);
@@ -164,12 +164,12 @@
 
   void test_addStatus_Warning_withError() {
     RefactoringStatus refactoringStatus = RefactoringStatus();
-    refactoringStatus.addWarning("warn");
+    refactoringStatus.addWarning('warn');
     expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING);
     // merge with OK
     {
       RefactoringStatus other = RefactoringStatus();
-      other.addError("err");
+      other.addError('err');
       refactoringStatus.addStatus(other);
     }
     expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
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 0cc082e..4790004 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -196,12 +196,12 @@
     refactoring.name = null;
     assertRefactoringStatus(
         refactoring.checkName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be null.");
+        expectedMessage: 'Variable name must not be null.');
     // empty
     refactoring.name = '';
     assertRefactoringStatus(
         refactoring.checkName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be empty.");
+        expectedMessage: 'Variable name must not be empty.');
     // OK
     refactoring.name = 'res';
     assertRefactoringStatusOK(refactoring.checkName());
@@ -1365,12 +1365,12 @@
   void _assertSingleLinkedEditGroup(
       {int length, List<int> offsets, List<String> names}) {
     var positions =
-        offsets.map((offset) => {"file": testFile, "offset": offset});
-    var suggestions = names.map((name) => {"value": name, "kind": "VARIABLE"});
+        offsets.map((offset) => {'file': testFile, 'offset': offset});
+    var suggestions = names.map((name) => {'value': name, 'kind': 'VARIABLE'});
     var expected = <String, dynamic>{
-      "length": length,
-      "positions": positions.toList(),
-      "suggestions": suggestions.toList()
+      'length': length,
+      'positions': positions.toList(),
+      'suggestions': suggestions.toList()
     };
     _assertSingleLinkedEditGroupJson(json.encode(expected));
   }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index 0d0261f..77be546 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -197,7 +197,7 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Can only extract a single expression or a set of statements.");
+        'Can only extract a single expression or a set of statements.');
   }
 
   test_bad_forLoop_conditionAndUpdaters() async {
@@ -282,7 +282,7 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Not all selected statements are enclosed by the same parent statement.");
+        'Not all selected statements are enclosed by the same parent statement.');
   }
 
   test_bad_methodName_reference() async {
@@ -292,7 +292,7 @@
 }
 ''');
     _createRefactoringWithSuffix('main', '();');
-    return _assertConditionsFatal("Cannot extract a single method name.");
+    return _assertConditionsFatal('Cannot extract a single method name.');
   }
 
   test_bad_namePartOfDeclaration_function() async {
@@ -302,7 +302,7 @@
 ''');
     _createRefactoringForString('main');
     return _assertConditionsFatal(
-        "Cannot extract the name part of a declaration.");
+        'Cannot extract the name part of a declaration.');
   }
 
   test_bad_namePartOfDeclaration_variable() async {
@@ -313,7 +313,7 @@
 ''');
     _createRefactoringForString('vvv');
     return _assertConditionsFatal(
-        "Cannot extract the name part of a declaration.");
+        'Cannot extract the name part of a declaration.');
   }
 
   test_bad_namePartOfQualified() async {
@@ -328,7 +328,7 @@
 ''');
     _createRefactoringWithSuffix('fff', ' = 1');
     return _assertConditionsFatal(
-        "Can not extract name part of a property access.");
+        'Can not extract name part of a property access.');
   }
 
   test_bad_newMethodName_notIdentifier() async {
@@ -468,8 +468,8 @@
 ''');
     _createRefactoringForStartEndString('print(0', 'rint(1)');
     return _assertConditionsFatal(
-        "The selection does not cover a set of statements or an expression. "
-        "Extend selection to a valid range.");
+        'The selection does not cover a set of statements or an expression. '
+        'Extend selection to a valid range.');
   }
 
   test_bad_statements_exit_notAllExecutionFlows() async {
@@ -499,8 +499,8 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Ambiguous return value: Selected block contains assignment(s) to "
-        "local variables and return statement.");
+        'Ambiguous return value: Selected block contains assignment(s) to '
+        'local variables and return statement.');
   }
 
   test_bad_switchCase() async {
@@ -515,8 +515,8 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Selection must either cover whole switch statement "
-        "or parts of a single case block.");
+        'Selection must either cover whole switch statement '
+        'or parts of a single case block.');
   }
 
   test_bad_tokensBetweenLastNodeAndSelectionEnd() async {
@@ -530,7 +530,7 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "The end of the selection contains characters that do not belong to a statement.");
+        'The end of the selection contains characters that do not belong to a statement.');
   }
 
   test_bad_tokensBetweenSelectionStartAndFirstNode() async {
@@ -544,7 +544,7 @@
 ''');
     _createRefactoringForStartEndString('); // marker', '// end');
     return _assertConditionsFatal(
-        "The beginning of the selection contains characters that do not belong to a statement.");
+        'The beginning of the selection contains characters that do not belong to a statement.');
   }
 
   test_bad_try_catchBlock_block() async {
@@ -560,8 +560,8 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Selection must either cover whole try statement or "
-        "parts of try, catch, or finally block.");
+        'Selection must either cover whole try statement or '
+        'parts of try, catch, or finally block.');
   }
 
   test_bad_try_catchBlock_complete() async {
@@ -577,8 +577,8 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Selection must either cover whole try statement or "
-        "parts of try, catch, or finally block.");
+        'Selection must either cover whole try statement or '
+        'parts of try, catch, or finally block.');
   }
 
   test_bad_try_catchBlock_exception() async {
@@ -611,8 +611,8 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Selection must either cover whole try statement or "
-        "parts of try, catch, or finally block.");
+        'Selection must either cover whole try statement or '
+        'parts of try, catch, or finally block.');
   }
 
   test_bad_try_tryBlock() async {
@@ -628,8 +628,8 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Selection must either cover whole try statement or "
-        "parts of try, catch, or finally block.");
+        'Selection must either cover whole try statement or '
+        'parts of try, catch, or finally block.');
   }
 
   test_bad_typeReference() async {
@@ -638,8 +638,8 @@
   int a = 0;
 }
 ''');
-    _createRefactoringForString("int");
-    return _assertConditionsFatal("Cannot extract a single type reference.");
+    _createRefactoringForString('int');
+    return _assertConditionsFatal('Cannot extract a single type reference.');
   }
 
   test_bad_variableDeclarationFragment() async {
@@ -654,7 +654,7 @@
 ''');
     _createRefactoringForStartEndComments();
     return _assertConditionsFatal(
-        "Cannot extract a variable declaration fragment. Select whole declaration statement.");
+        'Cannot extract a variable declaration fragment. Select whole declaration statement.');
   }
 
   test_bad_while_conditionAndBody() async {
@@ -796,23 +796,23 @@
     refactoring.name = null;
     assertRefactoringStatus(
         refactoring.checkName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be null.");
+        expectedMessage: 'Method name must not be null.');
     // empty
     refactoring.name = '';
     assertRefactoringStatus(
         refactoring.checkName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be empty.");
+        expectedMessage: 'Method name must not be empty.');
     // incorrect casing
     refactoring.name = 'Aaa';
     assertRefactoringStatus(
         refactoring.checkName(), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Method name should start with a lowercase letter.");
+        expectedMessage: 'Method name should start with a lowercase letter.');
     // starts with digit
     refactoring.name = '0aa';
     assertRefactoringStatus(
         refactoring.checkName(), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Method name must begin with a lowercase letter or underscore.");
+            'Method name must begin with a lowercase letter or underscore.');
     // invalid name (quote)
     refactoring.name = '"';
     assertRefactoringStatus(
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index d714f0d..a51399b 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -24,661 +24,661 @@
 
   void test_validateClassName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateClassName("newName"), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Class name should start with an uppercase letter.");
+        validateClassName('newName'), RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Class name should start with an uppercase letter.');
   }
 
   void test_validateClassName_empty() {
     assertRefactoringStatus(
-        validateClassName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Class name must not be empty.");
+        validateClassName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Class name must not be empty.');
   }
 
   void test_validateClassName_invalidCharacter() {
     assertRefactoringStatus(
-        validateClassName("-NewName"), RefactoringProblemSeverity.FATAL,
+        validateClassName('-NewName'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not contain '-'.");
   }
 
   void test_validateClassName_leadingBlanks() {
     assertRefactoringStatus(
-        validateClassName(" NewName"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Class name must not start or end with a blank.");
+        validateClassName(' NewName'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Class name must not start or end with a blank.');
   }
 
   void test_validateClassName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateClassName("New-Name"), RefactoringProblemSeverity.FATAL,
+        validateClassName('New-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not contain '-'.");
   }
 
   void test_validateClassName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateClassName("badName"), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Class name should start with an uppercase letter.");
+        validateClassName('badName'), RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Class name should start with an uppercase letter.');
   }
 
   void test_validateClassName_null() {
     assertRefactoringStatus(
         validateClassName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Class name must not be null.");
+        expectedMessage: 'Class name must not be null.');
   }
 
   void test_validateClassName_OK() {
-    assertRefactoringStatusOK(validateClassName("NewName"));
+    assertRefactoringStatusOK(validateClassName('NewName'));
   }
 
   void test_validateClassName_OK_leadingDollar() {
-    assertRefactoringStatusOK(validateClassName("\$NewName"));
+    assertRefactoringStatusOK(validateClassName('\$NewName'));
   }
 
   void test_validateClassName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateClassName("_NewName"));
+    assertRefactoringStatusOK(validateClassName('_NewName'));
   }
 
   void test_validateClassName_OK_middleDollar() {
-    assertRefactoringStatusOK(validateClassName("New\$Name"));
+    assertRefactoringStatusOK(validateClassName('New\$Name'));
   }
 
   void test_validateClassName_trailingBlanks() {
     assertRefactoringStatus(
-        validateClassName("NewName "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Class name must not start or end with a blank.");
+        validateClassName('NewName '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Class name must not start or end with a blank.');
   }
 
   void test_validateConstructorName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateConstructorName("NewName"), RefactoringProblemSeverity.WARNING,
+        validateConstructorName('NewName'), RefactoringProblemSeverity.WARNING,
         expectedMessage:
-            "Constructor name should start with a lowercase letter.");
+            'Constructor name should start with a lowercase letter.');
   }
 
   void test_validateConstructorName_empty() {
-    assertRefactoringStatusOK(validateConstructorName(""));
+    assertRefactoringStatusOK(validateConstructorName(''));
   }
 
   void test_validateConstructorName_leadingBlanks() {
     assertRefactoringStatus(
-        validateConstructorName(" newName"), RefactoringProblemSeverity.FATAL,
+        validateConstructorName(' newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Constructor name must not start or end with a blank.");
+            'Constructor name must not start or end with a blank.');
   }
 
   void test_validateConstructorName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateConstructorName("na-me"), RefactoringProblemSeverity.FATAL,
+        validateConstructorName('na-me'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constructor name must not contain '-'.");
   }
 
   void test_validateConstructorName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateConstructorName("2name"), RefactoringProblemSeverity.FATAL,
+        validateConstructorName('2name'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Constructor name must begin with a lowercase letter or underscore.");
+            'Constructor name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateConstructorName_null() {
     assertRefactoringStatus(
         validateConstructorName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constructor name must not be null.");
+        expectedMessage: 'Constructor name must not be null.');
   }
 
   void test_validateConstructorName_OK() {
-    assertRefactoringStatusOK(validateConstructorName("newName"));
+    assertRefactoringStatusOK(validateConstructorName('newName'));
   }
 
   void test_validateConstructorName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateConstructorName("_newName"));
+    assertRefactoringStatusOK(validateConstructorName('_newName'));
   }
 
   void test_validateConstructorName_trailingBlanks() {
     assertRefactoringStatus(
-        validateConstructorName("newName "), RefactoringProblemSeverity.FATAL,
+        validateConstructorName('newName '), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Constructor name must not start or end with a blank.");
+            'Constructor name must not start or end with a blank.');
   }
 
   void test_validateFieldName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateFieldName("NewName"), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Field name should start with a lowercase letter.");
+        validateFieldName('NewName'), RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Field name should start with a lowercase letter.');
   }
 
   void test_validateFieldName_empty() {
     assertRefactoringStatus(
-        validateFieldName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not be empty.");
+        validateFieldName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Field name must not be empty.');
   }
 
   void test_validateFieldName_keyword() {
     assertRefactoringStatus(
-        validateFieldName("for"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not be a keyword.");
+        validateFieldName('for'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Field name must not be a keyword.');
   }
 
   void test_validateFieldName_leadingBlanks() {
     assertRefactoringStatus(
-        validateFieldName(" newName"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not start or end with a blank.");
+        validateFieldName(' newName'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Field name must not start or end with a blank.');
   }
 
   void test_validateFieldName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateFieldName("new-Name"), RefactoringProblemSeverity.FATAL,
+        validateFieldName('new-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Field name must not contain '-'.");
   }
 
   void test_validateFieldName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateFieldName("2newName"), RefactoringProblemSeverity.FATAL,
+        validateFieldName('2newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Field name must begin with a lowercase letter or underscore.");
+            'Field name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateFieldName_null() {
     assertRefactoringStatus(
         validateFieldName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not be null.");
+        expectedMessage: 'Field name must not be null.');
   }
 
   void test_validateFieldName_OK() {
-    assertRefactoringStatusOK(validateFieldName("newName"));
+    assertRefactoringStatusOK(validateFieldName('newName'));
   }
 
   void test_validateFieldName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateFieldName("_newName"));
+    assertRefactoringStatusOK(validateFieldName('_newName'));
   }
 
   void test_validateFieldName_OK_middleUnderscore() {
-    assertRefactoringStatusOK(validateFieldName("new_name"));
+    assertRefactoringStatusOK(validateFieldName('new_name'));
   }
 
   void test_validateFieldName_pseudoKeyword() {
-    _assertWarningBuiltIn(validateFieldName("await"));
+    _assertWarningBuiltIn(validateFieldName('await'));
   }
 
   void test_validateFieldName_trailingBlanks() {
     assertRefactoringStatus(
-        validateFieldName("newName "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not start or end with a blank.");
+        validateFieldName('newName '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Field name must not start or end with a blank.');
   }
 
   void test_validateFunctionName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateFunctionName("NewName"), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Function name should start with a lowercase letter.");
+        validateFunctionName('NewName'), RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Function name should start with a lowercase letter.');
   }
 
   void test_validateFunctionName_empty() {
     assertRefactoringStatus(
-        validateFunctionName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be empty.");
+        validateFunctionName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Function name must not be empty.');
   }
 
   void test_validateFunctionName_keyword() {
     assertRefactoringStatus(
-        validateFunctionName("new"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be a keyword.");
+        validateFunctionName('new'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Function name must not be a keyword.');
   }
 
   void test_validateFunctionName_leadingBlanks() {
     assertRefactoringStatus(
-        validateFunctionName(" newName"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not start or end with a blank.");
+        validateFunctionName(' newName'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Function name must not start or end with a blank.');
   }
 
   void test_validateFunctionName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateFunctionName("new-Name"), RefactoringProblemSeverity.FATAL,
+        validateFunctionName('new-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function name must not contain '-'.");
   }
 
   void test_validateFunctionName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateFunctionName("2newName"), RefactoringProblemSeverity.FATAL,
+        validateFunctionName('2newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Function name must begin with a lowercase letter or underscore.");
+            'Function name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateFunctionName_null() {
     assertRefactoringStatus(
         validateFunctionName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be null.");
+        expectedMessage: 'Function name must not be null.');
   }
 
   void test_validateFunctionName_OK() {
-    assertRefactoringStatusOK(validateFunctionName("newName"));
+    assertRefactoringStatusOK(validateFunctionName('newName'));
   }
 
   void test_validateFunctionName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateFunctionName("_newName"));
+    assertRefactoringStatusOK(validateFunctionName('_newName'));
   }
 
   void test_validateFunctionName_OK_middleUnderscore() {
-    assertRefactoringStatusOK(validateFunctionName("new_name"));
+    assertRefactoringStatusOK(validateFunctionName('new_name'));
   }
 
   void test_validateFunctionName_pseudoKeyword() {
-    _assertWarningBuiltIn(validateFunctionName("yield"));
+    _assertWarningBuiltIn(validateFunctionName('yield'));
   }
 
   void test_validateFunctionName_trailingBlanks() {
     assertRefactoringStatus(
-        validateFunctionName("newName "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not start or end with a blank.");
+        validateFunctionName('newName '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Function name must not start or end with a blank.');
   }
 
   void test_validateFunctionTypeAliasName_doesNotStartWithLowerCase() {
-    assertRefactoringStatus(validateFunctionTypeAliasName("newName"),
+    assertRefactoringStatus(validateFunctionTypeAliasName('newName'),
         RefactoringProblemSeverity.WARNING,
         expectedMessage:
-            "Function type alias name should start with an uppercase letter.");
+            'Function type alias name should start with an uppercase letter.');
   }
 
   void test_validateFunctionTypeAliasName_empty() {
     assertRefactoringStatus(
-        validateFunctionTypeAliasName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function type alias name must not be empty.");
+        validateFunctionTypeAliasName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Function type alias name must not be empty.');
   }
 
   void test_validateFunctionTypeAliasName_invalidCharacters() {
-    assertRefactoringStatus(validateFunctionTypeAliasName("New-Name"),
+    assertRefactoringStatus(validateFunctionTypeAliasName('New-Name'),
         RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function type alias name must not contain \'-\'.");
   }
 
   void test_validateFunctionTypeAliasName_leadingBlanks() {
-    assertRefactoringStatus(validateFunctionTypeAliasName(" NewName"),
+    assertRefactoringStatus(validateFunctionTypeAliasName(' NewName'),
         RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Function type alias name must not start or end with a blank.");
+            'Function type alias name must not start or end with a blank.');
   }
 
   void test_validateFunctionTypeAliasName_notIdentifierMiddle() {
-    assertRefactoringStatus(validateFunctionTypeAliasName("New-Name"),
+    assertRefactoringStatus(validateFunctionTypeAliasName('New-Name'),
         RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function type alias name must not contain '-'.");
   }
 
   void test_validateFunctionTypeAliasName_notIdentifierStart() {
-    assertRefactoringStatus(validateFunctionTypeAliasName("newName"),
+    assertRefactoringStatus(validateFunctionTypeAliasName('newName'),
         RefactoringProblemSeverity.WARNING,
         expectedMessage:
-            "Function type alias name should start with an uppercase letter.");
+            'Function type alias name should start with an uppercase letter.');
   }
 
   void test_validateFunctionTypeAliasName_null() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function type alias name must not be null.");
+        expectedMessage: 'Function type alias name must not be null.');
   }
 
   void test_validateFunctionTypeAliasName_OK() {
-    assertRefactoringStatusOK(validateFunctionTypeAliasName("NewName"));
+    assertRefactoringStatusOK(validateFunctionTypeAliasName('NewName'));
   }
 
   void test_validateFunctionTypeAliasName_OK_leadingDollar() {
-    assertRefactoringStatusOK(validateFunctionTypeAliasName("\$NewName"));
+    assertRefactoringStatusOK(validateFunctionTypeAliasName('\$NewName'));
   }
 
   void test_validateFunctionTypeAliasName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateFunctionTypeAliasName("_NewName"));
+    assertRefactoringStatusOK(validateFunctionTypeAliasName('_NewName'));
   }
 
   void test_validateFunctionTypeAliasName_OK_middleDollar() {
-    assertRefactoringStatusOK(validateFunctionTypeAliasName("New\$Name"));
+    assertRefactoringStatusOK(validateFunctionTypeAliasName('New\$Name'));
   }
 
   void test_validateFunctionTypeAliasName_trailingBlanks() {
-    assertRefactoringStatus(validateFunctionTypeAliasName("NewName "),
+    assertRefactoringStatus(validateFunctionTypeAliasName('NewName '),
         RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Function type alias name must not start or end with a blank.");
+            'Function type alias name must not start or end with a blank.');
   }
 
   void test_validateImportPrefixName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateImportPrefixName("NewName"), RefactoringProblemSeverity.WARNING,
+        validateImportPrefixName('NewName'), RefactoringProblemSeverity.WARNING,
         expectedMessage:
-            "Import prefix name should start with a lowercase letter.");
+            'Import prefix name should start with a lowercase letter.');
   }
 
   void test_validateImportPrefixName_empty() {
-    assertRefactoringStatusOK(validateImportPrefixName(""));
+    assertRefactoringStatusOK(validateImportPrefixName(''));
   }
 
   void test_validateImportPrefixName_keyword() {
     assertRefactoringStatus(
-        validateImportPrefixName("while"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Import prefix name must not be a keyword.");
+        validateImportPrefixName('while'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Import prefix name must not be a keyword.');
   }
 
   void test_validateImportPrefixName_leadingBlanks() {
     assertRefactoringStatus(
-        validateImportPrefixName(" newName"), RefactoringProblemSeverity.FATAL,
+        validateImportPrefixName(' newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Import prefix name must not start or end with a blank.");
+            'Import prefix name must not start or end with a blank.');
   }
 
   void test_validateImportPrefixName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateImportPrefixName("new-Name"), RefactoringProblemSeverity.FATAL,
+        validateImportPrefixName('new-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Import prefix name must not contain '-'.");
   }
 
   void test_validateImportPrefixName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateImportPrefixName("2newName"), RefactoringProblemSeverity.FATAL,
+        validateImportPrefixName('2newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Import prefix name must begin with a lowercase letter or underscore.");
+            'Import prefix name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateImportPrefixName_null() {
     assertRefactoringStatus(
         validateImportPrefixName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Import prefix name must not be null.");
+        expectedMessage: 'Import prefix name must not be null.');
   }
 
   void test_validateImportPrefixName_OK() {
-    assertRefactoringStatusOK(validateImportPrefixName("newName"));
+    assertRefactoringStatusOK(validateImportPrefixName('newName'));
   }
 
   void test_validateImportPrefixName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateImportPrefixName("_newName"));
+    assertRefactoringStatusOK(validateImportPrefixName('_newName'));
   }
 
   void test_validateImportPrefixName_OK_middleUnderscore() {
-    assertRefactoringStatusOK(validateImportPrefixName("new_name"));
+    assertRefactoringStatusOK(validateImportPrefixName('new_name'));
   }
 
   void test_validateImportPrefixName_pseudoKeyword() {
     assertRefactoringStatus(
-        validateImportPrefixName("await"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Import prefix name must not be a keyword.");
+        validateImportPrefixName('await'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Import prefix name must not be a keyword.');
   }
 
   void test_validateImportPrefixName_trailingBlanks() {
     assertRefactoringStatus(
-        validateImportPrefixName("newName "), RefactoringProblemSeverity.FATAL,
+        validateImportPrefixName('newName '), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Import prefix name must not start or end with a blank.");
+            'Import prefix name must not start or end with a blank.');
   }
 
   void test_validateLabelName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateLabelName("NewName"), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Label name should start with a lowercase letter.");
+        validateLabelName('NewName'), RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Label name should start with a lowercase letter.');
   }
 
   void test_validateLabelName_empty() {
     assertRefactoringStatus(
-        validateLabelName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not be empty.");
+        validateLabelName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Label name must not be empty.');
   }
 
   void test_validateLabelName_keyword() {
     assertRefactoringStatus(
-        validateLabelName("for"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not be a keyword.");
+        validateLabelName('for'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Label name must not be a keyword.');
   }
 
   void test_validateLabelName_leadingBlanks() {
     assertRefactoringStatus(
-        validateLabelName(" newName"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not start or end with a blank.");
+        validateLabelName(' newName'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Label name must not start or end with a blank.');
   }
 
   void test_validateLabelName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateLabelName("new-Name"), RefactoringProblemSeverity.FATAL,
+        validateLabelName('new-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Label name must not contain '-'.");
   }
 
   void test_validateLabelName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateLabelName("2newName"), RefactoringProblemSeverity.FATAL,
+        validateLabelName('2newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Label name must begin with a lowercase letter or underscore.");
+            'Label name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateLabelName_null() {
     assertRefactoringStatus(
         validateLabelName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not be null.");
+        expectedMessage: 'Label name must not be null.');
   }
 
   void test_validateLabelName_OK() {
-    assertRefactoringStatusOK(validateLabelName("newName"));
+    assertRefactoringStatusOK(validateLabelName('newName'));
   }
 
   void test_validateLabelName_OK_leadingDollar() {
-    assertRefactoringStatusOK(validateLabelName("\$newName"));
+    assertRefactoringStatusOK(validateLabelName('\$newName'));
   }
 
   void test_validateLabelName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateLabelName("_newName"));
+    assertRefactoringStatusOK(validateLabelName('_newName'));
   }
 
   void test_validateLabelName_OK_middleUnderscore() {
-    assertRefactoringStatusOK(validateLabelName("new_name"));
+    assertRefactoringStatusOK(validateLabelName('new_name'));
   }
 
   void test_validateLabelName_pseudoKeyword() {
-    _assertWarningBuiltIn(validateLabelName("await"));
+    _assertWarningBuiltIn(validateLabelName('await'));
   }
 
   void test_validateLabelName_trailingBlanks() {
     assertRefactoringStatus(
-        validateLabelName("newName "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not start or end with a blank.");
+        validateLabelName('newName '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Label name must not start or end with a blank.');
   }
 
   void test_validateLibraryName_blank() {
     assertRefactoringStatus(
-        validateLibraryName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name must not be blank.");
+        validateLibraryName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Library name must not be blank.');
     assertRefactoringStatus(
-        validateLibraryName(" "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name must not be blank.");
+        validateLibraryName(' '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Library name must not be blank.');
   }
 
   void test_validateLibraryName_blank_identifier() {
     assertRefactoringStatus(
-        validateLibraryName("my..name"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name identifier must not be empty.");
+        validateLibraryName('my..name'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Library name identifier must not be empty.');
     assertRefactoringStatus(
-        validateLibraryName("my. .name"), RefactoringProblemSeverity.FATAL,
+        validateLibraryName('my. .name'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Library name identifier must not start or end with a blank.");
+            'Library name identifier must not start or end with a blank.');
   }
 
   void test_validateLibraryName_hasUpperCase() {
     assertRefactoringStatus(
-        validateLibraryName("my.newName"), RefactoringProblemSeverity.WARNING,
+        validateLibraryName('my.newName'), RefactoringProblemSeverity.WARNING,
         expectedMessage:
-            "Library name should consist of lowercase identifier separated by dots.");
+            'Library name should consist of lowercase identifier separated by dots.');
   }
 
   void test_validateLibraryName_keyword() {
     assertRefactoringStatus(
-        validateLibraryName("my.for.name"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name identifier must not be a keyword.");
+        validateLibraryName('my.for.name'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Library name identifier must not be a keyword.');
   }
 
   void test_validateLibraryName_leadingBlanks() {
     assertRefactoringStatus(
-        validateLibraryName("my. name"), RefactoringProblemSeverity.FATAL,
+        validateLibraryName('my. name'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Library name identifier must not start or end with a blank.");
+            'Library name identifier must not start or end with a blank.');
   }
 
   void test_validateLibraryName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateLibraryName("my.ba-d.name"), RefactoringProblemSeverity.FATAL,
+        validateLibraryName('my.ba-d.name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name identifier must not contain '-'.");
   }
 
   void test_validateLibraryName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateLibraryName("my.2bad.name"), RefactoringProblemSeverity.FATAL,
+        validateLibraryName('my.2bad.name'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Library name identifier must begin with a lowercase letter or underscore.");
+            'Library name identifier must begin with a lowercase letter or underscore.');
   }
 
   void test_validateLibraryName_null() {
     assertRefactoringStatus(
         validateLibraryName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name must not be null.");
+        expectedMessage: 'Library name must not be null.');
   }
 
   void test_validateLibraryName_OK_oneIdentifier() {
-    assertRefactoringStatusOK(validateLibraryName("name"));
+    assertRefactoringStatusOK(validateLibraryName('name'));
   }
 
   void test_validateLibraryName_OK_severalIdentifiers() {
-    assertRefactoringStatusOK(validateLibraryName("my.lib.name"));
+    assertRefactoringStatusOK(validateLibraryName('my.lib.name'));
   }
 
   void test_validateLibraryName_trailingBlanks() {
     assertRefactoringStatus(
-        validateLibraryName("my.bad .name"), RefactoringProblemSeverity.FATAL,
+        validateLibraryName('my.bad .name'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Library name identifier must not start or end with a blank.");
+            'Library name identifier must not start or end with a blank.');
   }
 
   void test_validateMethodName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateMethodName("NewName"), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Method name should start with a lowercase letter.");
+        validateMethodName('NewName'), RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Method name should start with a lowercase letter.');
   }
 
   void test_validateMethodName_empty() {
     assertRefactoringStatus(
-        validateMethodName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be empty.");
+        validateMethodName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Method name must not be empty.');
   }
 
   void test_validateMethodName_keyword() {
     assertRefactoringStatus(
-        validateMethodName("for"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be a keyword.");
+        validateMethodName('for'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Method name must not be a keyword.');
   }
 
   void test_validateMethodName_leadingBlanks() {
     assertRefactoringStatus(
-        validateMethodName(" newName"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not start or end with a blank.");
+        validateMethodName(' newName'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Method name must not start or end with a blank.');
   }
 
   void test_validateMethodName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateMethodName("new-Name"), RefactoringProblemSeverity.FATAL,
+        validateMethodName('new-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Method name must not contain '-'.");
   }
 
   void test_validateMethodName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateMethodName("2newName"), RefactoringProblemSeverity.FATAL,
+        validateMethodName('2newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Method name must begin with a lowercase letter or underscore.");
+            'Method name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateMethodName_null() {
     assertRefactoringStatus(
         validateMethodName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be null.");
+        expectedMessage: 'Method name must not be null.');
   }
 
   void test_validateMethodName_OK() {
-    assertRefactoringStatusOK(validateMethodName("newName"));
+    assertRefactoringStatusOK(validateMethodName('newName'));
   }
 
   void test_validateMethodName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateMethodName("_newName"));
+    assertRefactoringStatusOK(validateMethodName('_newName'));
   }
 
   void test_validateMethodName_OK_middleUnderscore() {
-    assertRefactoringStatusOK(validateMethodName("new_name"));
+    assertRefactoringStatusOK(validateMethodName('new_name'));
   }
 
   void test_validateMethodName_pseudoKeyword() {
-    _assertWarningBuiltIn(validateMethodName("yield"));
+    _assertWarningBuiltIn(validateMethodName('yield'));
   }
 
   void test_validateMethodName_trailingBlanks() {
     assertRefactoringStatus(
-        validateMethodName("newName "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not start or end with a blank.");
+        validateMethodName('newName '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Method name must not start or end with a blank.');
   }
 
   void test_validateParameterName_builtIn() {
-    _assertWarningBuiltIn(validateParameterName("await"));
+    _assertWarningBuiltIn(validateParameterName('await'));
   }
 
   void test_validateParameterName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateParameterName("NewName"), RefactoringProblemSeverity.WARNING,
+        validateParameterName('NewName'), RefactoringProblemSeverity.WARNING,
         expectedMessage:
-            "Parameter name should start with a lowercase letter.");
+            'Parameter name should start with a lowercase letter.');
   }
 
   void test_validateParameterName_empty() {
     assertRefactoringStatus(
-        validateParameterName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not be empty.");
+        validateParameterName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Parameter name must not be empty.');
   }
 
   void test_validateParameterName_keyword() {
     assertRefactoringStatus(
-        validateParameterName("while"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not be a keyword.");
+        validateParameterName('while'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Parameter name must not be a keyword.');
   }
 
   void test_validateParameterName_leadingBlanks() {
     assertRefactoringStatus(
-        validateParameterName(" newName"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not start or end with a blank.");
+        validateParameterName(' newName'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Parameter name must not start or end with a blank.');
   }
 
   void test_validateParameterName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateParameterName("new-Name"), RefactoringProblemSeverity.FATAL,
+        validateParameterName('new-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not contain '-'.");
   }
 
   void test_validateParameterName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateParameterName("2newName"), RefactoringProblemSeverity.FATAL,
+        validateParameterName('2newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Parameter name must begin with a lowercase letter or underscore.");
+            'Parameter name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateParameterName_null() {
     assertRefactoringStatus(
         validateParameterName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not be null.");
+        expectedMessage: 'Parameter name must not be null.');
   }
 
   void test_validateParameterName_OK() {
-    assertRefactoringStatusOK(validateParameterName("newName"));
+    assertRefactoringStatusOK(validateParameterName('newName'));
   }
 
   void test_validateParameterName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateParameterName("_newName"));
+    assertRefactoringStatusOK(validateParameterName('_newName'));
   }
 
   void test_validateParameterName_OK_middleUnderscore() {
-    assertRefactoringStatusOK(validateParameterName("new_name"));
+    assertRefactoringStatusOK(validateParameterName('new_name'));
   }
 
   void test_validateParameterName_pseudoKeyword() {
-    _assertWarningBuiltIn(validateParameterName("await"));
+    _assertWarningBuiltIn(validateParameterName('await'));
   }
 
   void test_validateParameterName_trailingBlanks() {
     assertRefactoringStatus(
-        validateParameterName("newName "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not start or end with a blank.");
+        validateParameterName('newName '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Parameter name must not start or end with a blank.');
   }
 
   void test_validateVariableName_builtIn() {
@@ -687,71 +687,71 @@
 
   void test_validateVariableName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
-        validateVariableName("NewName"), RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Variable name should start with a lowercase letter.");
+        validateVariableName('NewName'), RefactoringProblemSeverity.WARNING,
+        expectedMessage: 'Variable name should start with a lowercase letter.');
   }
 
   void test_validateVariableName_empty() {
     assertRefactoringStatus(
-        validateVariableName(""), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be empty.");
+        validateVariableName(''), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Variable name must not be empty.');
   }
 
   void test_validateVariableName_keyword() {
     assertRefactoringStatus(
-        validateVariableName("for"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be a keyword.");
+        validateVariableName('for'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Variable name must not be a keyword.');
   }
 
   void test_validateVariableName_leadingBlanks() {
     assertRefactoringStatus(
-        validateVariableName(" newName"), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not start or end with a blank.");
+        validateVariableName(' newName'), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Variable name must not start or end with a blank.');
   }
 
   void test_validateVariableName_notIdentifierMiddle() {
     assertRefactoringStatus(
-        validateVariableName("new-Name"), RefactoringProblemSeverity.FATAL,
+        validateVariableName('new-Name'), RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not contain '-'.");
   }
 
   void test_validateVariableName_notIdentifierStart() {
     assertRefactoringStatus(
-        validateVariableName("2newName"), RefactoringProblemSeverity.FATAL,
+        validateVariableName('2newName'), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "Variable name must begin with a lowercase letter or underscore.");
+            'Variable name must begin with a lowercase letter or underscore.');
   }
 
   void test_validateVariableName_null() {
     assertRefactoringStatus(
         validateVariableName(null), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be null.");
+        expectedMessage: 'Variable name must not be null.');
   }
 
   void test_validateVariableName_OK() {
-    assertRefactoringStatusOK(validateVariableName("newName"));
+    assertRefactoringStatusOK(validateVariableName('newName'));
   }
 
   void test_validateVariableName_OK_leadingDollar() {
-    assertRefactoringStatusOK(validateVariableName("\$newName"));
+    assertRefactoringStatusOK(validateVariableName('\$newName'));
   }
 
   void test_validateVariableName_OK_leadingUnderscore() {
-    assertRefactoringStatusOK(validateVariableName("_newName"));
+    assertRefactoringStatusOK(validateVariableName('_newName'));
   }
 
   void test_validateVariableName_OK_middleUnderscore() {
-    assertRefactoringStatusOK(validateVariableName("new_name"));
+    assertRefactoringStatusOK(validateVariableName('new_name'));
   }
 
   void test_validateVariableName_pseudoKeyword() {
-    _assertWarningBuiltIn(validateVariableName("await"));
+    _assertWarningBuiltIn(validateVariableName('await'));
   }
 
   void test_validateVariableName_trailingBlanks() {
     assertRefactoringStatus(
-        validateVariableName("newName "), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not start or end with a blank.");
+        validateVariableName('newName '), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Variable name must not start or end with a blank.');
   }
 
   void _assertWarningBuiltIn(RefactoringStatus status) {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index 92dc7fe..9fb1fd4 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -412,7 +412,7 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Field name must not be null.");
+        expectedMessage: 'Field name must not be null.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
@@ -429,18 +429,18 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be null.");
+        expectedMessage: 'Method name must not be null.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Method name must not be empty.");
+        expectedMessage: 'Method name must not be empty.');
     // same
     refactoring.newName = 'test';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "The new name must be different than the current name.");
+            'The new name must be different than the current name.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index a801fd3..91686be 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -47,13 +47,13 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constructor name must not be null.");
+        expectedMessage: 'Constructor name must not be null.');
     // same
     refactoring.newName = 'test';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "The new name must be different than the current name.");
+            'The new name must be different than the current name.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatusOK(refactoring.checkNewName());
diff --git a/pkg/analysis_server/test/services/refactoring/rename_extension_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_extension_member_test.dart
index 7e24c92..b26061f 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_extension_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_extension_member_test.dart
@@ -146,7 +146,7 @@
     assertRefactoringStatus(
       refactoring.checkNewName(),
       RefactoringProblemSeverity.FATAL,
-      expectedMessage: "Field name must not be null.",
+      expectedMessage: 'Field name must not be null.',
     );
 
     // OK
@@ -167,7 +167,7 @@
     assertRefactoringStatus(
       refactoring.checkNewName(),
       RefactoringProblemSeverity.FATAL,
-      expectedMessage: "Method name must not be null.",
+      expectedMessage: 'Method name must not be null.',
     );
 
     // empty
@@ -175,7 +175,7 @@
     assertRefactoringStatus(
       refactoring.checkNewName(),
       RefactoringProblemSeverity.FATAL,
-      expectedMessage: "Method name must not be empty.",
+      expectedMessage: 'Method name must not be empty.',
     );
 
     // same
@@ -183,7 +183,7 @@
     assertRefactoringStatus(
       refactoring.checkNewName(),
       RefactoringProblemSeverity.FATAL,
-      expectedMessage: "The new name must be different than the current name.",
+      expectedMessage: 'The new name must be different than the current name.',
     );
 
     // OK
diff --git a/pkg/analysis_server/test/services/refactoring/rename_import_test.dart b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
index ef76288..51a5849 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
@@ -25,13 +25,13 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Import prefix name must not be null.");
+        expectedMessage: 'Import prefix name must not be null.');
     // same
     refactoring.newName = 'test';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "The new name must be different than the current name.");
+            'The new name must be different than the current name.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatusOK(refactoring.checkNewName());
diff --git a/pkg/analysis_server/test/services/refactoring/rename_label_test.dart b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
index b8d8564..b583c5b 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
@@ -30,12 +30,12 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not be null.");
+        expectedMessage: 'Label name must not be null.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Label name must not be empty.");
+        expectedMessage: 'Label name must not be empty.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
diff --git a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index b8f8ac2..5ac2e21 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -25,18 +25,18 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name must not be null.");
+        expectedMessage: 'Library name must not be null.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Library name must not be blank.");
+        expectedMessage: 'Library name must not be blank.');
     // same name
     refactoring.newName = 'my.app';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "The new name must be different than the current name.");
+            'The new name must be different than the current name.');
   }
 
   test_createChange() async {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 14f3924..c677fca 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -240,7 +240,7 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be null.");
+        expectedMessage: 'Function name must not be null.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
@@ -257,12 +257,12 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be null.");
+        expectedMessage: 'Variable name must not be null.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be empty.");
+        expectedMessage: 'Variable name must not be empty.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
@@ -278,7 +278,7 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Parameter name must not be null.");
+        expectedMessage: 'Parameter name must not be null.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index baa28a5..c075d62 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -257,18 +257,18 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Class name must not be null.");
+        expectedMessage: 'Class name must not be null.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Class name must not be empty.");
+        expectedMessage: 'Class name must not be empty.');
     // same
     refactoring.newName = 'Test';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            "The new name must be different than the current name.");
+            'The new name must be different than the current name.');
     // OK
     refactoring.newName = 'NewName';
     assertRefactoringStatusOK(refactoring.checkNewName());
@@ -283,12 +283,12 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be null.");
+        expectedMessage: 'Function name must not be null.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function name must not be empty.");
+        expectedMessage: 'Function name must not be empty.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
@@ -303,7 +303,7 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Function type alias name must not be null.");
+        expectedMessage: 'Function type alias name must not be null.');
     // OK
     refactoring.newName = 'NewName';
     assertRefactoringStatusOK(refactoring.checkNewName());
@@ -318,12 +318,12 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be null.");
+        expectedMessage: 'Variable name must not be null.');
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Variable name must not be empty.");
+        expectedMessage: 'Variable name must not be empty.');
     // OK
     refactoring.newName = 'newName';
     assertRefactoringStatusOK(refactoring.checkNewName());
@@ -681,39 +681,39 @@
   }
 
   test_createChange_PropertyAccessorElement_getter_declaration() async {
-    await _test_createChange_PropertyAccessorElement("test {}");
+    await _test_createChange_PropertyAccessorElement('test {}');
   }
 
   test_createChange_PropertyAccessorElement_getter_usage() async {
-    await _test_createChange_PropertyAccessorElement("test);");
+    await _test_createChange_PropertyAccessorElement('test);');
   }
 
   test_createChange_PropertyAccessorElement_mix() async {
-    await _test_createChange_PropertyAccessorElement("test += 2");
+    await _test_createChange_PropertyAccessorElement('test += 2');
   }
 
   test_createChange_PropertyAccessorElement_setter_declaration() async {
-    await _test_createChange_PropertyAccessorElement("test(x) {}");
+    await _test_createChange_PropertyAccessorElement('test(x) {}');
   }
 
   test_createChange_PropertyAccessorElement_setter_usage() async {
-    await _test_createChange_PropertyAccessorElement("test = 1");
+    await _test_createChange_PropertyAccessorElement('test = 1');
   }
 
   test_createChange_TopLevelVariableElement_field() async {
-    await _test_createChange_TopLevelVariableElement("test = 0");
+    await _test_createChange_TopLevelVariableElement('test = 0');
   }
 
   test_createChange_TopLevelVariableElement_getter() async {
-    await _test_createChange_TopLevelVariableElement("test);");
+    await _test_createChange_TopLevelVariableElement('test);');
   }
 
   test_createChange_TopLevelVariableElement_mix() async {
-    await _test_createChange_TopLevelVariableElement("test += 2");
+    await _test_createChange_TopLevelVariableElement('test += 2');
   }
 
   test_createChange_TopLevelVariableElement_setter() async {
-    await _test_createChange_TopLevelVariableElement("test = 1");
+    await _test_createChange_TopLevelVariableElement('test = 1');
   }
 
   _test_createChange_PropertyAccessorElement(String search) async {
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index b4e4387..252bd3f 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -63,8 +63,8 @@
   B() {}
 }
 ''');
-    ClassElement classA = findElement("A");
-    ClassElement classB = findElement("B");
+    ClassElement classA = findElement('A');
+    ClassElement classB = findElement('B');
     ClassMemberElement memberA = classA.constructors[0];
     ClassMemberElement memberB = classB.constructors[0];
     var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
@@ -91,10 +91,10 @@
   int foo;
 }
 ''');
-    ClassElement classA = findElement("A");
-    ClassElement classB = findElement("B");
-    ClassElement classC = findElement("C");
-    ClassElement classD = findElement("D");
+    ClassElement classA = findElement('A');
+    ClassElement classB = findElement('B');
+    ClassElement classC = findElement('C');
+    ClassElement classD = findElement('D');
     ClassMemberElement memberA = classA.fields[0];
     ClassMemberElement memberB = classB.fields[0];
     ClassMemberElement memberC = classC.fields[0];
@@ -167,11 +167,11 @@
   foo() {}
 }
 ''');
-    ClassElement classA = findElement("A");
-    ClassElement classB = findElement("B");
-    ClassElement classC = findElement("C");
-    ClassElement classD = findElement("D");
-    ClassElement classE = findElement("E");
+    ClassElement classA = findElement('A');
+    ClassElement classB = findElement('B');
+    ClassElement classC = findElement('C');
+    ClassElement classD = findElement('D');
+    ClassElement classE = findElement('E');
     ClassMemberElement memberA = classA.methods[0];
     ClassMemberElement memberB = classB.methods[0];
     ClassMemberElement memberC = classC.methods[0];
@@ -237,9 +237,9 @@
   foo() {}
 }
 ''');
-    ClassElement classA = findElement("A");
-    ClassElement classB = findElement("B");
-    ClassElement classD = findElement("D");
+    ClassElement classA = findElement('A');
+    ClassElement classB = findElement('B');
+    ClassElement classD = findElement('D');
     ClassMemberElement memberA = classA.methods[0];
     ClassMemberElement memberB = classB.methods[0];
     ClassMemberElement memberD = classD.methods[0];
@@ -402,12 +402,12 @@
 class E extends A with M {}
 class F implements A {}
 ''');
-    ClassElement classA = findElement("A");
-    ClassElement classB = findElement("B");
-    ClassElement classC = findElement("C");
-    ClassElement classD = findElement("D");
-    ClassElement classE = findElement("E");
-    ClassElement classF = findElement("F");
+    ClassElement classA = findElement('A');
+    ClassElement classB = findElement('B');
+    ClassElement classC = findElement('C');
+    ClassElement classD = findElement('D');
+    ClassElement classE = findElement('E');
+    ClassElement classF = findElement('F');
     ClassElement objectElement = classA.supertype.element;
     // Object
     {
diff --git a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
index b994216..2304e90 100644
--- a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
@@ -29,14 +29,14 @@
   }
 
   test_adjacentLinesExcluded() async {
-    String content = """
+    String content = '''
 void myMethod() {
   return /*1*/new Wrapper(
     /*2*/new Thing(1,
       2)/*2:Thing*/
   )/*1:Wrapper*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 2);
@@ -46,13 +46,13 @@
   /// of the expression and not where the opening paren is, so this test ensures we
   /// don't end up with lots of unwanted labels on each line here.
   test_chainedConstructorOverManyLines() async {
-    String content = """
+    String content = '''
 main() {
   return new thing
     .whatIsSplit
     .acrossManyLines(1, 2);
 }
-    """;
+    ''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 0);
@@ -62,7 +62,7 @@
   /// of the expression and not where the opening paren is, so this test ensures we
   /// don't end up with lots of unwanted labels on each line here.
   test_chainedMethodsOverManyLines() async {
-    String content = """
+    String content = '''
 List<ClosingLabel> compute() {
   _unit.accept(new _DartUnitClosingLabelsComputerVisitor(this));
   return _closingLabelsByEndLine.values
@@ -71,14 +71,14 @@
       .map((clwlc) => clwlc.label)
       .toList();
 }
-    """;
+    ''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 0);
   }
 
   test_constConstructor() async {
-    String content = """
+    String content = '''
 void myMethod() {
   return /*1*/new Wrapper(
     /*2*/const Class(
@@ -87,14 +87,14 @@
     )/*2:Class*/
   )/*1:Wrapper*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_constNamedConstructor() async {
-    String content = """
+    String content = '''
 void myMethod() {
   return /*1*/new Wrapper(
     /*2*/const Class.fromThing(
@@ -103,7 +103,7 @@
     )/*2:Class.fromThing*/
   )/*1:Wrapper*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 2);
@@ -139,20 +139,20 @@
   }
 
   test_labelsShownForMultipleElements() async {
-    String content = """
+    String content = '''
 Widget build(BuildContext context) {
   return /*1*/new Row(
     child: new RaisedButton(),
   )/*1:Row*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 1);
   }
 
   test_labelsShownForMultipleElements_2() async {
-    String content = """
+    String content = '''
 Widget build(BuildContext context) {
   return /*1*/new Row(
     child: /*2*/new RaisedButton(
@@ -160,14 +160,14 @@
     )/*2:RaisedButton*/,
   )/*1:Row*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_listLiterals() async {
-    String content = """
+    String content = '''
 void myMethod() {
   return /*1*/new Wrapper(
     Widget.createWidget(/*2*/<Widget>[
@@ -176,7 +176,7 @@
     ]/*2:<Widget>[]*/)
   )/*1:Wrapper*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 2);
@@ -186,7 +186,7 @@
   /// other labels that end on the same line, even if they are 1-2 lines, otherwise
   /// it isn't obvious which closing bracket goes with the label.
   test_mixedLineSpanning() async {
-    String content = """
+    String content = '''
 main() {
     /*1*/new Foo((m) {
       /*2*/new Bar(
@@ -196,7 +196,7 @@
     })/*1:Foo*/;
   }
 }
-  """;
+  ''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 3);
@@ -227,7 +227,7 @@
   }
 
   test_newConstructor() async {
-    String content = """
+    String content = '''
 void myMethod() {
   return /*1*/new Wrapper(
     /*2*/new Class(
@@ -236,14 +236,14 @@
     )/*2:Class*/
   )/*1:Wrapper*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_newNamedConstructor() async {
-    String content = """
+    String content = '''
 void myMethod() {
   return /*1*/new Wrapper(
     /*2*/new Class.fromThing(
@@ -252,19 +252,19 @@
     )/*2:Class.fromThing*/
   )/*1:Wrapper*/;
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 2);
   }
 
   test_noLabelsForOneElement() async {
-    String content = """
+    String content = '''
 Widget build(BuildContext context) {
   return new Row(
   );
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 0);
@@ -354,11 +354,11 @@
   }
 
   test_sameLineExcluded() async {
-    String content = """
+    String content = '''
 void myMethod() {
   return new Thing();
 }
-""";
+''';
 
     var labels = await _computeElements(content);
     _compareLabels(labels, content, expectedLabelCount: 0);
@@ -374,7 +374,7 @@
     expect(labels, hasLength(expectedLabelCount));
 
     // Find all numeric markers for label starts.
-    var regex = RegExp("/\\*(\\d+)\\*/");
+    var regex = RegExp('/\\*(\\d+)\\*/');
     var expectedLabels = regex.allMatches(content);
 
     // Check we didn't get more than expected, since the loop below only
@@ -386,7 +386,7 @@
     expectedLabels.forEach((m) {
       var i = m.group(1);
       // Find the end marker.
-      var endMatch = RegExp("/\\*$i:(.+?)\\*/").firstMatch(content);
+      var endMatch = RegExp('/\\*$i:(.+?)\\*/').firstMatch(content);
 
       var expectedStart = m.end;
       var expectedLength = endMatch.start - expectedStart;
diff --git a/pkg/analysis_server/test/src/computer/folding_computer_test.dart b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
index 04f0c83..bec25b0 100644
--- a/pkg/analysis_server/test/src/computer/folding_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -29,7 +29,7 @@
   }
 
   test_annotations() async {
-    String content = """
+    String content = '''
 @myMultilineAnnotation/*1:INC*/(
   "this",
   "is a test"
@@ -73,7 +73,7 @@
   @constructorAnnotation1/*9:EXC:ANNOTATIONS*/
   MyClass2() {}
 /*4:INC:CLASS_BODY*/}
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
@@ -106,7 +106,7 @@
   }
 
   test_class() async {
-    String content = """
+    String content = '''
 // Content before
 
 class Person {/*1:INC*/
@@ -120,7 +120,7 @@
 /*1:INC:CLASS_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
@@ -140,7 +140,7 @@
   }
 
   test_constructor_invocations() async {
-    String content = """
+    String content = '''
 // Content before
 
 main() {/*1:INC*/
@@ -150,7 +150,7 @@
 /*1:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
@@ -186,12 +186,12 @@
   }
 
   test_file_header_with_no_function_comment() async {
-    String content = """
+    String content = '''
 // Copyright some year by some people/*1:EXC*/
 // See LICENCE etc./*1:INC:FILE_HEADER*/
 
 main() {}
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
@@ -226,7 +226,7 @@
   }
 
   test_function() async {
-    String content = """
+    String content = '''
 // Content before
 
 main() {/*1:INC*/
@@ -234,14 +234,14 @@
 /*1:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
   }
 
   test_function_expression_invocation() async {
-    String content = """
+    String content = '''
 // Content before
 
 getFunc() => (String a, String b) {/*1:INC*/
@@ -256,14 +256,14 @@
 /*2:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
   }
 
   test_function_with_dart_doc() async {
-    String content = """
+    String content = '''
 // Content before
 
 /*1:EXC*//// This is a doc comment
@@ -273,14 +273,14 @@
 /*2:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
   }
 
   test_invocations() async {
-    String content = """
+    String content = '''
 // Content before
 
 main() {/*1:INC*/
@@ -290,14 +290,14 @@
 /*1:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
   }
 
   test_literal_list() async {
-    String content = """
+    String content = '''
 // Content before
 
 main() {/*1:INC*/
@@ -308,14 +308,14 @@
 /*1:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
   }
 
   test_literal_map() async {
-    String content = """
+    String content = '''
 // Content before
 
 main2() {/*1:INC*/
@@ -326,14 +326,14 @@
 /*1:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
   }
 
   test_mixin() async {
-    String content = """
+    String content = '''
 // Content before
 
 mixin M {/*1:INC*/
@@ -343,7 +343,7 @@
 /*1:INC:CLASS_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
@@ -384,7 +384,7 @@
   }
 
   test_nested_function() async {
-    String content = """
+    String content = '''
 // Content before
 
 main() {/*1:INC*/
@@ -395,14 +395,14 @@
 /*1:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
   }
 
   test_nested_invocations() async {
-    String content = """
+    String content = '''
 // Content before
 
 main() {/*1:INC*/
@@ -416,7 +416,7 @@
 /*1:INC:FUNCTION_BODY*/}
 
 // Content after
-""";
+''';
 
     final regions = await _computeRegions(content);
     _compareRegions(regions, content);
@@ -450,17 +450,17 @@
     // ensure it's in the results.
     expectedRegions.forEach((m) {
       final i = m.group(1);
-      final inclusiveStart = m.group(2) == "INC";
+      final inclusiveStart = m.group(2) == 'INC';
       // Find the end marker.
       final endMatch = RegExp('/\\*$i:(INC|EXC):(.+?)\\*/').firstMatch(content);
 
-      final inclusiveEnd = endMatch.group(1) == "INC";
+      final inclusiveEnd = endMatch.group(1) == 'INC';
       final expectedKindString = endMatch.group(2);
       final expectedKind = FoldingKind.VALUES.firstWhere(
           (f) => f.toString() == 'FoldingKind.$expectedKindString',
           orElse: () => throw Exception(
-              "Annotated test code references $expectedKindString but "
-              "this does not exist in FoldingKind"));
+              'Annotated test code references $expectedKindString but '
+              'this does not exist in FoldingKind'));
 
       final expectedStart = inclusiveStart ? m.start : m.end;
       final expectedLength =
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index c41c751..127b4a6 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -51,7 +51,7 @@
   }
 
   test_dartAsync_noPrefix() async {
-    String selection = "Future<String> f = null;";
+    String selection = 'Future<String> f = null;';
     String content = '''
 import 'dart:async';
 printer() {
@@ -67,7 +67,7 @@
   }
 
   test_dartAsync_prefix() async {
-    String selection = "a.Future<String> f = null;";
+    String selection = 'a.Future<String> f = null;';
     String content = '''
 import 'dart:async' as a;
 printer() {
@@ -112,7 +112,7 @@
   }
 
   test_dartMath_noPrefix() async {
-    String selection = "new Random();";
+    String selection = 'new Random();';
     String content = '''
 import 'dart:math';
 bool randomBool() {
@@ -231,7 +231,7 @@
   static String b = '';
 }
 ''');
-    String selection = "A.a + B.b";
+    String selection = 'A.a + B.b';
     String content = '''
 import 'package:foo/foo.dart';
 blankLine() {
@@ -250,7 +250,7 @@
   static String first = '';
 }
 ''');
-    String selection = "Foo.first";
+    String selection = 'Foo.first';
     String content = '''
 import 'package:foo/foo.dart';
 blankLine() {
@@ -269,7 +269,7 @@
   static String first = '';
 }
 ''');
-    String selection = "f.Foo.first";
+    String selection = 'f.Foo.first';
     String content = '''
 import 'package:foo/foo.dart' as f;
 blankLine() {
@@ -286,7 +286,7 @@
     addPackageFile('foo', 'foo.dart', '''
 String foo() => '';
 ''');
-    String selection = "f.foo()";
+    String selection = 'f.foo()';
     String content = '''
 import 'package:foo/foo.dart' as f;
 blankLine() {
@@ -303,7 +303,7 @@
     addPackageFile('foo', 'foo.dart', '''
 String foo = '';
 ''');
-    String selection = "f.foo";
+    String selection = 'f.foo';
     String content = '''
 import 'package:foo/foo.dart' as f;
 blankLine() {
@@ -320,7 +320,7 @@
     addPackageFile('foo', 'foo.dart', '''
 String foo = '';
 ''');
-    String selection = "f.foo";
+    String selection = 'f.foo';
     String content = '''
 import 'package:foo/foo.dart' as f;
 main() {
@@ -339,7 +339,7 @@
   static String first = '';
 }
 ''');
-    String selection = "Foo.first";
+    String selection = 'Foo.first';
     String content = '''
 import 'package:foo/foo.dart' as f;
 blankLine() {
@@ -359,7 +359,7 @@
   static String second = '';
 }
 ''');
-    String selection = "f.Foo.first + Foo.second";
+    String selection = 'f.Foo.first + Foo.second';
     String content = '''
 import 'package:foo/foo.dart';
 import 'package:foo/foo.dart' as f;
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 1836692..0da185a 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -166,11 +166,11 @@
       Outline outline_A = topOutlines[0];
       Element element_A = outline_A.element;
       expect(element_A.kind, ElementKind.CLASS);
-      expect(element_A.name, "A");
-      expect(element_A.typeParameters, "<K, V>");
+      expect(element_A.name, 'A');
+      expect(element_A.typeParameters, '<K, V>');
       {
         Location location = element_A.location;
-        expect(location.offset, testCode.indexOf("A<K, V> {"));
+        expect(location.offset, testCode.indexOf('A<K, V> {'));
         expect(location.length, 1);
       }
       expect(element_A.parameters, null);
@@ -182,37 +182,37 @@
         Outline outline = outlines_A[0];
         Element element = outline.element;
         expect(element.kind, ElementKind.FIELD);
-        expect(element.name, "fa");
+        expect(element.name, 'fa');
         expect(element.parameters, isNull);
-        expect(element.returnType, "int");
+        expect(element.returnType, 'int');
       }
       {
         Outline outline = outlines_A[1];
         Element element = outline.element;
         expect(element.kind, ElementKind.FIELD);
-        expect(element.name, "fb");
+        expect(element.name, 'fb');
         expect(element.parameters, isNull);
-        expect(element.returnType, "int");
+        expect(element.returnType, 'int');
       }
       {
         Outline outline = outlines_A[2];
         Element element = outline.element;
         expect(element.kind, ElementKind.FIELD);
-        expect(element.name, "fc");
+        expect(element.name, 'fc');
         expect(element.parameters, isNull);
-        expect(element.returnType, "String");
+        expect(element.returnType, 'String');
       }
       {
         Outline outline = outlines_A[3];
         Element element = outline.element;
         expect(element.kind, ElementKind.CONSTRUCTOR);
-        expect(element.name, "A");
+        expect(element.name, 'A');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("A(int i, String s);"));
-          expect(location.length, "A".length);
+          expect(location.offset, testCode.indexOf('A(int i, String s);'));
+          expect(location.length, 'A'.length);
         }
-        expect(element.parameters, "(int i, String s)");
+        expect(element.parameters, '(int i, String s)');
         expect(element.returnType, isNull);
         expect(element.isAbstract, isFalse);
         expect(element.isStatic, isFalse);
@@ -221,13 +221,13 @@
         Outline outline = outlines_A[4];
         Element element = outline.element;
         expect(element.kind, ElementKind.CONSTRUCTOR);
-        expect(element.name, "A.name");
+        expect(element.name, 'A.name');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("name(num p);"));
-          expect(location.length, "name".length);
+          expect(location.offset, testCode.indexOf('name(num p);'));
+          expect(location.length, 'name'.length);
         }
-        expect(element.parameters, "(num p)");
+        expect(element.parameters, '(num p)');
         expect(element.returnType, isNull);
         expect(element.isAbstract, isFalse);
         expect(element.isStatic, isFalse);
@@ -236,13 +236,13 @@
         Outline outline = outlines_A[5];
         Element element = outline.element;
         expect(element.kind, ElementKind.CONSTRUCTOR);
-        expect(element.name, "A._privateName");
+        expect(element.name, 'A._privateName');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("_privateName(num p);"));
-          expect(location.length, "_privateName".length);
+          expect(location.offset, testCode.indexOf('_privateName(num p);'));
+          expect(location.length, '_privateName'.length);
         }
-        expect(element.parameters, "(num p)");
+        expect(element.parameters, '(num p)');
         expect(element.returnType, isNull);
         expect(element.isAbstract, isFalse);
         expect(element.isStatic, isFalse);
@@ -251,14 +251,14 @@
         Outline outline = outlines_A[6];
         Element element = outline.element;
         expect(element.kind, ElementKind.METHOD);
-        expect(element.name, "ma");
+        expect(element.name, 'ma');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("ma(int pa) => null;"));
-          expect(location.length, "ma".length);
+          expect(location.offset, testCode.indexOf('ma(int pa) => null;'));
+          expect(location.length, 'ma'.length);
         }
-        expect(element.parameters, "(int pa)");
-        expect(element.returnType, "String");
+        expect(element.parameters, '(int pa)');
+        expect(element.returnType, 'String');
         expect(element.isAbstract, isFalse);
         expect(element.isStatic, isTrue);
       }
@@ -266,14 +266,14 @@
         Outline outline = outlines_A[7];
         Element element = outline.element;
         expect(element.kind, ElementKind.METHOD);
-        expect(element.name, "_mb");
+        expect(element.name, '_mb');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("_mb(int pb);"));
-          expect(location.length, "_mb".length);
+          expect(location.offset, testCode.indexOf('_mb(int pb);'));
+          expect(location.length, '_mb'.length);
         }
-        expect(element.parameters, "(int pb)");
-        expect(element.returnType, "");
+        expect(element.parameters, '(int pb)');
+        expect(element.returnType, '');
         expect(element.isAbstract, isTrue);
         expect(element.isStatic, isFalse);
       }
@@ -281,15 +281,15 @@
         Outline outline = outlines_A[8];
         Element element = outline.element;
         expect(element.kind, ElementKind.METHOD);
-        expect(element.name, "mc");
+        expect(element.name, 'mc');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("mc<R, P>"));
-          expect(location.length, "mc".length);
+          expect(location.offset, testCode.indexOf('mc<R, P>'));
+          expect(location.length, 'mc'.length);
         }
-        expect(element.parameters, "(P p)");
-        expect(element.returnType, "R");
-        expect(element.typeParameters, "<R, P>");
+        expect(element.parameters, '(P p)');
+        expect(element.returnType, 'R');
+        expect(element.typeParameters, '<R, P>');
         expect(element.isAbstract, isFalse);
         expect(element.isStatic, isFalse);
       }
@@ -297,27 +297,27 @@
         Outline outline = outlines_A[9];
         Element element = outline.element;
         expect(element.kind, ElementKind.GETTER);
-        expect(element.name, "propA");
+        expect(element.name, 'propA');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("propA => null;"));
-          expect(location.length, "propA".length);
+          expect(location.offset, testCode.indexOf('propA => null;'));
+          expect(location.length, 'propA'.length);
         }
         expect(element.parameters, isNull);
-        expect(element.returnType, "String");
+        expect(element.returnType, 'String');
       }
       {
         Outline outline = outlines_A[10];
         Element element = outline.element;
         expect(element.kind, ElementKind.SETTER);
-        expect(element.name, "propB");
+        expect(element.name, 'propB');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("propB(int v) {}"));
-          expect(location.length, "propB".length);
+          expect(location.offset, testCode.indexOf('propB(int v) {}'));
+          expect(location.length, 'propB'.length);
         }
-        expect(element.parameters, "(int v)");
-        expect(element.returnType, "");
+        expect(element.parameters, '(int v)');
+        expect(element.returnType, '');
       }
     }
     // B
@@ -325,11 +325,11 @@
       Outline outline_B = topOutlines[1];
       Element element_B = outline_B.element;
       expect(element_B.kind, ElementKind.CLASS);
-      expect(element_B.name, "B");
+      expect(element_B.name, 'B');
       expect(element_B.typeParameters, isNull);
       {
         Location location = element_B.location;
-        expect(location.offset, testCode.indexOf("B {"));
+        expect(location.offset, testCode.indexOf('B {'));
         expect(location.length, 1);
       }
       expect(element_B.parameters, null);
@@ -341,13 +341,13 @@
         Outline outline = outlines_B[0];
         Element element = outline.element;
         expect(element.kind, ElementKind.CONSTRUCTOR);
-        expect(element.name, "B");
+        expect(element.name, 'B');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("B(int p);"));
-          expect(location.length, "B".length);
+          expect(location.offset, testCode.indexOf('B(int p);'));
+          expect(location.length, 'B'.length);
         }
-        expect(element.parameters, "(int p)");
+        expect(element.parameters, '(int p)');
         expect(element.returnType, isNull);
       }
     }
@@ -355,14 +355,14 @@
       Outline outline = topOutlines[2];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION);
-      expect(element.name, "fa");
+      expect(element.name, 'fa');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("fa(int pa)"));
-        expect(location.length, "ma".length);
+        expect(location.offset, testCode.indexOf('fa(int pa)'));
+        expect(location.length, 'ma'.length);
       }
-      expect(element.parameters, "(int pa)");
-      expect(element.returnType, "String");
+      expect(element.parameters, '(int pa)');
+      expect(element.returnType, 'String');
       expect(element.isAbstract, isFalse);
       expect(element.isStatic, isTrue);
     }
@@ -370,15 +370,15 @@
       Outline outline = topOutlines[3];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION);
-      expect(element.name, "fb");
+      expect(element.name, 'fb');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("fb<R, P>"));
-        expect(location.length, "fb".length);
+        expect(location.offset, testCode.indexOf('fb<R, P>'));
+        expect(location.length, 'fb'.length);
       }
-      expect(element.parameters, "(P p)");
-      expect(element.returnType, "R");
-      expect(element.typeParameters, "<R, P>");
+      expect(element.parameters, '(P p)');
+      expect(element.returnType, 'R');
+      expect(element.typeParameters, '<R, P>');
       expect(element.isAbstract, isFalse);
       expect(element.isStatic, isTrue);
     }
@@ -397,10 +397,10 @@
       Outline outline_MyEnum = topOutlines[0];
       Element element_MyEnum = outline_MyEnum.element;
       expect(element_MyEnum.kind, ElementKind.ENUM);
-      expect(element_MyEnum.name, "MyEnum");
+      expect(element_MyEnum.name, 'MyEnum');
       {
         Location location = element_MyEnum.location;
-        expect(location.offset, testCode.indexOf("MyEnum {"));
+        expect(location.offset, testCode.indexOf('MyEnum {'));
         expect(location.length, 'MyEnum'.length);
       }
       expect(element_MyEnum.parameters, null);
@@ -486,10 +486,10 @@
     Outline outline_F = topOutlines[0];
     Element element_F = outline_F.element;
     expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
-    expect(element_F.name, "F");
+    expect(element_F.name, 'F');
     {
       Location location = element_F.location;
-      expect(location.offset, testCode.indexOf("F ="));
+      expect(location.offset, testCode.indexOf('F ='));
       expect(location.length, 'F'.length);
     }
     expect(element_F.parameters, '');
@@ -506,10 +506,10 @@
     Outline outline_F = topOutlines[0];
     Element element_F = outline_F.element;
     expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
-    expect(element_F.name, "F");
+    expect(element_F.name, 'F');
     {
       Location location = element_F.location;
-      expect(location.offset, testCode.indexOf("F ="));
+      expect(location.offset, testCode.indexOf('F ='));
       expect(location.length, 'F'.length);
     }
     expect(element_F.parameters, '()');
@@ -526,10 +526,10 @@
     Outline outline_F = topOutlines[0];
     Element element_F = outline_F.element;
     expect(element_F.kind, ElementKind.FUNCTION_TYPE_ALIAS);
-    expect(element_F.name, "F");
+    expect(element_F.name, 'F');
     {
       Location location = element_F.location;
-      expect(location.offset, testCode.indexOf("F ="));
+      expect(location.offset, testCode.indexOf('F ='));
       expect(location.length, 'F'.length);
     }
     expect(element_F.parameters, '()');
@@ -564,7 +564,7 @@
     _expect(main_outline,
         kind: ElementKind.FUNCTION,
         name: 'main',
-        offset: testCode.indexOf("main() {"),
+        offset: testCode.indexOf('main() {'),
         parameters: '()',
         returnType: 'void');
     List<Outline> main_children = main_outline.children;
@@ -714,7 +714,7 @@
     _expect(main_outline,
         kind: ElementKind.FUNCTION,
         name: 'main',
-        offset: testCode.indexOf("main() {"),
+        offset: testCode.indexOf('main() {'),
         parameters: '()',
         returnType: 'void');
     List<Outline> main_children = main_outline.children;
@@ -821,11 +821,11 @@
       Outline outline_A = topOutlines[0];
       Element element_A = outline_A.element;
       expect(element_A.kind, ElementKind.CLASS);
-      expect(element_A.name, "A");
+      expect(element_A.name, 'A');
       {
         Location location = element_A.location;
-        expect(location.offset, testCode.indexOf("A {"));
-        expect(location.length, "A".length);
+        expect(location.offset, testCode.indexOf('A {'));
+        expect(location.length, 'A'.length);
       }
       expect(element_A.parameters, null);
       expect(element_A.returnType, null);
@@ -836,13 +836,13 @@
         Outline constructorOutline = outlines_A[0];
         Element constructorElement = constructorOutline.element;
         expect(constructorElement.kind, ElementKind.CONSTRUCTOR);
-        expect(constructorElement.name, "A");
+        expect(constructorElement.name, 'A');
         {
           Location location = constructorElement.location;
-          expect(location.offset, testCode.indexOf("A() {"));
-          expect(location.length, "A".length);
+          expect(location.offset, testCode.indexOf('A() {'));
+          expect(location.length, 'A'.length);
         }
-        expect(constructorElement.parameters, "()");
+        expect(constructorElement.parameters, '()');
         expect(constructorElement.returnType, isNull);
         // local function
         List<Outline> outlines_constructor = constructorOutline.children;
@@ -851,28 +851,28 @@
           Outline outline = outlines_constructor[0];
           Element element = outline.element;
           expect(element.kind, ElementKind.FUNCTION);
-          expect(element.name, "local_A");
+          expect(element.name, 'local_A');
           {
             Location location = element.location;
-            expect(location.offset, testCode.indexOf("local_A() {}"));
-            expect(location.length, "local_A".length);
+            expect(location.offset, testCode.indexOf('local_A() {}'));
+            expect(location.length, 'local_A'.length);
           }
-          expect(element.parameters, "()");
-          expect(element.returnType, "int");
+          expect(element.parameters, '()');
+          expect(element.returnType, 'int');
         }
       }
       {
         Outline outline_m = outlines_A[1];
         Element element_m = outline_m.element;
         expect(element_m.kind, ElementKind.METHOD);
-        expect(element_m.name, "m");
+        expect(element_m.name, 'm');
         {
           Location location = element_m.location;
-          expect(location.offset, testCode.indexOf("m() {"));
-          expect(location.length, "m".length);
+          expect(location.offset, testCode.indexOf('m() {'));
+          expect(location.length, 'm'.length);
         }
-        expect(element_m.parameters, "()");
-        expect(element_m.returnType, "");
+        expect(element_m.parameters, '()');
+        expect(element_m.returnType, '');
         // local function
         List<Outline> methodChildren = outline_m.children;
         expect(methodChildren, hasLength(1));
@@ -880,14 +880,14 @@
           Outline outline = methodChildren[0];
           Element element = outline.element;
           expect(element.kind, ElementKind.FUNCTION);
-          expect(element.name, "local_m");
+          expect(element.name, 'local_m');
           {
             Location location = element.location;
-            expect(location.offset, testCode.indexOf("local_m() {}"));
-            expect(location.length, "local_m".length);
+            expect(location.offset, testCode.indexOf('local_m() {}'));
+            expect(location.length, 'local_m'.length);
           }
-          expect(element.parameters, "()");
-          expect(element.returnType, "");
+          expect(element.parameters, '()');
+          expect(element.returnType, '');
         }
       }
     }
@@ -896,14 +896,14 @@
       Outline outline_f = topOutlines[1];
       Element element_f = outline_f.element;
       expect(element_f.kind, ElementKind.FUNCTION);
-      expect(element_f.name, "f");
+      expect(element_f.name, 'f');
       {
         Location location = element_f.location;
-        expect(location.offset, testCode.indexOf("f() {"));
-        expect(location.length, "f".length);
+        expect(location.offset, testCode.indexOf('f() {'));
+        expect(location.length, 'f'.length);
       }
-      expect(element_f.parameters, "()");
-      expect(element_f.returnType, "");
+      expect(element_f.parameters, '()');
+      expect(element_f.returnType, '');
       // f() children
       List<Outline> outlines_f = outline_f.children;
       expect(outlines_f, hasLength(2));
@@ -911,27 +911,27 @@
         Outline outline_f1 = outlines_f[0];
         Element element_f1 = outline_f1.element;
         expect(element_f1.kind, ElementKind.FUNCTION);
-        expect(element_f1.name, "local_f1");
+        expect(element_f1.name, 'local_f1');
         {
           Location location = element_f1.location;
-          expect(location.offset, testCode.indexOf("local_f1(int i) {}"));
-          expect(location.length, "local_f1".length);
+          expect(location.offset, testCode.indexOf('local_f1(int i) {}'));
+          expect(location.length, 'local_f1'.length);
         }
-        expect(element_f1.parameters, "(int i)");
-        expect(element_f1.returnType, "");
+        expect(element_f1.parameters, '(int i)');
+        expect(element_f1.returnType, '');
       }
       {
         Outline outline_f2 = outlines_f[1];
         Element element_f2 = outline_f2.element;
         expect(element_f2.kind, ElementKind.FUNCTION);
-        expect(element_f2.name, "local_f2");
+        expect(element_f2.name, 'local_f2');
         {
           Location location = element_f2.location;
-          expect(location.offset, testCode.indexOf("local_f2(String s) {"));
-          expect(location.length, "local_f2".length);
+          expect(location.offset, testCode.indexOf('local_f2(String s) {'));
+          expect(location.length, 'local_f2'.length);
         }
-        expect(element_f2.parameters, "(String s)");
-        expect(element_f2.returnType, "");
+        expect(element_f2.parameters, '(String s)');
+        expect(element_f2.returnType, '');
         // local_f2() local function
         List<Outline> outlines_f2 = outline_f2.children;
         expect(outlines_f2, hasLength(1));
@@ -939,14 +939,14 @@
           Outline outline_f21 = outlines_f2[0];
           Element element_f21 = outline_f21.element;
           expect(element_f21.kind, ElementKind.FUNCTION);
-          expect(element_f21.name, "local_f21");
+          expect(element_f21.name, 'local_f21');
           {
             Location location = element_f21.location;
-            expect(location.offset, testCode.indexOf("local_f21(int p) {"));
-            expect(location.length, "local_f21".length);
+            expect(location.offset, testCode.indexOf('local_f21(int p) {'));
+            expect(location.length, 'local_f21'.length);
           }
-          expect(element_f21.parameters, "(int p)");
-          expect(element_f21.returnType, "");
+          expect(element_f21.parameters, '(int p)');
+          expect(element_f21.returnType, '');
         }
       }
     }
@@ -967,11 +967,11 @@
       Outline outline_M = topOutlines[0];
       Element element_M = outline_M.element;
       expect(element_M.kind, ElementKind.MIXIN);
-      expect(element_M.name, "M");
-      expect(element_M.typeParameters, "<N>");
+      expect(element_M.name, 'M');
+      expect(element_M.typeParameters, '<N>');
       {
         Location location = element_M.location;
-        expect(location.offset, testCode.indexOf("M<N>"));
+        expect(location.offset, testCode.indexOf('M<N>'));
         expect(location.length, 1);
       }
       expect(element_M.parameters, isNull);
@@ -983,14 +983,14 @@
         Outline outline = outlines_M[0];
         Element element = outline.element;
         expect(element.kind, ElementKind.METHOD);
-        expect(element.name, "c");
+        expect(element.name, 'c');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("c(int d)"));
+          expect(location.offset, testCode.indexOf('c(int d)'));
           expect(location.length, 1);
         }
-        expect(element.parameters, "(int d)");
-        expect(element.returnType, "");
+        expect(element.parameters, '(int d)');
+        expect(element.returnType, '');
         expect(element.isAbstract, isFalse);
         expect(element.isStatic, isFalse);
       }
@@ -998,27 +998,27 @@
         Outline outline = outlines_M[1];
         Element element = outline.element;
         expect(element.kind, ElementKind.GETTER);
-        expect(element.name, "e");
+        expect(element.name, 'e');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("e => null"));
+          expect(location.offset, testCode.indexOf('e => null'));
           expect(location.length, 1);
         }
         expect(element.parameters, isNull);
-        expect(element.returnType, "String");
+        expect(element.returnType, 'String');
       }
       {
         Outline outline = outlines_M[2];
         Element element = outline.element;
         expect(element.kind, ElementKind.SETTER);
-        expect(element.name, "f");
+        expect(element.name, 'f');
         {
           Location location = element.location;
-          expect(location.offset, testCode.indexOf("f(int g)"));
+          expect(location.offset, testCode.indexOf('f(int g)'));
           expect(location.length, 1);
         }
-        expect(element.parameters, "(int g)");
-        expect(element.returnType, "");
+        expect(element.parameters, '(int g)');
+        expect(element.returnType, '');
       }
     }
   }
@@ -1042,7 +1042,7 @@
       Outline outline = outlines[0];
       Element element = outline.element;
       expect(element.kind, ElementKind.FIELD);
-      expect(element.name, "fieldA");
+      expect(element.name, 'fieldA');
 
       expect(outline.offset, 12);
       expect(outline.length, 10);
@@ -1056,7 +1056,7 @@
       Outline outline = outlines[1];
       Element element = outline.element;
       expect(element.kind, ElementKind.FIELD);
-      expect(element.name, "fieldB");
+      expect(element.name, 'fieldB');
 
       expect(outline.offset, 24);
       expect(outline.length, 11);
@@ -1070,7 +1070,7 @@
       Outline outline = outlines[2];
       Element element = outline.element;
       expect(element.kind, ElementKind.FIELD);
-      expect(element.name, "fieldC");
+      expect(element.name, 'fieldC');
 
       expect(outline.offset, 41);
       expect(outline.length, 11);
@@ -1084,7 +1084,7 @@
       Outline outline = outlines[3];
       Element element = outline.element;
       expect(element.kind, ElementKind.FIELD);
-      expect(element.name, "fieldD");
+      expect(element.name, 'fieldD');
 
       expect(outline.offset, 58);
       expect(outline.length, 32);
@@ -1109,7 +1109,7 @@
       Outline outline = topOutlines[0];
       Element element = outline.element;
       expect(element.kind, ElementKind.CLASS);
-      expect(element.name, "A");
+      expect(element.name, 'A');
 
       expect(outline.offset, 0);
       expect(outline.length, 30);
@@ -1123,7 +1123,7 @@
       Outline outline = topOutlines[1];
       Element element = outline.element;
       expect(element.kind, ElementKind.CLASS);
-      expect(element.name, "B");
+      expect(element.name, 'B');
 
       expect(outline.offset, 32);
       expect(outline.length, 10);
@@ -1151,7 +1151,7 @@
       Outline outline = outlines[0];
       Element element = outline.element;
       expect(element.kind, ElementKind.METHOD);
-      expect(element.name, "methodA");
+      expect(element.name, 'methodA');
 
       expect(outline.offset, 12);
       expect(outline.length, 16);
@@ -1165,7 +1165,7 @@
       Outline outline = outlines[1];
       Element element = outline.element;
       expect(element.kind, ElementKind.METHOD);
-      expect(element.name, "methodB");
+      expect(element.name, 'methodB');
 
       expect(outline.offset, 34);
       expect(outline.length, 49);
@@ -1196,57 +1196,57 @@
       Outline outline = topOutlines[0];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
-      expect(element.name, "FTA");
-      expect(element.typeParameters, "<K, V>");
+      expect(element.name, 'FTA');
+      expect(element.typeParameters, '<K, V>');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("FTA<K, V>("));
-        expect(location.length, "FTA".length);
+        expect(location.offset, testCode.indexOf('FTA<K, V>('));
+        expect(location.length, 'FTA'.length);
       }
-      expect(element.parameters, "(int i, String s)");
-      expect(element.returnType, "String");
+      expect(element.parameters, '(int i, String s)');
+      expect(element.returnType, 'String');
     }
     // FTB
     {
       Outline outline = topOutlines[1];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
-      expect(element.name, "FTB");
+      expect(element.name, 'FTB');
       expect(element.typeParameters, isNull);
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("FTB("));
-        expect(location.length, "FTB".length);
+        expect(location.offset, testCode.indexOf('FTB('));
+        expect(location.length, 'FTB'.length);
       }
-      expect(element.parameters, "(int p)");
-      expect(element.returnType, "");
+      expect(element.parameters, '(int p)');
+      expect(element.returnType, '');
     }
     // GenericTypeAlias - function
     {
       Outline outline = topOutlines[2];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
-      expect(element.name, "GTAF");
+      expect(element.name, 'GTAF');
       expect(element.typeParameters, '<T>');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("GTAF<T> ="));
-        expect(location.length, "GTAF".length);
+        expect(location.offset, testCode.indexOf('GTAF<T> ='));
+        expect(location.length, 'GTAF'.length);
       }
-      expect(element.parameters, "(T t, S s)");
-      expect(element.returnType, "void");
+      expect(element.parameters, '(T t, S s)');
+      expect(element.returnType, 'void');
     }
     // CTA
     {
       Outline outline = topOutlines[5];
       Element element = outline.element;
       expect(element.kind, ElementKind.CLASS_TYPE_ALIAS);
-      expect(element.name, "CTA");
+      expect(element.name, 'CTA');
       expect(element.typeParameters, '<T>');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("CTA<T> ="));
-        expect(location.length, "CTA".length);
+        expect(location.offset, testCode.indexOf('CTA<T> ='));
+        expect(location.length, 'CTA'.length);
       }
       expect(element.parameters, isNull);
       expect(element.returnType, isNull);
@@ -1265,56 +1265,56 @@
       Outline outline = topOutlines[7];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION);
-      expect(element.name, "fA");
+      expect(element.name, 'fA');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("fA("));
-        expect(location.length, "fA".length);
+        expect(location.offset, testCode.indexOf('fA('));
+        expect(location.length, 'fA'.length);
       }
-      expect(element.parameters, "(int i, String s)");
-      expect(element.returnType, "String");
+      expect(element.parameters, '(int i, String s)');
+      expect(element.returnType, 'String');
     }
     // fB
     {
       Outline outline = topOutlines[8];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION);
-      expect(element.name, "fB");
+      expect(element.name, 'fB');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("fB("));
-        expect(location.length, "fB".length);
+        expect(location.offset, testCode.indexOf('fB('));
+        expect(location.length, 'fB'.length);
       }
-      expect(element.parameters, "(int p)");
-      expect(element.returnType, "");
+      expect(element.parameters, '(int p)');
+      expect(element.returnType, '');
     }
     // propA
     {
       Outline outline = topOutlines[9];
       Element element = outline.element;
       expect(element.kind, ElementKind.GETTER);
-      expect(element.name, "propA");
+      expect(element.name, 'propA');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("propA => null;"));
-        expect(location.length, "propA".length);
+        expect(location.offset, testCode.indexOf('propA => null;'));
+        expect(location.length, 'propA'.length);
       }
-      expect(element.parameters, "");
-      expect(element.returnType, "String");
+      expect(element.parameters, '');
+      expect(element.returnType, 'String');
     }
     // propB
     {
       Outline outline = topOutlines[10];
       Element element = outline.element;
       expect(element.kind, ElementKind.SETTER);
-      expect(element.name, "propB");
+      expect(element.name, 'propB');
       {
         Location location = element.location;
-        expect(location.offset, testCode.indexOf("propB(int v) {}"));
-        expect(location.length, "propB".length);
+        expect(location.offset, testCode.indexOf('propB(int v) {}'));
+        expect(location.length, 'propB'.length);
       }
-      expect(element.parameters, "(int v)");
-      expect(element.returnType, "");
+      expect(element.parameters, '(int v)');
+      expect(element.returnType, '');
     }
   }
 
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
index 6261a4f..6427cb0 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
@@ -253,11 +253,11 @@
     assertRegion(
         region: regions[1],
         offset: 24,
-        details: ["This variable is initialized to a nullable value"]);
+        details: ['This variable is initialized to a nullable value']);
     assertRegion(
         region: regions[2],
         offset: 38,
-        details: ["The value of the expression is nullable"]);
+        details: ['The value of the expression is nullable']);
   }
 
   test_asExpression_insideReturn() async {
@@ -277,7 +277,7 @@
     assertRegion(
         region: regions[2],
         offset: 36,
-        details: ["The value of the expression is nullable"]);
+        details: ['The value of the expression is nullable']);
   }
 
   test_discardCondition() async {
@@ -345,7 +345,7 @@
     var region = regions[0];
     var edits = region.edits;
     assertRegion(region: region, offset: 10, details: [
-      "A dynamic value, which is nullable is passed as an argument"
+      'A dynamic value, which is nullable is passed as an argument'
     ]);
     assertDetail(detail: region.details[0], offset: 104, length: 1);
     assertEdit(edit: edits[0], offset: 10, replacement: '/*!*/');
@@ -379,7 +379,7 @@
     assertRegion(
         region: regions[2],
         offset: 66,
-        details: ["This is later required to accept null."]);
+        details: ['This is later required to accept null.']);
   }
 
   test_exactNullable_exactNullable() async {
@@ -422,7 +422,7 @@
     assertRegion(
         region: regions[0],
         offset: 6,
-        details: ["This function returns a nullable value on line 1"]);
+        details: ['This function returns a nullable value on line 1']);
     assertDetail(detail: regions[0].details[0], offset: 11, length: 2);
   }
 
@@ -441,7 +441,7 @@
     List<RegionInfo> regions = unit.regions;
     expect(regions, hasLength(1));
     assertRegion(region: regions[0], offset: 15, details: [
-      "This field is initialized by an optional field formal parameter that "
+      'This field is initialized by an optional field formal parameter that '
           "has an implicit default value of 'null'"
     ]);
   }
@@ -461,7 +461,7 @@
     List<RegionInfo> regions = unit.regions;
     expect(regions, hasLength(1));
     assertRegion(region: regions[0], offset: 15, details: [
-      "This field is initialized by an optional field formal parameter that "
+      'This field is initialized by an optional field formal parameter that '
           "has an explicit default value of 'null'"
     ]);
   }
@@ -489,8 +489,8 @@
     // TODO(brianwilkerson) It would be nice if the target for the region could
     //  be the argument rather than the field formal parameter.
     assertRegion(region: regions[0], offset: 15, details: [
-      "This field is initialized by a field formal parameter and a nullable "
-          "value is passed as an argument"
+      'This field is initialized by a field formal parameter and a nullable '
+          'value is passed as an argument'
     ]);
   }
 
@@ -515,7 +515,7 @@
     assertRegion(
         region: regions[1],
         offset: 33,
-        details: ["This field is initialized to a nullable value"]);
+        details: ['This field is initialized to a nullable value']);
   }
 
   test_fieldLaterAssignedNullable() async {
@@ -563,7 +563,7 @@
     var region = regions[0];
     var edits = region.edits;
     assertRegion(region: region, offset: 42, length: 9, details: [
-      "This parameter is non-nullable, so cannot have an implicit default "
+      'This parameter is non-nullable, so cannot have an implicit default '
           "value of 'null'"
     ]);
     assertEdit(
@@ -588,7 +588,7 @@
     var region = regions[1];
     var edits = region.edits;
     assertRegion(region: region, offset: 34, length: 9, details: [
-      "This parameter is non-nullable, so cannot have an implicit default "
+      'This parameter is non-nullable, so cannot have an implicit default '
           "value of 'null'"
     ]);
     assertEdit(
@@ -616,12 +616,12 @@
     assertRegion(
         region: regions[1],
         offset: 48,
-        details: ["This list is initialized with a nullable value on line 3"]);
+        details: ['This list is initialized with a nullable value on line 3']);
     assertDetail(detail: regions[1].details[0], offset: 58, length: 1);
     assertRegion(
         region: regions[2],
         offset: 81,
-        details: ["This set is initialized with a nullable value on line 4"]);
+        details: ['This set is initialized with a nullable value on line 4']);
     assertDetail(detail: regions[2].details[0], offset: 90, length: 1);
   }
 
@@ -639,12 +639,12 @@
     expect(regions, hasLength(2));
     // regions[0] is `num? a`.
     assertRegion(region: regions[1], offset: 39, details: [
-      "List value type must be nullable because a length is specified,"
-          " and the list items are initialized as null."
+      'List value type must be nullable because a length is specified,'
+          ' and the list items are initialized as null.'
     ]);
   }
 
-  @FailingTest(issue: "https://github.com/dart-lang/sdk/issues/40064")
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/40064')
   test_listConstructor_length_implicitType() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 void f() {
@@ -659,8 +659,8 @@
     expect(regions, hasLength(2));
     // regions[0] is `num? a`.
     assertRegion(region: regions[1], offset: 40, details: [
-      "List value type must be nullable because a length is specified,"
-          " and the list items are initialized as null."
+      'List value type must be nullable because a length is specified,'
+          ' and the list items are initialized as null.'
     ]);
   }
 
@@ -688,7 +688,7 @@
     assertRegion(
         region: regions[1],
         offset: 48,
-        details: ["This list is initialized with a nullable value on line 5"]);
+        details: ['This list is initialized with a nullable value on line 5']);
     assertDetail(detail: regions[1].details[0], offset: 79, length: 1);
   }
 
@@ -713,7 +713,7 @@
     assertRegion(
         region: regions[1],
         offset: 34,
-        details: ["This variable is initialized to a nullable value"]);
+        details: ['This variable is initialized to a nullable value']);
   }
 
   test_mapLiteralTypeArgument() async {
@@ -736,12 +736,12 @@
     assertRegion(
         region: regions[1],
         offset: 48,
-        details: ["This map is initialized with a nullable value on line 3"]);
+        details: ['This map is initialized with a nullable value on line 3']);
     assertDetail(detail: regions[1].details[0], offset: 71, length: 1);
     assertRegion(
         region: regions[2],
         offset: 106,
-        details: ["This map is initialized with a nullable value on line 4"]);
+        details: ['This map is initialized with a nullable value on line 4']);
     assertDetail(detail: regions[2].details[0], offset: 128, length: 1);
   }
 
@@ -771,7 +771,7 @@
     expect(regions, hasLength(2));
     // regions[0] is "an explicit null is passed..."
     assertRegion(region: regions[1], offset: 71, details: [
-      "The corresponding parameter in the overridden method, A.m, is nullable"
+      'The corresponding parameter in the overridden method, A.m, is nullable'
     ]);
     assertDetail(detail: regions[1].details[0], offset: 20, length: 3);
   }
@@ -792,7 +792,7 @@
         region: regions[0],
         offset: 7,
         length: 6,
-        details: ["This value is asserted to be non-null"]);
+        details: ['This value is asserted to be non-null']);
   }
 
   test_nonNullableType_exclamationComment() async {
@@ -821,7 +821,7 @@
     List<RegionInfo> regions = unit.nonNullableTypeRegions;
     expect(regions, hasLength(1));
     assertRegion(region: regions[0], offset: 7, length: 6, details: [
-      "This value is unconditionally used in a non-nullable context"
+      'This value is unconditionally used in a non-nullable context'
     ]);
   }
 
@@ -849,7 +849,7 @@
     var region = regions[1];
     var edits = region.edits;
     assertRegion(region: regions[1], offset: 65, details: [
-      "This value must be null-checked before accessing its properties."
+      'This value must be null-checked before accessing its properties.'
     ]);
     assertEdit(edit: edits[0], offset: 64, length: 0, replacement: '/*!*/');
   }
@@ -876,7 +876,7 @@
     expect(regions, hasLength(2));
     // regions[0] is `int?`.
     assertRegion(region: regions[1], offset: 65, details: [
-      "This value must be null-checked before calling its methods."
+      'This value must be null-checked before calling its methods.'
     ]);
   }
 
@@ -917,7 +917,7 @@
     List<RegionInfo> regions = unit.regions;
     expect(regions, hasLength(1));
     assertRegion(region: regions[0], offset: 13, details: [
-      "A dynamic value, which is nullable is passed as an argument"
+      'A dynamic value, which is nullable is passed as an argument'
     ]);
   }
 
@@ -953,10 +953,10 @@
     expect(regions, hasLength(3));
     // regions[0] is "an explicit null is passed..."
     assertRegion(region: regions[1], offset: 64, details: [
-      "The corresponding parameter in the overridden method, A.m, is nullable"
+      'The corresponding parameter in the overridden method, A.m, is nullable'
     ]);
     assertRegion(region: regions[2], offset: 109, details: [
-      "The corresponding parameter in the overridden method, B.m, is nullable"
+      'The corresponding parameter in the overridden method, B.m, is nullable'
     ]);
     assertDetail(detail: regions[1].details[0], offset: 19, length: 3);
     assertDetail(detail: regions[2].details[0], offset: 60, length: 3);
@@ -994,7 +994,7 @@
     expect(regions, hasLength(2));
     // regions[0] is "an explicit null is passed..."
     assertRegion(region: regions[1], offset: 104, details: [
-      "The corresponding parameter in the overridden method is nullable"
+      'The corresponding parameter in the overridden method is nullable'
     ]);
   }
 
@@ -1022,7 +1022,7 @@
     assertRegion(
         region: regions[0],
         offset: 62,
-        details: ["A nullable value is assigned"]);
+        details: ['A nullable value is assigned']);
   }
 
   test_parameter_fromOverriddenField_explicit() async {
@@ -1047,12 +1047,12 @@
     expect(regions, hasLength(2));
     assertRegion(region: regions[0], offset: 15, details: [
       // TODO(srawlins): I suspect this should be removed...
-      "A nullable value is assigned",
+      'A nullable value is assigned',
       "An explicit 'null' is assigned in the function 'f'",
     ]);
     assertRegion(region: regions[1], offset: 61, details: [
       // TODO(srawlins): Improve this message to include "B.m".
-      "The corresponding parameter in the overridden method is nullable"
+      'The corresponding parameter in the overridden method is nullable'
     ]);
     assertDetail(detail: regions[0].details[1], offset: 90, length: 4);
     assertDetail(detail: regions[1].details[0], offset: 12, length: 3);
@@ -1071,7 +1071,7 @@
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(1));
     assertRegion(region: regions[0], offset: 30, details: [
-      "This named parameter was omitted in a call to this function",
+      'This named parameter was omitted in a call to this function',
       "This parameter has an implicit default value of 'null'",
     ]);
     assertDetail(detail: regions[0].details[0], offset: 11, length: 3);
@@ -1104,7 +1104,7 @@
     assertRegion(
         region: regions[1],
         offset: 33,
-        details: ["This parameter has a nullable default value"]);
+        details: ['This parameter has a nullable default value']);
   }
 
   test_parameter_optional_implicitDefault_named() async {
@@ -1156,7 +1156,7 @@
     assertRegion(
         region: regions[0],
         offset: 27,
-        details: ["An overridding method has a nullable return value"]);
+        details: ['An overridding method has a nullable return value']);
     assertDetail(detail: regions[0].details[0], offset: 60, length: 6);
   }
 
@@ -1179,7 +1179,7 @@
     assertRegion(
         region: regions[0],
         offset: 6,
-        details: ["This function returns a nullable value on line 3"]);
+        details: ['This function returns a nullable value on line 3']);
     assertInTargets(targets: unit.targets, offset: 40, length: 6); // "return"
   }
 
@@ -1200,7 +1200,7 @@
     assertRegion(
         region: regions[0],
         offset: 6,
-        details: ["This function returns a nullable value on line 2"]);
+        details: ['This function returns a nullable value on line 2']);
     assertDetail(detail: regions[0].details[0], offset: 15, length: 6);
   }
 
@@ -1221,7 +1221,7 @@
     assertRegion(
         region: regions[1],
         offset: 19,
-        details: ["This function returns a nullable value on line 2"]);
+        details: ['This function returns a nullable value on line 2']);
   }
 
   test_returnType_getter_block() async {
@@ -1249,7 +1249,7 @@
     assertRegion(
         region: regions[1],
         offset: 33,
-        details: ["This getter returns a nullable value on line 4"]);
+        details: ['This getter returns a nullable value on line 4']);
   }
 
   test_returnType_getter_expression() async {
@@ -1273,7 +1273,7 @@
     assertRegion(
         region: regions[1],
         offset: 33,
-        details: ["This getter returns a nullable value on line 3"]);
+        details: ['This getter returns a nullable value on line 3']);
   }
 
   test_setLiteralTypeArgument_nestedList() async {
@@ -1300,7 +1300,7 @@
     assertRegion(
         region: regions[1],
         offset: 53,
-        details: ["This set is initialized with a nullable value on line 5"]);
+        details: ['This set is initialized with a nullable value on line 5']);
     // TODO(srawlins): Actually, this is marking the `[s]`, but I think only
     //  `s` should be marked. Minor bug for now.
     assertDetail(detail: regions[1].details[0], offset: 87, length: 3);
@@ -1323,7 +1323,7 @@
     assertRegion(
         region: regions[1],
         offset: 19,
-        details: ["This variable is initialized to a nullable value"]);
+        details: ['This variable is initialized to a nullable value']);
   }
 
   test_uninitializedField() async {
@@ -1351,11 +1351,11 @@
     RegionInfo region = regions.single;
     assertRegion(region: region, offset: 15, details: [
       "The constructor 'C' does not initialize this field in its initializer "
-          "list",
+          'list',
       "The constructor 'C.one' does not initialize this field in its "
-          "initializer list",
+          'initializer list',
       "The constructor 'C.two' does not initialize this field in its "
-          "initializer list",
+          'initializer list',
     ]);
 
     assertDetail(detail: region.details[0], offset: 25, length: 1);
@@ -1384,7 +1384,7 @@
     assertRegion(
         region: regions[0],
         offset: 16,
-        details: ["Used on line 4, when it is possibly uninitialized"]);
+        details: ['Used on line 4, when it is possibly uninitialized']);
     // regions[1] is the `v1!` fix.
   }
 }
diff --git a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
index 57035e8..5dfe529 100644
--- a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
@@ -502,8 +502,8 @@
   }
 
   @override
-  void listen(void onRequest(server.Request request),
-      {Function onError, void onDone()}) {
+  void listen(void Function(server.Request) onRequest,
+      {Function onError, void Function() onDone}) {
     fail('Unexpected invocation of listen');
   }
 
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index 0830872..93f39d8 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -725,7 +725,7 @@
   Future<void> withPlugin(
       {String content,
       String pluginName,
-      Future<void> test(String pluginPath)}) async {
+      Future<void> Function(String) test}) async {
     io.Directory tempDirectory =
         io.Directory.systemTemp.createTempSync(pluginName ?? 'test_plugin');
     try {
@@ -773,7 +773,7 @@
   Future<void> withPubspecPlugin(
       {String content,
       String pluginName,
-      Future<void> test(String pluginPath)}) async {
+      Future<void> Function(String) test}) async {
     io.Directory tempDirectory =
         io.Directory.systemTemp.createTempSync(pluginName ?? 'test_plugin');
     try {
@@ -955,9 +955,9 @@
   }
 
   @override
-  void listen(void onResponse(Response response),
-      void onNotification(Notification notification),
-      {void onError(dynamic error), void onDone()}) {
+  void listen(void Function(Response) onResponse,
+      void Function(Notification) onNotification,
+      {void Function(dynamic) onError, void Function() onDone}) {
     fail('Unexpected invocation of listen');
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
index f4b1317..1410b85 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
@@ -154,7 +154,7 @@
   print('a $b - ${c} d');
 }
 """);
-    await assertHasAssistAt("- ", r"""
+    await assertHasAssistAt('- ', r"""
 main() {
   var b = 'b';
   var c = 'c';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
index b8a4916..43725ad 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
@@ -96,7 +96,7 @@
   );
 }
 ''');
-    assertExitPosition(after: "],");
+    assertExitPosition(after: '],');
   }
 
   test_sort_noAssistWithLint() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
index 6fc4504..36c8426 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
@@ -389,39 +389,39 @@
   }
 
   test_returnType_bool_and_left() async {
-    await assert_returnType_bool("test() && b;");
+    await assert_returnType_bool('test() && b;');
   }
 
   test_returnType_bool_and_right() async {
-    await assert_returnType_bool("b && test();");
+    await assert_returnType_bool('b && test();');
   }
 
   test_returnType_bool_assert() async {
-    await assert_returnType_bool("assert ( test() );");
+    await assert_returnType_bool('assert ( test() );');
   }
 
   test_returnType_bool_do() async {
-    await assert_returnType_bool("do {} while ( test() );");
+    await assert_returnType_bool('do {} while ( test() );');
   }
 
   test_returnType_bool_if() async {
-    await assert_returnType_bool("if ( test() ) {}");
+    await assert_returnType_bool('if ( test() ) {}');
   }
 
   test_returnType_bool_or_left() async {
-    await assert_returnType_bool("test() || b;");
+    await assert_returnType_bool('test() || b;');
   }
 
   test_returnType_bool_or_right() async {
-    await assert_returnType_bool("b || test();");
+    await assert_returnType_bool('b || test();');
   }
 
   test_returnType_bool_unaryNegation() async {
-    await assert_returnType_bool("!test();");
+    await assert_returnType_bool('!test();');
   }
 
   test_returnType_bool_while() async {
-    await assert_returnType_bool("while ( test() ) {}");
+    await assert_returnType_bool('while ( test() ) {}');
   }
 
   test_returnType_fromAssignment_eq() async {
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index af92890..ee8db5f 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -31,7 +31,7 @@
 var w = const Icon(Icons.book);
 ''');
     var w = _getTopVariableCreation('w');
-    expect(flutter.getWidgetPresentationText(w), "Icon(Icons.book)");
+    expect(flutter.getWidgetPresentationText(w), 'Icon(Icons.book)');
   }
 
   test_getWidgetPresentationText_icon_withoutArguments() async {
@@ -41,7 +41,7 @@
 var w = const Icon();
 ''');
     var w = _getTopVariableCreation('w');
-    expect(flutter.getWidgetPresentationText(w), "Icon");
+    expect(flutter.getWidgetPresentationText(w), 'Icon');
   }
 
   test_getWidgetPresentationText_notWidget() async {
@@ -81,7 +81,7 @@
 var w = const Text();
 ''');
     var w = _getTopVariableCreation('w');
-    expect(flutter.getWidgetPresentationText(w), "Text");
+    expect(flutter.getWidgetPresentationText(w), 'Text');
   }
 
   test_getWidgetPresentationText_unresolved() async {
@@ -164,7 +164,7 @@
 ''');
     {
       MethodInvocation invocation = findNodeAtString(
-          "createEmptyText();", (node) => node is MethodInvocation);
+          'createEmptyText();', (node) => node is MethodInvocation);
       expect(flutter.identifyWidgetExpression(invocation), invocation);
       ArgumentList argumentList = invocation.argumentList;
       expect(flutter.identifyWidgetExpression(argumentList), isNull);
@@ -254,12 +254,12 @@
 ''');
     expect(flutter.identifyWidgetExpression(null), isNull);
     {
-      Expression expression = findNodeAtString("42;");
+      Expression expression = findNodeAtString('42;');
       expect(flutter.identifyWidgetExpression(expression), isNull);
     }
 
     {
-      Expression expression = findNodeAtString("intVariable;");
+      Expression expression = findNodeAtString('intVariable;');
       expect(flutter.identifyWidgetExpression(expression), isNull);
     }
   }
@@ -275,7 +275,7 @@
 
 void useWidget(Widget w) {}
 ''');
-    Expression expression = findNodeAtString("text); // ref");
+    Expression expression = findNodeAtString('text); // ref');
     expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
@@ -330,7 +330,7 @@
 
 main(Widget widget) => widget; // ref
 ''');
-    Expression expression = findNodeAtString("widget; // ref");
+    Expression expression = findNodeAtString('widget; // ref');
     expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
@@ -342,7 +342,7 @@
   widget; // ref
 }
 ''');
-    Expression expression = findNodeAtString("widget; // ref");
+    Expression expression = findNodeAtString('widget; // ref');
     expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
@@ -392,7 +392,7 @@
   return [widget]; // ref
 }
 ''');
-    Expression expression = findNodeAtString("widget]; // ref");
+    Expression expression = findNodeAtString('widget]; // ref');
     expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
@@ -407,7 +407,7 @@
 
 void useWidget({Widget child}) {}
 ''');
-    Expression expression = findNodeAtString("text); // ref");
+    Expression expression = findNodeAtString('text); // ref');
     expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
@@ -419,7 +419,7 @@
   return widget; // ref
 }
 ''');
-    Expression expression = findNodeAtString("widget; // ref");
+    Expression expression = findNodeAtString('widget; // ref');
     expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
@@ -498,13 +498,13 @@
     }
 
     {
-      Expression expression = findNodeAtString("text;");
+      Expression expression = findNodeAtString('text;');
       expect(flutter.isWidgetExpression(expression), isTrue);
     }
 
     {
       Expression expression = findNodeAtString(
-          "createEmptyText();", (node) => node is MethodInvocation);
+          'createEmptyText();', (node) => node is MethodInvocation);
       expect(flutter.isWidgetExpression(expression), isTrue);
     }
 
@@ -520,12 +520,12 @@
     }
 
     {
-      Expression expression = findNodeAtString("42;");
+      Expression expression = findNodeAtString('42;');
       expect(flutter.isWidgetExpression(expression), isFalse);
     }
 
     {
-      Expression expression = findNodeAtString("intVariable;");
+      Expression expression = findNodeAtString('intVariable;');
       expect(flutter.isWidgetExpression(expression), isFalse);
     }
   }
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index cf93f1d..cbbee68 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -394,31 +394,31 @@
 
   RequestData sendAnalysisGetErrors(String file) {
     var params = AnalysisGetErrorsParams(file).toJson();
-    return _send("analysis.getErrors", params);
+    return _send('analysis.getErrors', params);
   }
 
   RequestData sendAnalysisGetHover(String file, int offset) {
     var params = AnalysisGetHoverParams(file, offset).toJson();
-    return _send("analysis.getHover", params);
+    return _send('analysis.getHover', params);
   }
 
   RequestData sendAnalysisGetLibraryDependencies() {
-    return _send("analysis.getLibraryDependencies", null);
+    return _send('analysis.getLibraryDependencies', null);
   }
 
   RequestData sendAnalysisGetNavigation(String file, int offset, int length) {
     var params = AnalysisGetNavigationParams(file, offset, length).toJson();
-    return _send("analysis.getNavigation", params);
+    return _send('analysis.getNavigation', params);
   }
 
   RequestData sendAnalysisGetReachableSources(String file) {
     var params = AnalysisGetReachableSourcesParams(file).toJson();
-    return _send("analysis.getReachableSources", params);
+    return _send('analysis.getReachableSources', params);
   }
 
   void sendAnalysisReanalyze() {
     var params = AnalysisReanalyzeParams().toJson();
-    _send("analysis.reanalyze", params);
+    _send('analysis.reanalyze', params);
   }
 
   void sendAnalysisSetAnalysisRoots(
@@ -428,24 +428,24 @@
     var params = AnalysisSetAnalysisRootsParams(included, excluded,
             packageRoots: packageRoots)
         .toJson();
-    _send("analysis.setAnalysisRoots", params);
+    _send('analysis.setAnalysisRoots', params);
   }
 
   void sendAnalysisSetGeneralSubscriptions(
       List<GeneralAnalysisService> subscriptions) {
     var params = AnalysisSetGeneralSubscriptionsParams(subscriptions).toJson();
-    _send("analysis.setGeneralSubscriptions", params);
+    _send('analysis.setGeneralSubscriptions', params);
   }
 
   void sendAnalysisSetPriorityFiles(List<String> files) {
     var params = AnalysisSetPriorityFilesParams(files).toJson();
-    _send("analysis.setPriorityFiles", params);
+    _send('analysis.setPriorityFiles', params);
   }
 
   void sendAnalysisSetSubscriptions(
       Map<AnalysisService, List<String>> subscriptions) {
     var params = AnalysisSetSubscriptionsParams(subscriptions).toJson();
-    _send("analysis.setSubscriptions", params);
+    _send('analysis.setSubscriptions', params);
   }
 
   void sendAnalysisUpdateContent(Map<String, dynamic> files) {
@@ -462,16 +462,16 @@
 
   void sendAnalysisUpdateOptions(AnalysisOptions options) {
     var params = AnalysisUpdateOptionsParams(options).toJson();
-    _send("analysis.updateOptions", params);
+    _send('analysis.updateOptions', params);
   }
 
   void sendCompletionGetSuggestions(String file, int offset) {
     var params = CompletionGetSuggestionsParams(file, offset).toJson();
-    _send("completion.getSuggestions", params);
+    _send('completion.getSuggestions', params);
   }
 
   RequestData sendDiagnosticGetDiagnostics() {
-    return _send("diagnostic.getDiagnostics", null);
+    return _send('diagnostic.getDiagnostics', null);
   }
 
   RequestData sendEditFormat(
@@ -480,24 +480,24 @@
     var params = EditFormatParams(file, selectionOffset, selectionLength,
             lineLength: lineLength)
         .toJson();
-    return _send("edit.format", params);
+    return _send('edit.format', params);
   }
 
   RequestData sendEditGetAssists(String file, int offset, int length) {
     var params = EditGetAssistsParams(file, offset, length).toJson();
-    return _send("edit.getAssists", params);
+    return _send('edit.getAssists', params);
   }
 
   RequestData sendEditGetAvailableRefactorings(
       String file, int offset, int length) {
     var params =
         EditGetAvailableRefactoringsParams(file, offset, length).toJson();
-    return _send("edit.getAvailableRefactorings", params);
+    return _send('edit.getAvailableRefactorings', params);
   }
 
   RequestData sendEditGetFixes(String file, int offset) {
     var params = EditGetFixesParams(file, offset).toJson();
-    return _send("edit.getFixes", params);
+    return _send('edit.getFixes', params);
   }
 
   RequestData sendEditGetRefactoring(RefactoringKind kind, String file,
@@ -507,38 +507,38 @@
             kind, file, offset, length, validateOnly,
             options: options)
         .toJson();
-    return _send("edit.getRefactoring", params);
+    return _send('edit.getRefactoring', params);
   }
 
   RequestData sendEditOrganizeDirectives(String file) {
     var params = EditOrganizeDirectivesParams(file).toJson();
-    return _send("edit.organizeDirectives", params);
+    return _send('edit.organizeDirectives', params);
   }
 
   RequestData sendEditSortMembers(String file) {
     var params = EditSortMembersParams(file).toJson();
-    return _send("edit.sortMembers", params);
+    return _send('edit.sortMembers', params);
   }
 
   RequestData sendExecutionCreateContext(String contextRoot) {
     var params = ExecutionCreateContextParams(contextRoot).toJson();
-    return _send("execution.createContext", params);
+    return _send('execution.createContext', params);
   }
 
   RequestData sendExecutionDeleteContext(String id) {
     var params = ExecutionDeleteContextParams(id).toJson();
-    return _send("execution.deleteContext", params);
+    return _send('execution.deleteContext', params);
   }
 
   RequestData sendExecutionMapUri(String id, {String file, String uri}) {
     var params = ExecutionMapUriParams(id, file: file, uri: uri).toJson();
-    return _send("execution.mapUri", params);
+    return _send('execution.mapUri', params);
   }
 
   RequestData sendExecutionSetSubscriptions(
       List<ExecutionService> subscriptions) {
     var params = ExecutionSetSubscriptionsParams(subscriptions).toJson();
-    return _send("execution.setSubscriptions", params);
+    return _send('execution.setSubscriptions', params);
   }
 
   void sendSearchFindElementReferences(
@@ -546,42 +546,42 @@
     var params =
         SearchFindElementReferencesParams(file, offset, includePotential)
             .toJson();
-    _send("search.findElementReferences", params);
+    _send('search.findElementReferences', params);
   }
 
   void sendSearchFindMemberDeclarations(String name) {
     var params = SearchFindMemberDeclarationsParams(name).toJson();
-    _send("search.findMemberDeclarations", params);
+    _send('search.findMemberDeclarations', params);
   }
 
   void sendSearchFindMemberReferences(String name) {
     var params = SearchFindMemberReferencesParams(name).toJson();
-    _send("search.findMemberReferences", params);
+    _send('search.findMemberReferences', params);
   }
 
   void sendSearchFindTopLevelDeclarations(String pattern) {
     var params = SearchFindTopLevelDeclarationsParams(pattern).toJson();
-    _send("search.findTopLevelDeclarations", params);
+    _send('search.findTopLevelDeclarations', params);
   }
 
   void sendSearchGetTypeHierarchy(String file, int offset, {bool superOnly}) {
     var params =
         SearchGetTypeHierarchyParams(file, offset, superOnly: superOnly)
             .toJson();
-    _send("search.getTypeHierarchy", params);
+    _send('search.getTypeHierarchy', params);
   }
 
   RequestData sendServerGetVersion() {
-    return _send("server.getVersion", null);
+    return _send('server.getVersion', null);
   }
 
   void sendServerSetSubscriptions(List<ServerService> subscriptions) {
     var params = ServerSetSubscriptionsParams(subscriptions).toJson();
-    _send("server.setSubscriptions", params);
+    _send('server.setSubscriptions', params);
   }
 
   void sendServerShutdown() {
-    _send("server.shutdown", null);
+    _send('server.shutdown', null);
   }
 
   /**
@@ -683,15 +683,15 @@
    */
   void _handleNotification(Notification notification) {
     switch (notification.event) {
-      case "server.connected":
+      case 'server.connected':
 //        new ServerConnectedParams.fromNotification(notification);
         _serverConnectedCompleter.complete(null);
         break;
-      case "server.error":
+      case 'server.error':
 //        new ServerErrorParams.fromNotification(notification);
         throw StateError('Server error: ${notification.toJson()}');
         break;
-      case "server.status":
+      case 'server.status':
         if (_analysisFinishedCompleter != null) {
           ServerStatusParams params =
               ServerStatusParams.fromNotification(notification);
@@ -701,51 +701,51 @@
           }
         }
         break;
-      case "analysis.analyzedFiles":
+      case 'analysis.analyzedFiles':
         AnalysisAnalyzedFilesParams params =
             AnalysisAnalyzedFilesParams.fromNotification(notification);
         _analyzedFiles = params.directories;
         break;
-      case "analysis.errors":
+      case 'analysis.errors':
         AnalysisErrorsParams params =
             AnalysisErrorsParams.fromNotification(notification);
         _errorMap.pathMap[params.file] = params.errors;
         break;
-      case "analysis.flushResults":
+      case 'analysis.flushResults':
 //        new AnalysisFlushResultsParams.fromNotification(notification);
         _errorMap.pathMap.clear();
         break;
-      case "analysis.folding":
+      case 'analysis.folding':
 //        new AnalysisFoldingParams.fromNotification(notification);
         break;
-      case "analysis.highlights":
+      case 'analysis.highlights':
 //        new AnalysisHighlightsParams.fromNotification(notification);
         break;
-      case "analysis.implemented":
+      case 'analysis.implemented':
 //        new AnalysisImplementedParams.fromNotification(notification);
         break;
-      case "analysis.invalidate":
+      case 'analysis.invalidate':
 //        new AnalysisInvalidateParams.fromNotification(notification);
         break;
-      case "analysis.navigation":
+      case 'analysis.navigation':
 //        new AnalysisNavigationParams.fromNotification(notification);
         break;
-      case "analysis.occurrences":
+      case 'analysis.occurrences':
 //        new AnalysisOccurrencesParams.fromNotification(notification);
         break;
-      case "analysis.outline":
+      case 'analysis.outline':
 //        new AnalysisOutlineParams.fromNotification(notification);
         break;
-      case "analysis.overrides":
+      case 'analysis.overrides':
 //        new AnalysisOverridesParams.fromNotification(notification);
         break;
-      case "completion.results":
+      case 'completion.results':
 //        new CompletionResultsParams.fromNotification(notification);
         break;
-      case "search.results":
+      case 'search.results':
 //        new SearchResultsParams.fromNotification(notification);
         break;
-      case "execution.launchData":
+      case 'execution.launchData':
 //        new ExecutionLaunchDataParams.fromNotification(notification);
         break;
       default:
@@ -884,7 +884,8 @@
      * Install the given [handler] to listen to transformed output from the
      * given [stream].
      */
-    void installHandler(Stream<List<int>> stream, handler(String line)) {
+    void installHandler(
+        Stream<List<int>> stream, void Function(String) handler) {
       stream
           .transform((Utf8Codec()).decoder)
           .transform(LineSplitter())
@@ -899,7 +900,7 @@
    * Send a command to the server. An 'id' will be automatically assigned.
    */
   RequestData _send(String method, Map<String, dynamic> params,
-      {void onResponse(Response response)}) {
+      {void Function(Response) onResponse}) {
     String id = '${_nextId++}';
     RequestData requestData = RequestData(id, method, params, currentTime);
     _requestDataMap[id] = requestData;
diff --git a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
index 0b3b6d9..0ec2b14 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
@@ -20,7 +20,7 @@
 
     test('returns correct output for union types', () {
       final message = RequestMessage(
-          Either2<num, String>.t1(1), Method.shutdown, null, "test");
+          Either2<num, String>.t1(1), Method.shutdown, null, 'test');
       String output = json.encode(message.toJson());
       expect(output, equals('{"id":1,"method":"shutdown","jsonrpc":"test"}'));
     });
@@ -165,14 +165,14 @@
       expect(CreateFile.canParse(<String, dynamic>{}, reporter), isFalse);
       expect(reporter.errors, hasLength(1));
       expect(
-          reporter.errors.first, equals("params.kind must not be undefined"));
+          reporter.errors.first, equals('params.kind must not be undefined'));
     });
 
     test('canParse records null fields', () {
       final reporter = LspJsonReporter('params');
       expect(CreateFile.canParse({'kind': null}, reporter), isFalse);
       expect(reporter.errors, hasLength(1));
-      expect(reporter.errors.first, equals("params.kind must not be null"));
+      expect(reporter.errors.first, equals('params.kind must not be null'));
     });
 
     test('canParse records fields of the wrong type', () {
@@ -180,7 +180,7 @@
       expect(RenameFileOptions.canParse({'overwrite': 1}, reporter), isFalse);
       expect(reporter.errors, hasLength(1));
       expect(reporter.errors.first,
-          equals("params.overwrite must be of type bool"));
+          equals('params.overwrite must be of type bool'));
     });
 
     test('canParse records nested undefined fields', () {
@@ -191,7 +191,7 @@
           isFalse);
       expect(reporter.errors, hasLength(greaterThanOrEqualTo(1)));
       expect(reporter.errors.first,
-          equals("params.textDocument.uri must not be undefined"));
+          equals('params.textDocument.uri must not be undefined'));
     });
 
     test('canParse records nested null fields', () {
@@ -203,7 +203,7 @@
           isFalse);
       expect(reporter.errors, hasLength(greaterThanOrEqualTo(1)));
       expect(reporter.errors.first,
-          equals("params.textDocument.uri must not be null"));
+          equals('params.textDocument.uri must not be null'));
     });
 
     test('canParse records nested fields of the wrong type', () {
@@ -215,7 +215,7 @@
           isFalse);
       expect(reporter.errors, hasLength(greaterThanOrEqualTo(1)));
       expect(reporter.errors.first,
-          equals("params.textDocument.uri must be of type String"));
+          equals('params.textDocument.uri must be of type String'));
     });
 
     test(
@@ -231,7 +231,7 @@
       expect(
           reporter.errors.first,
           equals(
-              "params.documentChanges must be of type Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>"));
+              'params.documentChanges must be of type Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>'));
     });
 
     test('ResponseMessage can include a null result', () {
@@ -266,16 +266,16 @@
       final message = RequestMessage.fromJson(jsonDecode(input));
       expect(message.id, equals(Either2<num, String>.t1(1)));
       expect(message.id.valueEquals(1), isTrue);
-      expect(message.jsonrpc, "test");
+      expect(message.jsonrpc, 'test');
       expect(message.method, Method.shutdown);
     });
 
     test('parses JSON for types with unions (right side)', () {
       final input = '{"id":"one","method":"shutdown","jsonrpc":"test"}';
       final message = RequestMessage.fromJson(jsonDecode(input));
-      expect(message.id, equals(Either2<num, String>.t2("one")));
-      expect(message.id.valueEquals("one"), isTrue);
-      expect(message.jsonrpc, "test");
+      expect(message.id, equals(Either2<num, String>.t2('one')));
+      expect(message.id.valueEquals('one'), isTrue);
+      expect(message.jsonrpc, 'test');
       expect(message.method, Method.shutdown);
     });
 
@@ -308,9 +308,9 @@
           '{"id":1,"invalidField":true,"method":"foo","jsonrpc":"test"}';
       final message = RequestMessage.fromJson(jsonDecode(input));
       expect(message.id.valueEquals(1), isTrue);
-      expect(message.method, equals(Method("foo")));
+      expect(message.method, equals(Method('foo')));
       expect(message.params, isNull);
-      expect(message.jsonrpc, equals("test"));
+      expect(message.jsonrpc, equals('test'));
     });
   });
 
diff --git a/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart b/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
index b1d86bd..cf88296 100644
--- a/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
+++ b/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
@@ -4,7 +4,6 @@
 
 import 'dart:async';
 import 'dart:io' as io;
-import 'dart:math';
 
 import 'package:analysis_server/src/domains/completion/available_suggestions.dart';
 import 'package:analysis_server/src/protocol_server.dart';
@@ -21,11 +20,13 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 
+import 'metrics_util.dart';
 import 'visitors.dart';
 
-main() {
+main() async {
   var analysisRoots = [''];
-  _computeCompletionMetrics(PhysicalResourceProvider.INSTANCE, analysisRoots);
+  await _computeCompletionMetrics(
+      PhysicalResourceProvider.INSTANCE, analysisRoots);
 }
 
 /// When enabled, expected, but missing completion tokens will be printed to
@@ -37,6 +38,9 @@
     ResourceProvider resourceProvider, List<String> analysisRoots) async {
   int includedCount = 0;
   int notIncludedCount = 0;
+  Counter completionKindCounter = Counter('completion kind counter');
+  Counter completionElementKindCounter =
+      Counter('completion element kind counter');
 
   for (var root in analysisRoots) {
     print('Analyzing root: \"$root\"');
@@ -78,7 +82,7 @@
               var fraction =
                   _placementInSuggestionList(suggestions, expectedCompletion);
 
-              if (fraction.y != 0) {
+              if (fraction.denominator != 0) {
                 includedCount++;
               } else {
                 notIncludedCount++;
@@ -90,6 +94,11 @@
                   print(
                       '\tdid not include the expected completion: \"${expectedCompletion.completion}\", completion kind: ${expectedCompletion.kind.toString()}, element kind: ${expectedCompletion.elementKind.toString()}');
                   print('');
+
+                  completionKindCounter
+                      .count(expectedCompletion.kind.toString());
+                  completionElementKindCounter
+                      .count(expectedCompletion.elementKind.toString());
                 }
               }
             }
@@ -105,7 +114,8 @@
     final percentIncluded = includedCount / totalCompletionCount;
     final percentNotIncluded = 1 - percentIncluded;
 
-    print('');
+    completionKindCounter.printCounterValues();
+    completionElementKindCounter.printCounterValues();
     print('Summary for $root:');
     print('Total number of completion tests   = $totalCompletionCount');
     print(
@@ -115,18 +125,20 @@
   }
   includedCount = 0;
   notIncludedCount = 0;
+  completionKindCounter.clear();
+  completionElementKindCounter.clear();
 }
 
-Point<int> _placementInSuggestionList(List<CompletionSuggestion> suggestions,
+Place _placementInSuggestionList(List<CompletionSuggestion> suggestions,
     ExpectedCompletion expectedCompletion) {
-  var i = 1;
+  var placeCounter = 1;
   for (var completionSuggestion in suggestions) {
     if (expectedCompletion.matches(completionSuggestion)) {
-      return Point(i, suggestions.length);
+      return Place(placeCounter, suggestions.length);
     }
-    i++;
+    placeCounter++;
   }
-  return Point(0, 0);
+  return Place.none();
 }
 
 Future<List<CompletionSuggestion>> computeCompletionSuggestions(
diff --git a/pkg/analysis_server/tool/completion_metrics/metrics_util.dart b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
new file mode 100644
index 0000000..95998e9
--- /dev/null
+++ b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/status/pages.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
+
+/// A simple counter class.  A [String] name is passed to name the counter. Each
+/// time something is counted, a non-null, non-empty [String] key is passed to
+/// [count] to increment the amount from zero. [printCounterValues] is provided
+/// to have a [String] summary of the generated counts, example:
+///
+/// ```
+/// Counts for 'counter example':
+/// [bucket-1] 60 (60.0%)
+/// [bucket-2] 25 (25.0%)
+/// [bucket-3] 5 (5.0%)
+/// [bucket-4] 10 (10.0%)
+/// ```
+class Counter {
+  final String name;
+  final Map<String, int> _buckets;
+  int _totalCount = 0;
+
+  Counter(this.name) : _buckets = {};
+
+  /// Return a copy of all the current count data, this getter copies and
+  /// returns the data to ensure that the data is only modified with the public
+  /// accessors in this class.
+  Map<String, int> get map => Map.from(_buckets);
+
+  int get totalCount => _totalCount;
+
+  void clear() {
+    _buckets.clear();
+    _totalCount = 0;
+  }
+
+  void count(String id, [int countNumber = 1]) {
+    assert(id != null && id.isNotEmpty && 1 <= countNumber);
+    if (_buckets.containsKey(id)) {
+      _buckets[id] += countNumber;
+    } else {
+      _buckets.putIfAbsent(id, () => countNumber);
+    }
+    _totalCount += countNumber;
+  }
+
+  int getCountOf(String id) => _buckets[id] ?? 0;
+
+  void printCounterValues() {
+    print('Counts for \'$name\':');
+    _buckets.forEach((id, count) =>
+        print('[$id] $count (${printPercentage(count / _totalCount, 2)})'));
+    print('');
+  }
+}
+
+/// An immutable class to represent the placement in some list, for example '2nd
+/// place out of 5'.
+class Place {
+  /// A 1-indexed place in a list
+  final int _numerator;
+
+  /// The total number of possible places.
+  final int _denominator;
+
+  Place(this._numerator, this._denominator) {
+    assert(_numerator > 0 && _denominator > 0);
+  }
+
+  Place.none()
+      : _numerator = 0,
+        _denominator = 0;
+
+  int get denominator => _denominator;
+
+  @override
+  int get hashCode => JenkinsSmiHash.hash2(_numerator, _denominator);
+
+  int get numerator => _numerator;
+
+  @override
+  bool operator ==(dynamic other) =>
+      other is Place &&
+      _numerator == other._numerator &&
+      _denominator == other._denominator;
+}
diff --git a/pkg/analysis_server/tool/instrumentation/server.dart b/pkg/analysis_server/tool/instrumentation/server.dart
index 5c9d55a..0b2bede 100644
--- a/pkg/analysis_server/tool/instrumentation/server.dart
+++ b/pkg/analysis_server/tool/instrumentation/server.dart
@@ -34,7 +34,7 @@
    * The content type for HTML responses.
    */
   static final ContentType _htmlContent =
-      ContentType("text", "html", charset: "utf-8");
+      ContentType('text', 'html', charset: 'utf-8');
 
   /**
    * The instrumentation log being served up.
@@ -172,7 +172,7 @@
     HttpResponse response = request.response;
     response.statusCode = HttpStatus.notFound;
     response.headers.contentType =
-        ContentType("text", "html", charset: "utf-8");
+        ContentType('text', 'html', charset: 'utf-8');
     response.write(
         '<html><head></head><body><h3>Page not found: "${request.uri.path}".</h3></body></html>');
     response.close();
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 4771a00..11c69dd 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -399,15 +399,15 @@
   type = resolveTypeAlias(type);
 
   if (_isSimpleType(type)) {
-    buffer.write("$valueCode");
+    buffer.write('$valueCode');
   } else if (_isSpecType(type)) {
     // Our own types have fromJson() constructors we can call.
     buffer.write(
-        "$valueCode != null ? ${type.dartType}.fromJson${type.typeArgsString}($valueCode) : null");
+        '$valueCode != null ? ${type.dartType}.fromJson${type.typeArgsString}($valueCode) : null');
   } else if (type is ArrayType) {
     // Lists need to be map()'d so we can recursively call writeFromJsonCode
     // as they may need fromJson on each element.
-    buffer.write("$valueCode?.map((item) => ");
+    buffer.write('$valueCode?.map((item) => ');
     _writeFromJsonCode(buffer, type.elementType, 'item',
         allowsNull: allowsNull);
     buffer
@@ -424,7 +424,7 @@
   } else if (type is UnionType) {
     _writeFromJsonCodeForUnion(buffer, type, valueCode, allowsNull: allowsNull);
   } else {
-    buffer.write("$valueCode");
+    buffer.write('$valueCode');
   }
 }
 
@@ -603,7 +603,7 @@
   // ResponseMessage must confirm to JSON-RPC which says only one of
   // result/error can be included. Since this isn't encoded in the types we
   // need to special-case it's toJson generation.
-  if (interface.name == "ResponseMessage") {
+  if (interface.name == 'ResponseMessage') {
     _writeToJsonFieldsForResponseMessage(buffer, interface);
   } else {
     for (var field in _getAllFields(interface)) {
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript.dart b/pkg/analysis_server/tool/lsp_spec/typescript.dart
index 2feceef..391a659 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript.dart
@@ -43,53 +43,53 @@
 ///   of code in `EitherX<Y,Z>.tX()` and simplifies the testing of them.
 String getImprovedType(String interfaceName, String fieldName) {
   const Map<String, Map<String, String>> _improvedTypeMappings = {
-    "Diagnostic": {
-      "severity": "DiagnosticSeverity",
-      "code": "String",
+    'Diagnostic': {
+      'severity': 'DiagnosticSeverity',
+      'code': 'String',
     },
-    "TextDocumentSyncOptions": {
-      "change": "TextDocumentSyncKind",
+    'TextDocumentSyncOptions': {
+      'change': 'TextDocumentSyncKind',
     },
-    "TextDocumentChangeRegistrationOptions": {
-      "syncKind": "TextDocumentSyncKind",
+    'TextDocumentChangeRegistrationOptions': {
+      'syncKind': 'TextDocumentSyncKind',
     },
-    "FileSystemWatcher": {
-      "kind": "WatchKind",
+    'FileSystemWatcher': {
+      'kind': 'WatchKind',
     },
-    "CompletionItem": {
-      "kind": "CompletionItemKind",
-      "data": "CompletionItemResolutionInfo",
+    'CompletionItem': {
+      'kind': 'CompletionItemKind',
+      'data': 'CompletionItemResolutionInfo',
     },
-    "DocumentHighlight": {
-      "kind": "DocumentHighlightKind",
+    'DocumentHighlight': {
+      'kind': 'DocumentHighlightKind',
     },
-    "FoldingRange": {
-      "kind": "FoldingRangeKind",
+    'FoldingRange': {
+      'kind': 'FoldingRangeKind',
     },
-    "ResponseError": {
-      "code": "ErrorCodes",
+    'ResponseError': {
+      'code': 'ErrorCodes',
       // This is dynamic normally, but since this class can be serialised
       // we will crash if it data is set to something that can't be converted to
       // JSON (for ex. Uri) so this forces anyone setting this to convert to a
       // String.
-      "data": "String",
+      'data': 'String',
     },
-    "NotificationMessage": {
-      "method": "Method",
-      "params": "object",
+    'NotificationMessage': {
+      'method': 'Method',
+      'params': 'object',
     },
-    "RequestMessage": {
-      "method": "Method",
-      "params": "object",
+    'RequestMessage': {
+      'method': 'Method',
+      'params': 'object',
     },
-    "SymbolInformation": {
-      "kind": "SymbolKind",
+    'SymbolInformation': {
+      'kind': 'SymbolKind',
     },
-    "ParameterInformation": {
-      "label": "String",
+    'ParameterInformation': {
+      'label': 'String',
     },
-    "ServerCapabilities": {
-      "changeNotifications": "bool",
+    'ServerCapabilities': {
+      'changeNotifications': 'bool',
     }
   };
 
@@ -102,9 +102,9 @@
 /// altered (for ex. with [getImprovedType] above).
 String getImprovedComment(String interfaceName, String fieldName) {
   const Map<String, Map<String, String>> _improvedComments = {
-    "ResponseError": {
-      "data":
-          "// A string that contains additional information about the error. Can be omitted.",
+    'ResponseError': {
+      'data':
+          '// A string that contains additional information about the error. Can be omitted.',
     },
   };
 
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index c4e8464..fa1bbf6 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -708,7 +708,7 @@
             writeln(' else {');
             indent(() {
               writeln(
-                  "throw jsonDecoder.mismatch(jsonPath, $fieldNameString);");
+                  'throw jsonDecoder.mismatch(jsonPath, $fieldNameString);');
             });
             writeln('}');
           } else {
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index 9eedfa7..928c838 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -303,7 +303,7 @@
       //
       // public static final "EMPTY_ARRAY" field
       //
-      publicField(javaName("EMPTY_ARRAY"), () {
+      publicField(javaName('EMPTY_ARRAY'), () {
         writeln(
             'public static final $className[] EMPTY_ARRAY = new $className[0];');
       });
@@ -311,7 +311,7 @@
       //
       // public static final "EMPTY_LIST" field
       //
-      publicField(javaName("EMPTY_LIST"), () {
+      publicField(javaName('EMPTY_LIST'), () {
         writeln(
             'public static final List<$className> EMPTY_LIST = Lists.newArrayList();');
       });
@@ -691,7 +691,7 @@
         indent(() {
           writeln('HashCodeBuilder builder = new HashCodeBuilder();');
           for (int i = 0; i < fields.length; i++) {
-            writeln("builder.append(${javaName(fields[i].name)});");
+            writeln('builder.append(${javaName(fields[i].name)});');
           }
           writeln('return builder.toHashCode();');
         });
@@ -708,8 +708,8 @@
           writeln('StringBuilder builder = new StringBuilder();');
           writeln('builder.append(\"[\");');
           for (int i = 0; i < fields.length; i++) {
-            writeln("builder.append(\"${javaName(fields[i].name)}=\");");
-            write("builder.append(${_getToStringForField(fields[i])}");
+            writeln('builder.append(\"${javaName(fields[i].name)}=\");');
+            write('builder.append(${_getToStringForField(fields[i])}');
             if (i + 1 != fields.length) {
               // this is not the last field
               write(' + \", \"');
diff --git a/pkg/analysis_server/tool/spec/to_html.dart b/pkg/analysis_server/tool/spec/to_html.dart
index c3ee37d3..95cf23a 100644
--- a/pkg/analysis_server/tool/spec/to_html.dart
+++ b/pkg/analysis_server/tool/spec/to_html.dart
@@ -299,7 +299,7 @@
   }
 
   void generateNotificationsIndex(Iterable<Notification> notifications) {
-    h5(() => write("Notifications"));
+    h5(() => write('Notifications'));
     element('div', {'class': 'subindex'}, () {
       element('ul', {}, () {
         for (var notification in notifications) {
@@ -318,7 +318,7 @@
       return;
     }
     h3(() {
-      write("Refactorings");
+      write('Refactorings');
       write(' (');
       link('refactorings', () => write('\u2191'));
       write(')');
@@ -338,7 +338,7 @@
   }
 
   void generateRequestsIndex(Iterable<Request> requests) {
-    h5(() => write("Requests"));
+    h5(() => write('Requests'));
     element('ul', {}, () {
       for (var request in requests) {
         if (!request.experimental) {
@@ -383,7 +383,7 @@
 
   void generateTypesIndex(Set<String> types) {
     h3(() {
-      write("Types");
+      write('Types');
       write(' (');
       link('types', () => write('\u2191'));
       write(')');
diff --git a/pkg/analysis_server_client/analysis_options.yaml b/pkg/analysis_server_client/analysis_options.yaml
index 166a5d4..d7b19d7 100644
--- a/pkg/analysis_server_client/analysis_options.yaml
+++ b/pkg/analysis_server_client/analysis_options.yaml
@@ -40,7 +40,7 @@
     - prefer_is_empty
     - prefer_is_not_empty
     - prefer_iterable_whereType
-    #- prefer_single_quotes # 3434
+    - prefer_single_quotes
     - prefer_spread_collections
     - recursive_getters
     - slash_for_doc_comments
diff --git a/pkg/analysis_server_client/lib/server.dart b/pkg/analysis_server_client/lib/server.dart
index f6bd613..69ebb4a 100644
--- a/pkg/analysis_server_client/lib/server.dart
+++ b/pkg/analysis_server_client/lib/server.dart
@@ -142,7 +142,7 @@
     _pendingCommands[id] = completer;
     String line = json.encode(command);
     _listener?.requestSent(line);
-    _process.stdin.add(utf8.encoder.convert("$line\n"));
+    _process.stdin.add(utf8.encoder.convert('$line\n'));
     return completer.future;
   }
 
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart
index baa6257..af02e5c 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart
@@ -435,7 +435,7 @@
   Response.invalidAnalysisRoot(Request request, String rootPath)
       : this(request.id,
             error: RequestError(RequestErrorCode.INVALID_ANALYSIS_ROOT,
-                "Invalid analysis root: $rootPath"));
+                'Invalid analysis root: $rootPath'));
 
   /// Initialize a newly created instance to represent an error condition caused
   /// by a [request] that specifies an execution context whose context root does
@@ -443,7 +443,7 @@
   Response.invalidExecutionContext(Request request, String contextId)
       : this(request.id,
             error: RequestError(RequestErrorCode.INVALID_EXECUTION_CONTEXT,
-                "Invalid execution context: $contextId"));
+                'Invalid execution context: $contextId'));
 
   /// Initialize a newly created instance to represent the
   /// INVALID_FILE_PATH_FORMAT error condition.
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
index 73395b0..6e80c79 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_common.dart
@@ -43,27 +43,27 @@
       JsonDecoder jsonDecoder, String jsonPath, Object json) {
     json ??= {};
     if (json is Map) {
-      if (json["type"] != "add") {
-        throw jsonDecoder.mismatch(jsonPath, "equal add", json);
+      if (json['type'] != 'add') {
+        throw jsonDecoder.mismatch(jsonPath, 'equal add', json);
       }
       String content;
-      if (json.containsKey("content")) {
+      if (json.containsKey('content')) {
         content =
-            jsonDecoder.decodeString(jsonPath + ".content", json["content"]);
+            jsonDecoder.decodeString(jsonPath + '.content', json['content']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "content");
+        throw jsonDecoder.mismatch(jsonPath, 'content');
       }
       return AddContentOverlay(content);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "AddContentOverlay", json);
+      throw jsonDecoder.mismatch(jsonPath, 'AddContentOverlay', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["type"] = "add";
-    result["content"] = content;
+    result['type'] = 'add';
+    result['content'] = content;
     return result;
   }
 
@@ -213,68 +213,68 @@
     json ??= {};
     if (json is Map) {
       AnalysisErrorSeverity severity;
-      if (json.containsKey("severity")) {
+      if (json.containsKey('severity')) {
         severity = AnalysisErrorSeverity.fromJson(
-            jsonDecoder, jsonPath + ".severity", json["severity"]);
+            jsonDecoder, jsonPath + '.severity', json['severity']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "severity");
+        throw jsonDecoder.mismatch(jsonPath, 'severity');
       }
       AnalysisErrorType type;
-      if (json.containsKey("type")) {
+      if (json.containsKey('type')) {
         type = AnalysisErrorType.fromJson(
-            jsonDecoder, jsonPath + ".type", json["type"]);
+            jsonDecoder, jsonPath + '.type', json['type']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "type");
+        throw jsonDecoder.mismatch(jsonPath, 'type');
       }
       Location location;
-      if (json.containsKey("location")) {
+      if (json.containsKey('location')) {
         location = Location.fromJson(
-            jsonDecoder, jsonPath + ".location", json["location"]);
+            jsonDecoder, jsonPath + '.location', json['location']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "location");
+        throw jsonDecoder.mismatch(jsonPath, 'location');
       }
       String message;
-      if (json.containsKey("message")) {
+      if (json.containsKey('message')) {
         message =
-            jsonDecoder.decodeString(jsonPath + ".message", json["message"]);
+            jsonDecoder.decodeString(jsonPath + '.message', json['message']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "message");
+        throw jsonDecoder.mismatch(jsonPath, 'message');
       }
       String correction;
-      if (json.containsKey("correction")) {
+      if (json.containsKey('correction')) {
         correction = jsonDecoder.decodeString(
-            jsonPath + ".correction", json["correction"]);
+            jsonPath + '.correction', json['correction']);
       }
       String code;
-      if (json.containsKey("code")) {
-        code = jsonDecoder.decodeString(jsonPath + ".code", json["code"]);
+      if (json.containsKey('code')) {
+        code = jsonDecoder.decodeString(jsonPath + '.code', json['code']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "code");
+        throw jsonDecoder.mismatch(jsonPath, 'code');
       }
       bool hasFix;
-      if (json.containsKey("hasFix")) {
-        hasFix = jsonDecoder.decodeBool(jsonPath + ".hasFix", json["hasFix"]);
+      if (json.containsKey('hasFix')) {
+        hasFix = jsonDecoder.decodeBool(jsonPath + '.hasFix', json['hasFix']);
       }
       return AnalysisError(severity, type, location, message, code,
           correction: correction, hasFix: hasFix);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "AnalysisError", json);
+      throw jsonDecoder.mismatch(jsonPath, 'AnalysisError', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["severity"] = severity.toJson();
-    result["type"] = type.toJson();
-    result["location"] = location.toJson();
-    result["message"] = message;
+    result['severity'] = severity.toJson();
+    result['type'] = type.toJson();
+    result['location'] = location.toJson();
+    result['message'] = message;
     if (correction != null) {
-      result["correction"] = correction;
+      result['correction'] = correction;
     }
-    result["code"] = code;
+    result['code'] = code;
     if (hasFix != null) {
-      result["hasFix"] = hasFix;
+      result['hasFix'] = hasFix;
     }
     return result;
   }
@@ -320,12 +320,12 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisErrorSeverity implements Enum {
-  static const AnalysisErrorSeverity INFO = AnalysisErrorSeverity._("INFO");
+  static const AnalysisErrorSeverity INFO = AnalysisErrorSeverity._('INFO');
 
   static const AnalysisErrorSeverity WARNING =
-      AnalysisErrorSeverity._("WARNING");
+      AnalysisErrorSeverity._('WARNING');
 
-  static const AnalysisErrorSeverity ERROR = AnalysisErrorSeverity._("ERROR");
+  static const AnalysisErrorSeverity ERROR = AnalysisErrorSeverity._('ERROR');
 
   /// A list containing all of the enum values that are defined.
   static const List<AnalysisErrorSeverity> VALUES = <AnalysisErrorSeverity>[
@@ -341,11 +341,11 @@
 
   factory AnalysisErrorSeverity(String name) {
     switch (name) {
-      case "INFO":
+      case 'INFO':
         return INFO;
-      case "WARNING":
+      case 'WARNING':
         return WARNING;
-      case "ERROR":
+      case 'ERROR':
         return ERROR;
     }
     throw Exception('Illegal enum value: $name');
@@ -360,11 +360,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "AnalysisErrorSeverity", json);
+    throw jsonDecoder.mismatch(jsonPath, 'AnalysisErrorSeverity', json);
   }
 
   @override
-  String toString() => "AnalysisErrorSeverity.$name";
+  String toString() => 'AnalysisErrorSeverity.$name';
 
   String toJson() => name;
 }
@@ -385,25 +385,25 @@
 /// Clients may not extend, implement or mix-in this class.
 class AnalysisErrorType implements Enum {
   static const AnalysisErrorType CHECKED_MODE_COMPILE_TIME_ERROR =
-      AnalysisErrorType._("CHECKED_MODE_COMPILE_TIME_ERROR");
+      AnalysisErrorType._('CHECKED_MODE_COMPILE_TIME_ERROR');
 
   static const AnalysisErrorType COMPILE_TIME_ERROR =
-      AnalysisErrorType._("COMPILE_TIME_ERROR");
+      AnalysisErrorType._('COMPILE_TIME_ERROR');
 
-  static const AnalysisErrorType HINT = AnalysisErrorType._("HINT");
+  static const AnalysisErrorType HINT = AnalysisErrorType._('HINT');
 
-  static const AnalysisErrorType LINT = AnalysisErrorType._("LINT");
+  static const AnalysisErrorType LINT = AnalysisErrorType._('LINT');
 
   static const AnalysisErrorType STATIC_TYPE_WARNING =
-      AnalysisErrorType._("STATIC_TYPE_WARNING");
+      AnalysisErrorType._('STATIC_TYPE_WARNING');
 
   static const AnalysisErrorType STATIC_WARNING =
-      AnalysisErrorType._("STATIC_WARNING");
+      AnalysisErrorType._('STATIC_WARNING');
 
   static const AnalysisErrorType SYNTACTIC_ERROR =
-      AnalysisErrorType._("SYNTACTIC_ERROR");
+      AnalysisErrorType._('SYNTACTIC_ERROR');
 
-  static const AnalysisErrorType TODO = AnalysisErrorType._("TODO");
+  static const AnalysisErrorType TODO = AnalysisErrorType._('TODO');
 
   /// A list containing all of the enum values that are defined.
   static const List<AnalysisErrorType> VALUES = <AnalysisErrorType>[
@@ -424,21 +424,21 @@
 
   factory AnalysisErrorType(String name) {
     switch (name) {
-      case "CHECKED_MODE_COMPILE_TIME_ERROR":
+      case 'CHECKED_MODE_COMPILE_TIME_ERROR':
         return CHECKED_MODE_COMPILE_TIME_ERROR;
-      case "COMPILE_TIME_ERROR":
+      case 'COMPILE_TIME_ERROR':
         return COMPILE_TIME_ERROR;
-      case "HINT":
+      case 'HINT':
         return HINT;
-      case "LINT":
+      case 'LINT':
         return LINT;
-      case "STATIC_TYPE_WARNING":
+      case 'STATIC_TYPE_WARNING':
         return STATIC_TYPE_WARNING;
-      case "STATIC_WARNING":
+      case 'STATIC_WARNING':
         return STATIC_WARNING;
-      case "SYNTACTIC_ERROR":
+      case 'SYNTACTIC_ERROR':
         return SYNTACTIC_ERROR;
-      case "TODO":
+      case 'TODO':
         return TODO;
     }
     throw Exception('Illegal enum value: $name');
@@ -453,11 +453,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "AnalysisErrorType", json);
+    throw jsonDecoder.mismatch(jsonPath, 'AnalysisErrorType', json);
   }
 
   @override
-  String toString() => "AnalysisErrorType.$name";
+  String toString() => 'AnalysisErrorType.$name';
 
   String toJson() => name;
 }
@@ -490,30 +490,30 @@
       JsonDecoder jsonDecoder, String jsonPath, Object json) {
     json ??= {};
     if (json is Map) {
-      if (json["type"] != "change") {
-        throw jsonDecoder.mismatch(jsonPath, "equal change", json);
+      if (json['type'] != 'change') {
+        throw jsonDecoder.mismatch(jsonPath, 'equal change', json);
       }
       List<SourceEdit> edits;
-      if (json.containsKey("edits")) {
+      if (json.containsKey('edits')) {
         edits = jsonDecoder.decodeList(
-            jsonPath + ".edits",
-            json["edits"],
+            jsonPath + '.edits',
+            json['edits'],
             (String jsonPath, Object json) =>
                 SourceEdit.fromJson(jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "edits");
+        throw jsonDecoder.mismatch(jsonPath, 'edits');
       }
       return ChangeContentOverlay(edits);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "ChangeContentOverlay", json);
+      throw jsonDecoder.mismatch(jsonPath, 'ChangeContentOverlay', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["type"] = "change";
-    result["edits"] = edits.map((SourceEdit value) => value.toJson()).toList();
+    result['type'] = 'change';
+    result['edits'] = edits.map((SourceEdit value) => value.toJson()).toList();
     return result;
   }
 
@@ -904,132 +904,132 @@
     json ??= {};
     if (json is Map) {
       CompletionSuggestionKind kind;
-      if (json.containsKey("kind")) {
+      if (json.containsKey('kind')) {
         kind = CompletionSuggestionKind.fromJson(
-            jsonDecoder, jsonPath + ".kind", json["kind"]);
+            jsonDecoder, jsonPath + '.kind', json['kind']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "kind");
+        throw jsonDecoder.mismatch(jsonPath, 'kind');
       }
       int relevance;
-      if (json.containsKey("relevance")) {
+      if (json.containsKey('relevance')) {
         relevance =
-            jsonDecoder.decodeInt(jsonPath + ".relevance", json["relevance"]);
+            jsonDecoder.decodeInt(jsonPath + '.relevance', json['relevance']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "relevance");
+        throw jsonDecoder.mismatch(jsonPath, 'relevance');
       }
       String completion;
-      if (json.containsKey("completion")) {
+      if (json.containsKey('completion')) {
         completion = jsonDecoder.decodeString(
-            jsonPath + ".completion", json["completion"]);
+            jsonPath + '.completion', json['completion']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "completion");
+        throw jsonDecoder.mismatch(jsonPath, 'completion');
       }
       String displayText;
-      if (json.containsKey("displayText")) {
+      if (json.containsKey('displayText')) {
         displayText = jsonDecoder.decodeString(
-            jsonPath + ".displayText", json["displayText"]);
+            jsonPath + '.displayText', json['displayText']);
       }
       int selectionOffset;
-      if (json.containsKey("selectionOffset")) {
+      if (json.containsKey('selectionOffset')) {
         selectionOffset = jsonDecoder.decodeInt(
-            jsonPath + ".selectionOffset", json["selectionOffset"]);
+            jsonPath + '.selectionOffset', json['selectionOffset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "selectionOffset");
+        throw jsonDecoder.mismatch(jsonPath, 'selectionOffset');
       }
       int selectionLength;
-      if (json.containsKey("selectionLength")) {
+      if (json.containsKey('selectionLength')) {
         selectionLength = jsonDecoder.decodeInt(
-            jsonPath + ".selectionLength", json["selectionLength"]);
+            jsonPath + '.selectionLength', json['selectionLength']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "selectionLength");
+        throw jsonDecoder.mismatch(jsonPath, 'selectionLength');
       }
       bool isDeprecated;
-      if (json.containsKey("isDeprecated")) {
+      if (json.containsKey('isDeprecated')) {
         isDeprecated = jsonDecoder.decodeBool(
-            jsonPath + ".isDeprecated", json["isDeprecated"]);
+            jsonPath + '.isDeprecated', json['isDeprecated']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "isDeprecated");
+        throw jsonDecoder.mismatch(jsonPath, 'isDeprecated');
       }
       bool isPotential;
-      if (json.containsKey("isPotential")) {
+      if (json.containsKey('isPotential')) {
         isPotential = jsonDecoder.decodeBool(
-            jsonPath + ".isPotential", json["isPotential"]);
+            jsonPath + '.isPotential', json['isPotential']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "isPotential");
+        throw jsonDecoder.mismatch(jsonPath, 'isPotential');
       }
       String docSummary;
-      if (json.containsKey("docSummary")) {
+      if (json.containsKey('docSummary')) {
         docSummary = jsonDecoder.decodeString(
-            jsonPath + ".docSummary", json["docSummary"]);
+            jsonPath + '.docSummary', json['docSummary']);
       }
       String docComplete;
-      if (json.containsKey("docComplete")) {
+      if (json.containsKey('docComplete')) {
         docComplete = jsonDecoder.decodeString(
-            jsonPath + ".docComplete", json["docComplete"]);
+            jsonPath + '.docComplete', json['docComplete']);
       }
       String declaringType;
-      if (json.containsKey("declaringType")) {
+      if (json.containsKey('declaringType')) {
         declaringType = jsonDecoder.decodeString(
-            jsonPath + ".declaringType", json["declaringType"]);
+            jsonPath + '.declaringType', json['declaringType']);
       }
       String defaultArgumentListString;
-      if (json.containsKey("defaultArgumentListString")) {
+      if (json.containsKey('defaultArgumentListString')) {
         defaultArgumentListString = jsonDecoder.decodeString(
-            jsonPath + ".defaultArgumentListString",
-            json["defaultArgumentListString"]);
+            jsonPath + '.defaultArgumentListString',
+            json['defaultArgumentListString']);
       }
       List<int> defaultArgumentListTextRanges;
-      if (json.containsKey("defaultArgumentListTextRanges")) {
+      if (json.containsKey('defaultArgumentListTextRanges')) {
         defaultArgumentListTextRanges = jsonDecoder.decodeList(
-            jsonPath + ".defaultArgumentListTextRanges",
-            json["defaultArgumentListTextRanges"],
+            jsonPath + '.defaultArgumentListTextRanges',
+            json['defaultArgumentListTextRanges'],
             jsonDecoder.decodeInt);
       }
       Element element;
-      if (json.containsKey("element")) {
+      if (json.containsKey('element')) {
         element = Element.fromJson(
-            jsonDecoder, jsonPath + ".element", json["element"]);
+            jsonDecoder, jsonPath + '.element', json['element']);
       }
       String returnType;
-      if (json.containsKey("returnType")) {
+      if (json.containsKey('returnType')) {
         returnType = jsonDecoder.decodeString(
-            jsonPath + ".returnType", json["returnType"]);
+            jsonPath + '.returnType', json['returnType']);
       }
       List<String> parameterNames;
-      if (json.containsKey("parameterNames")) {
-        parameterNames = jsonDecoder.decodeList(jsonPath + ".parameterNames",
-            json["parameterNames"], jsonDecoder.decodeString);
+      if (json.containsKey('parameterNames')) {
+        parameterNames = jsonDecoder.decodeList(jsonPath + '.parameterNames',
+            json['parameterNames'], jsonDecoder.decodeString);
       }
       List<String> parameterTypes;
-      if (json.containsKey("parameterTypes")) {
-        parameterTypes = jsonDecoder.decodeList(jsonPath + ".parameterTypes",
-            json["parameterTypes"], jsonDecoder.decodeString);
+      if (json.containsKey('parameterTypes')) {
+        parameterTypes = jsonDecoder.decodeList(jsonPath + '.parameterTypes',
+            json['parameterTypes'], jsonDecoder.decodeString);
       }
       int requiredParameterCount;
-      if (json.containsKey("requiredParameterCount")) {
+      if (json.containsKey('requiredParameterCount')) {
         requiredParameterCount = jsonDecoder.decodeInt(
-            jsonPath + ".requiredParameterCount",
-            json["requiredParameterCount"]);
+            jsonPath + '.requiredParameterCount',
+            json['requiredParameterCount']);
       }
       bool hasNamedParameters;
-      if (json.containsKey("hasNamedParameters")) {
+      if (json.containsKey('hasNamedParameters')) {
         hasNamedParameters = jsonDecoder.decodeBool(
-            jsonPath + ".hasNamedParameters", json["hasNamedParameters"]);
+            jsonPath + '.hasNamedParameters', json['hasNamedParameters']);
       }
       String parameterName;
-      if (json.containsKey("parameterName")) {
+      if (json.containsKey('parameterName')) {
         parameterName = jsonDecoder.decodeString(
-            jsonPath + ".parameterName", json["parameterName"]);
+            jsonPath + '.parameterName', json['parameterName']);
       }
       String parameterType;
-      if (json.containsKey("parameterType")) {
+      if (json.containsKey('parameterType')) {
         parameterType = jsonDecoder.decodeString(
-            jsonPath + ".parameterType", json["parameterType"]);
+            jsonPath + '.parameterType', json['parameterType']);
       }
       String importUri;
-      if (json.containsKey("importUri")) {
+      if (json.containsKey('importUri')) {
         importUri = jsonDecoder.decodeString(
-            jsonPath + ".importUri", json["importUri"]);
+            jsonPath + '.importUri', json['importUri']);
       }
       return CompletionSuggestion(kind, relevance, completion, selectionOffset,
           selectionLength, isDeprecated, isPotential,
@@ -1049,64 +1049,64 @@
           parameterType: parameterType,
           importUri: importUri);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestion", json);
+      throw jsonDecoder.mismatch(jsonPath, 'CompletionSuggestion', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["kind"] = kind.toJson();
-    result["relevance"] = relevance;
-    result["completion"] = completion;
+    result['kind'] = kind.toJson();
+    result['relevance'] = relevance;
+    result['completion'] = completion;
     if (displayText != null) {
-      result["displayText"] = displayText;
+      result['displayText'] = displayText;
     }
-    result["selectionOffset"] = selectionOffset;
-    result["selectionLength"] = selectionLength;
-    result["isDeprecated"] = isDeprecated;
-    result["isPotential"] = isPotential;
+    result['selectionOffset'] = selectionOffset;
+    result['selectionLength'] = selectionLength;
+    result['isDeprecated'] = isDeprecated;
+    result['isPotential'] = isPotential;
     if (docSummary != null) {
-      result["docSummary"] = docSummary;
+      result['docSummary'] = docSummary;
     }
     if (docComplete != null) {
-      result["docComplete"] = docComplete;
+      result['docComplete'] = docComplete;
     }
     if (declaringType != null) {
-      result["declaringType"] = declaringType;
+      result['declaringType'] = declaringType;
     }
     if (defaultArgumentListString != null) {
-      result["defaultArgumentListString"] = defaultArgumentListString;
+      result['defaultArgumentListString'] = defaultArgumentListString;
     }
     if (defaultArgumentListTextRanges != null) {
-      result["defaultArgumentListTextRanges"] = defaultArgumentListTextRanges;
+      result['defaultArgumentListTextRanges'] = defaultArgumentListTextRanges;
     }
     if (element != null) {
-      result["element"] = element.toJson();
+      result['element'] = element.toJson();
     }
     if (returnType != null) {
-      result["returnType"] = returnType;
+      result['returnType'] = returnType;
     }
     if (parameterNames != null) {
-      result["parameterNames"] = parameterNames;
+      result['parameterNames'] = parameterNames;
     }
     if (parameterTypes != null) {
-      result["parameterTypes"] = parameterTypes;
+      result['parameterTypes'] = parameterTypes;
     }
     if (requiredParameterCount != null) {
-      result["requiredParameterCount"] = requiredParameterCount;
+      result['requiredParameterCount'] = requiredParameterCount;
     }
     if (hasNamedParameters != null) {
-      result["hasNamedParameters"] = hasNamedParameters;
+      result['hasNamedParameters'] = hasNamedParameters;
     }
     if (parameterName != null) {
-      result["parameterName"] = parameterName;
+      result['parameterName'] = parameterName;
     }
     if (parameterType != null) {
-      result["parameterType"] = parameterType;
+      result['parameterType'] = parameterType;
     }
     if (importUri != null) {
-      result["importUri"] = importUri;
+      result['importUri'] = importUri;
     }
     return result;
   }
@@ -1196,44 +1196,44 @@
   /// the invocation and the parameterNames, parameterTypes, and
   /// requiredParameterCount attributes are defined.
   static const CompletionSuggestionKind ARGUMENT_LIST =
-      CompletionSuggestionKind._("ARGUMENT_LIST");
+      CompletionSuggestionKind._('ARGUMENT_LIST');
 
   static const CompletionSuggestionKind IMPORT =
-      CompletionSuggestionKind._("IMPORT");
+      CompletionSuggestionKind._('IMPORT');
 
   /// The element identifier should be inserted at the completion location. For
   /// example "someMethod" in import 'myLib.dart' show someMethod;. For
   /// suggestions of this kind, the element attribute is defined and the
   /// completion field is the element's identifier.
   static const CompletionSuggestionKind IDENTIFIER =
-      CompletionSuggestionKind._("IDENTIFIER");
+      CompletionSuggestionKind._('IDENTIFIER');
 
   /// The element is being invoked at the completion location. For example,
   /// 'someMethod' in x.someMethod();. For suggestions of this kind, the element
   /// attribute is defined and the completion field is the element's identifier.
   static const CompletionSuggestionKind INVOCATION =
-      CompletionSuggestionKind._("INVOCATION");
+      CompletionSuggestionKind._('INVOCATION');
 
   /// A keyword is being suggested. For suggestions of this kind, the completion
   /// is the keyword.
   static const CompletionSuggestionKind KEYWORD =
-      CompletionSuggestionKind._("KEYWORD");
+      CompletionSuggestionKind._('KEYWORD');
 
   /// A named argument for the current call site is being suggested. For
   /// suggestions of this kind, the completion is the named argument identifier
   /// including a trailing ':' and a space.
   static const CompletionSuggestionKind NAMED_ARGUMENT =
-      CompletionSuggestionKind._("NAMED_ARGUMENT");
+      CompletionSuggestionKind._('NAMED_ARGUMENT');
 
   static const CompletionSuggestionKind OPTIONAL_ARGUMENT =
-      CompletionSuggestionKind._("OPTIONAL_ARGUMENT");
+      CompletionSuggestionKind._('OPTIONAL_ARGUMENT');
 
   /// An overriding implementation of a class member is being suggested.
   static const CompletionSuggestionKind OVERRIDE =
-      CompletionSuggestionKind._("OVERRIDE");
+      CompletionSuggestionKind._('OVERRIDE');
 
   static const CompletionSuggestionKind PARAMETER =
-      CompletionSuggestionKind._("PARAMETER");
+      CompletionSuggestionKind._('PARAMETER');
 
   /// A list containing all of the enum values that are defined.
   static const List<CompletionSuggestionKind> VALUES =
@@ -1256,23 +1256,23 @@
 
   factory CompletionSuggestionKind(String name) {
     switch (name) {
-      case "ARGUMENT_LIST":
+      case 'ARGUMENT_LIST':
         return ARGUMENT_LIST;
-      case "IMPORT":
+      case 'IMPORT':
         return IMPORT;
-      case "IDENTIFIER":
+      case 'IDENTIFIER':
         return IDENTIFIER;
-      case "INVOCATION":
+      case 'INVOCATION':
         return INVOCATION;
-      case "KEYWORD":
+      case 'KEYWORD':
         return KEYWORD;
-      case "NAMED_ARGUMENT":
+      case 'NAMED_ARGUMENT':
         return NAMED_ARGUMENT;
-      case "OPTIONAL_ARGUMENT":
+      case 'OPTIONAL_ARGUMENT':
         return OPTIONAL_ARGUMENT;
-      case "OVERRIDE":
+      case 'OVERRIDE':
         return OVERRIDE;
-      case "PARAMETER":
+      case 'PARAMETER':
         return PARAMETER;
     }
     throw Exception('Illegal enum value: $name');
@@ -1287,11 +1287,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestionKind", json);
+    throw jsonDecoder.mismatch(jsonPath, 'CompletionSuggestionKind', json);
   }
 
   @override
-  String toString() => "CompletionSuggestionKind.$name";
+  String toString() => 'CompletionSuggestionKind.$name';
 
   String toJson() => name;
 }
@@ -1456,43 +1456,43 @@
     json ??= {};
     if (json is Map) {
       ElementKind kind;
-      if (json.containsKey("kind")) {
+      if (json.containsKey('kind')) {
         kind =
-            ElementKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+            ElementKind.fromJson(jsonDecoder, jsonPath + '.kind', json['kind']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "kind");
+        throw jsonDecoder.mismatch(jsonPath, 'kind');
       }
       String name;
-      if (json.containsKey("name")) {
-        name = jsonDecoder.decodeString(jsonPath + ".name", json["name"]);
+      if (json.containsKey('name')) {
+        name = jsonDecoder.decodeString(jsonPath + '.name', json['name']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "name");
+        throw jsonDecoder.mismatch(jsonPath, 'name');
       }
       Location location;
-      if (json.containsKey("location")) {
+      if (json.containsKey('location')) {
         location = Location.fromJson(
-            jsonDecoder, jsonPath + ".location", json["location"]);
+            jsonDecoder, jsonPath + '.location', json['location']);
       }
       int flags;
-      if (json.containsKey("flags")) {
-        flags = jsonDecoder.decodeInt(jsonPath + ".flags", json["flags"]);
+      if (json.containsKey('flags')) {
+        flags = jsonDecoder.decodeInt(jsonPath + '.flags', json['flags']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "flags");
+        throw jsonDecoder.mismatch(jsonPath, 'flags');
       }
       String parameters;
-      if (json.containsKey("parameters")) {
+      if (json.containsKey('parameters')) {
         parameters = jsonDecoder.decodeString(
-            jsonPath + ".parameters", json["parameters"]);
+            jsonPath + '.parameters', json['parameters']);
       }
       String returnType;
-      if (json.containsKey("returnType")) {
+      if (json.containsKey('returnType')) {
         returnType = jsonDecoder.decodeString(
-            jsonPath + ".returnType", json["returnType"]);
+            jsonPath + '.returnType', json['returnType']);
       }
       String typeParameters;
-      if (json.containsKey("typeParameters")) {
+      if (json.containsKey('typeParameters')) {
         typeParameters = jsonDecoder.decodeString(
-            jsonPath + ".typeParameters", json["typeParameters"]);
+            jsonPath + '.typeParameters', json['typeParameters']);
       }
       return Element(kind, name, flags,
           location: location,
@@ -1500,7 +1500,7 @@
           returnType: returnType,
           typeParameters: typeParameters);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "Element", json);
+      throw jsonDecoder.mismatch(jsonPath, 'Element', json);
     }
   }
 
@@ -1514,20 +1514,20 @@
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["kind"] = kind.toJson();
-    result["name"] = name;
+    result['kind'] = kind.toJson();
+    result['name'] = name;
     if (location != null) {
-      result["location"] = location.toJson();
+      result['location'] = location.toJson();
     }
-    result["flags"] = flags;
+    result['flags'] = flags;
     if (parameters != null) {
-      result["parameters"] = parameters;
+      result['parameters'] = parameters;
     }
     if (returnType != null) {
-      result["returnType"] = returnType;
+      result['returnType'] = returnType;
     }
     if (typeParameters != null) {
-      result["typeParameters"] = typeParameters;
+      result['typeParameters'] = typeParameters;
     }
     return result;
   }
@@ -1596,61 +1596,61 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class ElementKind implements Enum {
-  static const ElementKind CLASS = ElementKind._("CLASS");
+  static const ElementKind CLASS = ElementKind._('CLASS');
 
-  static const ElementKind CLASS_TYPE_ALIAS = ElementKind._("CLASS_TYPE_ALIAS");
+  static const ElementKind CLASS_TYPE_ALIAS = ElementKind._('CLASS_TYPE_ALIAS');
 
-  static const ElementKind COMPILATION_UNIT = ElementKind._("COMPILATION_UNIT");
+  static const ElementKind COMPILATION_UNIT = ElementKind._('COMPILATION_UNIT');
 
-  static const ElementKind CONSTRUCTOR = ElementKind._("CONSTRUCTOR");
+  static const ElementKind CONSTRUCTOR = ElementKind._('CONSTRUCTOR');
 
   static const ElementKind CONSTRUCTOR_INVOCATION =
-      ElementKind._("CONSTRUCTOR_INVOCATION");
+      ElementKind._('CONSTRUCTOR_INVOCATION');
 
-  static const ElementKind ENUM = ElementKind._("ENUM");
+  static const ElementKind ENUM = ElementKind._('ENUM');
 
-  static const ElementKind ENUM_CONSTANT = ElementKind._("ENUM_CONSTANT");
+  static const ElementKind ENUM_CONSTANT = ElementKind._('ENUM_CONSTANT');
 
-  static const ElementKind FIELD = ElementKind._("FIELD");
+  static const ElementKind FIELD = ElementKind._('FIELD');
 
-  static const ElementKind FILE = ElementKind._("FILE");
+  static const ElementKind FILE = ElementKind._('FILE');
 
-  static const ElementKind FUNCTION = ElementKind._("FUNCTION");
+  static const ElementKind FUNCTION = ElementKind._('FUNCTION');
 
   static const ElementKind FUNCTION_INVOCATION =
-      ElementKind._("FUNCTION_INVOCATION");
+      ElementKind._('FUNCTION_INVOCATION');
 
   static const ElementKind FUNCTION_TYPE_ALIAS =
-      ElementKind._("FUNCTION_TYPE_ALIAS");
+      ElementKind._('FUNCTION_TYPE_ALIAS');
 
-  static const ElementKind GETTER = ElementKind._("GETTER");
+  static const ElementKind GETTER = ElementKind._('GETTER');
 
-  static const ElementKind LABEL = ElementKind._("LABEL");
+  static const ElementKind LABEL = ElementKind._('LABEL');
 
-  static const ElementKind LIBRARY = ElementKind._("LIBRARY");
+  static const ElementKind LIBRARY = ElementKind._('LIBRARY');
 
-  static const ElementKind LOCAL_VARIABLE = ElementKind._("LOCAL_VARIABLE");
+  static const ElementKind LOCAL_VARIABLE = ElementKind._('LOCAL_VARIABLE');
 
-  static const ElementKind METHOD = ElementKind._("METHOD");
+  static const ElementKind METHOD = ElementKind._('METHOD');
 
-  static const ElementKind MIXIN = ElementKind._("MIXIN");
+  static const ElementKind MIXIN = ElementKind._('MIXIN');
 
-  static const ElementKind PARAMETER = ElementKind._("PARAMETER");
+  static const ElementKind PARAMETER = ElementKind._('PARAMETER');
 
-  static const ElementKind PREFIX = ElementKind._("PREFIX");
+  static const ElementKind PREFIX = ElementKind._('PREFIX');
 
-  static const ElementKind SETTER = ElementKind._("SETTER");
+  static const ElementKind SETTER = ElementKind._('SETTER');
 
   static const ElementKind TOP_LEVEL_VARIABLE =
-      ElementKind._("TOP_LEVEL_VARIABLE");
+      ElementKind._('TOP_LEVEL_VARIABLE');
 
-  static const ElementKind TYPE_PARAMETER = ElementKind._("TYPE_PARAMETER");
+  static const ElementKind TYPE_PARAMETER = ElementKind._('TYPE_PARAMETER');
 
-  static const ElementKind UNIT_TEST_GROUP = ElementKind._("UNIT_TEST_GROUP");
+  static const ElementKind UNIT_TEST_GROUP = ElementKind._('UNIT_TEST_GROUP');
 
-  static const ElementKind UNIT_TEST_TEST = ElementKind._("UNIT_TEST_TEST");
+  static const ElementKind UNIT_TEST_TEST = ElementKind._('UNIT_TEST_TEST');
 
-  static const ElementKind UNKNOWN = ElementKind._("UNKNOWN");
+  static const ElementKind UNKNOWN = ElementKind._('UNKNOWN');
 
   /// A list containing all of the enum values that are defined.
   static const List<ElementKind> VALUES = <ElementKind>[
@@ -1689,57 +1689,57 @@
 
   factory ElementKind(String name) {
     switch (name) {
-      case "CLASS":
+      case 'CLASS':
         return CLASS;
-      case "CLASS_TYPE_ALIAS":
+      case 'CLASS_TYPE_ALIAS':
         return CLASS_TYPE_ALIAS;
-      case "COMPILATION_UNIT":
+      case 'COMPILATION_UNIT':
         return COMPILATION_UNIT;
-      case "CONSTRUCTOR":
+      case 'CONSTRUCTOR':
         return CONSTRUCTOR;
-      case "CONSTRUCTOR_INVOCATION":
+      case 'CONSTRUCTOR_INVOCATION':
         return CONSTRUCTOR_INVOCATION;
-      case "ENUM":
+      case 'ENUM':
         return ENUM;
-      case "ENUM_CONSTANT":
+      case 'ENUM_CONSTANT':
         return ENUM_CONSTANT;
-      case "FIELD":
+      case 'FIELD':
         return FIELD;
-      case "FILE":
+      case 'FILE':
         return FILE;
-      case "FUNCTION":
+      case 'FUNCTION':
         return FUNCTION;
-      case "FUNCTION_INVOCATION":
+      case 'FUNCTION_INVOCATION':
         return FUNCTION_INVOCATION;
-      case "FUNCTION_TYPE_ALIAS":
+      case 'FUNCTION_TYPE_ALIAS':
         return FUNCTION_TYPE_ALIAS;
-      case "GETTER":
+      case 'GETTER':
         return GETTER;
-      case "LABEL":
+      case 'LABEL':
         return LABEL;
-      case "LIBRARY":
+      case 'LIBRARY':
         return LIBRARY;
-      case "LOCAL_VARIABLE":
+      case 'LOCAL_VARIABLE':
         return LOCAL_VARIABLE;
-      case "METHOD":
+      case 'METHOD':
         return METHOD;
-      case "MIXIN":
+      case 'MIXIN':
         return MIXIN;
-      case "PARAMETER":
+      case 'PARAMETER':
         return PARAMETER;
-      case "PREFIX":
+      case 'PREFIX':
         return PREFIX;
-      case "SETTER":
+      case 'SETTER':
         return SETTER;
-      case "TOP_LEVEL_VARIABLE":
+      case 'TOP_LEVEL_VARIABLE':
         return TOP_LEVEL_VARIABLE;
-      case "TYPE_PARAMETER":
+      case 'TYPE_PARAMETER':
         return TYPE_PARAMETER;
-      case "UNIT_TEST_GROUP":
+      case 'UNIT_TEST_GROUP':
         return UNIT_TEST_GROUP;
-      case "UNIT_TEST_TEST":
+      case 'UNIT_TEST_TEST':
         return UNIT_TEST_TEST;
-      case "UNKNOWN":
+      case 'UNKNOWN':
         return UNKNOWN;
     }
     throw Exception('Illegal enum value: $name');
@@ -1754,11 +1754,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "ElementKind", json);
+    throw jsonDecoder.mismatch(jsonPath, 'ElementKind', json);
   }
 
   @override
-  String toString() => "ElementKind.$name";
+  String toString() => 'ElementKind.$name';
 
   String toJson() => name;
 }
@@ -1778,22 +1778,22 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class FoldingKind implements Enum {
-  static const FoldingKind ANNOTATIONS = FoldingKind._("ANNOTATIONS");
+  static const FoldingKind ANNOTATIONS = FoldingKind._('ANNOTATIONS');
 
-  static const FoldingKind CLASS_BODY = FoldingKind._("CLASS_BODY");
+  static const FoldingKind CLASS_BODY = FoldingKind._('CLASS_BODY');
 
-  static const FoldingKind DIRECTIVES = FoldingKind._("DIRECTIVES");
+  static const FoldingKind DIRECTIVES = FoldingKind._('DIRECTIVES');
 
   static const FoldingKind DOCUMENTATION_COMMENT =
-      FoldingKind._("DOCUMENTATION_COMMENT");
+      FoldingKind._('DOCUMENTATION_COMMENT');
 
-  static const FoldingKind FILE_HEADER = FoldingKind._("FILE_HEADER");
+  static const FoldingKind FILE_HEADER = FoldingKind._('FILE_HEADER');
 
-  static const FoldingKind FUNCTION_BODY = FoldingKind._("FUNCTION_BODY");
+  static const FoldingKind FUNCTION_BODY = FoldingKind._('FUNCTION_BODY');
 
-  static const FoldingKind INVOCATION = FoldingKind._("INVOCATION");
+  static const FoldingKind INVOCATION = FoldingKind._('INVOCATION');
 
-  static const FoldingKind LITERAL = FoldingKind._("LITERAL");
+  static const FoldingKind LITERAL = FoldingKind._('LITERAL');
 
   /// A list containing all of the enum values that are defined.
   static const List<FoldingKind> VALUES = <FoldingKind>[
@@ -1814,21 +1814,21 @@
 
   factory FoldingKind(String name) {
     switch (name) {
-      case "ANNOTATIONS":
+      case 'ANNOTATIONS':
         return ANNOTATIONS;
-      case "CLASS_BODY":
+      case 'CLASS_BODY':
         return CLASS_BODY;
-      case "DIRECTIVES":
+      case 'DIRECTIVES':
         return DIRECTIVES;
-      case "DOCUMENTATION_COMMENT":
+      case 'DOCUMENTATION_COMMENT':
         return DOCUMENTATION_COMMENT;
-      case "FILE_HEADER":
+      case 'FILE_HEADER':
         return FILE_HEADER;
-      case "FUNCTION_BODY":
+      case 'FUNCTION_BODY':
         return FUNCTION_BODY;
-      case "INVOCATION":
+      case 'INVOCATION':
         return INVOCATION;
-      case "LITERAL":
+      case 'LITERAL':
         return LITERAL;
     }
     throw Exception('Illegal enum value: $name');
@@ -1843,11 +1843,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "FoldingKind", json);
+    throw jsonDecoder.mismatch(jsonPath, 'FoldingKind', json);
   }
 
   @override
-  String toString() => "FoldingKind.$name";
+  String toString() => 'FoldingKind.$name';
 
   String toJson() => name;
 }
@@ -1906,36 +1906,36 @@
     json ??= {};
     if (json is Map) {
       FoldingKind kind;
-      if (json.containsKey("kind")) {
+      if (json.containsKey('kind')) {
         kind =
-            FoldingKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+            FoldingKind.fromJson(jsonDecoder, jsonPath + '.kind', json['kind']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "kind");
+        throw jsonDecoder.mismatch(jsonPath, 'kind');
       }
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       return FoldingRegion(kind, offset, length);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "FoldingRegion", json);
+      throw jsonDecoder.mismatch(jsonPath, 'FoldingRegion', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["kind"] = kind.toJson();
-    result["offset"] = offset;
-    result["length"] = length;
+    result['kind'] = kind.toJson();
+    result['offset'] = offset;
+    result['length'] = length;
     return result;
   }
 
@@ -2016,36 +2016,36 @@
     json ??= {};
     if (json is Map) {
       HighlightRegionType type;
-      if (json.containsKey("type")) {
+      if (json.containsKey('type')) {
         type = HighlightRegionType.fromJson(
-            jsonDecoder, jsonPath + ".type", json["type"]);
+            jsonDecoder, jsonPath + '.type', json['type']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "type");
+        throw jsonDecoder.mismatch(jsonPath, 'type');
       }
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       return HighlightRegion(type, offset, length);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "HighlightRegion", json);
+      throw jsonDecoder.mismatch(jsonPath, 'HighlightRegion', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["type"] = type.toJson();
-    result["offset"] = offset;
-    result["length"] = length;
+    result['type'] = type.toJson();
+    result['offset'] = offset;
+    result['length'] = length;
     return result;
   }
 
@@ -2153,264 +2153,264 @@
 /// Clients may not extend, implement or mix-in this class.
 class HighlightRegionType implements Enum {
   static const HighlightRegionType ANNOTATION =
-      HighlightRegionType._("ANNOTATION");
+      HighlightRegionType._('ANNOTATION');
 
-  static const HighlightRegionType BUILT_IN = HighlightRegionType._("BUILT_IN");
+  static const HighlightRegionType BUILT_IN = HighlightRegionType._('BUILT_IN');
 
-  static const HighlightRegionType CLASS = HighlightRegionType._("CLASS");
+  static const HighlightRegionType CLASS = HighlightRegionType._('CLASS');
 
   static const HighlightRegionType COMMENT_BLOCK =
-      HighlightRegionType._("COMMENT_BLOCK");
+      HighlightRegionType._('COMMENT_BLOCK');
 
   static const HighlightRegionType COMMENT_DOCUMENTATION =
-      HighlightRegionType._("COMMENT_DOCUMENTATION");
+      HighlightRegionType._('COMMENT_DOCUMENTATION');
 
   static const HighlightRegionType COMMENT_END_OF_LINE =
-      HighlightRegionType._("COMMENT_END_OF_LINE");
+      HighlightRegionType._('COMMENT_END_OF_LINE');
 
   static const HighlightRegionType CONSTRUCTOR =
-      HighlightRegionType._("CONSTRUCTOR");
+      HighlightRegionType._('CONSTRUCTOR');
 
   static const HighlightRegionType DIRECTIVE =
-      HighlightRegionType._("DIRECTIVE");
+      HighlightRegionType._('DIRECTIVE');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType DYNAMIC_TYPE =
-      HighlightRegionType._("DYNAMIC_TYPE");
+      HighlightRegionType._('DYNAMIC_TYPE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_LOCAL_VARIABLE_DECLARATION =
-      HighlightRegionType._("DYNAMIC_LOCAL_VARIABLE_DECLARATION");
+      HighlightRegionType._('DYNAMIC_LOCAL_VARIABLE_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_LOCAL_VARIABLE_REFERENCE =
-      HighlightRegionType._("DYNAMIC_LOCAL_VARIABLE_REFERENCE");
+      HighlightRegionType._('DYNAMIC_LOCAL_VARIABLE_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_PARAMETER_DECLARATION =
-      HighlightRegionType._("DYNAMIC_PARAMETER_DECLARATION");
+      HighlightRegionType._('DYNAMIC_PARAMETER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_PARAMETER_REFERENCE =
-      HighlightRegionType._("DYNAMIC_PARAMETER_REFERENCE");
+      HighlightRegionType._('DYNAMIC_PARAMETER_REFERENCE');
 
-  static const HighlightRegionType ENUM = HighlightRegionType._("ENUM");
+  static const HighlightRegionType ENUM = HighlightRegionType._('ENUM');
 
   static const HighlightRegionType ENUM_CONSTANT =
-      HighlightRegionType._("ENUM_CONSTANT");
+      HighlightRegionType._('ENUM_CONSTANT');
 
   /// Only for version 1 of highlight.
-  static const HighlightRegionType FIELD = HighlightRegionType._("FIELD");
+  static const HighlightRegionType FIELD = HighlightRegionType._('FIELD');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType FIELD_STATIC =
-      HighlightRegionType._("FIELD_STATIC");
+      HighlightRegionType._('FIELD_STATIC');
 
   /// Only for version 1 of highlight.
-  static const HighlightRegionType FUNCTION = HighlightRegionType._("FUNCTION");
+  static const HighlightRegionType FUNCTION = HighlightRegionType._('FUNCTION');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType FUNCTION_DECLARATION =
-      HighlightRegionType._("FUNCTION_DECLARATION");
+      HighlightRegionType._('FUNCTION_DECLARATION');
 
   static const HighlightRegionType FUNCTION_TYPE_ALIAS =
-      HighlightRegionType._("FUNCTION_TYPE_ALIAS");
+      HighlightRegionType._('FUNCTION_TYPE_ALIAS');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType GETTER_DECLARATION =
-      HighlightRegionType._("GETTER_DECLARATION");
+      HighlightRegionType._('GETTER_DECLARATION');
 
   static const HighlightRegionType IDENTIFIER_DEFAULT =
-      HighlightRegionType._("IDENTIFIER_DEFAULT");
+      HighlightRegionType._('IDENTIFIER_DEFAULT');
 
   static const HighlightRegionType IMPORT_PREFIX =
-      HighlightRegionType._("IMPORT_PREFIX");
+      HighlightRegionType._('IMPORT_PREFIX');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_FIELD_DECLARATION =
-      HighlightRegionType._("INSTANCE_FIELD_DECLARATION");
+      HighlightRegionType._('INSTANCE_FIELD_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_FIELD_REFERENCE =
-      HighlightRegionType._("INSTANCE_FIELD_REFERENCE");
+      HighlightRegionType._('INSTANCE_FIELD_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_GETTER_DECLARATION =
-      HighlightRegionType._("INSTANCE_GETTER_DECLARATION");
+      HighlightRegionType._('INSTANCE_GETTER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_GETTER_REFERENCE =
-      HighlightRegionType._("INSTANCE_GETTER_REFERENCE");
+      HighlightRegionType._('INSTANCE_GETTER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_METHOD_DECLARATION =
-      HighlightRegionType._("INSTANCE_METHOD_DECLARATION");
+      HighlightRegionType._('INSTANCE_METHOD_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_METHOD_REFERENCE =
-      HighlightRegionType._("INSTANCE_METHOD_REFERENCE");
+      HighlightRegionType._('INSTANCE_METHOD_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_SETTER_DECLARATION =
-      HighlightRegionType._("INSTANCE_SETTER_DECLARATION");
+      HighlightRegionType._('INSTANCE_SETTER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_SETTER_REFERENCE =
-      HighlightRegionType._("INSTANCE_SETTER_REFERENCE");
+      HighlightRegionType._('INSTANCE_SETTER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType INVALID_STRING_ESCAPE =
-      HighlightRegionType._("INVALID_STRING_ESCAPE");
+      HighlightRegionType._('INVALID_STRING_ESCAPE');
 
-  static const HighlightRegionType KEYWORD = HighlightRegionType._("KEYWORD");
+  static const HighlightRegionType KEYWORD = HighlightRegionType._('KEYWORD');
 
-  static const HighlightRegionType LABEL = HighlightRegionType._("LABEL");
+  static const HighlightRegionType LABEL = HighlightRegionType._('LABEL');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType LIBRARY_NAME =
-      HighlightRegionType._("LIBRARY_NAME");
+      HighlightRegionType._('LIBRARY_NAME');
 
   static const HighlightRegionType LITERAL_BOOLEAN =
-      HighlightRegionType._("LITERAL_BOOLEAN");
+      HighlightRegionType._('LITERAL_BOOLEAN');
 
   static const HighlightRegionType LITERAL_DOUBLE =
-      HighlightRegionType._("LITERAL_DOUBLE");
+      HighlightRegionType._('LITERAL_DOUBLE');
 
   static const HighlightRegionType LITERAL_INTEGER =
-      HighlightRegionType._("LITERAL_INTEGER");
+      HighlightRegionType._('LITERAL_INTEGER');
 
   static const HighlightRegionType LITERAL_LIST =
-      HighlightRegionType._("LITERAL_LIST");
+      HighlightRegionType._('LITERAL_LIST');
 
   static const HighlightRegionType LITERAL_MAP =
-      HighlightRegionType._("LITERAL_MAP");
+      HighlightRegionType._('LITERAL_MAP');
 
   static const HighlightRegionType LITERAL_STRING =
-      HighlightRegionType._("LITERAL_STRING");
+      HighlightRegionType._('LITERAL_STRING');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_FUNCTION_DECLARATION =
-      HighlightRegionType._("LOCAL_FUNCTION_DECLARATION");
+      HighlightRegionType._('LOCAL_FUNCTION_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_FUNCTION_REFERENCE =
-      HighlightRegionType._("LOCAL_FUNCTION_REFERENCE");
+      HighlightRegionType._('LOCAL_FUNCTION_REFERENCE');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType LOCAL_VARIABLE =
-      HighlightRegionType._("LOCAL_VARIABLE");
+      HighlightRegionType._('LOCAL_VARIABLE');
 
   static const HighlightRegionType LOCAL_VARIABLE_DECLARATION =
-      HighlightRegionType._("LOCAL_VARIABLE_DECLARATION");
+      HighlightRegionType._('LOCAL_VARIABLE_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_VARIABLE_REFERENCE =
-      HighlightRegionType._("LOCAL_VARIABLE_REFERENCE");
+      HighlightRegionType._('LOCAL_VARIABLE_REFERENCE');
 
   /// Only for version 1 of highlight.
-  static const HighlightRegionType METHOD = HighlightRegionType._("METHOD");
+  static const HighlightRegionType METHOD = HighlightRegionType._('METHOD');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType METHOD_DECLARATION =
-      HighlightRegionType._("METHOD_DECLARATION");
+      HighlightRegionType._('METHOD_DECLARATION');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType METHOD_DECLARATION_STATIC =
-      HighlightRegionType._("METHOD_DECLARATION_STATIC");
+      HighlightRegionType._('METHOD_DECLARATION_STATIC');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType METHOD_STATIC =
-      HighlightRegionType._("METHOD_STATIC");
+      HighlightRegionType._('METHOD_STATIC');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType PARAMETER =
-      HighlightRegionType._("PARAMETER");
+      HighlightRegionType._('PARAMETER');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType SETTER_DECLARATION =
-      HighlightRegionType._("SETTER_DECLARATION");
+      HighlightRegionType._('SETTER_DECLARATION');
 
   /// Only for version 1 of highlight.
   static const HighlightRegionType TOP_LEVEL_VARIABLE =
-      HighlightRegionType._("TOP_LEVEL_VARIABLE");
+      HighlightRegionType._('TOP_LEVEL_VARIABLE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType PARAMETER_DECLARATION =
-      HighlightRegionType._("PARAMETER_DECLARATION");
+      HighlightRegionType._('PARAMETER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType PARAMETER_REFERENCE =
-      HighlightRegionType._("PARAMETER_REFERENCE");
+      HighlightRegionType._('PARAMETER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_FIELD_DECLARATION =
-      HighlightRegionType._("STATIC_FIELD_DECLARATION");
+      HighlightRegionType._('STATIC_FIELD_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_GETTER_DECLARATION =
-      HighlightRegionType._("STATIC_GETTER_DECLARATION");
+      HighlightRegionType._('STATIC_GETTER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_GETTER_REFERENCE =
-      HighlightRegionType._("STATIC_GETTER_REFERENCE");
+      HighlightRegionType._('STATIC_GETTER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_METHOD_DECLARATION =
-      HighlightRegionType._("STATIC_METHOD_DECLARATION");
+      HighlightRegionType._('STATIC_METHOD_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_METHOD_REFERENCE =
-      HighlightRegionType._("STATIC_METHOD_REFERENCE");
+      HighlightRegionType._('STATIC_METHOD_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_SETTER_DECLARATION =
-      HighlightRegionType._("STATIC_SETTER_DECLARATION");
+      HighlightRegionType._('STATIC_SETTER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_SETTER_REFERENCE =
-      HighlightRegionType._("STATIC_SETTER_REFERENCE");
+      HighlightRegionType._('STATIC_SETTER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_FUNCTION_DECLARATION =
-      HighlightRegionType._("TOP_LEVEL_FUNCTION_DECLARATION");
+      HighlightRegionType._('TOP_LEVEL_FUNCTION_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_FUNCTION_REFERENCE =
-      HighlightRegionType._("TOP_LEVEL_FUNCTION_REFERENCE");
+      HighlightRegionType._('TOP_LEVEL_FUNCTION_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_GETTER_DECLARATION =
-      HighlightRegionType._("TOP_LEVEL_GETTER_DECLARATION");
+      HighlightRegionType._('TOP_LEVEL_GETTER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_GETTER_REFERENCE =
-      HighlightRegionType._("TOP_LEVEL_GETTER_REFERENCE");
+      HighlightRegionType._('TOP_LEVEL_GETTER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_SETTER_DECLARATION =
-      HighlightRegionType._("TOP_LEVEL_SETTER_DECLARATION");
+      HighlightRegionType._('TOP_LEVEL_SETTER_DECLARATION');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_SETTER_REFERENCE =
-      HighlightRegionType._("TOP_LEVEL_SETTER_REFERENCE");
+      HighlightRegionType._('TOP_LEVEL_SETTER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_VARIABLE_DECLARATION =
-      HighlightRegionType._("TOP_LEVEL_VARIABLE_DECLARATION");
+      HighlightRegionType._('TOP_LEVEL_VARIABLE_DECLARATION');
 
   static const HighlightRegionType TYPE_NAME_DYNAMIC =
-      HighlightRegionType._("TYPE_NAME_DYNAMIC");
+      HighlightRegionType._('TYPE_NAME_DYNAMIC');
 
   static const HighlightRegionType TYPE_PARAMETER =
-      HighlightRegionType._("TYPE_PARAMETER");
+      HighlightRegionType._('TYPE_PARAMETER');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType UNRESOLVED_INSTANCE_MEMBER_REFERENCE =
-      HighlightRegionType._("UNRESOLVED_INSTANCE_MEMBER_REFERENCE");
+      HighlightRegionType._('UNRESOLVED_INSTANCE_MEMBER_REFERENCE');
 
   /// Only for version 2 of highlight.
   static const HighlightRegionType VALID_STRING_ESCAPE =
-      HighlightRegionType._("VALID_STRING_ESCAPE");
+      HighlightRegionType._('VALID_STRING_ESCAPE');
 
   /// A list containing all of the enum values that are defined.
   static const List<HighlightRegionType> VALUES = <HighlightRegionType>[
@@ -2496,151 +2496,151 @@
 
   factory HighlightRegionType(String name) {
     switch (name) {
-      case "ANNOTATION":
+      case 'ANNOTATION':
         return ANNOTATION;
-      case "BUILT_IN":
+      case 'BUILT_IN':
         return BUILT_IN;
-      case "CLASS":
+      case 'CLASS':
         return CLASS;
-      case "COMMENT_BLOCK":
+      case 'COMMENT_BLOCK':
         return COMMENT_BLOCK;
-      case "COMMENT_DOCUMENTATION":
+      case 'COMMENT_DOCUMENTATION':
         return COMMENT_DOCUMENTATION;
-      case "COMMENT_END_OF_LINE":
+      case 'COMMENT_END_OF_LINE':
         return COMMENT_END_OF_LINE;
-      case "CONSTRUCTOR":
+      case 'CONSTRUCTOR':
         return CONSTRUCTOR;
-      case "DIRECTIVE":
+      case 'DIRECTIVE':
         return DIRECTIVE;
-      case "DYNAMIC_TYPE":
+      case 'DYNAMIC_TYPE':
         return DYNAMIC_TYPE;
-      case "DYNAMIC_LOCAL_VARIABLE_DECLARATION":
+      case 'DYNAMIC_LOCAL_VARIABLE_DECLARATION':
         return DYNAMIC_LOCAL_VARIABLE_DECLARATION;
-      case "DYNAMIC_LOCAL_VARIABLE_REFERENCE":
+      case 'DYNAMIC_LOCAL_VARIABLE_REFERENCE':
         return DYNAMIC_LOCAL_VARIABLE_REFERENCE;
-      case "DYNAMIC_PARAMETER_DECLARATION":
+      case 'DYNAMIC_PARAMETER_DECLARATION':
         return DYNAMIC_PARAMETER_DECLARATION;
-      case "DYNAMIC_PARAMETER_REFERENCE":
+      case 'DYNAMIC_PARAMETER_REFERENCE':
         return DYNAMIC_PARAMETER_REFERENCE;
-      case "ENUM":
+      case 'ENUM':
         return ENUM;
-      case "ENUM_CONSTANT":
+      case 'ENUM_CONSTANT':
         return ENUM_CONSTANT;
-      case "FIELD":
+      case 'FIELD':
         return FIELD;
-      case "FIELD_STATIC":
+      case 'FIELD_STATIC':
         return FIELD_STATIC;
-      case "FUNCTION":
+      case 'FUNCTION':
         return FUNCTION;
-      case "FUNCTION_DECLARATION":
+      case 'FUNCTION_DECLARATION':
         return FUNCTION_DECLARATION;
-      case "FUNCTION_TYPE_ALIAS":
+      case 'FUNCTION_TYPE_ALIAS':
         return FUNCTION_TYPE_ALIAS;
-      case "GETTER_DECLARATION":
+      case 'GETTER_DECLARATION':
         return GETTER_DECLARATION;
-      case "IDENTIFIER_DEFAULT":
+      case 'IDENTIFIER_DEFAULT':
         return IDENTIFIER_DEFAULT;
-      case "IMPORT_PREFIX":
+      case 'IMPORT_PREFIX':
         return IMPORT_PREFIX;
-      case "INSTANCE_FIELD_DECLARATION":
+      case 'INSTANCE_FIELD_DECLARATION':
         return INSTANCE_FIELD_DECLARATION;
-      case "INSTANCE_FIELD_REFERENCE":
+      case 'INSTANCE_FIELD_REFERENCE':
         return INSTANCE_FIELD_REFERENCE;
-      case "INSTANCE_GETTER_DECLARATION":
+      case 'INSTANCE_GETTER_DECLARATION':
         return INSTANCE_GETTER_DECLARATION;
-      case "INSTANCE_GETTER_REFERENCE":
+      case 'INSTANCE_GETTER_REFERENCE':
         return INSTANCE_GETTER_REFERENCE;
-      case "INSTANCE_METHOD_DECLARATION":
+      case 'INSTANCE_METHOD_DECLARATION':
         return INSTANCE_METHOD_DECLARATION;
-      case "INSTANCE_METHOD_REFERENCE":
+      case 'INSTANCE_METHOD_REFERENCE':
         return INSTANCE_METHOD_REFERENCE;
-      case "INSTANCE_SETTER_DECLARATION":
+      case 'INSTANCE_SETTER_DECLARATION':
         return INSTANCE_SETTER_DECLARATION;
-      case "INSTANCE_SETTER_REFERENCE":
+      case 'INSTANCE_SETTER_REFERENCE':
         return INSTANCE_SETTER_REFERENCE;
-      case "INVALID_STRING_ESCAPE":
+      case 'INVALID_STRING_ESCAPE':
         return INVALID_STRING_ESCAPE;
-      case "KEYWORD":
+      case 'KEYWORD':
         return KEYWORD;
-      case "LABEL":
+      case 'LABEL':
         return LABEL;
-      case "LIBRARY_NAME":
+      case 'LIBRARY_NAME':
         return LIBRARY_NAME;
-      case "LITERAL_BOOLEAN":
+      case 'LITERAL_BOOLEAN':
         return LITERAL_BOOLEAN;
-      case "LITERAL_DOUBLE":
+      case 'LITERAL_DOUBLE':
         return LITERAL_DOUBLE;
-      case "LITERAL_INTEGER":
+      case 'LITERAL_INTEGER':
         return LITERAL_INTEGER;
-      case "LITERAL_LIST":
+      case 'LITERAL_LIST':
         return LITERAL_LIST;
-      case "LITERAL_MAP":
+      case 'LITERAL_MAP':
         return LITERAL_MAP;
-      case "LITERAL_STRING":
+      case 'LITERAL_STRING':
         return LITERAL_STRING;
-      case "LOCAL_FUNCTION_DECLARATION":
+      case 'LOCAL_FUNCTION_DECLARATION':
         return LOCAL_FUNCTION_DECLARATION;
-      case "LOCAL_FUNCTION_REFERENCE":
+      case 'LOCAL_FUNCTION_REFERENCE':
         return LOCAL_FUNCTION_REFERENCE;
-      case "LOCAL_VARIABLE":
+      case 'LOCAL_VARIABLE':
         return LOCAL_VARIABLE;
-      case "LOCAL_VARIABLE_DECLARATION":
+      case 'LOCAL_VARIABLE_DECLARATION':
         return LOCAL_VARIABLE_DECLARATION;
-      case "LOCAL_VARIABLE_REFERENCE":
+      case 'LOCAL_VARIABLE_REFERENCE':
         return LOCAL_VARIABLE_REFERENCE;
-      case "METHOD":
+      case 'METHOD':
         return METHOD;
-      case "METHOD_DECLARATION":
+      case 'METHOD_DECLARATION':
         return METHOD_DECLARATION;
-      case "METHOD_DECLARATION_STATIC":
+      case 'METHOD_DECLARATION_STATIC':
         return METHOD_DECLARATION_STATIC;
-      case "METHOD_STATIC":
+      case 'METHOD_STATIC':
         return METHOD_STATIC;
-      case "PARAMETER":
+      case 'PARAMETER':
         return PARAMETER;
-      case "SETTER_DECLARATION":
+      case 'SETTER_DECLARATION':
         return SETTER_DECLARATION;
-      case "TOP_LEVEL_VARIABLE":
+      case 'TOP_LEVEL_VARIABLE':
         return TOP_LEVEL_VARIABLE;
-      case "PARAMETER_DECLARATION":
+      case 'PARAMETER_DECLARATION':
         return PARAMETER_DECLARATION;
-      case "PARAMETER_REFERENCE":
+      case 'PARAMETER_REFERENCE':
         return PARAMETER_REFERENCE;
-      case "STATIC_FIELD_DECLARATION":
+      case 'STATIC_FIELD_DECLARATION':
         return STATIC_FIELD_DECLARATION;
-      case "STATIC_GETTER_DECLARATION":
+      case 'STATIC_GETTER_DECLARATION':
         return STATIC_GETTER_DECLARATION;
-      case "STATIC_GETTER_REFERENCE":
+      case 'STATIC_GETTER_REFERENCE':
         return STATIC_GETTER_REFERENCE;
-      case "STATIC_METHOD_DECLARATION":
+      case 'STATIC_METHOD_DECLARATION':
         return STATIC_METHOD_DECLARATION;
-      case "STATIC_METHOD_REFERENCE":
+      case 'STATIC_METHOD_REFERENCE':
         return STATIC_METHOD_REFERENCE;
-      case "STATIC_SETTER_DECLARATION":
+      case 'STATIC_SETTER_DECLARATION':
         return STATIC_SETTER_DECLARATION;
-      case "STATIC_SETTER_REFERENCE":
+      case 'STATIC_SETTER_REFERENCE':
         return STATIC_SETTER_REFERENCE;
-      case "TOP_LEVEL_FUNCTION_DECLARATION":
+      case 'TOP_LEVEL_FUNCTION_DECLARATION':
         return TOP_LEVEL_FUNCTION_DECLARATION;
-      case "TOP_LEVEL_FUNCTION_REFERENCE":
+      case 'TOP_LEVEL_FUNCTION_REFERENCE':
         return TOP_LEVEL_FUNCTION_REFERENCE;
-      case "TOP_LEVEL_GETTER_DECLARATION":
+      case 'TOP_LEVEL_GETTER_DECLARATION':
         return TOP_LEVEL_GETTER_DECLARATION;
-      case "TOP_LEVEL_GETTER_REFERENCE":
+      case 'TOP_LEVEL_GETTER_REFERENCE':
         return TOP_LEVEL_GETTER_REFERENCE;
-      case "TOP_LEVEL_SETTER_DECLARATION":
+      case 'TOP_LEVEL_SETTER_DECLARATION':
         return TOP_LEVEL_SETTER_DECLARATION;
-      case "TOP_LEVEL_SETTER_REFERENCE":
+      case 'TOP_LEVEL_SETTER_REFERENCE':
         return TOP_LEVEL_SETTER_REFERENCE;
-      case "TOP_LEVEL_VARIABLE_DECLARATION":
+      case 'TOP_LEVEL_VARIABLE_DECLARATION':
         return TOP_LEVEL_VARIABLE_DECLARATION;
-      case "TYPE_NAME_DYNAMIC":
+      case 'TYPE_NAME_DYNAMIC':
         return TYPE_NAME_DYNAMIC;
-      case "TYPE_PARAMETER":
+      case 'TYPE_PARAMETER':
         return TYPE_PARAMETER;
-      case "UNRESOLVED_INSTANCE_MEMBER_REFERENCE":
+      case 'UNRESOLVED_INSTANCE_MEMBER_REFERENCE':
         return UNRESOLVED_INSTANCE_MEMBER_REFERENCE;
-      case "VALID_STRING_ESCAPE":
+      case 'VALID_STRING_ESCAPE':
         return VALID_STRING_ESCAPE;
     }
     throw Exception('Illegal enum value: $name');
@@ -2655,11 +2655,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "HighlightRegionType", json);
+    throw jsonDecoder.mismatch(jsonPath, 'HighlightRegionType', json);
   }
 
   @override
-  String toString() => "HighlightRegionType.$name";
+  String toString() => 'HighlightRegionType.$name';
 
   String toJson() => name;
 }
@@ -2742,51 +2742,51 @@
     json ??= {};
     if (json is Map) {
       KytheVName source;
-      if (json.containsKey("source")) {
+      if (json.containsKey('source')) {
         source = KytheVName.fromJson(
-            jsonDecoder, jsonPath + ".source", json["source"]);
+            jsonDecoder, jsonPath + '.source', json['source']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "source");
+        throw jsonDecoder.mismatch(jsonPath, 'source');
       }
       String kind;
-      if (json.containsKey("kind")) {
-        kind = jsonDecoder.decodeString(jsonPath + ".kind", json["kind"]);
+      if (json.containsKey('kind')) {
+        kind = jsonDecoder.decodeString(jsonPath + '.kind', json['kind']);
       }
       KytheVName target;
-      if (json.containsKey("target")) {
+      if (json.containsKey('target')) {
         target = KytheVName.fromJson(
-            jsonDecoder, jsonPath + ".target", json["target"]);
+            jsonDecoder, jsonPath + '.target', json['target']);
       }
       String fact;
-      if (json.containsKey("fact")) {
-        fact = jsonDecoder.decodeString(jsonPath + ".fact", json["fact"]);
+      if (json.containsKey('fact')) {
+        fact = jsonDecoder.decodeString(jsonPath + '.fact', json['fact']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "fact");
+        throw jsonDecoder.mismatch(jsonPath, 'fact');
       }
       List<int> value;
-      if (json.containsKey("value")) {
+      if (json.containsKey('value')) {
         value = jsonDecoder.decodeList(
-            jsonPath + ".value", json["value"], jsonDecoder.decodeInt);
+            jsonPath + '.value', json['value'], jsonDecoder.decodeInt);
       }
       return KytheEntry(source, fact, kind: kind, target: target, value: value);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "KytheEntry", json);
+      throw jsonDecoder.mismatch(jsonPath, 'KytheEntry', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["source"] = source.toJson();
+    result['source'] = source.toJson();
     if (kind != null) {
-      result["kind"] = kind;
+      result['kind'] = kind;
     }
     if (target != null) {
-      result["target"] = target.toJson();
+      result['target'] = target.toJson();
     }
-    result["fact"] = fact;
+    result['fact'] = fact;
     if (value != null) {
-      result["value"] = value;
+      result['value'] = value;
     }
     return result;
   }
@@ -2909,51 +2909,51 @@
     json ??= {};
     if (json is Map) {
       String signature;
-      if (json.containsKey("signature")) {
+      if (json.containsKey('signature')) {
         signature = jsonDecoder.decodeString(
-            jsonPath + ".signature", json["signature"]);
+            jsonPath + '.signature', json['signature']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "signature");
+        throw jsonDecoder.mismatch(jsonPath, 'signature');
       }
       String corpus;
-      if (json.containsKey("corpus")) {
-        corpus = jsonDecoder.decodeString(jsonPath + ".corpus", json["corpus"]);
+      if (json.containsKey('corpus')) {
+        corpus = jsonDecoder.decodeString(jsonPath + '.corpus', json['corpus']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "corpus");
+        throw jsonDecoder.mismatch(jsonPath, 'corpus');
       }
       String root;
-      if (json.containsKey("root")) {
-        root = jsonDecoder.decodeString(jsonPath + ".root", json["root"]);
+      if (json.containsKey('root')) {
+        root = jsonDecoder.decodeString(jsonPath + '.root', json['root']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "root");
+        throw jsonDecoder.mismatch(jsonPath, 'root');
       }
       String path;
-      if (json.containsKey("path")) {
-        path = jsonDecoder.decodeString(jsonPath + ".path", json["path"]);
+      if (json.containsKey('path')) {
+        path = jsonDecoder.decodeString(jsonPath + '.path', json['path']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "path");
+        throw jsonDecoder.mismatch(jsonPath, 'path');
       }
       String language;
-      if (json.containsKey("language")) {
+      if (json.containsKey('language')) {
         language =
-            jsonDecoder.decodeString(jsonPath + ".language", json["language"]);
+            jsonDecoder.decodeString(jsonPath + '.language', json['language']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "language");
+        throw jsonDecoder.mismatch(jsonPath, 'language');
       }
       return KytheVName(signature, corpus, root, path, language);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "KytheVName", json);
+      throw jsonDecoder.mismatch(jsonPath, 'KytheVName', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["signature"] = signature;
-    result["corpus"] = corpus;
-    result["root"] = root;
-    result["path"] = path;
-    result["language"] = language;
+    result['signature'] = signature;
+    result['corpus'] = corpus;
+    result['root'] = root;
+    result['path'] = path;
+    result['language'] = language;
     return result;
   }
 
@@ -3041,34 +3041,34 @@
     json ??= {};
     if (json is Map) {
       List<Position> positions;
-      if (json.containsKey("positions")) {
+      if (json.containsKey('positions')) {
         positions = jsonDecoder.decodeList(
-            jsonPath + ".positions",
-            json["positions"],
+            jsonPath + '.positions',
+            json['positions'],
             (String jsonPath, Object json) =>
                 Position.fromJson(jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "positions");
+        throw jsonDecoder.mismatch(jsonPath, 'positions');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       List<LinkedEditSuggestion> suggestions;
-      if (json.containsKey("suggestions")) {
+      if (json.containsKey('suggestions')) {
         suggestions = jsonDecoder.decodeList(
-            jsonPath + ".suggestions",
-            json["suggestions"],
+            jsonPath + '.suggestions',
+            json['suggestions'],
             (String jsonPath, Object json) =>
                 LinkedEditSuggestion.fromJson(jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "suggestions");
+        throw jsonDecoder.mismatch(jsonPath, 'suggestions');
       }
       return LinkedEditGroup(positions, length, suggestions);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "LinkedEditGroup", json);
+      throw jsonDecoder.mismatch(jsonPath, 'LinkedEditGroup', json);
     }
   }
 
@@ -3078,10 +3078,10 @@
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["positions"] =
+    result['positions'] =
         positions.map((Position value) => value.toJson()).toList();
-    result["length"] = length;
-    result["suggestions"] = suggestions
+    result['length'] = length;
+    result['suggestions'] = suggestions
         .map((LinkedEditSuggestion value) => value.toJson())
         .toList();
     return result;
@@ -3164,29 +3164,29 @@
     json ??= {};
     if (json is Map) {
       String value;
-      if (json.containsKey("value")) {
-        value = jsonDecoder.decodeString(jsonPath + ".value", json["value"]);
+      if (json.containsKey('value')) {
+        value = jsonDecoder.decodeString(jsonPath + '.value', json['value']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "value");
+        throw jsonDecoder.mismatch(jsonPath, 'value');
       }
       LinkedEditSuggestionKind kind;
-      if (json.containsKey("kind")) {
+      if (json.containsKey('kind')) {
         kind = LinkedEditSuggestionKind.fromJson(
-            jsonDecoder, jsonPath + ".kind", json["kind"]);
+            jsonDecoder, jsonPath + '.kind', json['kind']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "kind");
+        throw jsonDecoder.mismatch(jsonPath, 'kind');
       }
       return LinkedEditSuggestion(value, kind);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "LinkedEditSuggestion", json);
+      throw jsonDecoder.mismatch(jsonPath, 'LinkedEditSuggestion', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["value"] = value;
-    result["kind"] = kind.toJson();
+    result['value'] = value;
+    result['kind'] = kind.toJson();
     return result;
   }
 
@@ -3222,16 +3222,16 @@
 /// Clients may not extend, implement or mix-in this class.
 class LinkedEditSuggestionKind implements Enum {
   static const LinkedEditSuggestionKind METHOD =
-      LinkedEditSuggestionKind._("METHOD");
+      LinkedEditSuggestionKind._('METHOD');
 
   static const LinkedEditSuggestionKind PARAMETER =
-      LinkedEditSuggestionKind._("PARAMETER");
+      LinkedEditSuggestionKind._('PARAMETER');
 
   static const LinkedEditSuggestionKind TYPE =
-      LinkedEditSuggestionKind._("TYPE");
+      LinkedEditSuggestionKind._('TYPE');
 
   static const LinkedEditSuggestionKind VARIABLE =
-      LinkedEditSuggestionKind._("VARIABLE");
+      LinkedEditSuggestionKind._('VARIABLE');
 
   /// A list containing all of the enum values that are defined.
   static const List<LinkedEditSuggestionKind> VALUES =
@@ -3244,13 +3244,13 @@
 
   factory LinkedEditSuggestionKind(String name) {
     switch (name) {
-      case "METHOD":
+      case 'METHOD':
         return METHOD;
-      case "PARAMETER":
+      case 'PARAMETER':
         return PARAMETER;
-      case "TYPE":
+      case 'TYPE':
         return TYPE;
-      case "VARIABLE":
+      case 'VARIABLE':
         return VARIABLE;
     }
     throw Exception('Illegal enum value: $name');
@@ -3265,11 +3265,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "LinkedEditSuggestionKind", json);
+    throw jsonDecoder.mismatch(jsonPath, 'LinkedEditSuggestionKind', json);
   }
 
   @override
-  String toString() => "LinkedEditSuggestionKind.$name";
+  String toString() => 'LinkedEditSuggestionKind.$name';
 
   String toJson() => name;
 }
@@ -3359,51 +3359,51 @@
     json ??= {};
     if (json is Map) {
       String file;
-      if (json.containsKey("file")) {
-        file = jsonDecoder.decodeString(jsonPath + ".file", json["file"]);
+      if (json.containsKey('file')) {
+        file = jsonDecoder.decodeString(jsonPath + '.file', json['file']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "file");
+        throw jsonDecoder.mismatch(jsonPath, 'file');
       }
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       int startLine;
-      if (json.containsKey("startLine")) {
+      if (json.containsKey('startLine')) {
         startLine =
-            jsonDecoder.decodeInt(jsonPath + ".startLine", json["startLine"]);
+            jsonDecoder.decodeInt(jsonPath + '.startLine', json['startLine']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "startLine");
+        throw jsonDecoder.mismatch(jsonPath, 'startLine');
       }
       int startColumn;
-      if (json.containsKey("startColumn")) {
+      if (json.containsKey('startColumn')) {
         startColumn = jsonDecoder.decodeInt(
-            jsonPath + ".startColumn", json["startColumn"]);
+            jsonPath + '.startColumn', json['startColumn']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "startColumn");
+        throw jsonDecoder.mismatch(jsonPath, 'startColumn');
       }
       return Location(file, offset, length, startLine, startColumn);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "Location", json);
+      throw jsonDecoder.mismatch(jsonPath, 'Location', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["file"] = file;
-    result["offset"] = offset;
-    result["length"] = length;
-    result["startLine"] = startLine;
-    result["startColumn"] = startColumn;
+    result['file'] = file;
+    result['offset'] = offset;
+    result['length'] = length;
+    result['startLine'] = startLine;
+    result['startColumn'] = startColumn;
     return result;
   }
 
@@ -3492,36 +3492,36 @@
     json ??= {};
     if (json is Map) {
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       List<int> targets;
-      if (json.containsKey("targets")) {
+      if (json.containsKey('targets')) {
         targets = jsonDecoder.decodeList(
-            jsonPath + ".targets", json["targets"], jsonDecoder.decodeInt);
+            jsonPath + '.targets', json['targets'], jsonDecoder.decodeInt);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "targets");
+        throw jsonDecoder.mismatch(jsonPath, 'targets');
       }
       return NavigationRegion(offset, length, targets);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "NavigationRegion", json);
+      throw jsonDecoder.mismatch(jsonPath, 'NavigationRegion', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["offset"] = offset;
-    result["length"] = length;
-    result["targets"] = targets;
+    result['offset'] = offset;
+    result['length'] = length;
+    result['targets'] = targets;
     return result;
   }
 
@@ -3648,61 +3648,61 @@
     json ??= {};
     if (json is Map) {
       ElementKind kind;
-      if (json.containsKey("kind")) {
+      if (json.containsKey('kind')) {
         kind =
-            ElementKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+            ElementKind.fromJson(jsonDecoder, jsonPath + '.kind', json['kind']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "kind");
+        throw jsonDecoder.mismatch(jsonPath, 'kind');
       }
       int fileIndex;
-      if (json.containsKey("fileIndex")) {
+      if (json.containsKey('fileIndex')) {
         fileIndex =
-            jsonDecoder.decodeInt(jsonPath + ".fileIndex", json["fileIndex"]);
+            jsonDecoder.decodeInt(jsonPath + '.fileIndex', json['fileIndex']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "fileIndex");
+        throw jsonDecoder.mismatch(jsonPath, 'fileIndex');
       }
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       int startLine;
-      if (json.containsKey("startLine")) {
+      if (json.containsKey('startLine')) {
         startLine =
-            jsonDecoder.decodeInt(jsonPath + ".startLine", json["startLine"]);
+            jsonDecoder.decodeInt(jsonPath + '.startLine', json['startLine']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "startLine");
+        throw jsonDecoder.mismatch(jsonPath, 'startLine');
       }
       int startColumn;
-      if (json.containsKey("startColumn")) {
+      if (json.containsKey('startColumn')) {
         startColumn = jsonDecoder.decodeInt(
-            jsonPath + ".startColumn", json["startColumn"]);
+            jsonPath + '.startColumn', json['startColumn']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "startColumn");
+        throw jsonDecoder.mismatch(jsonPath, 'startColumn');
       }
       return NavigationTarget(
           kind, fileIndex, offset, length, startLine, startColumn);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "NavigationTarget", json);
+      throw jsonDecoder.mismatch(jsonPath, 'NavigationTarget', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["kind"] = kind.toJson();
-    result["fileIndex"] = fileIndex;
-    result["offset"] = offset;
-    result["length"] = length;
-    result["startLine"] = startLine;
-    result["startColumn"] = startColumn;
+    result['kind'] = kind.toJson();
+    result['fileIndex'] = fileIndex;
+    result['offset'] = offset;
+    result['length'] = length;
+    result['startLine'] = startLine;
+    result['startColumn'] = startColumn;
     return result;
   }
 
@@ -3789,37 +3789,37 @@
     json ??= {};
     if (json is Map) {
       Element element;
-      if (json.containsKey("element")) {
+      if (json.containsKey('element')) {
         element = Element.fromJson(
-            jsonDecoder, jsonPath + ".element", json["element"]);
+            jsonDecoder, jsonPath + '.element', json['element']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "element");
+        throw jsonDecoder.mismatch(jsonPath, 'element');
       }
       List<int> offsets;
-      if (json.containsKey("offsets")) {
+      if (json.containsKey('offsets')) {
         offsets = jsonDecoder.decodeList(
-            jsonPath + ".offsets", json["offsets"], jsonDecoder.decodeInt);
+            jsonPath + '.offsets', json['offsets'], jsonDecoder.decodeInt);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offsets");
+        throw jsonDecoder.mismatch(jsonPath, 'offsets');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       return Occurrences(element, offsets, length);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "Occurrences", json);
+      throw jsonDecoder.mismatch(jsonPath, 'Occurrences', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["element"] = element.toJson();
-    result["offsets"] = offsets;
-    result["length"] = length;
+    result['element'] = element.toJson();
+    result['offsets'] = offsets;
+    result['length'] = length;
     return result;
   }
 
@@ -3950,63 +3950,63 @@
     json ??= {};
     if (json is Map) {
       Element element;
-      if (json.containsKey("element")) {
+      if (json.containsKey('element')) {
         element = Element.fromJson(
-            jsonDecoder, jsonPath + ".element", json["element"]);
+            jsonDecoder, jsonPath + '.element', json['element']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "element");
+        throw jsonDecoder.mismatch(jsonPath, 'element');
       }
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       int codeOffset;
-      if (json.containsKey("codeOffset")) {
+      if (json.containsKey('codeOffset')) {
         codeOffset =
-            jsonDecoder.decodeInt(jsonPath + ".codeOffset", json["codeOffset"]);
+            jsonDecoder.decodeInt(jsonPath + '.codeOffset', json['codeOffset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "codeOffset");
+        throw jsonDecoder.mismatch(jsonPath, 'codeOffset');
       }
       int codeLength;
-      if (json.containsKey("codeLength")) {
+      if (json.containsKey('codeLength')) {
         codeLength =
-            jsonDecoder.decodeInt(jsonPath + ".codeLength", json["codeLength"]);
+            jsonDecoder.decodeInt(jsonPath + '.codeLength', json['codeLength']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "codeLength");
+        throw jsonDecoder.mismatch(jsonPath, 'codeLength');
       }
       List<Outline> children;
-      if (json.containsKey("children")) {
+      if (json.containsKey('children')) {
         children = jsonDecoder.decodeList(
-            jsonPath + ".children",
-            json["children"],
+            jsonPath + '.children',
+            json['children'],
             (String jsonPath, Object json) =>
                 Outline.fromJson(jsonDecoder, jsonPath, json));
       }
       return Outline(element, offset, length, codeOffset, codeLength,
           children: children);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "Outline", json);
+      throw jsonDecoder.mismatch(jsonPath, 'Outline', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["element"] = element.toJson();
-    result["offset"] = offset;
-    result["length"] = length;
-    result["codeOffset"] = codeOffset;
-    result["codeLength"] = codeLength;
+    result['element'] = element.toJson();
+    result['offset'] = offset;
+    result['length'] = length;
+    result['codeOffset'] = codeOffset;
+    result['codeLength'] = codeLength;
     if (children != null) {
-      result["children"] =
+      result['children'] =
           children.map((Outline value) => value.toJson()).toList();
     }
     return result;
@@ -4110,43 +4110,43 @@
     json ??= {};
     if (json is Map) {
       ParameterKind kind;
-      if (json.containsKey("kind")) {
+      if (json.containsKey('kind')) {
         kind = ParameterKind.fromJson(
-            jsonDecoder, jsonPath + ".kind", json["kind"]);
+            jsonDecoder, jsonPath + '.kind', json['kind']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "kind");
+        throw jsonDecoder.mismatch(jsonPath, 'kind');
       }
       String name;
-      if (json.containsKey("name")) {
-        name = jsonDecoder.decodeString(jsonPath + ".name", json["name"]);
+      if (json.containsKey('name')) {
+        name = jsonDecoder.decodeString(jsonPath + '.name', json['name']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "name");
+        throw jsonDecoder.mismatch(jsonPath, 'name');
       }
       String type;
-      if (json.containsKey("type")) {
-        type = jsonDecoder.decodeString(jsonPath + ".type", json["type"]);
+      if (json.containsKey('type')) {
+        type = jsonDecoder.decodeString(jsonPath + '.type', json['type']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "type");
+        throw jsonDecoder.mismatch(jsonPath, 'type');
       }
       String defaultValue;
-      if (json.containsKey("defaultValue")) {
+      if (json.containsKey('defaultValue')) {
         defaultValue = jsonDecoder.decodeString(
-            jsonPath + ".defaultValue", json["defaultValue"]);
+            jsonPath + '.defaultValue', json['defaultValue']);
       }
       return ParameterInfo(kind, name, type, defaultValue: defaultValue);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "ParameterInfo", json);
+      throw jsonDecoder.mismatch(jsonPath, 'ParameterInfo', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["kind"] = kind.toJson();
-    result["name"] = name;
-    result["type"] = type;
+    result['kind'] = kind.toJson();
+    result['name'] = name;
+    result['type'] = type;
     if (defaultValue != null) {
-      result["defaultValue"] = defaultValue;
+      result['defaultValue'] = defaultValue;
     }
     return result;
   }
@@ -4187,13 +4187,13 @@
 /// Clients may not extend, implement or mix-in this class.
 class ParameterKind implements Enum {
   /// A named parameter.
-  static const ParameterKind NAMED = ParameterKind._("NAMED");
+  static const ParameterKind NAMED = ParameterKind._('NAMED');
 
   /// An optional parameter.
-  static const ParameterKind OPTIONAL = ParameterKind._("OPTIONAL");
+  static const ParameterKind OPTIONAL = ParameterKind._('OPTIONAL');
 
   /// A required parameter.
-  static const ParameterKind REQUIRED = ParameterKind._("REQUIRED");
+  static const ParameterKind REQUIRED = ParameterKind._('REQUIRED');
 
   /// A list containing all of the enum values that are defined.
   static const List<ParameterKind> VALUES = <ParameterKind>[
@@ -4209,11 +4209,11 @@
 
   factory ParameterKind(String name) {
     switch (name) {
-      case "NAMED":
+      case 'NAMED':
         return NAMED;
-      case "OPTIONAL":
+      case 'OPTIONAL':
         return OPTIONAL;
-      case "REQUIRED":
+      case 'REQUIRED':
         return REQUIRED;
     }
     throw Exception('Illegal enum value: $name');
@@ -4228,11 +4228,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "ParameterKind", json);
+    throw jsonDecoder.mismatch(jsonPath, 'ParameterKind', json);
   }
 
   @override
-  String toString() => "ParameterKind.$name";
+  String toString() => 'ParameterKind.$name';
 
   String toJson() => name;
 }
@@ -4278,28 +4278,28 @@
     json ??= {};
     if (json is Map) {
       String file;
-      if (json.containsKey("file")) {
-        file = jsonDecoder.decodeString(jsonPath + ".file", json["file"]);
+      if (json.containsKey('file')) {
+        file = jsonDecoder.decodeString(jsonPath + '.file', json['file']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "file");
+        throw jsonDecoder.mismatch(jsonPath, 'file');
       }
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       return Position(file, offset);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "Position", json);
+      throw jsonDecoder.mismatch(jsonPath, 'Position', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["file"] = file;
-    result["offset"] = offset;
+    result['file'] = file;
+    result['offset'] = offset;
     return result;
   }
 
@@ -4340,29 +4340,29 @@
 /// Clients may not extend, implement or mix-in this class.
 class RefactoringKind implements Enum {
   static const RefactoringKind CONVERT_GETTER_TO_METHOD =
-      RefactoringKind._("CONVERT_GETTER_TO_METHOD");
+      RefactoringKind._('CONVERT_GETTER_TO_METHOD');
 
   static const RefactoringKind CONVERT_METHOD_TO_GETTER =
-      RefactoringKind._("CONVERT_METHOD_TO_GETTER");
+      RefactoringKind._('CONVERT_METHOD_TO_GETTER');
 
   static const RefactoringKind EXTRACT_LOCAL_VARIABLE =
-      RefactoringKind._("EXTRACT_LOCAL_VARIABLE");
+      RefactoringKind._('EXTRACT_LOCAL_VARIABLE');
 
   static const RefactoringKind EXTRACT_METHOD =
-      RefactoringKind._("EXTRACT_METHOD");
+      RefactoringKind._('EXTRACT_METHOD');
 
   static const RefactoringKind EXTRACT_WIDGET =
-      RefactoringKind._("EXTRACT_WIDGET");
+      RefactoringKind._('EXTRACT_WIDGET');
 
   static const RefactoringKind INLINE_LOCAL_VARIABLE =
-      RefactoringKind._("INLINE_LOCAL_VARIABLE");
+      RefactoringKind._('INLINE_LOCAL_VARIABLE');
 
   static const RefactoringKind INLINE_METHOD =
-      RefactoringKind._("INLINE_METHOD");
+      RefactoringKind._('INLINE_METHOD');
 
-  static const RefactoringKind MOVE_FILE = RefactoringKind._("MOVE_FILE");
+  static const RefactoringKind MOVE_FILE = RefactoringKind._('MOVE_FILE');
 
-  static const RefactoringKind RENAME = RefactoringKind._("RENAME");
+  static const RefactoringKind RENAME = RefactoringKind._('RENAME');
 
   /// A list containing all of the enum values that are defined.
   static const List<RefactoringKind> VALUES = <RefactoringKind>[
@@ -4384,23 +4384,23 @@
 
   factory RefactoringKind(String name) {
     switch (name) {
-      case "CONVERT_GETTER_TO_METHOD":
+      case 'CONVERT_GETTER_TO_METHOD':
         return CONVERT_GETTER_TO_METHOD;
-      case "CONVERT_METHOD_TO_GETTER":
+      case 'CONVERT_METHOD_TO_GETTER':
         return CONVERT_METHOD_TO_GETTER;
-      case "EXTRACT_LOCAL_VARIABLE":
+      case 'EXTRACT_LOCAL_VARIABLE':
         return EXTRACT_LOCAL_VARIABLE;
-      case "EXTRACT_METHOD":
+      case 'EXTRACT_METHOD':
         return EXTRACT_METHOD;
-      case "EXTRACT_WIDGET":
+      case 'EXTRACT_WIDGET':
         return EXTRACT_WIDGET;
-      case "INLINE_LOCAL_VARIABLE":
+      case 'INLINE_LOCAL_VARIABLE':
         return INLINE_LOCAL_VARIABLE;
-      case "INLINE_METHOD":
+      case 'INLINE_METHOD':
         return INLINE_METHOD;
-      case "MOVE_FILE":
+      case 'MOVE_FILE':
         return MOVE_FILE;
-      case "RENAME":
+      case 'RENAME':
         return RENAME;
     }
     throw Exception('Illegal enum value: $name');
@@ -4415,11 +4415,11 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "RefactoringKind", json);
+    throw jsonDecoder.mismatch(jsonPath, 'RefactoringKind', json);
   }
 
   @override
-  String toString() => "RefactoringKind.$name";
+  String toString() => 'RefactoringKind.$name';
 
   String toJson() => name;
 }
@@ -4512,37 +4512,37 @@
     json ??= {};
     if (json is Map) {
       String id;
-      if (json.containsKey("id")) {
-        id = jsonDecoder.decodeString(jsonPath + ".id", json["id"]);
+      if (json.containsKey('id')) {
+        id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
       }
       RefactoringMethodParameterKind kind;
-      if (json.containsKey("kind")) {
+      if (json.containsKey('kind')) {
         kind = RefactoringMethodParameterKind.fromJson(
-            jsonDecoder, jsonPath + ".kind", json["kind"]);
+            jsonDecoder, jsonPath + '.kind', json['kind']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "kind");
+        throw jsonDecoder.mismatch(jsonPath, 'kind');
       }
       String type;
-      if (json.containsKey("type")) {
-        type = jsonDecoder.decodeString(jsonPath + ".type", json["type"]);
+      if (json.containsKey('type')) {
+        type = jsonDecoder.decodeString(jsonPath + '.type', json['type']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "type");
+        throw jsonDecoder.mismatch(jsonPath, 'type');
       }
       String name;
-      if (json.containsKey("name")) {
-        name = jsonDecoder.decodeString(jsonPath + ".name", json["name"]);
+      if (json.containsKey('name')) {
+        name = jsonDecoder.decodeString(jsonPath + '.name', json['name']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "name");
+        throw jsonDecoder.mismatch(jsonPath, 'name');
       }
       String parameters;
-      if (json.containsKey("parameters")) {
+      if (json.containsKey('parameters')) {
         parameters = jsonDecoder.decodeString(
-            jsonPath + ".parameters", json["parameters"]);
+            jsonPath + '.parameters', json['parameters']);
       }
       return RefactoringMethodParameter(kind, type, name,
           id: id, parameters: parameters);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "RefactoringMethodParameter", json);
+      throw jsonDecoder.mismatch(jsonPath, 'RefactoringMethodParameter', json);
     }
   }
 
@@ -4550,13 +4550,13 @@
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
     if (id != null) {
-      result["id"] = id;
+      result['id'] = id;
     }
-    result["kind"] = kind.toJson();
-    result["type"] = type;
-    result["name"] = name;
+    result['kind'] = kind.toJson();
+    result['type'] = type;
+    result['name'] = name;
     if (parameters != null) {
-      result["parameters"] = parameters;
+      result['parameters'] = parameters;
     }
     return result;
   }
@@ -4599,13 +4599,13 @@
 /// Clients may not extend, implement or mix-in this class.
 class RefactoringMethodParameterKind implements Enum {
   static const RefactoringMethodParameterKind REQUIRED =
-      RefactoringMethodParameterKind._("REQUIRED");
+      RefactoringMethodParameterKind._('REQUIRED');
 
   static const RefactoringMethodParameterKind POSITIONAL =
-      RefactoringMethodParameterKind._("POSITIONAL");
+      RefactoringMethodParameterKind._('POSITIONAL');
 
   static const RefactoringMethodParameterKind NAMED =
-      RefactoringMethodParameterKind._("NAMED");
+      RefactoringMethodParameterKind._('NAMED');
 
   /// A list containing all of the enum values that are defined.
   static const List<RefactoringMethodParameterKind> VALUES =
@@ -4618,11 +4618,11 @@
 
   factory RefactoringMethodParameterKind(String name) {
     switch (name) {
-      case "REQUIRED":
+      case 'REQUIRED':
         return REQUIRED;
-      case "POSITIONAL":
+      case 'POSITIONAL':
         return POSITIONAL;
-      case "NAMED":
+      case 'NAMED':
         return NAMED;
     }
     throw Exception('Illegal enum value: $name');
@@ -4638,11 +4638,11 @@
       }
     }
     throw jsonDecoder.mismatch(
-        jsonPath, "RefactoringMethodParameterKind", json);
+        jsonPath, 'RefactoringMethodParameterKind', json);
   }
 
   @override
-  String toString() => "RefactoringMethodParameterKind.$name";
+  String toString() => 'RefactoringMethodParameterKind.$name';
 
   String toJson() => name;
 }
@@ -4705,37 +4705,37 @@
     json ??= {};
     if (json is Map) {
       RefactoringProblemSeverity severity;
-      if (json.containsKey("severity")) {
+      if (json.containsKey('severity')) {
         severity = RefactoringProblemSeverity.fromJson(
-            jsonDecoder, jsonPath + ".severity", json["severity"]);
+            jsonDecoder, jsonPath + '.severity', json['severity']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "severity");
+        throw jsonDecoder.mismatch(jsonPath, 'severity');
       }
       String message;
-      if (json.containsKey("message")) {
+      if (json.containsKey('message')) {
         message =
-            jsonDecoder.decodeString(jsonPath + ".message", json["message"]);
+            jsonDecoder.decodeString(jsonPath + '.message', json['message']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "message");
+        throw jsonDecoder.mismatch(jsonPath, 'message');
       }
       Location location;
-      if (json.containsKey("location")) {
+      if (json.containsKey('location')) {
         location = Location.fromJson(
-            jsonDecoder, jsonPath + ".location", json["location"]);
+            jsonDecoder, jsonPath + '.location', json['location']);
       }
       return RefactoringProblem(severity, message, location: location);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "RefactoringProblem", json);
+      throw jsonDecoder.mismatch(jsonPath, 'RefactoringProblem', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["severity"] = severity.toJson();
-    result["message"] = message;
+    result['severity'] = severity.toJson();
+    result['message'] = message;
     if (location != null) {
-      result["location"] = location.toJson();
+      result['location'] = location.toJson();
     }
     return result;
   }
@@ -4776,14 +4776,14 @@
 class RefactoringProblemSeverity implements Enum {
   /// A minor code problem. No example, because it is not used yet.
   static const RefactoringProblemSeverity INFO =
-      RefactoringProblemSeverity._("INFO");
+      RefactoringProblemSeverity._('INFO');
 
   /// A minor code problem. For example names of local variables should be camel
   /// case and start with a lower case letter. Staring the name of a variable
   /// with an upper case is OK from the language point of view, but it is nice
   /// to warn the user.
   static const RefactoringProblemSeverity WARNING =
-      RefactoringProblemSeverity._("WARNING");
+      RefactoringProblemSeverity._('WARNING');
 
   /// The refactoring technically can be performed, but there is a logical
   /// problem. For example the name of a local variable being extracted
@@ -4795,13 +4795,13 @@
   /// the name conflict might be expected, and the user wants to fix it
   /// afterwards.
   static const RefactoringProblemSeverity ERROR =
-      RefactoringProblemSeverity._("ERROR");
+      RefactoringProblemSeverity._('ERROR');
 
   /// A fatal error, which prevents performing the refactoring. For example the
   /// name of a local variable being extracted is not a valid identifier, or
   /// selection is not a valid expression.
   static const RefactoringProblemSeverity FATAL =
-      RefactoringProblemSeverity._("FATAL");
+      RefactoringProblemSeverity._('FATAL');
 
   /// A list containing all of the enum values that are defined.
   static const List<RefactoringProblemSeverity> VALUES =
@@ -4814,13 +4814,13 @@
 
   factory RefactoringProblemSeverity(String name) {
     switch (name) {
-      case "INFO":
+      case 'INFO':
         return INFO;
-      case "WARNING":
+      case 'WARNING':
         return WARNING;
-      case "ERROR":
+      case 'ERROR':
         return ERROR;
-      case "FATAL":
+      case 'FATAL':
         return FATAL;
     }
     throw Exception('Illegal enum value: $name');
@@ -4835,7 +4835,7 @@
         // Fall through
       }
     }
-    throw jsonDecoder.mismatch(jsonPath, "RefactoringProblemSeverity", json);
+    throw jsonDecoder.mismatch(jsonPath, 'RefactoringProblemSeverity', json);
   }
 
   /// Returns the [RefactoringProblemSeverity] with the maximal severity.
@@ -4844,7 +4844,7 @@
       maxRefactoringProblemSeverity(a, b);
 
   @override
-  String toString() => "RefactoringProblemSeverity.$name";
+  String toString() => 'RefactoringProblemSeverity.$name';
 
   String toJson() => name;
 }
@@ -4863,19 +4863,19 @@
       JsonDecoder jsonDecoder, String jsonPath, Object json) {
     json ??= {};
     if (json is Map) {
-      if (json["type"] != "remove") {
-        throw jsonDecoder.mismatch(jsonPath, "equal remove", json);
+      if (json['type'] != 'remove') {
+        throw jsonDecoder.mismatch(jsonPath, 'equal remove', json);
       }
       return RemoveContentOverlay();
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "RemoveContentOverlay", json);
+      throw jsonDecoder.mismatch(jsonPath, 'RemoveContentOverlay', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["type"] = "remove";
+    result['type'] = 'remove';
     return result;
   }
 
@@ -4992,40 +4992,40 @@
     json ??= {};
     if (json is Map) {
       String message;
-      if (json.containsKey("message")) {
+      if (json.containsKey('message')) {
         message =
-            jsonDecoder.decodeString(jsonPath + ".message", json["message"]);
+            jsonDecoder.decodeString(jsonPath + '.message', json['message']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "message");
+        throw jsonDecoder.mismatch(jsonPath, 'message');
       }
       List<SourceFileEdit> edits;
-      if (json.containsKey("edits")) {
+      if (json.containsKey('edits')) {
         edits = jsonDecoder.decodeList(
-            jsonPath + ".edits",
-            json["edits"],
+            jsonPath + '.edits',
+            json['edits'],
             (String jsonPath, Object json) =>
                 SourceFileEdit.fromJson(jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "edits");
+        throw jsonDecoder.mismatch(jsonPath, 'edits');
       }
       List<LinkedEditGroup> linkedEditGroups;
-      if (json.containsKey("linkedEditGroups")) {
+      if (json.containsKey('linkedEditGroups')) {
         linkedEditGroups = jsonDecoder.decodeList(
-            jsonPath + ".linkedEditGroups",
-            json["linkedEditGroups"],
+            jsonPath + '.linkedEditGroups',
+            json['linkedEditGroups'],
             (String jsonPath, Object json) =>
                 LinkedEditGroup.fromJson(jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "linkedEditGroups");
+        throw jsonDecoder.mismatch(jsonPath, 'linkedEditGroups');
       }
       Position selection;
-      if (json.containsKey("selection")) {
+      if (json.containsKey('selection')) {
         selection = Position.fromJson(
-            jsonDecoder, jsonPath + ".selection", json["selection"]);
+            jsonDecoder, jsonPath + '.selection', json['selection']);
       }
       String id;
-      if (json.containsKey("id")) {
-        id = jsonDecoder.decodeString(jsonPath + ".id", json["id"]);
+      if (json.containsKey('id')) {
+        id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
       }
       return SourceChange(message,
           edits: edits,
@@ -5033,24 +5033,24 @@
           selection: selection,
           id: id);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "SourceChange", json);
+      throw jsonDecoder.mismatch(jsonPath, 'SourceChange', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["message"] = message;
-    result["edits"] =
+    result['message'] = message;
+    result['edits'] =
         edits.map((SourceFileEdit value) => value.toJson()).toList();
-    result["linkedEditGroups"] = linkedEditGroups
+    result['linkedEditGroups'] = linkedEditGroups
         .map((LinkedEditGroup value) => value.toJson())
         .toList();
     if (selection != null) {
-      result["selection"] = selection.toJson();
+      result['selection'] = selection.toJson();
     }
     if (id != null) {
-      result["id"] = id;
+      result['id'] = id;
     }
     return result;
   }
@@ -5186,31 +5186,31 @@
     json ??= {};
     if (json is Map) {
       int offset;
-      if (json.containsKey("offset")) {
-        offset = jsonDecoder.decodeInt(jsonPath + ".offset", json["offset"]);
+      if (json.containsKey('offset')) {
+        offset = jsonDecoder.decodeInt(jsonPath + '.offset', json['offset']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "offset");
+        throw jsonDecoder.mismatch(jsonPath, 'offset');
       }
       int length;
-      if (json.containsKey("length")) {
-        length = jsonDecoder.decodeInt(jsonPath + ".length", json["length"]);
+      if (json.containsKey('length')) {
+        length = jsonDecoder.decodeInt(jsonPath + '.length', json['length']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "length");
+        throw jsonDecoder.mismatch(jsonPath, 'length');
       }
       String replacement;
-      if (json.containsKey("replacement")) {
+      if (json.containsKey('replacement')) {
         replacement = jsonDecoder.decodeString(
-            jsonPath + ".replacement", json["replacement"]);
+            jsonPath + '.replacement', json['replacement']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "replacement");
+        throw jsonDecoder.mismatch(jsonPath, 'replacement');
       }
       String id;
-      if (json.containsKey("id")) {
-        id = jsonDecoder.decodeString(jsonPath + ".id", json["id"]);
+      if (json.containsKey('id')) {
+        id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
       }
       return SourceEdit(offset, length, replacement, id: id);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "SourceEdit", json);
+      throw jsonDecoder.mismatch(jsonPath, 'SourceEdit', json);
     }
   }
 
@@ -5220,11 +5220,11 @@
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["offset"] = offset;
-    result["length"] = length;
-    result["replacement"] = replacement;
+    result['offset'] = offset;
+    result['length'] = length;
+    result['replacement'] = replacement;
     if (id != null) {
-      result["id"] = id;
+      result['id'] = id;
     }
     return result;
   }
@@ -5323,40 +5323,40 @@
     json ??= {};
     if (json is Map) {
       String file;
-      if (json.containsKey("file")) {
-        file = jsonDecoder.decodeString(jsonPath + ".file", json["file"]);
+      if (json.containsKey('file')) {
+        file = jsonDecoder.decodeString(jsonPath + '.file', json['file']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "file");
+        throw jsonDecoder.mismatch(jsonPath, 'file');
       }
       int fileStamp;
-      if (json.containsKey("fileStamp")) {
+      if (json.containsKey('fileStamp')) {
         fileStamp =
-            jsonDecoder.decodeInt(jsonPath + ".fileStamp", json["fileStamp"]);
+            jsonDecoder.decodeInt(jsonPath + '.fileStamp', json['fileStamp']);
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "fileStamp");
+        throw jsonDecoder.mismatch(jsonPath, 'fileStamp');
       }
       List<SourceEdit> edits;
-      if (json.containsKey("edits")) {
+      if (json.containsKey('edits')) {
         edits = jsonDecoder.decodeList(
-            jsonPath + ".edits",
-            json["edits"],
+            jsonPath + '.edits',
+            json['edits'],
             (String jsonPath, Object json) =>
                 SourceEdit.fromJson(jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "edits");
+        throw jsonDecoder.mismatch(jsonPath, 'edits');
       }
       return SourceFileEdit(file, fileStamp, edits: edits);
     } else {
-      throw jsonDecoder.mismatch(jsonPath, "SourceFileEdit", json);
+      throw jsonDecoder.mismatch(jsonPath, 'SourceFileEdit', json);
     }
   }
 
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["file"] = file;
-    result["fileStamp"] = fileStamp;
-    result["edits"] = edits.map((SourceEdit value) => value.toJson()).toList();
+    result['file'] = file;
+    result['fileStamp'] = fileStamp;
+    result['edits'] = edits.map((SourceEdit value) => value.toJson()).toList();
     return result;
   }
 
diff --git a/pkg/analysis_server_client/test/server_test.dart b/pkg/analysis_server_client/test/server_test.dart
index 78f4c33..b6fe443 100644
--- a/pkg/analysis_server_client/test/server_test.dart
+++ b/pkg/analysis_server_client/test/server_test.dart
@@ -201,11 +201,11 @@
   void write(Object obj) {}
 
   @override
-  void writeAll(Iterable objects, [String separator = ""]) {}
+  void writeAll(Iterable objects, [String separator = '']) {}
 
   @override
   void writeCharCode(int charCode) {}
 
   @override
-  void writeln([Object obj = ""]) {}
+  void writeln([Object obj = '']) {}
 }
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 5a61207..70d6aa7 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -44,97 +44,71 @@
 import 'package:path/src/context.dart';
 import 'package:yaml/yaml.dart';
 
-/**
- * A utility class used to build an analysis context for a given directory.
- *
- * The construction of analysis contexts is as follows:
- *
- * 1. Determine how package: URI's are to be resolved. This follows the lookup
- *    algorithm defined by the [package specification][1].
- *
- * 2. Using the results of step 1, look in each package for an embedder file
- *    (_embedder.yaml). If one exists then it defines the SDK. If multiple such
- *    files exist then use the first one found. Otherwise, use the default SDK.
- *
- * 3. Look for an analysis options file (`analysis_options.yaml` or
- *    `.analysis_options`) and process the options in the file.
- *
- * 4. Create a new context. Initialize its source factory based on steps 1, 2
- *    and 3. Initialize its analysis options from step 4.
- *
- * [1]: https://github.com/dart-lang/dart_enhancement_proposals/blob/master/Accepted/0005%20-%20Package%20Specification/DEP-pkgspec.md.
- */
+/// A utility class used to build an analysis context for a given directory.
+///
+/// The construction of analysis contexts is as follows:
+///
+/// 1. Determine how package: URI's are to be resolved. This follows the lookup
+///    algorithm defined by the [package specification][1].
+///
+/// 2. Using the results of step 1, look in each package for an embedder file
+///    (_embedder.yaml). If one exists then it defines the SDK. If multiple such
+///    files exist then use the first one found. Otherwise, use the default SDK.
+///
+/// 3. Look for an analysis options file (`analysis_options.yaml` or
+///    `.analysis_options`) and process the options in the file.
+///
+/// 4. Create a new context. Initialize its source factory based on steps 1, 2
+///    and 3. Initialize its analysis options from step 4.
+///
+/// [1]: https://github.com/dart-lang/dart_enhancement_proposals/blob/master/Accepted/0005%20-%20Package%20Specification/DEP-pkgspec.md.
 class ContextBuilder {
-  /**
-   * A callback for when analysis drivers are created, which takes all the same
-   * arguments as the dart analysis driver constructor so that plugins may
-   * create their own drivers with the same tools, in theory. Here as a stopgap
-   * until the official plugin API is complete
-   */
+  /// A callback for when analysis drivers are created, which takes all the same
+  /// arguments as the dart analysis driver constructor so that plugins may
+  /// create their own drivers with the same tools, in theory. Here as a stopgap
+  /// until the official plugin API is complete
   static Function onCreateAnalysisDriver;
 
-  /**
-   * The [ResourceProvider] by which paths are converted into [Resource]s.
-   */
+  /// The [ResourceProvider] by which paths are converted into [Resource]s.
   final ResourceProvider resourceProvider;
 
-  /**
-   * The manager used to manage the DartSdk's that have been created so that
-   * they can be shared across contexts.
-   */
+  /// The manager used to manage the DartSdk's that have been created so that
+  /// they can be shared across contexts.
   final DartSdkManager sdkManager;
 
-  /**
-   * The cache containing the contents of overlaid files. If this builder will
-   * be used to build analysis drivers, set the [fileContentOverlay] instead.
-   */
+  /// The cache containing the contents of overlaid files. If this builder will
+  /// be used to build analysis drivers, set the [fileContentOverlay] instead.
   final ContentCache contentCache;
 
-  /**
-   * The options used by the context builder.
-   */
+  /// The options used by the context builder.
   final ContextBuilderOptions builderOptions;
 
-  /**
-   * The scheduler used by any analysis drivers created through this interface.
-   */
+  /// The scheduler used by any analysis drivers created through this interface.
   AnalysisDriverScheduler analysisDriverScheduler;
 
-  /**
-   * The performance log used by any analysis drivers created through this
-   * interface.
-   */
+  /// The performance log used by any analysis drivers created through this
+  /// interface.
   PerformanceLog performanceLog;
 
-  /**
-   * The byte store used by any analysis drivers created through this interface.
-   */
+  /// The byte store used by any analysis drivers created through this interface.
   ByteStore byteStore;
 
-  /**
-   * The file content overlay used by analysis drivers. If this builder will be
-   * used to build analysis contexts, set the [contentCache] instead.
-   */
+  /// The file content overlay used by analysis drivers. If this builder will be
+  /// used to build analysis contexts, set the [contentCache] instead.
   FileContentOverlay fileContentOverlay;
 
-  /**
-   * Whether any analysis driver created through this interface should support
-   * indexing and search.
-   */
+  /// Whether any analysis driver created through this interface should support
+  /// indexing and search.
   bool enableIndex = false;
 
-  /**
-   * Initialize a newly created builder to be ready to build a context rooted in
-   * the directory with the given [rootDirectoryPath].
-   */
+  /// Initialize a newly created builder to be ready to build a context rooted in
+  /// the directory with the given [rootDirectoryPath].
   ContextBuilder(this.resourceProvider, this.sdkManager, this.contentCache,
       {ContextBuilderOptions options})
       : builderOptions = options ?? ContextBuilderOptions();
 
-  /**
-   * Return an analysis driver that is configured correctly to analyze code in
-   * the directory with the given [path].
-   */
+  /// Return an analysis driver that is configured correctly to analyze code in
+  /// the directory with the given [path].
   AnalysisDriver buildDriver(ContextRoot contextRoot) {
     String path = contextRoot.root;
     AnalysisOptions options =
@@ -180,9 +154,7 @@
     return driver;
   }
 
-  /**
-   * Return an analysis options object containing the default option values.
-   */
+  /// Return an analysis options object containing the default option values.
   AnalysisOptions createDefaultOptions() {
     AnalysisOptions defaultOptions = builderOptions.defaultOptions;
     if (defaultOptions == null) {
@@ -218,7 +190,7 @@
     String filePath = builderOptions.defaultPackageFilePath;
     if (filePath != null) {
       File configFile = resourceProvider.getFile(filePath);
-      return parseDotPackagesFile(resourceProvider, configFile);
+      return parsePackagesFile(resourceProvider, configFile);
     }
     String directoryPath = builderOptions.defaultPackagesDirectoryPath;
     if (directoryPath != null) {
@@ -239,10 +211,8 @@
     return workspace.createSourceFactory(sdk, summaryData);
   }
 
-  /**
-   * Add any [declaredVariables] to the list of declared variables used by the
-   * given analysis [driver].
-   */
+  /// Add any [declaredVariables] to the list of declared variables used by the
+  /// given analysis [driver].
   void declareVariablesInDriver(AnalysisDriver driver) {
     Map<String, String> variables = builderOptions.declaredVariables;
     if (variables != null && variables.isNotEmpty) {
@@ -251,21 +221,19 @@
     }
   }
 
-  /**
-   * Finds a package resolution strategy for the directory at the given absolute
-   * [path].
-   *
-   * This function first tries to locate a `.packages` file in the 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.empty].
-   */
+  /// Finds a package resolution strategy for the directory at the given absolute
+  /// [path].
+  ///
+  /// This function first tries to locate a `.packages` file in the 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.empty].
   Packages findPackagesFromFile(String path) {
     Resource location = _findPackagesLocation(path);
     if (location is File) {
       try {
-        return parseDotPackagesFile(resourceProvider, location);
+        return parsePackagesFile(resourceProvider, location);
       } catch (_) {
         return Packages.empty;
       }
@@ -275,12 +243,10 @@
     return Packages.empty;
   }
 
-  /**
-   * Return the SDK that should be used to analyze code. Use the given
-   * [workspace] and [analysisOptions] to locate the SDK.
-   *
-   * TODO(scheglov) Remove [analysisOptions]?
-   */
+  /// Return the SDK that should be used to analyze code. Use the given
+  /// [workspace] and [analysisOptions] to locate the SDK.
+  ///
+  /// TODO(scheglov) Remove [analysisOptions]?
   DartSdk findSdk(Workspace workspace, AnalysisOptions analysisOptions) {
     String summaryPath = builderOptions.dartSdkSummaryPath;
     if (summaryPath != null) {
@@ -399,14 +365,12 @@
     return options;
   }
 
-  /**
-   * Return the analysis options file that should be used when analyzing code in
-   * the directory with the given [path].
-   *
-   * If [forceSearch] is true, then don't return the default analysis options
-   * path. This allows cli to locate what *would* have been the analysis options
-   * file path, and super-impose the defaults over it in-place.
-   */
+  /// Return the analysis options file that should be used when analyzing code in
+  /// the directory with the given [path].
+  ///
+  /// If [forceSearch] is true, then don't return the default analysis options
+  /// path. This allows cli to locate what *would* have been the analysis options
+  /// file path, and super-impose the defaults over it in-place.
   File getOptionsFile(String path, {bool forceSearch = false}) {
     if (!forceSearch) {
       String filePath = builderOptions.defaultAnalysisOptionsFilePath;
@@ -430,14 +394,12 @@
     return null;
   }
 
-  /**
-   * Create a [Packages] object for a 'package' directory ([folder]).
-   *
-   * Package names are resolved as relative to sub-directories of the package
-   * directory.
-   *
-   * TODO(scheglov) Remove this feature
-   */
+  /// Create a [Packages] object for a 'package' directory ([folder]).
+  ///
+  /// Package names are resolved as relative to sub-directories of the package
+  /// directory.
+  ///
+  /// TODO(scheglov) Remove this feature
   Packages getPackagesFromFolder(Folder folder) {
     Context pathContext = resourceProvider.pathContext;
     var map = <String, Package>{};
@@ -460,9 +422,7 @@
     return Packages(map);
   }
 
-  /**
-   * Resolve any symbolic links encoded in the path to the given [folder].
-   */
+  /// Resolve any symbolic links encoded in the path to the given [folder].
   String resolveSymbolicLink(Folder folder) {
     try {
       return folder.resolveSymbolicLinksSync().path;
@@ -471,10 +431,8 @@
     }
   }
 
-  /**
-   * Resolve any symbolic links encoded in the URI's in the given [map] by
-   * replacing the values in the map.
-   */
+  /// Resolve any symbolic links encoded in the URI's in the given [map] by
+  /// replacing the values in the map.
   void resolveSymbolicLinks(Map<String, Uri> map) {
     Context pathContext = resourceProvider.pathContext;
     for (String packageName in map.keys) {
@@ -489,23 +447,28 @@
     }
   }
 
-  /**
-   * Find the location of the package resolution file/directory for the
-   * directory at the given absolute [path].
-   *
-   * Checks for a `.packages` file in the [path]. If not found,
-   * checks for a `packages` directory in the same directory. If still not
-   * found, starts checking parent directories for `.packages` until reaching
-   * the root directory.
-   *
-   * Return a [File] object representing a `.packages` file if one is found, a
-   * [Folder] object for the `packages/` directory if that is found, or `null`
-   * if neither is found.
-   */
+  /// Find the location of the package resolution file/directory for the
+  /// directory at the given absolute [path].
+  ///
+  /// Checks for a `.packages` file in the [path]. If not found,
+  /// checks for a `packages` directory in the same directory. If still not
+  /// found, starts checking parent directories for `.packages` until reaching
+  /// the root directory.
+  ///
+  /// Return a [File] object representing a `.packages` file if one is found, a
+  /// [Folder] object for the `packages/` directory if that is found, or `null`
+  /// if neither is found.
   Resource _findPackagesLocation(String path) {
     var resource = resourceProvider.getResource(path);
     while (resource != null) {
       if (resource is Folder) {
+        var packageConfigFile = resource
+            .getChildAssumingFolder('.dart_tool')
+            .getChildAssumingFile('package_config.json');
+        if (packageConfigFile.exists) {
+          return packageConfigFile;
+        }
+
         var dotPackagesFile = resource.getChildAssumingFile('.packages');
         if (dotPackagesFile.exists) {
           return dotPackagesFile;
@@ -521,10 +484,8 @@
     return null;
   }
 
-  /**
-   * Return the `pubspec.yaml` file that should be used when analyzing code in
-   * the directory with the given [path], possibly `null`.
-   */
+  /// Return the `pubspec.yaml` file that should be used when analyzing code in
+  /// the directory with the given [path], possibly `null`.
   File _findPubspecFile(String path) {
     var resource = resourceProvider.getResource(path);
     while (resource != null) {
@@ -565,10 +526,8 @@
     return workspace;
   }
 
-  /**
-   * Return `true` if either the directory at [rootPath] or a parent of that
-   * directory contains a `.packages` file.
-   */
+  /// Return `true` if either the directory at [rootPath] or a parent of that
+  /// directory contains a `.packages` file.
   static bool _hasPackageFileInPath(
       ResourceProvider resourceProvider, String rootPath) {
     Folder folder = resourceProvider.getFolder(rootPath);
@@ -583,113 +542,79 @@
   }
 }
 
-/**
- * Options used by a [ContextBuilder].
- */
+/// Options used by a [ContextBuilder].
 class ContextBuilderOptions {
-  /**
-   * The results of parsing the command line arguments as defined by
-   * [defineAnalysisArguments] or `null` if none.
-   */
+  /// The results of parsing the command line arguments as defined by
+  /// [defineAnalysisArguments] or `null` if none.
   ArgResults argResults;
 
-  /**
-   * The file path of the file containing the summary of the SDK that should be
-   * used to "analyze" the SDK. This option should only be specified by
-   * command-line tools such as 'dartanalyzer' or 'ddc'.
-   */
+  /// The file path of the file containing the summary of the SDK that should be
+  /// used to "analyze" the SDK. This option should only be specified by
+  /// command-line tools such as 'dartanalyzer' or 'ddc'.
   String dartSdkSummaryPath;
 
-  /**
-   * The file path of the analysis options file that should be used in place of
-   * any file in the root directory or a parent of the root directory, or `null`
-   * if the normal lookup mechanism should be used.
-   */
+  /// The file path of the analysis options file that should be used in place of
+  /// any file in the root directory or a parent of the root directory, or `null`
+  /// if the normal lookup mechanism should be used.
   String defaultAnalysisOptionsFilePath;
 
-  /**
-   * A table mapping variable names to values for the declared variables, or
-   * `null` if no additional variables should be declared.
-   */
+  /// A table mapping variable names to values for the declared variables, or
+  /// `null` if no additional variables should be declared.
   Map<String, String> declaredVariables;
 
-  /**
-   * The default analysis options that should be used unless some or all of them
-   * are overridden in the analysis options file, or `null` if the default
-   * defaults should be used.
-   */
+  /// The default analysis options that should be used unless some or all of them
+  /// are overridden in the analysis options file, or `null` if the default
+  /// defaults should be used.
   AnalysisOptions defaultOptions;
 
-  /**
-   * The file path of the .packages file that should be used in place of any
-   * file found using the normal (Package Specification DEP) lookup mechanism,
-   * or `null` if the normal lookup mechanism should be used.
-   */
+  /// The file path of the .packages file that should be used in place of any
+  /// file found using the normal (Package Specification DEP) lookup mechanism,
+  /// or `null` if the normal lookup mechanism should be used.
   String defaultPackageFilePath;
 
-  /**
-   * The file path of the packages directory that should be used in place of any
-   * file found using the normal (Package Specification DEP) lookup mechanism,
-   * or `null` if the normal lookup mechanism should be used.
-   */
+  /// The file path of the packages directory that should be used in place of any
+  /// file found using the normal (Package Specification DEP) lookup mechanism,
+  /// or `null` if the normal lookup mechanism should be used.
   String defaultPackagesDirectoryPath;
 
-  /**
-   * A list of the paths of summary files that are to be used, or `null` if no
-   * summary information is available.
-   */
+  /// A list of the paths of summary files that are to be used, or `null` if no
+  /// summary information is available.
   List<String> librarySummaryPaths;
 
-  /**
-   * Initialize a newly created set of options
-   */
+  /// Initialize a newly created set of options
   ContextBuilderOptions();
 }
 
-/**
- * Given a package map, check in each package's lib directory for the existence
- * of an `_embedder.yaml` file. If the file contains a top level YamlMap, it
- * will be added to the [embedderYamls] map.
- */
+/// Given a package map, check in each package's lib directory for the existence
+/// of an `_embedder.yaml` file. If the file contains a top level YamlMap, it
+/// will be added to the [embedderYamls] map.
 class EmbedderYamlLocator {
-  /**
-   * The name of the embedder files being searched for.
-   */
+  /// The name of the embedder files being searched for.
   static const String EMBEDDER_FILE_NAME = '_embedder.yaml';
 
-  /**
-   * A mapping from a package's library directory to the parsed YamlMap.
-   */
+  /// A mapping from a package's library directory to the parsed YamlMap.
   final Map<Folder, YamlMap> embedderYamls = HashMap<Folder, YamlMap>();
 
-  /**
-   * Initialize a newly created locator by processing the packages in the given
-   * [packageMap].
-   */
+  /// Initialize a newly created locator by processing the packages in the given
+  /// [packageMap].
   EmbedderYamlLocator(Map<String, List<Folder>> packageMap) {
     if (packageMap != null) {
       _processPackageMap(packageMap);
     }
   }
 
-  /**
-   * Initialize with the given [libFolder] of `sky_engine` package.
-   */
+  /// Initialize with the given [libFolder] of `sky_engine` package.
   EmbedderYamlLocator.forLibFolder(Folder libFolder) {
     _processPackage([libFolder]);
   }
 
-  /**
-   * Programmatically add an `_embedder.yaml` mapping.
-   */
+  /// Programmatically add an `_embedder.yaml` mapping.
   void addEmbedderYaml(Folder libDir, String embedderYaml) {
     _processEmbedderYaml(libDir, embedderYaml);
   }
 
-  /**
-   * Refresh the map of located files to those found by processing the given
-   * [packageMap].
-   */
+  /// Refresh the map of located files to those found by processing the given
+  /// [packageMap].
   void refresh(Map<String, List<Folder>> packageMap) {
     // Clear existing.
     embedderYamls.clear();
@@ -698,10 +623,8 @@
     }
   }
 
-  /**
-   * Given the yaml for an embedder ([embedderYaml]) and a folder ([libDir]),
-   * setup the uri mapping.
-   */
+  /// Given the yaml for an embedder ([embedderYaml]) and a folder ([libDir]),
+  /// setup the uri mapping.
   void _processEmbedderYaml(Folder libDir, String embedderYaml) {
     try {
       YamlNode yaml = loadYaml(embedderYaml);
@@ -713,10 +636,8 @@
     }
   }
 
-  /**
-   * Given a package list of folders ([libDirs]), process any
-   * `_embedder.yaml` files that are found in any of the folders.
-   */
+  /// Given a package list of folders ([libDirs]), process any
+  /// `_embedder.yaml` files that are found in any of the folders.
   void _processPackage(List<Folder> libDirs) {
     for (Folder libDir in libDirs) {
       String embedderYaml = _readEmbedderYaml(libDir);
@@ -726,17 +647,13 @@
     }
   }
 
-  /**
-   * Process each of the entries in the [packageMap].
-   */
+  /// Process each of the entries in the [packageMap].
   void _processPackageMap(Map<String, List<Folder>> packageMap) {
     packageMap.values.forEach(_processPackage);
   }
 
-  /**
-   * Read and return the contents of [libDir]/[EMBEDDER_FILE_NAME], or `null` if
-   * the file doesn't exist.
-   */
+  /// Read and return the contents of [libDir]/[EMBEDDER_FILE_NAME], or `null` if
+  /// the file doesn't exist.
   String _readEmbedderYaml(Folder libDir) {
     File file = libDir.getChild(EMBEDDER_FILE_NAME);
     try {
diff --git a/pkg/analyzer/lib/src/context/packages.dart b/pkg/analyzer/lib/src/context/packages.dart
index b66b107..9c8d40c 100644
--- a/pkg/analyzer/lib/src/context/packages.dart
+++ b/pkg/analyzer/lib/src/context/packages.dart
@@ -110,6 +110,26 @@
   return Packages(map);
 }
 
+/// Check the content of the [file], and parse it as either `.packages` file,
+/// or as a `package_config.json` file, depending on its content (not its
+/// location).  OTOH, if the file has the `.packages` format, still look
+/// for a `.dart_tool/package_config.json` relative to the specified [file].
+Packages parsePackagesFile(ResourceProvider provider, File file) {
+  var content = file.readAsStringSync();
+  var isJson = content.trimLeft().startsWith('{');
+  if (isJson) {
+    return parsePackageConfigJsonFile(provider, file);
+  } else {
+    var relativePackageConfigFile = file.parent
+        .getChildAssumingFolder('.dart_tool')
+        .getChildAssumingFile('package_config.json');
+    if (relativePackageConfigFile.exists) {
+      return parsePackageConfigJsonFile(provider, relativePackageConfigFile);
+    }
+    return parseDotPackagesFile(provider, file);
+  }
+}
+
 class Package {
   final String name;
   final Folder rootFolder;
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 4bdecbe..b3a9d12 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -217,7 +217,9 @@
 
   @override
   void visitAsExpression(AsExpression node) {
-    _checkForUnnecessaryCast(node);
+    if (isUnnecessaryCast(node, _typeSystem)) {
+      _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node);
+    }
     super.visitAsExpression(node);
   }
 
@@ -1160,54 +1162,6 @@
     }
   }
 
-  /// Check for the passed as expression for the [HintCode.UNNECESSARY_CAST]
-  /// hint code.
-  ///
-  /// @param node the as expression to check
-  /// @return `true` if and only if a hint code is generated on the passed node
-  /// See [HintCode.UNNECESSARY_CAST].
-  bool _checkForUnnecessaryCast(AsExpression node) {
-    // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to
-    // remove the (x is! TypeParameterType) checks.
-    AstNode parent = node.parent;
-    if (parent is ConditionalExpression &&
-        (node == parent.thenExpression || node == parent.elseExpression)) {
-      Expression thenExpression = parent.thenExpression;
-      DartType thenType;
-      if (thenExpression is AsExpression) {
-        thenType = thenExpression.expression.staticType;
-      } else {
-        thenType = thenExpression.staticType;
-      }
-      Expression elseExpression = parent.elseExpression;
-      DartType elseType;
-      if (elseExpression is AsExpression) {
-        elseType = elseExpression.expression.staticType;
-      } else {
-        elseType = elseExpression.staticType;
-      }
-      if (thenType != null &&
-          elseType != null &&
-          !thenType.isDynamic &&
-          !elseType.isDynamic &&
-          !_typeSystem.isSubtypeOf(thenType, elseType) &&
-          !_typeSystem.isSubtypeOf(elseType, thenType)) {
-        return false;
-      }
-    }
-    DartType lhsType = node.expression.staticType;
-    DartType rhsType = node.type.type;
-    if (lhsType != null &&
-        rhsType != null &&
-        !lhsType.isDynamic &&
-        !rhsType.isDynamic &&
-        _typeSystem.isSubtypeOf(lhsType, rhsType)) {
-      _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node);
-      return true;
-    }
-    return false;
-  }
-
   /// Generate a hint for `noSuchMethod` methods that do nothing except of
   /// calling another `noSuchMethod` that is not defined by `Object`.
   ///
@@ -1346,6 +1300,52 @@
     return _workspacePackage.contains(library.source);
   }
 
+  /// Checks for the passed as expression for the [HintCode.UNNECESSARY_CAST]
+  /// hint code.
+  ///
+  /// Returns `true` if and only if an unnecessary cast hint should be generated
+  /// on [node].  See [HintCode.UNNECESSARY_CAST].
+  static bool isUnnecessaryCast(AsExpression node, TypeSystem typeSystem) {
+    // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to
+    // remove the (x is! TypeParameterType) checks.
+    AstNode parent = node.parent;
+    if (parent is ConditionalExpression &&
+        (node == parent.thenExpression || node == parent.elseExpression)) {
+      Expression thenExpression = parent.thenExpression;
+      DartType thenType;
+      if (thenExpression is AsExpression) {
+        thenType = thenExpression.expression.staticType;
+      } else {
+        thenType = thenExpression.staticType;
+      }
+      Expression elseExpression = parent.elseExpression;
+      DartType elseType;
+      if (elseExpression is AsExpression) {
+        elseType = elseExpression.expression.staticType;
+      } else {
+        elseType = elseExpression.staticType;
+      }
+      if (thenType != null &&
+          elseType != null &&
+          !thenType.isDynamic &&
+          !elseType.isDynamic &&
+          !typeSystem.isSubtypeOf(thenType, elseType) &&
+          !typeSystem.isSubtypeOf(elseType, thenType)) {
+        return false;
+      }
+    }
+    DartType lhsType = node.expression.staticType;
+    DartType rhsType = node.type.type;
+    if (lhsType != null &&
+        rhsType != null &&
+        !lhsType.isDynamic &&
+        !rhsType.isDynamic &&
+        typeSystem.isSubtypeOf(lhsType, rhsType)) {
+      return true;
+    }
+    return false;
+  }
+
   /// Return the message in the deprecated annotation on the given [element], or
   /// `null` if the element doesn't have a deprecated annotation or if the
   /// annotation does not have a message.
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 7928459..4ab22f4 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1497,6 +1497,9 @@
   @override
   void endFunctionTypedFormalParameter(Token nameToken, Token question) {
     debugEvent("FunctionTypedFormalParameter");
+    if (!enableNonNullable) {
+      reportErrorIfNullableType(question);
+    }
 
     FormalParameterList formalParameters = pop();
     TypeAnnotation returnType = pop();
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 53ea208..a5d61ba 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -237,7 +237,7 @@
       packageConfigPath = pathContext.normalize(packageConfigPath);
 
       try {
-        var packages = parseDotPackagesFile(
+        var packages = parsePackagesFile(
           resourceProvider,
           resourceProvider.getFile(packageConfigPath),
         );
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 12bcfe9..c53961a 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -23,6 +23,10 @@
     return _node(search, (n) => true);
   }
 
+  AsExpression as_(String search) {
+    return _node(search, (n) => n is AsExpression);
+  }
+
   AssignmentExpression assignment(String search) {
     return _node(search, (n) => n is AssignmentExpression);
   }
diff --git a/pkg/analyzer/lib/src/workspace/gn.dart b/pkg/analyzer/lib/src/workspace/gn.dart
index e0aae5f..fcef98c 100644
--- a/pkg/analyzer/lib/src/workspace/gn.dart
+++ b/pkg/analyzer/lib/src/workspace/gn.dart
@@ -142,7 +142,7 @@
 
         var packageMap = <String, List<Folder>>{};
         for (var packagesFile in packagesFiles) {
-          var packages = parseDotPackagesFile(provider, packagesFile);
+          var packages = parsePackagesFile(provider, packagesFile);
           for (var package in packages.packages) {
             packageMap[package.name] = [package.libFolder];
           }
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index d1b571d..2b9898e 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -6,11 +6,11 @@
 import 'package:_fe_analyzer_shared/src/parser/forwarding_listener.dart'
     as fasta;
 import 'package:_fe_analyzer_shared/src/parser/parser.dart' as fasta;
+import 'package:_fe_analyzer_shared/src/scanner/error_token.dart'
+    show ErrorToken;
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta;
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
     show LanguageVersionToken, ScannerConfiguration, ScannerResult, scanString;
-import 'package:_fe_analyzer_shared/src/scanner/error_token.dart'
-    show ErrorToken;
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart' as analyzer;
@@ -2442,6 +2442,73 @@
     expect(functionParameter.question, isNotNull);
   }
 
+  void test_functionTyped_named_nullable() {
+    ParameterKind kind = ParameterKind.NAMED;
+    var defaultParameter =
+        parseNNBDFormalParameter('a()? : null', kind) as DefaultFormalParameter;
+    var functionParameter =
+        defaultParameter.parameter as FunctionTypedFormalParameter;
+    assertNoErrors();
+    expect(functionParameter.returnType, isNull);
+    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.typeParameters, isNull);
+    expect(functionParameter.parameters, isNotNull);
+    expect(functionParameter.isNamed, isTrue);
+    expect(functionParameter.question, isNotNull);
+    expect(defaultParameter.separator, isNotNull);
+    expect(defaultParameter.defaultValue, isNotNull);
+    expect(defaultParameter.isNamed, isTrue);
+  }
+
+  void test_functionTyped_named_nullable_disabled() {
+    ParameterKind kind = ParameterKind.NAMED;
+    var defaultParameter = parseFormalParameter('a()? : null', kind,
+            errorCodes: [ParserErrorCode.EXPERIMENT_NOT_ENABLED])
+        as DefaultFormalParameter;
+    var functionParameter =
+        defaultParameter.parameter as FunctionTypedFormalParameter;
+    expect(functionParameter.returnType, isNull);
+    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.typeParameters, isNull);
+    expect(functionParameter.parameters, isNotNull);
+    expect(functionParameter.isNamed, isTrue);
+    expect(functionParameter.question, isNotNull);
+    expect(defaultParameter.separator, isNotNull);
+    expect(defaultParameter.defaultValue, isNotNull);
+    expect(defaultParameter.isNamed, isTrue);
+  }
+
+  void test_functionTyped_positional_nullable_disabled() {
+    ParameterKind kind = ParameterKind.POSITIONAL;
+    var defaultParameter = parseFormalParameter('a()? = null', kind,
+            errorCodes: [ParserErrorCode.EXPERIMENT_NOT_ENABLED])
+        as DefaultFormalParameter;
+    var functionParameter =
+        defaultParameter.parameter as FunctionTypedFormalParameter;
+    expect(functionParameter.returnType, isNull);
+    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.typeParameters, isNull);
+    expect(functionParameter.parameters, isNotNull);
+    expect(functionParameter.isOptionalPositional, isTrue);
+    expect(functionParameter.question, isNotNull);
+    expect(defaultParameter.separator, isNotNull);
+    expect(defaultParameter.defaultValue, isNotNull);
+    expect(defaultParameter.isOptionalPositional, isTrue);
+  }
+
+  void test_functionTyped_required_nullable_disabled() {
+    ParameterKind kind = ParameterKind.REQUIRED;
+    var functionParameter = parseFormalParameter('a()?', kind,
+            errorCodes: [ParserErrorCode.EXPERIMENT_NOT_ENABLED])
+        as FunctionTypedFormalParameter;
+    expect(functionParameter.returnType, isNull);
+    expect(functionParameter.identifier, isNotNull);
+    expect(functionParameter.typeParameters, isNull);
+    expect(functionParameter.parameters, isNotNull);
+    expect(functionParameter.isRequiredPositional, isTrue);
+    expect(functionParameter.question, isNotNull);
+  }
+
   void test_parseFormalParameter_covariant_required_named() {
     ParameterKind kind = ParameterKind.NAMED;
     FormalParameter parameter = parseNNBDFormalParameter(
@@ -2585,24 +2652,6 @@
     expect(defaultParameter.isNamed, isTrue);
   }
 
-  void test_parseNormalFormalParameter_function_named_nullable() {
-    ParameterKind kind = ParameterKind.NAMED;
-    var defaultParameter =
-        parseFormalParameter('a()? : null', kind) as DefaultFormalParameter;
-    var functionParameter =
-        defaultParameter.parameter as FunctionTypedFormalParameter;
-    assertNoErrors();
-    expect(functionParameter.returnType, isNull);
-    expect(functionParameter.identifier, isNotNull);
-    expect(functionParameter.typeParameters, isNull);
-    expect(functionParameter.parameters, isNotNull);
-    expect(functionParameter.isNamed, isTrue);
-    expect(functionParameter.question, isNotNull);
-    expect(defaultParameter.separator, isNotNull);
-    expect(defaultParameter.defaultValue, isNotNull);
-    expect(defaultParameter.isNamed, isTrue);
-  }
-
   void test_parseNormalFormalParameter_function_noType_nullable() {
     NormalFormalParameter parameter =
         parseNNBDFormalParameter('a()?', ParameterKind.REQUIRED);
@@ -2748,6 +2797,12 @@
     parseCompilationUnit('main() { for(int? x in [7, null]) { } }');
   }
 
+  void test_functionTypedFormalParameter_nullable_disabled() {
+    parseCompilationUnit('void f(void p()?) {}',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 15, 1)],
+        featureSet: preNonNullable);
+  }
+
   test_fuzz_38113() async {
     // https://github.com/dart-lang/sdk/issues/38113
     await parseCompilationUnit(r'+t{{r?this}}', errors: [
@@ -3221,6 +3276,12 @@
     var innerExpression = outerExpression.operand as PostfixExpression;
     expect(innerExpression.operator.type, TokenType.PLUS_PLUS);
   }
+
+  void test_typeName_nullable_disabled() {
+    parseCompilationUnit('int? x;',
+        errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 3, 1)],
+        featureSet: preNonNullable);
+  }
 }
 
 /**
@@ -4358,6 +4419,14 @@
         featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
   }
 
+  void test_class_disabled_single() {
+    parseCompilationUnit('class A<out T> { }',
+        errors: [
+          expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 3),
+        ],
+        featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+  }
+
   void test_class_enabled_multiple() {
     var unit = parseCompilationUnit('class A<in T, inout U, out V, W> { }');
     expect(unit.declarations, hasLength(1));
@@ -4390,14 +4459,6 @@
         isNull);
   }
 
-  void test_class_disabled_single() {
-    parseCompilationUnit('class A<out T> { }',
-        errors: [
-          expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 3),
-        ],
-        featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
-  }
-
   void test_class_enabled_multipleVariances() {
     var unit = parseCompilationUnit('class A<in out inout T> { }', errors: [
       expectedError(ParserErrorCode.MULTIPLE_VARIANCE_MODIFIERS, 11, 3),
diff --git a/pkg/analyzer/test/src/context/packages_test.dart b/pkg/analyzer/test/src/context/packages_test.dart
index 044313a..2868970 100644
--- a/pkg/analyzer/test/src/context/packages_test.dart
+++ b/pkg/analyzer/test/src/context/packages_test.dart
@@ -200,6 +200,81 @@
     );
   }
 
+  test_parsePackagesFile_dotPackages() {
+    var path = convertPath('/test/.packages');
+    newFile(path, content: '''
+bbb:${toUriStr('/packages/bbb/lib')}
+''');
+
+    var packages = parsePackagesFile(resourceProvider, getFile(path));
+
+    _assertPackage(
+      packages,
+      name: 'bbb',
+      expectedLibPath: '/packages/bbb/lib',
+      expectedVersion: null,
+    );
+  }
+
+  test_parsePackagesFile_packageConfig() {
+    var path = convertPath('/test/.dart_tool/package_config.json');
+    newFile(path, content: '''
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "aaa",
+      "rootUri": "${toUriStr('/packages/aaa')}",
+      "packageUri": "lib/",
+      "languageVersion": "2.3"
+    }
+  ]
+}
+''');
+
+    var packages = parsePackagesFile(resourceProvider, getFile(path));
+
+    _assertPackage(
+      packages,
+      name: 'aaa',
+      expectedLibPath: '/packages/aaa/lib',
+      expectedVersion: Version(2, 3, 0),
+    );
+  }
+
+  test_parsePackagesFile_packageConfig_fromDotPackages() {
+    newFile('/test/.dart_tool/package_config.json', content: '''
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "aaa",
+      "rootUri": "${toUriStr('/packages/aaa')}",
+      "packageUri": "lib/",
+      "languageVersion": "2.3"
+    }
+  ]
+}
+''');
+
+    var dotPackagesPath = '/test/.packages';
+    newFile(dotPackagesPath, content: '''
+bbb:${toUriStr('/packages/bbb/lib')}
+''');
+
+    var packages = parsePackagesFile(
+      resourceProvider,
+      getFile(dotPackagesPath),
+    );
+
+    _assertPackage(
+      packages,
+      name: 'aaa',
+      expectedLibPath: '/packages/aaa/lib',
+      expectedVersion: Version(2, 3, 0),
+    );
+  }
+
   void _assertPackage(
     Packages packages, {
     @required String name,
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 3ac81c7..f3dc01d 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -590,7 +590,7 @@
     if (options.packageConfigPath != null) {
       String path = normalizePath(options.packageConfigPath);
       try {
-        var packages = parseDotPackagesFile(
+        var packages = parsePackagesFile(
           resourceProvider,
           resourceProvider.getFile(path),
         );
diff --git a/pkg/analyzer_plugin/analysis_options.yaml b/pkg/analyzer_plugin/analysis_options.yaml
index 6f19da5..42d4036 100644
--- a/pkg/analyzer_plugin/analysis_options.yaml
+++ b/pkg/analyzer_plugin/analysis_options.yaml
@@ -39,7 +39,7 @@
     - prefer_is_empty
     - prefer_is_not_empty
     - prefer_iterable_whereType
-    #- prefer_single_quotes # 2076
+    - prefer_single_quotes
     - prefer_spread_collections
     - recursive_getters
     - slash_for_doc_comments
diff --git a/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart b/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart
index e91e598..ec2cc26 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/null_string_sink.dart
@@ -8,11 +8,11 @@
   void write(Object obj) {}
 
   @override
-  void writeAll(Iterable objects, [String separator = ""]) {}
+  void writeAll(Iterable objects, [String separator = '']) {}
 
   @override
   void writeCharCode(int charCode) {}
 
   @override
-  void writeln([Object obj = ""]) {}
+  void writeln([Object obj = '']) {}
 }
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
index 0e2e71e..9bfaea1 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
@@ -514,7 +514,7 @@
     _pendingCommands[id] = completer;
     String line = json.encode(command);
     _recordStdio('SEND: $line');
-    _process.stdin.add(utf8.encoder.convert("$line\n"));
+    _process.stdin.add(utf8.encoder.convert('$line\n'));
     return completer.future;
   }
 
@@ -615,7 +615,7 @@
   /// [debugStdio] has been called.
   void _recordStdio(String line) {
     double elapsedTime = currentElapseTime;
-    line = "$elapsedTime: $line";
+    line = '$elapsedTime: $line';
     if (_debuggingStdio) {
       print(line);
     }
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart b/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
index b4d2665..ff717bd 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
@@ -634,7 +634,7 @@
             writeln(' else {');
             indent(() {
               writeln(
-                  "throw jsonDecoder.mismatch(jsonPath, $fieldNameString);");
+                  'throw jsonDecoder.mismatch(jsonPath, $fieldNameString);');
             });
             writeln('}');
           } else {
diff --git a/pkg/analyzer_plugin/tool/spec/to_html.dart b/pkg/analyzer_plugin/tool/spec/to_html.dart
index f0fc4b2..92ffeb3 100644
--- a/pkg/analyzer_plugin/tool/spec/to_html.dart
+++ b/pkg/analyzer_plugin/tool/spec/to_html.dart
@@ -283,7 +283,7 @@
   }
 
   void generateNotificationsIndex(Iterable<Notification> notifications) {
-    h5(() => write("Notifications"));
+    h5(() => write('Notifications'));
     element('div', {'class': 'subindex'}, () {
       element('ul', {}, () {
         for (var notification in notifications) {
@@ -302,7 +302,7 @@
       return;
     }
     h3(() {
-      write("Refactorings");
+      write('Refactorings');
       write(' (');
       link('refactorings', () => write('\u2191'));
       write(')');
@@ -322,7 +322,7 @@
   }
 
   void generateRequestsIndex(Iterable<Request> requests) {
-    h5(() => write("Requests"));
+    h5(() => write('Requests'));
     element('ul', {}, () {
       for (var request in requests) {
         if (!request.experimental) {
@@ -367,7 +367,7 @@
 
   void generateTypesIndex(Set<String> types) {
     h3(() {
-      write("Types");
+      write('Types');
       write(' (');
       link('types', () => write('\u2191'));
       write(')');
diff --git a/pkg/dartdev/.gitignore b/pkg/dartdev/.gitignore
new file mode 100644
index 0000000..96cf44b
--- /dev/null
+++ b/pkg/dartdev/.gitignore
@@ -0,0 +1,10 @@
+.buildlog
+.DS_Store
+.idea
+.project
+.settings/
+build/
+pubspec.lock
+
+# Directory created by dartdoc
+doc/api/
diff --git a/pkg/dartdev/CHANGELOG.md b/pkg/dartdev/CHANGELOG.md
new file mode 100644
index 0000000..c93158c
--- /dev/null
+++ b/pkg/dartdev/CHANGELOG.md
@@ -0,0 +1,2 @@
+## 0.0.1
+* Initial commit adding `pkg/dartdev/` to the Dart SDK with initial package files
\ No newline at end of file
diff --git a/pkg/dartdev/LICENSE b/pkg/dartdev/LICENSE
new file mode 100644
index 0000000..18daf2b
--- /dev/null
+++ b/pkg/dartdev/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2020, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/dartdev/README.md b/pkg/dartdev/README.md
new file mode 100644
index 0000000..c1aeeeb
--- /dev/null
+++ b/pkg/dartdev/README.md
@@ -0,0 +1,7 @@
+# dartdev
+
+A command-line utility for Dart development.
+
+## Docs
+
+This tool is currently under active development.
\ No newline at end of file
diff --git a/pkg/dartdev/analysis_options.yaml b/pkg/dartdev/analysis_options.yaml
new file mode 100644
index 0000000..84a5e26
--- /dev/null
+++ b/pkg/dartdev/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:pedantic/analysis_options.1.8.0.yaml
diff --git a/pkg/dartdev/bin/dartdev.dart b/pkg/dartdev/bin/dartdev.dart
new file mode 100644
index 0000000..db84729
--- /dev/null
+++ b/pkg/dartdev/bin/dartdev.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:args/command_runner.dart';
+import 'package:dartdev/dartdev.dart';
+
+/// The entry point for dartdev.
+main(List<String> args) async {
+  final runner = DartdevRunner();
+  try {
+    dynamic result = await runner.run(args);
+    exit(result is int ? result : 0);
+  } catch (e) {
+    if (e is UsageException) {
+      stderr.writeln('$e');
+      exit(64);
+    } else {
+      stderr.writeln('$e');
+      exit(1);
+    }
+  }
+}
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
new file mode 100644
index 0000000..8422799
--- /dev/null
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:cli_util/cli_logging.dart';
+
+import 'src/commands/format.dart';
+import 'src/core.dart';
+
+class DartdevRunner extends CommandRunner {
+  static const String dartdevDescription =
+      'A command-line utility for Dart development';
+
+  DartdevRunner() : super('dartdev', '$dartdevDescription.') {
+    argParser.addFlag('verbose',
+        abbr: 'v', negatable: false, help: 'Show verbose output.');
+
+    // The list of currently supported commands:
+    addCommand(FormatCommand());
+  }
+
+  @override
+  Future runCommand(ArgResults results) async {
+    isVerbose = results['verbose'];
+
+    log = isVerbose ? Logger.verbose(ansi: ansi) : Logger.standard(ansi: ansi);
+
+    return await super.runCommand(results);
+  }
+}
diff --git a/pkg/dartdev/lib/src/commands/format.dart b/pkg/dartdev/lib/src/commands/format.dart
new file mode 100644
index 0000000..97c2d7d
--- /dev/null
+++ b/pkg/dartdev/lib/src/commands/format.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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 '../core.dart';
+import '../sdk.dart';
+
+class FormatCommand extends DartdevCommand {
+  FormatCommand() : super('format', 'Format one or more Dart files.') {
+    // TODO(jwren) add all options and flags
+  }
+
+  @override
+  run() async {
+    // TODO(jwren) implement verbose in dart_style
+    // dartfmt doesn't have '-v' or '--verbose', so remove from the argument list
+    var args = List.from(argResults.arguments)
+      ..remove('-v')
+      ..remove('--verbose');
+    var process = await startProcess(sdk.dartfmt, args);
+    routeToStdout(process);
+    return process.exitCode;
+  }
+}
diff --git a/pkg/dartdev/lib/src/core.dart b/pkg/dartdev/lib/src/core.dart
new file mode 100644
index 0000000..b937f19
--- /dev/null
+++ b/pkg/dartdev/lib/src/core.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:args/command_runner.dart';
+import 'package:cli_util/cli_logging.dart';
+
+Ansi ansi = Ansi(Ansi.terminalSupportsAnsi);
+Logger log;
+bool isVerbose = false;
+
+abstract class DartdevCommand extends Command {
+  final String _name;
+  final String _description;
+
+  DartdevCommand(this._name, this._description);
+
+  @override
+  String get name => _name;
+
+  @override
+  String get description => _description;
+}
+
+Future<Process> startProcess(
+  String executable,
+  List<String> arguments, {
+  String cwd,
+}) {
+  log.trace('$executable ${arguments.join(' ')}');
+  return Process.start(executable, arguments, workingDirectory: cwd);
+}
+
+void routeToStdout(
+  Process process, {
+  bool logToTrace = false,
+  void listener(String str),
+}) {
+  if (isVerbose) {
+    _streamLineTransform(process.stdout, (String line) {
+      logToTrace ? log.trace(line.trimRight()) : log.stdout(line.trimRight());
+      if (listener != null) listener(line);
+    });
+    _streamLineTransform(process.stderr, (String line) {
+      log.stderr(line.trimRight());
+      if (listener != null) listener(line);
+    });
+  } else {
+    _streamLineTransform(process.stdout, (String line) {
+      logToTrace ? log.trace(line.trimRight()) : log.stdout(line.trimRight());
+      if (listener != null) listener(line);
+    });
+
+    _streamLineTransform(process.stderr, (String line) {
+      log.stderr(line.trimRight());
+      if (listener != null) listener(line);
+    });
+  }
+}
+
+void routeToStdoutStreaming(Process process) {
+  if (isVerbose) {
+    _streamLineTransform(
+        process.stdout, (line) => log.stdout(line.trimRight()));
+    _streamLineTransform(
+        process.stderr, (line) => log.stderr(line.trimRight()));
+  } else {
+    process.stdout.listen((List<int> data) => stdout.add(data));
+    _streamLineTransform(
+        process.stderr, (line) => log.stderr(line.trimRight()));
+  }
+}
+
+void _streamLineTransform(Stream<List<int>> stream, handler(String line)) {
+  stream
+      .transform(utf8.decoder)
+      .transform(const LineSplitter())
+      .listen(handler);
+}
diff --git a/pkg/dartdev/lib/src/sdk.dart b/pkg/dartdev/lib/src/sdk.dart
new file mode 100644
index 0000000..73afe8d
--- /dev/null
+++ b/pkg/dartdev/lib/src/sdk.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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:cli_util/cli_util.dart';
+import 'package:path/path.dart' as path;
+
+final Sdk sdk = Sdk();
+
+/// A utility class for finding and referencing paths within the Dart SDK.
+class Sdk {
+  final String dir;
+
+  Sdk() : dir = getSdkPath();
+
+  String get dart => path.join(dir, 'bin', _exeName('dart'));
+
+  String get dartanalyzer => path.join(dir, 'bin', _binName('dartanalyzer'));
+
+  String get dartfmt => path.join(dir, 'bin', _binName('dartfmt'));
+
+  String get pub => path.join(dir, 'bin', _binName('pub'));
+
+  static String _binName(String base) =>
+      Platform.isWindows ? '$base.bat' : base;
+
+  static String _exeName(String base) =>
+      Platform.isWindows ? '$base.exe' : base;
+}
diff --git a/pkg/dartdev/lib/src/utils.dart b/pkg/dartdev/lib/src/utils.dart
new file mode 100644
index 0000000..0918d81
--- /dev/null
+++ b/pkg/dartdev/lib/src/utils.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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:intl/intl.dart';
+import 'package:path/path.dart' as path;
+
+/// The directory used to store per-user settings for Dart tooling.
+Directory getDartPrefsDirectory() {
+  return Directory(path.join(getUserHomeDir(), '.dart'));
+}
+
+/// Return the user's home directory.
+String getUserHomeDir() {
+  String envKey = Platform.operatingSystem == 'windows' ? 'APPDATA' : 'HOME';
+  String value = Platform.environment[envKey];
+  return value == null ? '.' : value;
+}
+
+/// A typedef to represent a function taking no arguments and with no return
+/// value.
+typedef void VoidFunction();
+
+final NumberFormat _numberFormat = NumberFormat.decimalPattern();
+
+/// Convert the given number to a string using the current locale.
+String formatNumber(int i) => _numberFormat.format(i);
+
+/// Emit the given word with the correct pluralization.
+String pluralize(String word, int count) => count == 1 ? word : '${word}s';
diff --git a/pkg/dartdev/pubspec.yaml b/pkg/dartdev/pubspec.yaml
new file mode 100644
index 0000000..65aaee2
--- /dev/null
+++ b/pkg/dartdev/pubspec.yaml
@@ -0,0 +1,18 @@
+name: dartdev
+
+# This package is not intended to be published
+publish_to: none
+
+environment:
+  sdk: '>=2.6.0 <3.0.0'
+dependencies:
+  args: ^1.5.2
+  cli_util: ^0.1.0
+  intl: ^0.16.0
+  path: ^1.6.2
+  watcher: ^0.9.7+13
+  yaml: ^2.2.0
+
+dev_dependencies:
+  test: ^1.0.0
+  pedantic: ^1.8.0
\ No newline at end of file
diff --git a/pkg/dartdev/test/command_test.dart b/pkg/dartdev/test/command_test.dart
new file mode 100644
index 0000000..d49fec4
--- /dev/null
+++ b/pkg/dartdev/test/command_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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:test/test.dart';
+
+// TODO(jwren) move the following test utilities to a separate file
+
+// Files that end in _test.dart must have a main method to satisfy the dart2js
+// bots
+void main() {
+  test('empty test for dart2js', () {
+    assert(true == true);
+  });
+}
+
+TestProject project({String mainSrc}) => TestProject(mainSrc: mainSrc);
+
+class TestProject {
+  Directory dir;
+
+  static String get defaultProjectName => 'dartdev_temp';
+
+  String get name => defaultProjectName;
+
+  TestProject({String mainSrc}) {
+    dir = Directory.systemTemp.createTempSync('dartdev');
+    if (mainSrc != null) {
+      file('lib/main.dart', mainSrc);
+    }
+    file('pubspec.yaml', 'name: $name\ndev_dependencies:\n  test: any\n');
+  }
+
+  void file(String name, String contents) {
+    var file = File(path.join(dir.path, name));
+    file.parent.createSync();
+    file.writeAsStringSync(contents);
+  }
+
+  void dispose() {
+    dir.deleteSync(recursive: true);
+  }
+
+  ProcessResult run(String command, [List<String> args]) {
+    var arguments = [
+      path.absolute(path.join(Directory.current.path, 'bin', 'dartdev.dart')),
+      command
+    ];
+    if (args != null && args.isNotEmpty) {
+      arguments.addAll(args);
+    }
+    return Process.runSync(
+      Platform.resolvedExecutable,
+      arguments,
+      workingDirectory: dir.path,
+    );
+  }
+
+  File findFile(String name) {
+    var file = File(path.join(dir.path, name));
+    return file.existsSync() ? file : null;
+  }
+}
diff --git a/pkg/dartdev/test/utils_test.dart b/pkg/dartdev/test/utils_test.dart
new file mode 100644
index 0000000..5850905
--- /dev/null
+++ b/pkg/dartdev/test/utils_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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:dartdev/src/utils.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('pluralize', () {
+    test('zero', () {
+      expect(pluralize('cat', 0), 'cats');
+    });
+
+    test('one', () {
+      expect(pluralize('cat', 1), 'cat');
+    });
+
+    test('many', () {
+      expect(pluralize('cat', 2), 'cats');
+    });
+  });
+}
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index 2306954..c6f12d2 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -305,18 +305,31 @@
   return uri;
 }
 
-/// Adjusts the source paths in [sourceMap] to be relative to [sourceMapPath],
-/// and returns the new map.  Relative paths are in terms of URIs ('/'), not
-/// local OS paths (e.g., windows '\'). Sources with a multi-root scheme
-/// matching [multiRootScheme] are adjusted to be relative to
-/// [multiRootOutputPath].
-// TODO(jmesserly): find a new home for this.
+/// Adjusts the source uris in [sourceMap] to be relative uris, and returns
+/// the new map.
+///
+/// Source uris show up in two forms, absolute `file:` uris and custom
+/// [multiRootScheme] uris (also "absolute" uris, but always relative to some
+/// multi-root).
+///
+/// - `file:` uris are converted to be relative to [sourceMapBase], which
+///   defaults to the dirname of [sourceMapPath] if not provided.
+///
+/// - [multiRootScheme] uris are prefixed by [multiRootOutputPath]. If the
+///   path starts with `/lib`, then we strip that before making it relative
+///   to the [multiRootOutputPath], and assert that [multiRootOutputPath]
+///   starts with `/packages` (more explanation inline).
+///
+// TODO(#40251): Remove this logic from dev_compiler itself, push it to the
+// invokers of dev_compiler which have more knowledge about how they want
+// source paths to look.
 Map placeSourceMap(Map sourceMap, String sourceMapPath, String multiRootScheme,
-    {String multiRootOutputPath}) {
+    {String multiRootOutputPath, String sourceMapBase}) {
   var map = Map.from(sourceMap);
   // Convert to a local file path if it's not.
   sourceMapPath = sourcePathToUri(p.absolute(p.fromUri(sourceMapPath))).path;
   var sourceMapDir = p.url.dirname(sourceMapPath);
+  sourceMapBase ??= sourceMapDir;
   var list = (map['sources'] as List).toList();
 
   String makeRelative(String sourcePath) {
@@ -330,8 +343,17 @@
         var shortPath = uri.path
             .replaceAll('/sdk/', '/dart-sdk/')
             .replaceAll('/sdk_nnbd/', '/dart-sdk/');
+        // A multi-root uri starting with a path under `/lib` indicates that
+        // the multi-root is at the root of a package (typically, the
+        // application root package). These should be converted into a
+        // `/packages` path, we do that by stripping the `/lib` prefix and
+        // relying on the `multiRootOutputPath` to be set to the proper
+        // packages dir (so /packages/<package>).
+        if (shortPath.startsWith('/lib') &&
+            multiRootOutputPath.startsWith('/packages')) {
+          shortPath = shortPath.substring(4);
+        }
         var multiRootPath = "${multiRootOutputPath ?? ''}$shortPath";
-        multiRootPath = multiRootPath;
         multiRootPath = p.url.relative(multiRootPath, from: sourceMapDir);
         return multiRootPath;
       }
@@ -342,7 +364,7 @@
     sourcePath = sourcePathToUri(p.absolute(p.fromUri(uri))).path;
 
     // Fall back to a relative path against the source map itself.
-    sourcePath = p.url.relative(sourcePath, from: sourceMapDir);
+    sourcePath = p.url.relative(sourcePath, from: sourceMapBase);
 
     // Convert from relative local path to relative URI.
     return p.toUri(sourcePath).path;
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 8315891..80014d1 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -536,11 +536,16 @@
   JSCode(this.code, this.sourceMap);
 }
 
+/// Converts [moduleTree] to [JSCode], using [format].
+///
+/// See [placeSourceMap] for a description of [sourceMapBase], [customScheme],
+/// and [multiRootOutputPath] arguments.
 JSCode jsProgramToCode(js_ast.Program moduleTree, ModuleFormat format,
     {bool buildSourceMap = false,
     bool inlineSourceMap = false,
     String jsUrl,
     String mapUrl,
+    String sourceMapBase,
     String customScheme,
     String multiRootOutputPath}) {
   var opts = js_ast.JavaScriptPrintingOptions(
@@ -562,7 +567,7 @@
   Map builtMap;
   if (buildSourceMap && sourceMap != null) {
     builtMap = placeSourceMap(sourceMap.build(jsUrl), mapUrl, customScheme,
-        multiRootOutputPath: multiRootOutputPath);
+        multiRootOutputPath: multiRootOutputPath, sourceMapBase: sourceMapBase);
     var jsDir = p.dirname(p.fromUri(jsUrl));
     var relative = p.relative(p.fromUri(mapUrl), from: jsDir);
     var relativeMapUrl = p.toUri(relative).toString();
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index cd71547..e1e67a1 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -36,11 +36,9 @@
           'dart:async',
           'dart:collection',
           'dart:convert',
-          if (!flags.enableNullSafety) ...[
-            'dart:developer',
-            'dart:io',
-            'dart:isolate'
-          ],
+          'dart:developer',
+          if (!flags.enableNullSafety) 'dart:io',
+          'dart:isolate',
           'dart:js',
           'dart:js_util',
           'dart:math',
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 8e09d8b..85e018a 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -211,8 +211,8 @@
   String requirePath;
   String ddcSdk;
   var archDir = nnbd ? 'ReleaseX64NNBD' : 'ReleaseX64';
+  var sdkRoot = p.dirname(p.dirname(ddcPath));
   if (debug) {
-    var sdkRoot = p.dirname(p.dirname(ddcPath));
     var buildDir = p.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
     dartSdk = p.join(buildDir, archDir, 'dart-sdk');
   }
@@ -261,13 +261,16 @@
 <script>
   require.config({
     paths: {
-        'dart_sdk': '$sdkJsPath/dart_sdk'
+        'dart_sdk': '$sdkJsPath/dart_sdk',
+        'browser-source-map-support':
+          '$sdkRoot/third_party/node-source-map-support/browser-source-map-support'
     },
     waitSeconds: 15
   });
-  require(['dart_sdk', '$basename'],
-        function(sdk, app) {
+  require(['dart_sdk', 'browser-source-map-support', '$basename'],
+        function(sdk, sm, app) {
     'use strict';
+    sm.install();
     if ($nnbd) {
       sdk.dart.strictSubtypeChecks($isNnbdStrong);
     }
@@ -289,7 +292,8 @@
       ]);
       if (await process.exitCode != 0) exit(await process.exitCode);
     } else if (node) {
-      var nodePath = '$sdkJsPath:$libRoot';
+      var nodePath =
+          '$sdkJsPath:$sdkRoot/third_party/node-source-map-support:$libRoot';
       var runjs = '''
 let source_maps;
 try {
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index b0d0617..3a500f5 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -1129,7 +1129,8 @@
             interfaceBound =
                 interfaceSubstitution.substituteType(interfaceBound);
           }
-          if (declaredBound != substitution.substituteType(interfaceBound)) {
+          DartType computedBound = substitution.substituteType(interfaceBound);
+          if (declaredBound != computedBound) {
             reportInvalidOverride(
                 isInterfaceCheck,
                 declaredMember,
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index 1cf5a7e..94edb1e 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -196,11 +196,11 @@
       return result;
     }
 
-    if (arguments != null && arguments.length != (typeVariables?.length ?? 0)) {
+    if (arguments != null && arguments.length != typeVariablesCount) {
       // That should be caught and reported as a compile-time error earlier.
       return unhandled(
           templateTypeArgumentMismatch
-              .withArguments(typeVariables.length)
+              .withArguments(typeVariablesCount)
               .message,
           "buildTypeArguments",
           -1,
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 87a4836..8949530 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -14,6 +14,10 @@
 import 'package:kernel/type_environment.dart';
 
 import 'package:kernel/src/future_or.dart';
+import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/nnbd_top_merge.dart';
+
+import '../../testing/id_testing_utils.dart' show typeToText;
 
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
@@ -22,7 +26,6 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/named_type_builder.dart';
-import '../builder/nullability_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
@@ -236,48 +239,45 @@
     types = new Types(this);
   }
 
-  ClassHierarchyNode getNodeFromClass(ClassBuilder classBuilder) {
+  ClassHierarchyNode getNodeFromClassBuilder(ClassBuilder classBuilder) {
     return nodes[classBuilder.cls] ??= new ClassHierarchyNodeBuilder(
             this, classBuilder, loader.target.enableNonNullable)
         .build();
   }
 
-  ClassHierarchyNode getNodeFromType(TypeBuilder type) {
+  ClassHierarchyNode getNodeFromTypeBuilder(TypeBuilder type) {
     ClassBuilder cls = getClass(type);
-    return cls == null ? null : getNodeFromClass(cls);
+    return cls == null ? null : getNodeFromClassBuilder(cls);
   }
 
-  ClassHierarchyNode getNodeFromKernelClass(Class cls) {
+  ClassHierarchyNode getNodeFromClass(Class cls) {
     return nodes[cls] ??
-        getNodeFromClass(loader.computeClassBuilderFromTargetClass(cls));
+        getNodeFromClassBuilder(loader.computeClassBuilderFromTargetClass(cls));
   }
 
-  TypeBuilder asSupertypeOf(Class cls, Class supertype) {
-    ClassHierarchyNode clsNode = getNodeFromKernelClass(cls);
-    if (cls == supertype) {
-      return new NamedTypeBuilder(
-          clsNode.classBuilder.name, const NullabilityBuilder.omitted(), null)
-        ..bind(clsNode.classBuilder);
+  InterfaceType asSupertypeOf(InterfaceType subtype, Class supertype) {
+    if (subtype.classNode == supertype) {
+      return subtype;
     }
-    ClassHierarchyNode supertypeNode = getNodeFromKernelClass(supertype);
-    List<TypeBuilder> supertypes = clsNode.superclasses;
+    ClassHierarchyNode clsNode = getNodeFromClass(subtype.classNode);
+    ClassHierarchyNode supertypeNode = getNodeFromClass(supertype);
+    List<DartType> superclasses = clsNode.superclasses;
     int depth = supertypeNode.depth;
-    Builder supertypeDeclaration = supertypeNode.classBuilder;
-    if (depth < supertypes.length) {
-      TypeBuilder asSupertypeOf = supertypes[depth];
-      TypeDeclarationBuilder declaration = asSupertypeOf.declaration;
-      if (declaration is TypeAliasBuilder) {
-        TypeAliasBuilder aliasBuilder = declaration;
-        declaration = aliasBuilder.unaliasDeclaration;
-      }
-      if (declaration == supertypeDeclaration) {
-        return asSupertypeOf;
+    if (depth < superclasses.length) {
+      DartType superclass = superclasses[depth];
+      if (superclass is InterfaceType && superclass.classNode == supertype) {
+        return Substitution.fromInterfaceType(subtype)
+            .substituteType(superclass);
       }
     }
-    supertypes = clsNode.interfaces;
-    for (int i = 0; i < supertypes.length; i++) {
-      TypeBuilder type = supertypes[i];
-      if (type.declaration == supertypeDeclaration) return type;
+    List<DartType> superinterfaces = clsNode.interfaces;
+    for (int i = 0; i < superinterfaces.length; i++) {
+      DartType superinterface = superinterfaces[i];
+      if (superinterface is InterfaceType &&
+          superinterface.classNode == supertype) {
+        return Substitution.fromInterfaceType(subtype)
+            .substituteType(superinterface);
+      }
     }
     return null;
   }
@@ -299,14 +299,7 @@
                 superclass.typeParameters.length, coreTypes.nullType));
       }
     }
-    NamedTypeBuilder supertype = asSupertypeOf(kernelClass, superclass);
-    if (supertype == null) return null;
-    if (supertype.arguments == null && superclass.typeParameters.isEmpty) {
-      return coreTypes.rawType(superclass, type.nullability);
-    }
-    return Substitution.fromInterfaceType(type)
-        .substituteType(supertype.build(null))
-        .withNullability(type.nullability);
+    return asSupertypeOf(type, superclass);
   }
 
   List<DartType> getKernelTypeArgumentsAsInstanceOf(
@@ -318,14 +311,7 @@
       return new List<DartType>.filled(
           superclass.typeParameters.length, coreTypes.nullType);
     }
-    NamedTypeBuilder supertype = asSupertypeOf(kernelClass, superclass);
-    if (supertype == null) return null;
-    if (supertype.arguments == null && superclass.typeParameters.isEmpty) {
-      return const <DartType>[];
-    }
-    return (Substitution.fromInterfaceType(type)
-            .substituteType(supertype.build(null)) as InterfaceType)
-        .typeArguments;
+    return asSupertypeOf(type, superclass)?.typeArguments;
   }
 
   InterfaceType getKernelLegacyLeastUpperBound(
@@ -345,8 +331,8 @@
       }
     }
 
-    ClassHierarchyNode node1 = getNodeFromKernelClass(type1.classNode);
-    ClassHierarchyNode node2 = getNodeFromKernelClass(type2.classNode);
+    ClassHierarchyNode node1 = getNodeFromClass(type1.classNode);
+    ClassHierarchyNode node2 = getNodeFromClass(type2.classNode);
     Set<ClassHierarchyNode> nodes1 = node1.computeAllSuperNodes(this).toSet();
     List<ClassHierarchyNode> nodes2 = node2.computeAllSuperNodes(this);
     List<ClassHierarchyNode> common = <ClassHierarchyNode>[];
@@ -389,21 +375,17 @@
   }
 
   Member getInterfaceMemberKernel(Class cls, Name name, bool isSetter) {
-    return getNodeFromKernelClass(cls)
-        .getInterfaceMember(name, isSetter)
-        ?.member;
+    return getNodeFromClass(cls).getInterfaceMember(name, isSetter)?.member;
   }
 
   Member getDispatchTargetKernel(Class cls, Name name, bool isSetter) {
-    return getNodeFromKernelClass(cls)
-        .getDispatchTarget(name, isSetter)
-        ?.member;
+    return getNodeFromClass(cls).getDispatchTarget(name, isSetter)?.member;
   }
 
   Member getCombinedMemberSignatureKernel(Class cls, Name name, bool isSetter,
       int charOffset, SourceLibraryBuilder library) {
     ClassMember declaration =
-        getNodeFromKernelClass(cls).getInterfaceMember(name, isSetter);
+        getNodeFromClass(cls).getInterfaceMember(name, isSetter);
     if (declaration?.isStatic ?? true) return null;
     if (declaration.isDuplicate) {
       library?.addProblem(
@@ -661,8 +643,9 @@
     if (classBuilder != bClassBuilder) {
       assert(
           substitutions.containsKey(bClassBuilder.cls),
-          "${classBuilder.fullNameForErrors} "
-          "${bClassBuilder.fullNameForErrors}");
+          "No substitution found for '${classBuilder.fullNameForErrors}' as "
+          "instance of '${bClassBuilder.fullNameForErrors}'. Substitutions "
+          "available for: ${substitutions.keys}");
       bSubstitution = substitutions[bClassBuilder.cls];
       debug?.log("${classBuilder.fullNameForErrors} -> "
           "${bClassBuilder.fullNameForErrors} $bSubstitution");
@@ -1221,9 +1204,9 @@
     assert(!classBuilder.isPatch);
     ClassHierarchyNode supernode;
     if (objectClass != classBuilder.origin) {
-      supernode = hierarchy.getNodeFromType(classBuilder.supertype);
+      supernode = hierarchy.getNodeFromTypeBuilder(classBuilder.supertype);
       if (supernode == null) {
-        supernode = hierarchy.getNodeFromClass(objectClass);
+        supernode = hierarchy.getNodeFromClassBuilder(objectClass);
       }
       assert(supernode != null);
     }
@@ -1287,9 +1270,9 @@
     /// superclasses.
     List<ClassMember> interfaceSetters;
 
-    List<TypeBuilder> superclasses;
+    List<DartType> superclasses;
 
-    List<TypeBuilder> interfaces;
+    List<DartType> interfaces;
 
     int maxInheritancePath;
 
@@ -1297,36 +1280,37 @@
       // This should be Object.
       classMembers = localMembers;
       classSetters = localSetters;
-      superclasses = new List<TypeBuilder>(0);
-      interfaces = new List<TypeBuilder>(0);
+      superclasses = new List<DartType>(0);
+      interfaces = new List<DartType>(0);
       maxInheritancePath = 0;
     } else {
       maxInheritancePath = supernode.maxInheritancePath + 1;
-      superclasses = new List<TypeBuilder>(supernode.superclasses.length + 1);
-      superclasses.setRange(0, superclasses.length - 1,
-          substSupertypes(classBuilder.supertype, supernode.superclasses));
-      superclasses[superclasses.length - 1] =
-          recordSupertype(classBuilder.supertype);
 
-      List<TypeBuilder> directInterfaces =
+      superclasses = new List<DartType>(supernode.superclasses.length + 1);
+      DartType supertype = classBuilder.supertype.build(classBuilder.library);
+      superclasses.setRange(0, superclasses.length - 1,
+          substSupertypes(supertype, supernode.superclasses));
+      superclasses[superclasses.length - 1] = recordSupertype(supertype);
+
+      List<TypeBuilder> directInterfaceBuilders =
           ignoreFunction(classBuilder.interfaces);
       if (classBuilder.isMixinApplication) {
-        if (directInterfaces == null) {
-          directInterfaces = <TypeBuilder>[classBuilder.mixedInType];
+        if (directInterfaceBuilders == null) {
+          directInterfaceBuilders = <TypeBuilder>[classBuilder.mixedInType];
         } else {
-          directInterfaces = <TypeBuilder>[classBuilder.mixedInType]
-            ..addAll(directInterfaces);
+          directInterfaceBuilders = <TypeBuilder>[classBuilder.mixedInType]
+            ..addAll(directInterfaceBuilders);
         }
       }
-      if (directInterfaces != null) {
-        for (int i = 0; i < directInterfaces.length; i++) {
-          recordSupertype(directInterfaces[i]);
+      if (directInterfaceBuilders != null) {
+        for (int i = 0; i < directInterfaceBuilders.length; i++) {
+          recordSupertype(
+              directInterfaceBuilders[i].build(classBuilder.library));
         }
       }
-      List<TypeBuilder> superclassInterfaces = supernode.interfaces;
+      List<DartType> superclassInterfaces = supernode.interfaces;
       if (superclassInterfaces != null) {
-        superclassInterfaces =
-            substSupertypes(classBuilder.supertype, superclassInterfaces);
+        superclassInterfaces = substSupertypes(supertype, superclassInterfaces);
       }
 
       classMembers = merge(
@@ -1334,37 +1318,42 @@
       classSetters = merge(
           localSetters, supernode.classSetters, MergeKind.superclassSetters);
 
-      if (directInterfaces != null) {
-        MergeResult result = mergeInterfaces(supernode, directInterfaces);
+      if (directInterfaceBuilders != null) {
+        MergeResult result =
+            mergeInterfaces(supernode, directInterfaceBuilders);
         interfaceMembers = result.mergedMembers;
         interfaceSetters = result.mergedSetters;
-        interfaces = <TypeBuilder>[];
+        interfaces = <DartType>[];
         if (superclassInterfaces != null) {
           for (int i = 0; i < superclassInterfaces.length; i++) {
             addInterface(interfaces, superclasses, superclassInterfaces[i]);
           }
         }
-        for (int i = 0; i < directInterfaces.length; i++) {
-          TypeBuilder directInterface = directInterfaces[i];
-          addInterface(interfaces, superclasses, directInterface);
-          ClassHierarchyNode interfaceNode =
-              hierarchy.getNodeFromType(directInterface);
-          if (interfaceNode != null) {
-            if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
-              maxInheritancePath = interfaceNode.maxInheritancePath + 1;
-            }
-            List<TypeBuilder> types =
-                substSupertypes(directInterface, interfaceNode.superclasses);
-            for (int i = 0; i < types.length; i++) {
-              addInterface(interfaces, superclasses, types[i]);
-            }
 
-            if (interfaceNode.interfaces != null) {
-              List<TypeBuilder> types =
-                  substSupertypes(directInterface, interfaceNode.interfaces);
+        for (int i = 0; i < directInterfaceBuilders.length; i++) {
+          DartType directInterface =
+              directInterfaceBuilders[i].build(classBuilder.library);
+          addInterface(interfaces, superclasses, directInterface);
+          if (directInterface is InterfaceType) {
+            ClassHierarchyNode interfaceNode =
+                hierarchy.getNodeFromClass(directInterface.classNode);
+            if (interfaceNode != null) {
+              if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
+                maxInheritancePath = interfaceNode.maxInheritancePath + 1;
+              }
+
+              List<DartType> types =
+                  substSupertypes(directInterface, interfaceNode.superclasses);
               for (int i = 0; i < types.length; i++) {
                 addInterface(interfaces, superclasses, types[i]);
               }
+              if (interfaceNode.interfaces != null) {
+                List<DartType> types =
+                    substSupertypes(directInterface, interfaceNode.interfaces);
+                for (int i = 0; i < types.length; i++) {
+                  addInterface(interfaces, superclasses, types[i]);
+                }
+              }
             }
           }
         }
@@ -1408,6 +1397,7 @@
         installNsmHandlers();
       }
     }
+
     return new ClassHierarchyNode(
       classBuilder,
       classMembers,
@@ -1421,61 +1411,40 @@
     );
   }
 
-  TypeBuilder recordSupertype(TypeBuilder supertype) {
-    if (supertype is NamedTypeBuilder) {
-      debug?.log("In ${this.classBuilder.fullNameForErrors} "
-          "recordSupertype(${supertype.fullNameForErrors})");
-      Builder declaration = supertype.declaration;
-      if (declaration is TypeAliasBuilder) {
-        TypeAliasBuilder aliasBuilder = declaration;
-        declaration = aliasBuilder.unaliasDeclaration;
+  DartType recordSupertype(DartType supertype) {
+    debug?.log("In ${this.classBuilder.fullNameForErrors} "
+        "recordSupertype(${supertype})");
+    if (supertype is InterfaceType) {
+      Class cls = supertype.classNode;
+      if (cls.isMixinApplication) {
+        recordSupertype(cls.mixedInType.asInterfaceType);
       }
-      if (declaration is! ClassBuilder) return supertype;
-      ClassBuilder classBuilder = declaration;
-      if (classBuilder.isMixinApplication) {
-        recordSupertype(classBuilder.mixedInType);
-      }
-      List<TypeVariableBuilder> typeVariableBuilders =
-          classBuilder.typeVariables;
+      List<TypeParameter> typeVariableBuilders = cls.typeParameters;
       if (typeVariableBuilders == null) {
-        substitutions[classBuilder.cls] = Substitution.empty;
-        assert(classBuilder.cls.typeParameters.isEmpty);
+        substitutions[cls] = Substitution.empty;
+        assert(cls.typeParameters.isEmpty);
       } else {
-        List<TypeBuilder> arguments =
-            supertype.arguments ?? computeDefaultTypeArguments(supertype);
-        if (arguments.length != typeVariableBuilders.length) {
-          arguments = computeDefaultTypeArguments(supertype);
-        }
+        List<DartType> arguments = supertype.typeArguments;
         List<DartType> typeArguments = new List<DartType>(arguments.length);
         List<TypeParameter> typeParameters =
             new List<TypeParameter>(arguments.length);
         for (int i = 0; i < arguments.length; i++) {
-          typeParameters[i] = typeVariableBuilders[i].parameter;
-          typeArguments[i] = arguments[i].build(this.classBuilder.parent);
+          typeParameters[i] = typeVariableBuilders[i];
+          typeArguments[i] = arguments[i];
         }
-        substitutions[classBuilder.cls] =
+        substitutions[cls] =
             Substitution.fromPairs(typeParameters, typeArguments);
       }
     }
     return supertype;
   }
 
-  List<TypeBuilder> substSupertypes(
-      NamedTypeBuilder supertype, List<TypeBuilder> supertypes) {
-    Builder declaration = supertype.declaration;
-    // TODO(eernst): perform substitution through the chain, like:
-    //typedef A1<T> = A<T>
-    //typedef A2<T> = A1<A<T>>
-    //typedef A3<T> = A2<A<T>>
-    //class B extends A3<B> {} // B extends A<A<A<B>>> and not just A<B>
-    if (declaration is TypeAliasBuilder) {
-      TypeAliasBuilder aliasBuilder = declaration;
-      declaration = aliasBuilder.unaliasDeclaration;
-    }
-    if (declaration is! ClassBuilder) return supertypes;
-    ClassBuilder cls = declaration;
-    List<TypeVariableBuilder> typeVariables = cls.typeVariables;
-    if (typeVariables == null) {
+  List<DartType> substSupertypes(
+      DartType supertype, List<DartType> supertypes) {
+    if (supertype is! InterfaceType) return supertypes;
+    InterfaceType cls = supertype;
+    List<TypeParameter> typeVariables = cls.classNode.typeParameters;
+    if (typeVariables.isEmpty) {
       debug?.log("In ${this.classBuilder.fullNameForErrors} "
           "$supertypes aren't substed");
       for (int i = 0; i < supertypes.length; i++) {
@@ -1483,22 +1452,22 @@
       }
       return supertypes;
     }
-    Map<TypeVariableBuilder, TypeBuilder> substitution =
-        <TypeVariableBuilder, TypeBuilder>{};
-    List<TypeBuilder> arguments =
-        supertype.arguments ?? computeDefaultTypeArguments(supertype);
+    Map<TypeParameter, DartType> map = <TypeParameter, DartType>{};
+    List<DartType> arguments = cls.typeArguments;
     for (int i = 0; i < typeVariables.length; i++) {
-      substitution[typeVariables[i]] = arguments[i];
+      map[typeVariables[i]] = arguments[i];
     }
-    List<TypeBuilder> result;
+    Substitution substitution = Substitution.fromMap(map);
+    List<DartType> result;
     for (int i = 0; i < supertypes.length; i++) {
-      TypeBuilder supertype = supertypes[i];
-      TypeBuilder substed = recordSupertype(supertype.subst(substitution));
-      if (supertype != substed) {
-        debug?.log(
-            "In ${this.classBuilder.fullNameForErrors} $supertype -> $substed");
+      DartType supertype = supertypes[i];
+      DartType substituted =
+          recordSupertype(substitution.substituteType(supertype));
+      if (supertype != substituted) {
+        debug?.log("In ${this.classBuilder.fullNameForErrors} $supertype"
+            " -> $substituted");
         result ??= supertypes.toList();
-        result[i] = substed;
+        result[i] = substituted;
       } else {
         debug?.log("In ${this.classBuilder.fullNameForErrors} "
             "$supertype isn't substed");
@@ -1528,43 +1497,78 @@
     }
   }
 
-  TypeBuilder addInterface(List<TypeBuilder> interfaces,
-      List<TypeBuilder> superclasses, TypeBuilder type) {
-    ClassHierarchyNode node = hierarchy.getNodeFromType(type);
-    if (node == null) return null;
-    int depth = node.depth;
-    int myDepth = superclasses.length;
-    if (depth < myDepth &&
-        superclasses[depth].declaration == node.classBuilder) {
-      // This is a potential conflict.
-      return superclasses[depth];
-    } else {
-      for (int i = 0; i < interfaces.length; i++) {
-        // This is a quadratic algorithm, but normally, the number of
-        // interfaces is really small.
-        if (interfaces[i].declaration == type.declaration) {
+  DartType addInterface(
+      List<DartType> interfaces, List<DartType> superclasses, DartType type) {
+    if (hierarchy.loader.target.enableNonNullable &&
+        !classBuilder.library.isNonNullableByDefault) {
+      type = legacyErasure(hierarchy.coreTypes, type);
+    }
+    if (type is InterfaceType) {
+      ClassHierarchyNode node = hierarchy.getNodeFromClass(type.classNode);
+      if (node == null) return null;
+      int depth = node.depth;
+      int myDepth = superclasses.length;
+      DartType superclass = depth < myDepth ? superclasses[depth] : null;
+      if (superclass is InterfaceType &&
+          superclass.classNode == type.classNode) {
+        if (hierarchy.loader.target.enableNonNullable) {
           // This is a potential conflict.
-          return interfaces[i];
+          if (classBuilder.library.isNonNullableByDefault) {
+            superclass = nnbdTopMerge(hierarchy.coreTypes, superclass, type);
+            if (superclass == null) {
+              // This is a conflict.
+              // TODO(johnniwinther): Report errors here instead of through
+              // the computation of the [ClassHierarchy].
+              superclass = superclasses[depth];
+            } else {
+              superclasses[depth] = superclass;
+            }
+          }
+        }
+        return superclass;
+      } else {
+        for (int i = 0; i < interfaces.length; i++) {
+          // This is a quadratic algorithm, but normally, the number of
+          // interfaces is really small.
+          DartType interface = interfaces[i];
+          if (interface is InterfaceType &&
+              interface.classNode == type.classNode) {
+            if (hierarchy.loader.target.enableNonNullable) {
+              // This is a potential conflict.
+              if (classBuilder.library.isNonNullableByDefault) {
+                interface = nnbdTopMerge(hierarchy.coreTypes, interface, type);
+                if (interface == null) {
+                  // This is a conflict.
+                  // TODO(johnniwinther): Report errors here instead of through
+                  // the computation of the [ClassHierarchy].
+                  interface = interfaces[i];
+                } else {
+                  interfaces[i] = interface;
+                }
+              }
+            }
+            return interface;
+          }
         }
       }
+      interfaces.add(type);
     }
-    interfaces.add(type);
     return null;
   }
 
   MergeResult mergeInterfaces(
-      ClassHierarchyNode supernode, List<TypeBuilder> interfaces) {
+      ClassHierarchyNode supernode, List<TypeBuilder> interfaceBuilders) {
     debug?.log("mergeInterfaces($classBuilder (${this.classBuilder}) "
-        "${supernode.interfaces} ${interfaces}");
+        "${supernode.interfaces} ${interfaceBuilders}");
     List<List<ClassMember>> memberLists =
-        new List<List<ClassMember>>(interfaces.length + 1);
+        new List<List<ClassMember>>(interfaceBuilders.length + 1);
     List<List<ClassMember>> setterLists =
-        new List<List<ClassMember>>(interfaces.length + 1);
+        new List<List<ClassMember>>(interfaceBuilders.length + 1);
     memberLists[0] = supernode.interfaceMembers;
     setterLists[0] = supernode.interfaceSetters;
-    for (int i = 0; i < interfaces.length; i++) {
+    for (int i = 0; i < interfaceBuilders.length; i++) {
       ClassHierarchyNode interfaceNode =
-          hierarchy.getNodeFromType(interfaces[i]);
+          hierarchy.getNodeFromTypeBuilder(interfaceBuilders[i]);
       if (interfaceNode == null) {
         memberLists[i + 1] = null;
         setterLists[i + 1] = null;
@@ -1837,11 +1841,11 @@
 
   /// All superclasses of [classBuilder] excluding itself. The classes are
   /// sorted by depth from the root (Object) in ascending order.
-  final List<TypeBuilder> superclasses;
+  final List<DartType> superclasses;
 
   /// The list of all classes implemented by [classBuilder] and its supertypes
   /// excluding any classes from [superclasses].
-  final List<TypeBuilder> interfaces;
+  final List<DartType> interfaces;
 
   /// The longest inheritance path from [classBuilder] to `Object`.
   final int maxInheritancePath;
@@ -1867,24 +1871,16 @@
     List<ClassHierarchyNode> result = new List<ClassHierarchyNode>(
         1 + superclasses.length + interfaces.length);
     for (int i = 0; i < superclasses.length; i++) {
-      Builder declaration = superclasses[i].declaration;
-      if (declaration is TypeAliasBuilder) {
-        TypeAliasBuilder aliasBuilder = declaration;
-        declaration = aliasBuilder.unaliasDeclaration;
-      }
-      if (declaration is ClassBuilder) {
-        result[i] = hierarchy.getNodeFromClass(declaration);
+      DartType type = superclasses[i];
+      if (type is InterfaceType) {
+        result[i] = hierarchy.getNodeFromClass(type.classNode);
       }
     }
     for (int i = 0; i < interfaces.length; i++) {
-      Builder declaration = interfaces[i].declaration;
-      if (declaration is TypeAliasBuilder) {
-        TypeAliasBuilder aliasBuilder = declaration;
-        declaration = aliasBuilder.unaliasDeclaration;
-      }
-      if (declaration is ClassBuilder) {
+      DartType type = interfaces[i];
+      if (type is InterfaceType) {
         result[i + superclasses.length] =
-            hierarchy.getNodeFromClass(declaration);
+            hierarchy.getNodeFromClass(type.classNode);
       }
     }
     return result..last = this;
@@ -1902,20 +1898,20 @@
     }
     sb..writeln("  superclasses:");
     int depth = 0;
-    for (TypeBuilder superclass in superclasses) {
+    for (DartType superclass in superclasses) {
       sb.write("  " * (depth + 2));
       if (depth != 0) sb.write("-> ");
-      superclass.printOn(sb);
+      sb.write(typeToText(superclass));
       sb.writeln();
       depth++;
     }
     if (interfaces != null) {
       sb.write("  interfaces:");
       bool first = true;
-      for (TypeBuilder i in interfaces) {
+      for (DartType i in interfaces) {
         if (!first) sb.write(",");
         sb.write(" ");
-        i.printOn(sb);
+        sb.write(typeToText(i));
         first = false;
       }
       sb.writeln();
@@ -2555,10 +2551,6 @@
           String uri = '${classBuilder.library.uri}';
           if (uri == 'dart:js' &&
                   classBuilder.fileUri.pathSegments.last == 'js.dart' ||
-              // Remove 'js_dart2js.dart' once the file is renamed
-              // to 'js.dart' everywhere.
-              uri == 'dart:js' &&
-                  classBuilder.fileUri.pathSegments.last == 'js_dart2js.dart' ||
               uri == 'dart:_interceptors' &&
                   classBuilder.fileUri.pathSegments.last == 'js_number.dart') {
             // TODO(johnniwinther): Fix the dart2js libraries and remove the
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 585b16a..4b523d4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -424,12 +424,13 @@
     inferrer.inferConstructorParameterTypes(node.target);
     bool hasExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    DartType inferredType = inferrer.inferInvocation(
+    InvocationInferenceResult result = inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
         node.target.function
             .computeThisFunctionType(inferrer.library.nonNullable),
         node.arguments,
+        node.name,
         returnType:
             computeConstructorReturnType(node.target, inferrer.coreTypes),
         isConst: node.isConst);
@@ -441,7 +442,8 @@
             inferred: true);
       }
     }
-    return new ExpressionInferenceResult(inferredType, node);
+    return new ExpressionInferenceResult(
+        result.inferredType, result.applyResult(node));
   }
 
   @override
@@ -458,8 +460,8 @@
         : new FunctionType(
             [], const DynamicType(), inferrer.library.nonNullable);
     TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
-    DartType inferredType = inferrer.inferInvocation(
-        typeContext, node.fileOffset, calleeType, node.arguments);
+    InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
+        node.fileOffset, calleeType, node.arguments, node.target.name);
     Expression replacement = new StaticInvocation(node.target, node.arguments);
     if (!inferrer.isTopLevel && node.target != null) {
       inferrer.library.checkBoundsInStaticInvocation(
@@ -468,7 +470,8 @@
           inferrer.helper.uri,
           typeArgumentsInfo);
     }
-    return inferrer.instantiateTearOff(inferredType, typeContext, replacement);
+    return inferrer.instantiateTearOff(
+        result.inferredType, typeContext, result.applyResult(replacement));
   }
 
   ExpressionInferenceResult visitExtensionSet(
@@ -704,12 +707,13 @@
       FactoryConstructorInvocationJudgment node, DartType typeContext) {
     bool hadExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    DartType inferredType = inferrer.inferInvocation(
+    InvocationInferenceResult result = inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
         node.target.function
             .computeThisFunctionType(inferrer.library.nonNullable),
         node.arguments,
+        node.name,
         returnType:
             computeConstructorReturnType(node.target, inferrer.coreTypes),
         isConst: node.isConst);
@@ -722,7 +726,8 @@
             inferred: true);
       }
     }
-    return new ExpressionInferenceResult(inferredType, node);
+    return new ExpressionInferenceResult(
+        result.inferredType, result.applyResult(node));
   }
 
   @override
@@ -1058,6 +1063,7 @@
             .computeThisFunctionType(inferrer.library.nonNullable)
             .withoutTypeParameters),
         node.argumentsJudgment,
+        node.target.name,
         returnType: inferrer.thisType,
         skipTypeArgumentInference: true);
   }
@@ -2284,26 +2290,6 @@
         node.arguments,
         typeContext,
         isExpressionInvocation: false);
-    if (inferrer.isNonNullableByDefault && inferrer.performNnbdChecks) {
-      if (receiverType is! DynamicType && receiverType.isPotentiallyNullable) {
-        if (inferrer.nnbdStrongMode) {
-          return new ExpressionInferenceResult.nullAware(
-              invocationResult.inferredType,
-              inferrer.helper.wrapInProblem(
-                  invocationResult.expression..fileOffset = node.fileOffset,
-                  templateNullableMethodCallError.withArguments(node.name.name,
-                      receiverType, inferrer.isNonNullableByDefault),
-                  node.name.name.length),
-              null);
-        } else {
-          inferrer.helper.addProblem(
-              templateNullableMethodCallWarning.withArguments(node.name.name,
-                  receiverType, inferrer.isNonNullableByDefault),
-              node.fileOffset,
-              node.name.name.length);
-        }
-      }
-    }
     return invocationResult;
   }
 
@@ -4641,7 +4627,10 @@
         isThisReceiver: node.receiver is ThisExpression);
     Expression resultExpression = readResult.expression;
     if (inferrer.isNonNullableByDefault && inferrer.performNnbdChecks) {
-      if (receiverType is! DynamicType && receiverType.isPotentiallyNullable) {
+      if (receiverType is! DynamicType &&
+          receiverType.isPotentiallyNullable &&
+          !inferrer.matchesObjectMemberCall(
+              node.name, const [], const [], const [])) {
         if (inferrer.nnbdStrongMode) {
           resultExpression = inferrer.helper.wrapInProblem(
               resultExpression,
@@ -4681,6 +4670,7 @@
         node.target.function
             .computeThisFunctionType(inferrer.library.nonNullable),
         node.arguments,
+        node.target.name,
         returnType: inferrer.coreTypes.thisInterfaceType(
             node.target.enclosingClass, inferrer.library.nonNullable),
         skipTypeArgumentInference: true);
@@ -4843,8 +4833,8 @@
         : new FunctionType(
             [], const DynamicType(), inferrer.library.nonNullable);
     TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
-    DartType inferredType = inferrer.inferInvocation(
-        typeContext, node.fileOffset, calleeType, node.arguments);
+    InvocationInferenceResult result = inferrer.inferInvocation(
+        typeContext, node.fileOffset, calleeType, node.arguments, node.name);
     if (!inferrer.isTopLevel && node.target != null) {
       inferrer.library.checkBoundsInStaticInvocation(
           node,
@@ -4852,7 +4842,8 @@
           inferrer.helper.uri,
           typeArgumentsInfo);
     }
-    return new ExpressionInferenceResult(inferredType, node);
+    return new ExpressionInferenceResult(
+        result.inferredType, result.applyResult(node));
   }
 
   @override
@@ -4890,6 +4881,7 @@
             .computeThisFunctionType(inferrer.library.nonNullable)
             .withoutTypeParameters),
         node.arguments,
+        node.target.name,
         returnType: inferrer.thisType,
         skipTypeArgumentInference: true);
   }
@@ -5395,7 +5387,7 @@
       FunctionType calleeType =
           new FunctionType([], inferredType, inferrer.library.nonNullable);
       inferrer.inferInvocation(
-          typeContext, node.fileOffset, calleeType, node.arguments);
+          typeContext, node.fileOffset, calleeType, node.arguments, null);
     }
     return new ExpressionInferenceResult(inferredType, node);
   }
diff --git a/pkg/front_end/lib/src/fasta/names.dart b/pkg/front_end/lib/src/fasta/names.dart
index 421d4be..229b64b 100644
--- a/pkg/front_end/lib/src/fasta/names.dart
+++ b/pkg/front_end/lib/src/fasta/names.dart
@@ -65,3 +65,9 @@
 final Name tildeName = new Name("~");
 
 final Name unaryMinusName = new Name("unary-");
+
+final Name hashCodeName = new Name("hashCode");
+
+final Name toStringName = new Name("toString");
+
+final Name runtimeTypeName = new Name("runtimeType");
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 c6ef570..f90f5c1 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
@@ -851,6 +851,8 @@
   }
 
   /// Computes the assignability kind of [expressionType] to [contextType].
+  ///
+  /// The computation is side-effect free.
   AssignabilityKind _computeAssignabilityKind(
       DartType contextType, DartType expressionType,
       {bool isStrongNullabilityMode,
@@ -1130,6 +1132,118 @@
     return target;
   }
 
+  /// True if [Object]'s member called [name] can be called with the arguments.
+  ///
+  /// Checks for the arity and the types of the arguments and tells if an
+  /// invocation of a method [name] on the receiver with static type [Object]
+  /// doesn't lead to a compile-time error.
+  bool matchesObjectMemberCall(
+      Name name,
+      List<DartType> typeArguments,
+      List<DartType> positionalArgumentTypes,
+      List<NamedType> namedArgumentTypes) {
+    ObjectAccessTarget target = findInterfaceMember(
+        coreTypes.objectNonNullableRawType, name, -1,
+        instrumented: false);
+    if (target.isUnresolved) return false;
+    return matchesMemberCall(target.member, typeArguments ?? const [],
+        positionalArgumentTypes ?? const [], namedArgumentTypes ?? const []);
+  }
+
+  /// True if [member] can be called with the arguments.
+  ///
+  /// Checks for the arity and the types of the arguments and tells if an
+  /// invocation of [member] doesn't lead to a compile-time error.
+  bool matchesMemberCall(
+      Member member,
+      List<DartType> typeArguments,
+      List<DartType> positionalArgumentTypes,
+      List<NamedType> namedArgumentTypes) {
+    FunctionNode function = member.function;
+    List<TypeParameter> typeParameters = function.typeParameters;
+    List<VariableDeclaration> positionalParameters =
+        function.positionalParameters;
+    List<VariableDeclaration> namedParameters = function.namedParameters;
+    if (typeParameters.length != typeArguments.length ||
+        positionalParameters.length < positionalArgumentTypes.length ||
+        namedParameters.length < namedArgumentTypes.length) {
+      // The number of arguments isn't compatible.
+      return false;
+    }
+
+    // Assume that both named parameters and named arguments are sorted
+    // lexicographically.
+    assert(namedParameters.isEmpty ||
+        namedParameters.skip(1).fold(
+                namedParameters[0],
+                (p, n) =>
+                    p != null && p.name.compareTo(n.name) <= 0 ? n : null) !=
+            null);
+    assert(namedArgumentTypes.isEmpty ||
+        namedArgumentTypes.skip(1).fold(
+                namedArgumentTypes[0],
+                (p, n) =>
+                    p != null && p.name.compareTo(n.name) <= 0 ? n : null) !=
+            null);
+
+    Substitution substitution = typeParameters.isEmpty
+        ? Substitution.empty
+        : Substitution.fromPairs(typeParameters, typeArguments);
+
+    {
+      int parameterIndex = 0;
+      int argumentIndex = 0;
+      while (parameterIndex < namedParameters.length &&
+          argumentIndex < namedArgumentTypes.length) {
+        VariableDeclaration parameter = namedParameters[parameterIndex];
+        NamedType argument = namedArgumentTypes[argumentIndex];
+        int compareResult = parameter.name.compareTo(argument.name);
+        if (compareResult == 0) {
+          if (!isAssignable(
+              substitution.substituteType(parameter.type), argument.type)) {
+            // Types aren't compatible.
+            return false;
+          }
+          ++parameterIndex;
+          ++argumentIndex;
+        } else if (compareResult < 0) {
+          if (parameter.isRequired) {
+            // A required parameter is skipped.
+            return false;
+          }
+          ++parameterIndex;
+        } else {
+          assert(compareResult > 0);
+          // Extra argument.
+          return false;
+        }
+      }
+    }
+    for (int i = 0; i < positionalArgumentTypes.length; ++i) {
+      VariableDeclaration parameter = positionalParameters[i];
+      DartType argument = positionalArgumentTypes[i];
+      if (!isAssignable(
+          substitution.substituteType(parameter.type), argument)) {
+        // Types aren't compatible.
+        return false;
+      }
+    }
+    for (int i = 0; i < typeArguments.length; ++i) {
+      TypeParameter parameter = typeParameters[i];
+      DartType argument = typeArguments[i];
+      if (!typeSchemaEnvironment.isSubtypeOf(
+          argument,
+          substitution.substituteType(parameter.bound),
+          library.isNonNullableByDefault
+              ? SubtypeCheckMode.withNullabilities
+              : SubtypeCheckMode.ignoringNullabilities)) {
+        // The type argument doesn't conform to the bound.
+        return false;
+      }
+    }
+    return true;
+  }
+
   /// If target is missing on a non-dynamic receiver, an error is reported
   /// using [errorTemplate] and an invalid expression is returned.
   Expression reportMissingInterfaceMember(
@@ -1806,8 +1920,8 @@
     return result.hasChanged ? result.statement : body;
   }
 
-  DartType inferInvocation(DartType typeContext, int offset,
-      FunctionType calleeType, Arguments arguments,
+  InvocationInferenceResult inferInvocation(DartType typeContext, int offset,
+      FunctionType calleeType, Arguments arguments, Name targetName,
       {bool isOverloadedArithmeticOperator: false,
       DartType returnType,
       DartType receiverType,
@@ -1823,14 +1937,15 @@
       assert(returnType == null,
           "Unexpected explicit return type for extension method invocation.");
       return _inferGenericExtensionMethodInvocation(extensionTypeParameterCount,
-          typeContext, offset, calleeType, arguments,
+          typeContext, offset, calleeType, arguments, targetName,
           isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
           receiverType: receiverType,
           skipTypeArgumentInference: skipTypeArgumentInference,
           isConst: isConst,
           isImplicitExtensionMember: isImplicitExtensionMember);
     }
-    return _inferInvocation(typeContext, offset, calleeType, arguments,
+    return _inferInvocation(
+        typeContext, offset, calleeType, arguments, targetName,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         receiverType: receiverType,
         returnType: returnType,
@@ -1839,12 +1954,13 @@
         isImplicitExtensionMember: isImplicitExtensionMember);
   }
 
-  DartType _inferGenericExtensionMethodInvocation(
+  InvocationInferenceResult _inferGenericExtensionMethodInvocation(
       int extensionTypeParameterCount,
       DartType typeContext,
       int offset,
       FunctionType calleeType,
       Arguments arguments,
+      Node targetName,
       {bool isOverloadedArithmeticOperator: false,
       DartType receiverType,
       bool skipTypeArgumentInference: false,
@@ -1861,8 +1977,8 @@
     Arguments extensionArguments = engine.forest.createArguments(
         arguments.fileOffset, [arguments.positional.first],
         types: getExplicitExtensionTypeArguments(arguments));
-    _inferInvocation(
-        const UnknownType(), offset, extensionFunctionType, extensionArguments,
+    _inferInvocation(const UnknownType(), offset, extensionFunctionType,
+        extensionArguments, targetName,
         skipTypeArgumentInference: skipTypeArgumentInference,
         receiverType: receiverType,
         isImplicitExtensionMember: isImplicitExtensionMember);
@@ -1886,8 +2002,8 @@
     Arguments targetArguments = engine.forest.createArguments(
         arguments.fileOffset, arguments.positional.skip(1).toList(),
         named: arguments.named, types: getExplicitTypeArguments(arguments));
-    DartType inferredType = _inferInvocation(
-        typeContext, offset, targetFunctionType, targetArguments,
+    InvocationInferenceResult result = _inferInvocation(
+        typeContext, offset, targetFunctionType, targetArguments, targetName,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         skipTypeArgumentInference: skipTypeArgumentInference,
         isConst: isConst);
@@ -1901,13 +2017,13 @@
     arguments.types.clear();
     arguments.types.addAll(extensionArguments.types);
     arguments.types.addAll(targetArguments.types);
-    return inferredType;
+    return result;
   }
 
   /// 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, Arguments arguments,
+  InvocationInferenceResult _inferInvocation(DartType typeContext, int offset,
+      FunctionType calleeType, Arguments arguments, Name targetName,
       {bool isOverloadedArithmeticOperator: false,
       bool isBinaryOperator: false,
       DartType receiverType,
@@ -2093,6 +2209,8 @@
       arguments.types.clear();
       arguments.types.addAll(inferredTypes);
     }
+    List<DartType> positionalArgumentTypes = [];
+    List<NamedType> namedArgumentTypes = [];
     if (typeChecksNeeded && !identical(calleeType, unknownFunction)) {
       LocatedMessage argMessage =
           helper.checkArgumentsForType(calleeType, arguments, offset);
@@ -2112,9 +2230,12 @@
           NamedExpression namedExpression;
           if (i < numPositionalArgs) {
             expression = arguments.positional[i];
+            positionalArgumentTypes.add(actualType);
           } else {
             namedExpression = arguments.named[i - numPositionalArgs];
             expression = namedExpression.value;
+            namedArgumentTypes
+                .add(new NamedType(namedExpression.name, actualType));
           }
           expression = ensureAssignable(expectedType, actualType, expression,
               isVoidAllowed: expectedType is VoidType,
@@ -2147,7 +2268,34 @@
         !containsFreeFunctionTypeVariables(inferredType),
         "Inferred return type $inferredType contains free variables."
         "Inferred function type: $calleeType.");
-    return inferredType;
+
+    if (isNonNullableByDefault && performNnbdChecks) {
+      if (receiverType != null &&
+          receiverType is! DynamicType &&
+          receiverType.isPotentiallyNullable &&
+          !matchesObjectMemberCall(targetName, inferredTypes,
+              positionalArgumentTypes, namedArgumentTypes)) {
+        // Use length 1 for .call -- in most cases its name is skipped.
+        int errorSpanLength =
+            targetName == callName ? noLength : targetName.name.length;
+        if (nnbdStrongMode) {
+          return new WrapInProblemInferenceResult(
+              inferredType,
+              templateNullableMethodCallError.withArguments(
+                  targetName.name, receiverType, isNonNullableByDefault),
+              errorSpanLength,
+              helper);
+        } else {
+          helper.addProblem(
+              templateNullableMethodCallWarning.withArguments(
+                  targetName.name, receiverType, isNonNullableByDefault),
+              offset,
+              errorSpanLength);
+        }
+      }
+    }
+
+    return new SuccessfulInferenceResult(inferredType);
   }
 
   DartType inferLocalFunction(FunctionNode function, DartType typeContext,
@@ -2347,14 +2495,14 @@
       Name name,
       Arguments arguments,
       DartType typeContext) {
-    DartType inferredType = inferInvocation(
-        typeContext, fileOffset, unknownFunction, arguments,
+    InvocationInferenceResult result = inferInvocation(
+        typeContext, fileOffset, unknownFunction, arguments, name,
         receiverType: const DynamicType());
     assert(name != equalsName);
     return new ExpressionInferenceResult.nullAware(
-        inferredType,
-        new MethodInvocation(receiver, name, arguments)
-          ..fileOffset = fileOffset,
+        result.inferredType,
+        result.applyResult(new MethodInvocation(receiver, name, arguments)
+          ..fileOffset = fileOffset),
         nullAwareGuards);
   }
 
@@ -2372,7 +2520,7 @@
     Expression error = createMissingMethodInvocation(
         fileOffset, receiver, receiverType, name, arguments,
         isExpressionInvocation: isExpressionInvocation);
-    inferInvocation(typeContext, fileOffset, unknownFunction, arguments,
+    inferInvocation(typeContext, fileOffset, unknownFunction, arguments, name,
         receiverType: receiverType);
     assert(name != equalsName);
     // TODO(johnniwinther): Use InvalidType instead.
@@ -2407,15 +2555,15 @@
     }
     StaticInvocation staticInvocation = transformExtensionMethodInvocation(
         fileOffset, target, receiver, arguments);
-    DartType inferredType = inferInvocation(
-        typeContext, fileOffset, functionType, staticInvocation.arguments,
+    InvocationInferenceResult result = inferInvocation(
+        typeContext, fileOffset, functionType, staticInvocation.arguments, name,
         receiverType: receiverType, isImplicitExtensionMember: true);
     if (!isTopLevel) {
       library.checkBoundsInStaticInvocation(staticInvocation,
           typeSchemaEnvironment, helper.uri, getTypeArgumentsInfo(arguments));
     }
-    return new ExpressionInferenceResult.nullAware(
-        inferredType, staticInvocation, nullAwareGuards);
+    return new ExpressionInferenceResult.nullAware(result.inferredType,
+        result.applyResult(staticInvocation), nullAwareGuards);
   }
 
   ExpressionInferenceResult _inferFunctionInvocation(
@@ -2428,14 +2576,14 @@
       DartType typeContext) {
     assert(target.isCallFunction);
     FunctionType functionType = getFunctionType(target, receiverType);
-    DartType inferredType = inferInvocation(
-        typeContext, fileOffset, functionType, arguments,
+    InvocationInferenceResult result = inferInvocation(
+        typeContext, fileOffset, functionType, arguments, target.member?.name,
         receiverType: receiverType);
     // TODO(johnniwinther): Check that type arguments against the bounds.
     return new ExpressionInferenceResult.nullAware(
-        inferredType,
-        new MethodInvocation(receiver, callName, arguments)
-          ..fileOffset = fileOffset,
+        result.inferredType,
+        result.applyResult(new MethodInvocation(receiver, callName, arguments)
+          ..fileOffset = fileOffset),
         nullAwareGuards);
   }
 
@@ -2497,8 +2645,8 @@
             method.enclosingClass, method.function.returnType)) {
       contravariantCheck = true;
     }
-    DartType inferredType = inferInvocation(
-        typeContext, fileOffset, functionType, arguments,
+    InvocationInferenceResult result = inferInvocation(
+        typeContext, fileOffset, functionType, arguments, target.member?.name,
         receiverType: receiverType);
 
     Expression replacement;
@@ -2507,14 +2655,14 @@
       replacement = new AsExpression(
           new MethodInvocation(receiver, methodName, arguments, method)
             ..fileOffset = fileOffset,
-          inferredType)
+          result.inferredType)
         ..isTypeError = true
         ..fileOffset = fileOffset;
       if (instrumentation != null) {
         int offset =
             arguments.fileOffset == -1 ? fileOffset : arguments.fileOffset;
         instrumentation.record(uriForInstrumentation, offset, 'checkReturn',
-            new InstrumentationValueForType(inferredType));
+            new InstrumentationValueForType(result.inferredType));
       }
     }
 
@@ -2526,7 +2674,7 @@
           ..fileOffset = fileOffset;
 
     return new ExpressionInferenceResult.nullAware(
-        inferredType, replacement, nullAwareGuards);
+        result.inferredType, result.applyResult(replacement), nullAwareGuards);
   }
 
   ExpressionInferenceResult _inferInstanceGetterInvocation(
@@ -2585,8 +2733,8 @@
       contravariantCheck = true;
     }
 
-    DartType inferredType = inferInvocation(
-        typeContext, fileOffset, functionType, arguments,
+    InvocationInferenceResult result = inferInvocation(
+        typeContext, fileOffset, functionType, arguments, target.member.name,
         receiverType: receiverType);
 
     if (isExpressionInvocation) {
@@ -2623,7 +2771,7 @@
           ..fileOffset = fileOffset;
 
     return new ExpressionInferenceResult.nullAware(
-        inferredType, replacement, nullAwareGuards);
+        result.inferredType, result.applyResult(replacement), nullAwareGuards);
   }
 
   ExpressionInferenceResult _inferInstanceFieldInvocation(
@@ -2660,8 +2808,8 @@
       contravariantCheck = true;
     }
 
-    DartType inferredType = inferInvocation(
-        typeContext, fileOffset, functionType, arguments,
+    InvocationInferenceResult result = inferInvocation(
+        typeContext, fileOffset, functionType, arguments, target.member.name,
         receiverType: receiverType);
 
     if (isExpressionInvocation) {
@@ -2697,7 +2845,7 @@
       ..fileOffset = fileOffset;
 
     return new ExpressionInferenceResult.nullAware(
-        inferredType, replacement, nullAwareGuards);
+        result.inferredType, result.applyResult(replacement), nullAwareGuards);
   }
 
   /// Performs the core type inference algorithm for method invocations.
@@ -2827,18 +2975,20 @@
           templateInvokeNonFunction.withArguments(methodName.name), noLength);
       return new ExpressionInferenceResult(const DynamicType(), error);
     }
-    DartType inferredType = inferInvocation(
-        typeContext, fileOffset, functionType, arguments,
+    InvocationInferenceResult result = inferInvocation(
+        typeContext, fileOffset, functionType, arguments, target.member?.name,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         receiverType: receiverType,
         isImplicitExtensionMember: target.isExtensionMember);
+    DartType inferredType = result.inferredType;
     if (methodName.name == '==') {
       inferredType = coreTypes.boolRawType(library.nonNullable);
     }
     _checkBoundsInMethodInvocation(
         target, receiverType, calleeType, methodName, arguments, fileOffset);
 
-    return new ExpressionInferenceResult(inferredType, expression);
+    return new ExpressionInferenceResult(
+        inferredType, result.applyResult(expression));
   }
 
   @override
@@ -3453,6 +3603,52 @@
   int get statementCount => statements.length;
 }
 
+/// Tells the inferred type and how the code should be transformed.
+///
+/// It is intended for use by generalized inference methods, such as
+/// [TypeInferrerImpl.inferInvocation], where the input [Expression] isn't
+/// available for rewriting.  So, instead of transforming the code, the result
+/// of the inference provides a way to transform the code at the point of
+/// invocation.
+abstract class InvocationInferenceResult {
+  DartType get inferredType;
+
+  /// Applies the result of the inference to the expression being inferred.
+  ///
+  /// A successful result leaves [expression] intact, and an error detected
+  /// during inference would wrap the expression into an [InvalidExpression].
+  Expression applyResult(Expression expression);
+}
+
+class SuccessfulInferenceResult implements InvocationInferenceResult {
+  @override
+  final DartType inferredType;
+
+  SuccessfulInferenceResult(this.inferredType);
+
+  @override
+  Expression applyResult(Expression expression) => expression;
+}
+
+class WrapInProblemInferenceResult implements InvocationInferenceResult {
+  @override
+  final DartType inferredType;
+
+  final Message message;
+
+  final int length;
+
+  final InferenceHelper helper;
+
+  WrapInProblemInferenceResult(
+      this.inferredType, this.message, this.length, this.helper);
+
+  @override
+  Expression applyResult(Expression expression) {
+    return helper.wrapInProblem(expression, message, length);
+  }
+}
+
 /// The result of an expression inference.
 class ExpressionInferenceResult {
   /// The inferred type of the expression.
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index c8f1ae5..5b58808 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -59,29 +59,41 @@
   /// Function that computes a data mapping for [member].
   ///
   /// Fills [actualMap] with the data.
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<T>> actualMap,
       {bool verbose}) {}
 
   /// Function that computes a data mapping for [cls].
   ///
   /// Fills [actualMap] with the data.
-  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
       Map<Id, ActualData<T>> actualMap,
       {bool verbose}) {}
 
   /// Function that computes a data mapping for [extension].
   ///
   /// Fills [actualMap] with the data.
-  void computeExtensionData(InternalCompilerResult compilerResult,
-      Extension extension, Map<Id, ActualData<T>> actualMap,
+  void computeExtensionData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Extension extension,
+      Map<Id, ActualData<T>> actualMap,
       {bool verbose}) {}
 
   /// Function that computes a data mapping for [library].
   ///
   /// Fills [actualMap] with the data.
-  void computeLibraryData(InternalCompilerResult compilerResult,
-      Library library, Map<Id, ActualData<T>> actualMap,
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<T>> actualMap,
       {bool verbose}) {}
 
   /// Returns `true` if this data computer supports tests with compile-time
@@ -92,7 +104,7 @@
   bool get supportsErrors => false;
 
   /// Returns data corresponding to [error].
-  T computeErrorData(InternalCompilerResult compiler, Id id,
+  T computeErrorData(TestConfig config, InternalCompilerResult compiler, Id id,
           List<FormattedMessage> errors) =>
       null;
 
@@ -299,7 +311,8 @@
           offset = 0;
         }
         NodeId id = new NodeId(offset, IdKind.error);
-        T data = dataComputer.computeErrorData(compilerResult, id, list);
+        T data =
+            dataComputer.computeErrorData(config, compilerResult, id, list);
         if (data != null) {
           Map<Id, ActualData<T>> actualMap = actualMapForUri(uri);
           actualMap[id] = new ActualData<T>(id, data, uri, offset, list);
@@ -328,17 +341,18 @@
         return;
       }
     }
-    dataComputer.computeMemberData(compilerResult, member, actualMap,
+    dataComputer.computeMemberData(config, compilerResult, member, actualMap,
         verbose: verbose);
   }
 
   void processClass(Class cls, Map<Id, ActualData<T>> actualMap) {
-    dataComputer.computeClassData(compilerResult, cls, actualMap,
+    dataComputer.computeClassData(config, compilerResult, cls, actualMap,
         verbose: verbose);
   }
 
   void processExtension(Extension extension, Map<Id, ActualData<T>> actualMap) {
-    dataComputer.computeExtensionData(compilerResult, extension, actualMap,
+    dataComputer.computeExtensionData(
+        config, compilerResult, extension, actualMap,
         verbose: verbose);
   }
 
@@ -354,7 +368,7 @@
       continue;
     }
     dataComputer.computeLibraryData(
-        compilerResult, library, actualMapFor(library));
+        config, compilerResult, library, actualMapFor(library));
     for (Class cls in library.classes) {
       processClass(cls, actualMapFor(cls));
       for (Member member in cls.members) {
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 9fd7893..f4b0f2e 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -37,29 +37,41 @@
   const ExtensionsDataComputer();
 
   @override
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<Features>> actualMap,
       {bool verbose}) {
     member.accept(new ExtensionsDataExtractor(compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
       Map<Id, ActualData<Features>> actualMap,
       {bool verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
-  void computeLibraryData(InternalCompilerResult compilerResult,
-      Library library, Map<Id, ActualData<Features>> actualMap,
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<Features>> actualMap,
       {bool verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeExtensionData(InternalCompilerResult compilerResult,
-      Extension extension, Map<Id, ActualData<Features>> actualMap,
+  void computeExtensionData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Extension extension,
+      Map<Id, ActualData<Features>> actualMap,
       {bool verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap)
         .computeForExtension(extension);
@@ -69,8 +81,8 @@
   bool get supportsErrors => true;
 
   @override
-  Features computeErrorData(
-      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+  Features computeErrorData(TestConfig config, InternalCompilerResult compiler,
+      Id id, List<FormattedMessage> errors) {
     Features features = new Features();
     for (FormattedMessage error in errors) {
       if (error.message.contains(',')) {
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
index c1c9773..661ed9a 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
@@ -7,12 +7,11 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/testing/type_parser_environment.dart';
+import 'package:kernel/testing/mock_sdk.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import '../types/kernel_type_parser.dart';
-import '../types/mock_sdk.dart';
-import '../types/type_parser.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -28,7 +27,7 @@
 
   TypeSchemaEnvironment env;
 
-  KernelEnvironment kernelEnvironment;
+  TypeParserEnvironment typeParserEnvironment;
 
   Library get testLib => component.libraries.single;
 
@@ -44,21 +43,17 @@
   ///
   /// If [environment] is passed it's used to resolve the type terms in [text].
   /// If [typeParameters] are passed, they are used to extend
-  /// [kernelEnvironment] to resolve the type terms in [text].  Not more than
-  /// one of [environment] or [typeParameters] should be passed in.
+  /// [typeParserEnvironment] to resolve the type terms in [text].  Not more
+  /// than one of [environment] or [typeParameters] should be passed in.
   DartType toType(String text,
-      {KernelEnvironment environment, String typeParameters}) {
+      {TypeParserEnvironment environment, String typeParameters}) {
     assert(environment == null || typeParameters == null);
     environment ??= extend(typeParameters);
-    return environment.kernelFromParsedType(parse(text).single);
+    return environment.parseType(text);
   }
 
-  KernelEnvironment extend(String typeParameters) {
-    if (typeParameters?.isEmpty ?? true) return kernelEnvironment;
-    return const KernelFromParsedType()
-        .computeTypeParameterEnvironment(
-            parseTypeVariables("<$typeParameters>"), kernelEnvironment)
-        .environment;
+  TypeParserEnvironment extend(String typeParameters) {
+    return typeParserEnvironment.extendWithTypeParameters(typeParameters);
   }
 
   void test_addLowerBound() {
@@ -275,7 +270,7 @@
 
   void testLower(String first, String second, String expected,
       {String typeParameters}) {
-    KernelEnvironment environment = extend(typeParameters);
+    TypeParserEnvironment environment = extend(typeParameters);
     DartType firstType = toType(first, environment: environment);
     DartType secondType = toType(second, environment: environment);
     DartType expectedType = toType(expected, environment: environment);
@@ -288,7 +283,7 @@
 
   void testUpper(String first, String second, String expected,
       {String typeParameters}) {
-    KernelEnvironment environment = extend(typeParameters);
+    TypeParserEnvironment environment = extend(typeParameters);
     DartType firstType = toType(first, environment: environment);
     DartType secondType = toType(second, environment: environment);
     DartType expectedType = toType(expected, environment: environment);
@@ -1175,9 +1170,9 @@
 
   void _initialize(String testSdk) {
     Uri uri = Uri.parse("dart:core");
-    kernelEnvironment = new KernelEnvironment(uri, uri);
+    typeParserEnvironment = new TypeSchemaTypeParserEnvironment(uri);
     Library library =
-        parseLibrary(uri, mockSdk + testSdk, environment: kernelEnvironment)
+        parseLibrary(uri, mockSdk + testSdk, environment: typeParserEnvironment)
           ..isNonNullableByDefault = true;
     component = new Component(libraries: <Library>[library]);
     coreTypes = new CoreTypes(component);
@@ -1185,3 +1180,16 @@
         coreTypes, new ClassHierarchy(component, coreTypes));
   }
 }
+
+class TypeSchemaTypeParserEnvironment extends TypeParserEnvironment {
+  TypeSchemaTypeParserEnvironment(Uri uri) : super(uri, uri);
+
+  DartType getPredefinedNamedType(String name) {
+    if (name == "unknown") {
+      // Don't return a const object to ensure we test implementations that use
+      // identical.
+      return new UnknownType();
+    }
+    return null;
+  }
+}
diff --git a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
index 21fc07d..3250327 100644
--- a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
+++ b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
@@ -12,6 +12,8 @@
 
 import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
 
+import 'package:kernel/testing/type_parser_environment.dart' show parseComponent;
+
 import "package:front_end/src/api_prototype/compiler_options.dart"
     show CompilerOptions;
 
@@ -31,8 +33,6 @@
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
 
-import "kernel_type_parser.dart" show parseComponent;
-
 const String expectedHierarchy = """
 Object:
   superclasses:
@@ -81,7 +81,7 @@
   Longest path to Object: 4
   superclasses:
     Object
-  interfaces: D<int, double>, B<int>, A, C<double>
+  interfaces: D<int,double>, B<int>, A, C<double>
   classMembers:
   classSetters:
   interfaceMembers:
@@ -91,7 +91,7 @@
   Longest path to Object: 4
   superclasses:
     Object
-  interfaces: D<int, bool>, B<int>, A, C<bool>
+  interfaces: D<int,bool>, B<int>, A, C<bool>
   classMembers:
   classSetters:
   interfaceMembers:
@@ -127,7 +127,7 @@
             objectClass, loader, new CoreTypes(component));
         Library library = component.libraries.last;
         for (Class cls in library.classes) {
-          hierarchy.getNodeFromKernelClass(cls);
+          hierarchy.getNodeFromClass(cls);
         }
         Expect.stringEquals(
             expectedHierarchy, hierarchy.nodes.values.join("\n"));
diff --git a/pkg/front_end/test/fasta/types/fasta_types_test.dart b/pkg/front_end/test/fasta/types/fasta_types_test.dart
index c89dda7..bfbde70 100644
--- a/pkg/front_end/test/fasta/types/fasta_types_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_types_test.dart
@@ -10,6 +10,11 @@
 
 import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
 
+import 'package:kernel/testing/type_parser_environment.dart'
+    show TypeParserEnvironment;
+
+import 'package:kernel/type_environment.dart';
+
 import "package:front_end/src/api_prototype/compiler_options.dart"
     show CompilerOptions;
 
@@ -28,23 +33,18 @@
     show ClassHierarchyBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
-import 'package:kernel/type_environment.dart';
 
-import "kernel_type_parser.dart" show KernelEnvironment, KernelFromParsedType;
-
-import "kernel_type_parser_test.dart" show parseSdk;
+import 'kernel_type_parser_test.dart' show parseSdk;
 
 import "shared_type_tests.dart" show SubtypeTest;
 
-import "type_parser.dart" as type_parser show parse, parseTypeVariables;
-
 main() {
   final Ticker ticker = new Ticker(isVerbose: false);
   final CompilerContext context = new CompilerContext(new ProcessedOptions(
       options: new CompilerOptions()
         ..packagesFileUri = Uri.base.resolve(".packages")));
   final Uri uri = Uri.parse("dart:core");
-  final KernelEnvironment environment = new KernelEnvironment(uri, uri);
+  final TypeParserEnvironment environment = new TypeParserEnvironment(uri, uri);
   final Component sdk = parseSdk(uri, environment);
   Future<void> doIt(_) async {
     DillTarget target = new DillTarget(
@@ -64,15 +64,15 @@
   asyncTest(() => context.runInContext<void>(doIt));
 }
 
-class FastaTypesTest extends SubtypeTest<DartType, KernelEnvironment> {
+class FastaTypesTest extends SubtypeTest<DartType, TypeParserEnvironment> {
   final ClassHierarchyBuilder hierarchy;
 
-  final KernelEnvironment environment;
+  final TypeParserEnvironment environment;
 
   FastaTypesTest(this.hierarchy, this.environment);
 
-  DartType toType(String text, KernelEnvironment environment) {
-    return environment.kernelFromParsedType(type_parser.parse(text).single);
+  DartType toType(String text, TypeParserEnvironment environment) {
+    return environment.parseType(text);
   }
 
   IsSubtypeOf isSubtypeImpl(DartType subtype, DartType supertype) {
@@ -80,11 +80,7 @@
         .performNullabilityAwareSubtypeCheck(subtype, supertype);
   }
 
-  KernelEnvironment extend(String typeParameters) {
-    if (typeParameters?.isEmpty ?? true) return environment;
-    return const KernelFromParsedType()
-        .computeTypeParameterEnvironment(
-            type_parser.parseTypeVariables("<$typeParameters>"), environment)
-        .environment;
+  TypeParserEnvironment extend(String typeParameters) {
+    return environment.extendWithTypeParameters(typeParameters);
   }
 }
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index 5f174aa..997eb27 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -14,14 +14,12 @@
 
 import "package:kernel/type_environment.dart" show IsSubtypeOf, TypeEnvironment;
 
-import "kernel_type_parser.dart"
-    show KernelEnvironment, KernelFromParsedType, parseLibrary;
+import 'package:kernel/testing/type_parser_environment.dart'
+    show TypeParserEnvironment, parseLibrary;
 
-import "mock_sdk.dart" show mockSdk;
+import 'package:kernel/testing/mock_sdk.dart' show mockSdk;
 
-import "shared_type_tests.dart" show SubtypeTest;
-
-import "type_parser.dart" as type_parser show parse, parseTypeVariables;
+import 'shared_type_tests.dart' show SubtypeTest;
 
 const String testSdk = """
 typedef Typedef<T> <S>(T) -> S;
@@ -83,7 +81,7 @@
 }
 """;
 
-Component parseSdk(Uri uri, KernelEnvironment environment) {
+Component parseSdk(Uri uri, TypeParserEnvironment environment) {
   Library library =
       parseLibrary(uri, mockSdk + testSdk, environment: environment);
   StringBuffer sb = new StringBuffer();
@@ -95,27 +93,27 @@
 
 main() {
   Uri uri = Uri.parse("dart:core");
-  KernelEnvironment environment = new KernelEnvironment(uri, uri);
+  TypeParserEnvironment environment = new TypeParserEnvironment(uri, uri);
   Component component = parseSdk(uri, environment);
   CoreTypes coreTypes = new CoreTypes(component);
   ClassHierarchy hierarchy = new ClassHierarchy(component, coreTypes);
   new KernelSubtypeTest(coreTypes, hierarchy, environment).run();
 }
 
-class KernelSubtypeTest extends SubtypeTest<DartType, KernelEnvironment> {
+class KernelSubtypeTest extends SubtypeTest<DartType, TypeParserEnvironment> {
   final CoreTypes coreTypes;
 
   final ClassHierarchy hierarchy;
 
-  final KernelEnvironment environment;
+  final TypeParserEnvironment environment;
 
   KernelSubtypeTest(this.coreTypes, this.hierarchy, this.environment);
 
   @override
   bool get skipFutureOrPromotion => true;
 
-  DartType toType(String text, KernelEnvironment environment) {
-    return environment.kernelFromParsedType(type_parser.parse(text).single);
+  DartType toType(String text, TypeParserEnvironment environment) {
+    return environment.parseType(text);
   }
 
   IsSubtypeOf isSubtypeImpl(DartType subtype, DartType supertype) {
@@ -123,11 +121,7 @@
         .performNullabilityAwareSubtypeCheck(subtype, supertype);
   }
 
-  KernelEnvironment extend(String typeParameters) {
-    if (typeParameters?.isEmpty ?? true) return environment;
-    return const KernelFromParsedType()
-        .computeTypeParameterEnvironment(
-            type_parser.parseTypeVariables("<$typeParameters>"), environment)
-        .environment;
+  TypeParserEnvironment extend(String typeParameters) {
+    return environment.extendWithTypeParameters(typeParameters);
   }
 }
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
index 06847dc..686768e 100644
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
@@ -13,7 +13,8 @@
 
 import "package:kernel/library_index.dart" show LibraryIndex;
 
-import "kernel_type_parser.dart" as kernel_type_parser show parseComponent;
+import 'package:kernel/testing/type_parser_environment.dart'
+    as kernel_type_parser show parseComponent;
 
 final Uri libraryUri = Uri.parse("org-dartlang-test:///library.dart");
 
diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
index c83187f..c869e7c 100644
--- a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
@@ -14,14 +14,12 @@
 
 import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
 
+import 'package:kernel/testing/type_parser_environment.dart'
+    show TypeParserEnvironment, parseLibrary;
+
 import "package:kernel/type_environment.dart"
     show SubtypeCheckMode, TypeEnvironment;
 
-import "kernel_type_parser.dart"
-    show KernelEnvironment, KernelFromParsedType, parseLibrary;
-
-import "type_parser.dart" as type_parser show parse, parseTypeVariables;
-
 import "package:front_end/src/api_prototype/compiler_options.dart"
     show CompilerOptions;
 
@@ -68,7 +66,7 @@
   Map<Object, Object> data = json.decode(source);
   List<Object> classes = data["classes"];
   Uri uri = Uri.parse("dart:core");
-  KernelEnvironment environment = new KernelEnvironment(uri, uri);
+  TypeParserEnvironment environment = new TypeParserEnvironment(uri, uri);
   Library library =
       parseLibrary(uri, classes.join("\n"), environment: environment);
   List<Object> checks = data["checks"];
@@ -82,20 +80,14 @@
     if (tSource.contains("?")) continue;
     if (sSource.contains("⊥")) continue;
     if (tSource.contains("⊥")) continue;
-    KernelEnvironment localEnvironment = environment;
+    TypeParserEnvironment localEnvironment = environment;
     if (arguments.length > 2) {
       List<Object> typeParametersSource = arguments[2];
-      localEnvironment = const KernelFromParsedType()
-          .computeTypeParameterEnvironment(
-              type_parser
-                  .parseTypeVariables("<${typeParametersSource.join(', ')}>"),
-              environment)
-          .environment;
+      localEnvironment = environment
+          .extendWithTypeParameters("${typeParametersSource.join(', ')}");
     }
-    DartType s = localEnvironment
-        .kernelFromParsedType(type_parser.parse(sSource).single);
-    DartType t = localEnvironment
-        .kernelFromParsedType(type_parser.parse(tSource).single);
+    DartType s = localEnvironment.parseType(sSource);
+    DartType t = localEnvironment.parseType(tSource);
     subtypeChecks.add(new SubtypeCheck(s, t, kind == "isSubtype"));
   }
   return new SubtypesBenchmark(library, subtypeChecks);
diff --git a/pkg/front_end/test/fasta/types/type_test_helper.dart b/pkg/front_end/test/fasta/types/type_test_helper.dart
deleted file mode 100644
index 46c00f1..0000000
--- a/pkg/front_end/test/fasta/types/type_test_helper.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/ast.dart' hide MapEntry;
-import 'package:kernel/core_types.dart';
-
-import "kernel_type_parser.dart";
-import "type_parser.dart";
-import "mock_sdk.dart" show mockSdk;
-
-class Env {
-  Component component;
-
-  CoreTypes coreTypes;
-
-  KernelEnvironment _libraryEnvironment;
-
-  Env(String source) {
-    Uri libraryUri = Uri.parse('memory:main.dart');
-    Uri coreUri = Uri.parse("dart:core");
-    KernelEnvironment coreEnvironment = new KernelEnvironment(coreUri, coreUri);
-    Library coreLibrary =
-        parseLibrary(coreUri, mockSdk, environment: coreEnvironment);
-    _libraryEnvironment = new KernelEnvironment(libraryUri, libraryUri)
-        .extend(coreEnvironment.declarations);
-    Library library =
-        parseLibrary(libraryUri, source, environment: _libraryEnvironment);
-    library.name = "lib";
-    component = new Component(libraries: <Library>[coreLibrary, library]);
-    coreTypes = new CoreTypes(component);
-  }
-
-  DartType parseType(String text) {
-    List<ParsedType> types = parse(text);
-    return _libraryEnvironment.kernelFromParsedType(types.single);
-  }
-}
diff --git a/pkg/front_end/test/id_testing/id_testing_test.dart b/pkg/front_end/test/id_testing/id_testing_test.dart
index 24573e0..248223c 100644
--- a/pkg/front_end/test/id_testing/id_testing_test.dart
+++ b/pkg/front_end/test/id_testing/id_testing_test.dart
@@ -13,6 +13,7 @@
         CfeDataExtractor,
         InternalCompilerResult,
         DataComputer,
+        TestConfig,
         defaultCfeConfig,
         createUriForFileName,
         onFailure,
@@ -41,21 +42,30 @@
   const IdTestingDataComputer();
 
   @override
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     member.accept(new IdTestingDataExtractor(compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     new IdTestingDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
-  void computeLibraryData(InternalCompilerResult compilerResult,
-      Library library, Map<Id, ActualData<String>> actualMap,
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     new IdTestingDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
@@ -64,8 +74,8 @@
   @override
   bool get supportsErrors => true;
 
-  String computeErrorData(
-      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+  String computeErrorData(TestConfig config, InternalCompilerResult compiler,
+      Id id, List<FormattedMessage> errors) {
     return errorsToText(errors);
   }
 
diff --git a/pkg/front_end/test/id_tests/assigned_variables_test.dart b/pkg/front_end/test/id_tests/assigned_variables_test.dart
index 382678e..31fe46c 100644
--- a/pkg/front_end/test/id_tests/assigned_variables_test.dart
+++ b/pkg/front_end/test/id_tests/assigned_variables_test.dart
@@ -40,7 +40,10 @@
   /// Function that computes a data mapping for [member].
   ///
   /// Fills [actualMap] with the data.
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<_Data>> actualMap,
       {bool verbose}) {
     MemberBuilderImpl memberBuilder =
diff --git a/pkg/front_end/test/id_tests/constant_test.dart b/pkg/front_end/test/id_tests/constant_test.dart
index 814aa14..7c83a40 100644
--- a/pkg/front_end/test/id_tests/constant_test.dart
+++ b/pkg/front_end/test/id_tests/constant_test.dart
@@ -13,6 +13,7 @@
         InternalCompilerResult,
         DataComputer,
         FormattedMessage,
+        TestConfig,
         createUriForFileName,
         defaultCfeConfig,
         onFailure,
@@ -36,14 +37,20 @@
   const ConstantsDataComputer();
 
   @override
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     member.accept(new ConstantsDataExtractor(compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     new ConstantsDataExtractor(compilerResult, actualMap).computeForClass(cls);
@@ -53,8 +60,8 @@
   bool get supportsErrors => true;
 
   /// Returns data corresponding to [error].
-  String computeErrorData(
-      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+  String computeErrorData(TestConfig config, InternalCompilerResult compiler,
+      Id id, List<FormattedMessage> errors) {
     return errorsToText(errors);
   }
 
diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart
index a99645a..3a69242 100644
--- a/pkg/front_end/test/id_tests/definite_assignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_assignment_test.dart
@@ -36,7 +36,10 @@
   /// Function that computes a data mapping for [member].
   ///
   /// Fills [actualMap] with the data.
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     MemberBuilderImpl memberBuilder =
@@ -53,7 +56,7 @@
   DefiniteAssignmentDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<String>> actualMap, this._flowResult)
       : _sourceLoaderDataForTesting =
-      compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting.loader.dataForTesting,
         super(compilerResult, actualMap);
 
   @override
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index 9bf13d2..f5534d1 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -5,22 +5,30 @@
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
+import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart';
 import 'package:front_end/src/fasta/kernel/kernel_api.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
 import 'package:front_end/src/testing/id_extractor.dart';
 import 'package:kernel/ast.dart';
 
+const String cfeFromBuilderMarker = 'cfe:builder';
+
+const TestConfig cfeFromBuilder = const TestConfig(
+    cfeFromBuilderMarker, 'cfe from builder',
+    experimentalFlags: const {ExperimentalFlag.nonNullable: true});
+
 main(List<String> args) async {
   Directory dataDir = new Directory.fromUri(Platform.script
       .resolve('../../../_fe_analyzer_shared/test/inheritance/data'));
   await runTests<String>(dataDir,
       args: args,
-      supportedMarkers: [cfeMarker],
+      supportedMarkers: [cfeMarker, cfeFromBuilderMarker],
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
-      runTest: runTestFor(
-          const InheritanceDataComputer(), [cfeNonNullableOnlyConfig]));
+      runTest: runTestFor(const InheritanceDataComputer(),
+          [cfeNonNullableOnlyConfig, cfeFromBuilder]));
 }
 
 class InheritanceDataComputer extends DataComputer<String> {
@@ -29,18 +37,24 @@
   /// Function that computes a data mapping for [library].
   ///
   /// Fills [actualMap] with the data.
-  void computeLibraryData(InternalCompilerResult compilerResult,
-      Library library, Map<Id, ActualData<String>> actualMap,
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
-    new InheritanceDataExtractor(compilerResult, actualMap)
+    new InheritanceDataExtractor(config, compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
-    new InheritanceDataExtractor(compilerResult, actualMap)
+    new InheritanceDataExtractor(config, compilerResult, actualMap)
         .computeForClass(cls);
   }
 
@@ -48,8 +62,8 @@
   bool get supportsErrors => true;
 
   @override
-  String computeErrorData(
-      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+  String computeErrorData(TestConfig config, InternalCompilerResult compiler,
+      Id id, List<FormattedMessage> errors) {
     return errorsToText(errors, useCodes: true);
   }
 
@@ -58,14 +72,17 @@
 }
 
 class InheritanceDataExtractor extends CfeDataExtractor<String> {
-  final ClassHierarchy _hierarchy;
-  final CoreTypes _coreTypes;
+  final TestConfig _config;
+  final InternalCompilerResult _compilerResult;
 
-  InheritanceDataExtractor(InternalCompilerResult compilerResult,
-      Map<Id, ActualData<String>> actualMap)
-      : _hierarchy = compilerResult.classHierarchy,
-        _coreTypes = compilerResult.coreTypes,
-        super(compilerResult, actualMap);
+  InheritanceDataExtractor(
+      this._config, this._compilerResult, Map<Id, ActualData<String>> actualMap)
+      : super(_compilerResult, actualMap);
+
+  ClassHierarchy get _hierarchy => _compilerResult.classHierarchy;
+  CoreTypes get _coreTypes => _compilerResult.coreTypes;
+  ClassHierarchyBuilder get _classHierarchyBuilder =>
+      _compilerResult.kernelTargetForTesting.loader.builderHierarchy;
 
   @override
   String computeLibraryValue(Id id, Library node) {
@@ -75,7 +92,7 @@
   @override
   void computeForClass(Class node) {
     super.computeForClass(node);
-
+    // TODO(johnniwinther): Also compute member data from builders.
     Set<Name> getters = _hierarchy
         .getInterfaceMembers(node)
         .map((Member member) => member.name)
@@ -148,14 +165,38 @@
 
   @override
   String computeClassValue(Id id, Class node) {
-    List<String> supertypes = <String>[];
-    for (Class superclass in computeAllSuperclasses(node)) {
-      Supertype supertype = _hierarchy.getClassAsInstanceOf(node, superclass);
-      assert(supertype != null, "No instance of $superclass found for $node.");
-      supertypes.add(
-          supertypeToText(supertype, TypeRepresentation.implicitUndetermined));
+    if (_config.marker == cfeMarker) {
+      List<String> supertypes = <String>[];
+      for (Class superclass in computeAllSuperclasses(node)) {
+        Supertype supertype = _hierarchy.getClassAsInstanceOf(node, superclass);
+        assert(
+            supertype != null, "No instance of $superclass found for $node.");
+        supertypes.add(supertypeToText(
+            supertype, TypeRepresentation.implicitUndetermined));
+      }
+      supertypes.sort();
+      return supertypes.join(',');
+    } else if (_config.marker == cfeFromBuilderMarker) {
+      ClassHierarchyNode classHierarchyNode =
+          _classHierarchyBuilder.getNodeFromClass(node);
+      Set<String> supertypes = <String>{};
+      void addDartType(DartType type) {
+        if (type is InterfaceType) {
+          Supertype supertype =
+              new Supertype(type.classNode, type.typeArguments);
+          supertypes.add(supertypeToText(
+              supertype, TypeRepresentation.implicitUndetermined));
+        }
+      }
+
+      addDartType(_coreTypes.thisInterfaceType(
+          classHierarchyNode.classBuilder.cls,
+          classHierarchyNode.classBuilder.cls.enclosingLibrary.nonNullable));
+      classHierarchyNode.superclasses.forEach(addDartType);
+      classHierarchyNode.interfaces.forEach(addDartType);
+      List<String> sorted = supertypes.toList()..sort();
+      return sorted.join(',');
     }
-    supertypes.sort();
-    return supertypes.join(',');
+    return null;
   }
 }
diff --git a/pkg/front_end/test/id_tests/nullability_test.dart b/pkg/front_end/test/id_tests/nullability_test.dart
index b5a565a..b22dd52 100644
--- a/pkg/front_end/test/id_tests/nullability_test.dart
+++ b/pkg/front_end/test/id_tests/nullability_test.dart
@@ -31,7 +31,10 @@
   /// Function that computes a data mapping for [member].
   ///
   /// Fills [actualMap] with the data.
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     member.accept(new NullabilityDataExtractor(compilerResult, actualMap));
diff --git a/pkg/front_end/test/id_tests/reachability_test.dart b/pkg/front_end/test/id_tests/reachability_test.dart
index 9fd0e40..442be6c 100644
--- a/pkg/front_end/test/id_tests/reachability_test.dart
+++ b/pkg/front_end/test/id_tests/reachability_test.dart
@@ -37,7 +37,10 @@
   /// Function that computes a data mapping for [member].
   ///
   /// Fills [actualMap] with the data.
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap,
       {bool verbose}) {
     MemberBuilderImpl memberBuilder =
diff --git a/pkg/front_end/test/id_tests/type_promotion_test.dart b/pkg/front_end/test/id_tests/type_promotion_test.dart
index b0423d9..5d64352 100644
--- a/pkg/front_end/test/id_tests/type_promotion_test.dart
+++ b/pkg/front_end/test/id_tests/type_promotion_test.dart
@@ -34,7 +34,10 @@
   /// Function that computes a data mapping for [member].
   ///
   /// Fills [actualMap] with the data.
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<DartType>> actualMap,
       {bool verbose}) {
     member.accept(new TypePromotionDataExtractor(compilerResult, actualMap));
diff --git a/pkg/front_end/test/language_versioning/language_versioning_test.dart b/pkg/front_end/test/language_versioning/language_versioning_test.dart
index 22d711a..4d609fe 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_test.dart
@@ -48,8 +48,11 @@
 class LanguageVersioningDataComputer extends DataComputer<String> {
   const LanguageVersioningDataComputer();
 
-  void computeLibraryData(InternalCompilerResult compilerResult,
-      Library library, Map<Id, ActualData<String>> actualMap,
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     new LanguageVersioningDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
@@ -58,8 +61,8 @@
   @override
   bool get supportsErrors => true;
 
-  String computeErrorData(
-      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+  String computeErrorData(TestConfig config, InternalCompilerResult compiler,
+      Id id, List<FormattedMessage> errors) {
     return errors.map((m) => m.code.name).join(',');
   }
 
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index 569f623..9562068 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -47,22 +47,31 @@
   const PatchingDataComputer();
 
   @override
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<Features>> actualMap,
       {bool verbose}) {
     member.accept(new PatchingDataExtractor(compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
       Map<Id, ActualData<Features>> actualMap,
       {bool verbose}) {
     new PatchingDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
   @override
-  void computeLibraryData(InternalCompilerResult compilerResult,
-      Library library, Map<Id, ActualData<Features>> actualMap,
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<Features>> actualMap,
       {bool verbose}) {
     new PatchingDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
@@ -71,9 +80,9 @@
   @override
   bool get supportsErrors => true;
 
-  /// Returns data corresponding to [error].
-  Features computeErrorData(
-      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+  @override
+  Features computeErrorData(TestConfig config, InternalCompilerResult compiler,
+      Id id, List<FormattedMessage> errors) {
     Features features = new Features();
     features[Tags.error] = errorsToText(errors);
     return features;
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 4abf220..ae10113 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -243,6 +243,7 @@
 deemed
 deepest
 deeply
+def
 degrades
 degree
 del
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 953ea73..e7c6b89 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -350,6 +350,7 @@
 calculation
 calculator
 call
+callable
 callback
 called
 caller
@@ -1473,6 +1474,7 @@
 instrumentation
 instrumented
 int
+intact
 integer
 integers
 integrated
@@ -2931,6 +2933,7 @@
 transformations
 transformed
 transformer
+transforms
 transient
 transition
 transitional
@@ -3071,6 +3074,7 @@
 updating
 upon
 upper
+uppercase
 upwards
 uri
 uris
diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart
index a4b7d1e..e49079f 100644
--- a/pkg/front_end/test/static_types/static_type_test.dart
+++ b/pkg/front_end/test/static_types/static_type_test.dart
@@ -38,15 +38,21 @@
   /// Function that computes a data mapping for [library].
   ///
   /// Fills [actualMap] with the data.
-  void computeLibraryData(InternalCompilerResult compilerResult,
-      Library library, Map<Id, ActualData<String>> actualMap,
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     new StaticTypeDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose}) {
     member.accept(new StaticTypeDataExtractor(compilerResult, actualMap));
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart b/pkg/front_end/testcases/nnbd/issue40134.dart
new file mode 100644
index 0000000..ac42c1f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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 is a regression test for http://dartbug.com/40134.
+
+class GenericMethodBounds<T> {
+  Type get t => T;
+  GenericMethodBounds<E> foo<E extends T>() => new GenericMethodBounds<E>();
+  GenericMethodBounds<E> bar<E extends void Function(T)>() =>
+      new GenericMethodBounds<E>();
+}
+
+class GenericMethodBoundsDerived extends GenericMethodBounds<num> {
+  GenericMethodBounds<E> foo<E extends num>() => new GenericMethodBounds<E>();
+  GenericMethodBounds<E> bar<E extends void Function(num)>() =>
+      new GenericMethodBounds<E>();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.outline.expect
new file mode 100644
index 0000000..4da8085
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class GenericMethodBounds<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericMethodBounds<self::GenericMethodBounds::T%>
+    ;
+  get t() → core::Type
+    ;
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+    ;
+  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+    ;
+}
+class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
+  synthetic constructor •() → self::GenericMethodBoundsDerived
+    ;
+  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+    ;
+  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.expect
new file mode 100644
index 0000000..e1c88be
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class GenericMethodBounds<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericMethodBounds<self::GenericMethodBounds::T%>
+    : super core::Object::•()
+    ;
+  get t() → core::Type
+    return self::GenericMethodBounds::T%;
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
+  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
+}
+class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
+  synthetic constructor •() → self::GenericMethodBoundsDerived
+    : super self::GenericMethodBounds::•()
+    ;
+  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
+  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.transformed.expect
new file mode 100644
index 0000000..e1c88be
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class GenericMethodBounds<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericMethodBounds<self::GenericMethodBounds::T%>
+    : super core::Object::•()
+    ;
+  get t() → core::Type
+    return self::GenericMethodBounds::T%;
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
+  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
+}
+class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
+  synthetic constructor •() → self::GenericMethodBoundsDerived
+    : super self::GenericMethodBounds::•()
+    ;
+  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
+  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.expect
new file mode 100644
index 0000000..e1c88be
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class GenericMethodBounds<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericMethodBounds<self::GenericMethodBounds::T%>
+    : super core::Object::•()
+    ;
+  get t() → core::Type
+    return self::GenericMethodBounds::T%;
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
+  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
+}
+class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
+  synthetic constructor •() → self::GenericMethodBoundsDerived
+    : super self::GenericMethodBounds::•()
+    ;
+  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
+  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.transformed.expect
new file mode 100644
index 0000000..e1c88be
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class GenericMethodBounds<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericMethodBounds<self::GenericMethodBounds::T%>
+    : super core::Object::•()
+    ;
+  get t() → core::Type
+    return self::GenericMethodBounds::T%;
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
+  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
+}
+class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
+  synthetic constructor •() → self::GenericMethodBoundsDerived
+    : super self::GenericMethodBounds::•()
+    ;
+  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
+  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart b/pkg/front_end/testcases/nnbd/nullable_receiver.dart
index 98c3f88..36b8369 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart
@@ -12,7 +12,11 @@
   void call() {}
 }
 
-error(String? s, A? a) {
+class B {
+  String toString([int extra = 42]) => super.toString();
+}
+
+error(String? s, A? a, B? b) {
   s.length;
   s.substring(1, 1);
 
@@ -20,6 +24,7 @@
   a.bar;
   a.baz = 42;
   a();
+  b.toString(0);
 
   Function f1 = a;
   void Function() f2 = a;
@@ -27,21 +32,31 @@
 }
 
 // It's ok to invoke members of Object on nullable types.
-ok(String? s, A? a, Invocation i) {
+ok<T extends Object?>(String? s, A? a, T t, B? b, Invocation i) {
   s == s;
   a == a;
+  t == t;
+  b == b;
 
   s.hashCode;
   a.hashCode;
+  t.hashCode;
+  b.hashCode;
 
   s.toString();
   a.toString();
+  t.toString();
+  b.toString();
 
   try { s.noSuchMethod(i); } catch (e, t) {}
   try { a.noSuchMethod(i); } catch (e, t) {}
+  try { t.noSuchMethod(i); } catch (e, t) {}
+  try { b.noSuchMethod(i); } catch (e, t) {}
 
   s.runtimeType;
   a.runtimeType;
+  t.runtimeType;
+  b.runtimeType;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.outline.expect
index 65602b3..8b1efd6 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.outline.expect
@@ -14,9 +14,15 @@
   method call() → void
     ;
 }
-static method error(core::String? s, self::A? a) → dynamic
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+  method toString([core::int extra = 42]) → core::String
+    ;
+}
+static method error(core::String? s, self::A? a, self::B? b) → dynamic
   ;
-static method ok(core::String? s, self::A? a, core::Invocation i) → dynamic
+static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
index ad24d5a..d981a0b 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
@@ -2,93 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:16:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 // Try accessing using ?. instead.
 //   s.length;
 //     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:17:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
 // Try calling using ?. instead.
 //   s.substring(1, 1);
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:19:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   a.foo();
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.bar;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:22:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   a();
+//    ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
 //   a();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   b.toString(0);
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
 //  - 'Function' is from 'dart:core'.
 //   Function f1 = a;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
 //   void Function() f2 = a;
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:34:5: Error: Property 'hashCode' cannot be accessed on 'String?' because it is potentially null.
-// Try accessing using ?. instead.
-//   s.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:35:5: Error: Property 'hashCode' cannot be accessed on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:37:5: Error: Method 'toString' cannot be called on 'String?' because it is potentially null.
-// Try calling using ?. instead.
-//   s.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:38:5: Error: Method 'toString' cannot be called on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:40:11: Error: Method 'noSuchMethod' cannot be called on 'String?' because it is potentially null.
-// Try calling using ?. instead.
-//   try { s.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:41:11: Error: Method 'noSuchMethod' cannot be called on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   try { a.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:43:5: Error: Property 'runtimeType' cannot be accessed on 'String?' because it is potentially null.
-// Try accessing using ?. instead.
-//   s.runtimeType;
-//     ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:44:5: Error: Property 'runtimeType' cannot be accessed on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.runtimeType;
-//     ^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -102,90 +70,100 @@
   set baz(core::int value) → void {}
   method call() → void {}
 }
-static method error(core::String? s, self::A? a) → dynamic {
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:16:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method toString([core::int extra = #C1]) → core::String
+    return super.{core::Object::toString}();
+}
+static method error(core::String? s, self::A? a, self::B? b) → dynamic {
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
   s.length;
     ^^^^^^" in s.{core::String::length};
-  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:17:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
 Try calling using ?. instead.
   s.substring(1, 1);
     ^^^^^^^^^" in s.{core::String::substring}(1, 1);
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:19:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?. instead.
   a.foo();
     ^^^" in a.{self::A::foo}();
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try accessing using ?. instead.
   a.bar;
     ^^^" in a.{self::A::bar};
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try accessing using ?. instead.
   a.baz = 42;
     ^^^" in a.{self::A::baz} = 42;
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:22:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?.call instead.
   a();
+   ^" in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  a();
    ^" in a.{self::A::call}();
-  core::Function f1 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  b.toString(0);
+    ^^^^^^^^" in b.{self::B::toString}(0);
+  core::Function f1 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   Function f1 = a;
-           ^" in (let final self::A? #t8 = a in #t8.==(null) ?{() →? void} null : #t8.{self::A::call}) as{TypeError} core::Function;
-  () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+           ^" in (let final self::A? #t10 = a in #t10.==(null) ?{() →? void} null : #t10.{self::A::call}) as{TypeError} core::Function;
+  () → void f2 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
   void Function() f2 = a;
-                  ^" in (let final self::A? #t10 = a in #t10.==(null) ?{() →? void} null : #t10.{self::A::call}) as{TypeError} () → void;
-  () →? void f3 = let final self::A? #t11 = a in #t11.==(null) ?{() →? void} null : #t11.{self::A::call};
+                  ^" in (let final self::A? #t12 = a in #t12.==(null) ?{() →? void} null : #t12.{self::A::call}) as{TypeError} () → void;
+  () →? void f3 = let final self::A? #t13 = a in #t13.==(null) ?{() →? void} null : #t13.{self::A::call};
 }
-static method ok(core::String? s, self::A? a, core::Invocation i) → dynamic {
+static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
   a.{core::Object::==}(a);
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:34:5: Error: Property 'hashCode' cannot be accessed on 'String?' because it is potentially null.
-Try accessing using ?. instead.
-  s.hashCode;
-    ^^^^^^^^" in s.{core::String::hashCode};
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:35:5: Error: Property 'hashCode' cannot be accessed on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try accessing using ?. instead.
-  a.hashCode;
-    ^^^^^^^^" in a.{core::Object::hashCode};
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:37:5: Error: Method 'toString' cannot be called on 'String?' because it is potentially null.
-Try calling using ?. instead.
-  s.toString();
-    ^^^^^^^^" in s.{core::Object::toString}();
-  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:38:5: Error: Method 'toString' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
-  a.toString();
-    ^^^^^^^^" in a.{core::Object::toString}();
+  t.{core::Object::==}(t);
+  b.{core::Object::==}(b);
+  s.{core::String::hashCode};
+  a.{core::Object::hashCode};
+  t.{core::Object::hashCode};
+  b.{core::Object::hashCode};
+  s.{core::Object::toString}();
+  a.{core::Object::toString}();
+  t.{core::Object::toString}();
+  b.{self::B::toString}();
   try {
-    let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:40:11: Error: Method 'noSuchMethod' cannot be called on 'String?' because it is potentially null.
-Try calling using ?. instead.
-  try { s.noSuchMethod(i); } catch (e, t) {}
-          ^^^^^^^^^^^^" in s.{core::Object::noSuchMethod}(i);
+    s.{core::Object::noSuchMethod}(i);
   }
   on dynamic catch(final dynamic e, final core::StackTrace t) {
   }
   try {
-    let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:41:11: Error: Method 'noSuchMethod' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
-  try { a.noSuchMethod(i); } catch (e, t) {}
-          ^^^^^^^^^^^^" in a.{core::Object::noSuchMethod}(i);
+    a.{core::Object::noSuchMethod}(i);
   }
   on dynamic catch(final dynamic e, final core::StackTrace t) {
   }
-  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:43:5: Error: Property 'runtimeType' cannot be accessed on 'String?' because it is potentially null.
-Try accessing using ?. instead.
-  s.runtimeType;
-    ^^^^^^^^^^^" in s.{core::Object::runtimeType};
-  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:44:5: Error: Property 'runtimeType' cannot be accessed on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try accessing using ?. instead.
-  a.runtimeType;
-    ^^^^^^^^^^^" in a.{core::Object::runtimeType};
+  try {
+    t.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
+  try {
+    b.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
+  s.{core::Object::runtimeType};
+  a.{core::Object::runtimeType};
+  t.{core::Object::runtimeType};
+  b.{core::Object::runtimeType};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
index ad24d5a..d981a0b 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
@@ -2,93 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:16:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 // Try accessing using ?. instead.
 //   s.length;
 //     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:17:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
 // Try calling using ?. instead.
 //   s.substring(1, 1);
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:19:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   a.foo();
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.bar;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:22:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   a();
+//    ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
 //   a();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   b.toString(0);
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
 //  - 'Function' is from 'dart:core'.
 //   Function f1 = a;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
 //   void Function() f2 = a;
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:34:5: Error: Property 'hashCode' cannot be accessed on 'String?' because it is potentially null.
-// Try accessing using ?. instead.
-//   s.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:35:5: Error: Property 'hashCode' cannot be accessed on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:37:5: Error: Method 'toString' cannot be called on 'String?' because it is potentially null.
-// Try calling using ?. instead.
-//   s.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:38:5: Error: Method 'toString' cannot be called on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:40:11: Error: Method 'noSuchMethod' cannot be called on 'String?' because it is potentially null.
-// Try calling using ?. instead.
-//   try { s.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:41:11: Error: Method 'noSuchMethod' cannot be called on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   try { a.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:43:5: Error: Property 'runtimeType' cannot be accessed on 'String?' because it is potentially null.
-// Try accessing using ?. instead.
-//   s.runtimeType;
-//     ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:44:5: Error: Property 'runtimeType' cannot be accessed on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.runtimeType;
-//     ^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -102,90 +70,100 @@
   set baz(core::int value) → void {}
   method call() → void {}
 }
-static method error(core::String? s, self::A? a) → dynamic {
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:16:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method toString([core::int extra = #C1]) → core::String
+    return super.{core::Object::toString}();
+}
+static method error(core::String? s, self::A? a, self::B? b) → dynamic {
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
   s.length;
     ^^^^^^" in s.{core::String::length};
-  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:17:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
 Try calling using ?. instead.
   s.substring(1, 1);
     ^^^^^^^^^" in s.{core::String::substring}(1, 1);
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:19:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?. instead.
   a.foo();
     ^^^" in a.{self::A::foo}();
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try accessing using ?. instead.
   a.bar;
     ^^^" in a.{self::A::bar};
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try accessing using ?. instead.
   a.baz = 42;
     ^^^" in a.{self::A::baz} = 42;
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:22:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?.call instead.
   a();
+   ^" in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  a();
    ^" in a.{self::A::call}();
-  core::Function f1 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  b.toString(0);
+    ^^^^^^^^" in b.{self::B::toString}(0);
+  core::Function f1 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   Function f1 = a;
-           ^" in (let final self::A? #t8 = a in #t8.==(null) ?{() →? void} null : #t8.{self::A::call}) as{TypeError} core::Function;
-  () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+           ^" in (let final self::A? #t10 = a in #t10.==(null) ?{() →? void} null : #t10.{self::A::call}) as{TypeError} core::Function;
+  () → void f2 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:19: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
   void Function() f2 = a;
-                  ^" in (let final self::A? #t10 = a in #t10.==(null) ?{() →? void} null : #t10.{self::A::call}) as{TypeError} () → void;
-  () →? void f3 = let final self::A? #t11 = a in #t11.==(null) ?{() →? void} null : #t11.{self::A::call};
+                  ^" in (let final self::A? #t12 = a in #t12.==(null) ?{() →? void} null : #t12.{self::A::call}) as{TypeError} () → void;
+  () →? void f3 = let final self::A? #t13 = a in #t13.==(null) ?{() →? void} null : #t13.{self::A::call};
 }
-static method ok(core::String? s, self::A? a, core::Invocation i) → dynamic {
+static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
   a.{core::Object::==}(a);
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:34:5: Error: Property 'hashCode' cannot be accessed on 'String?' because it is potentially null.
-Try accessing using ?. instead.
-  s.hashCode;
-    ^^^^^^^^" in s.{core::String::hashCode};
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:35:5: Error: Property 'hashCode' cannot be accessed on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try accessing using ?. instead.
-  a.hashCode;
-    ^^^^^^^^" in a.{core::Object::hashCode};
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:37:5: Error: Method 'toString' cannot be called on 'String?' because it is potentially null.
-Try calling using ?. instead.
-  s.toString();
-    ^^^^^^^^" in s.{core::Object::toString}();
-  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:38:5: Error: Method 'toString' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
-  a.toString();
-    ^^^^^^^^" in a.{core::Object::toString}();
+  t.{core::Object::==}(t);
+  b.{core::Object::==}(b);
+  s.{core::String::hashCode};
+  a.{core::Object::hashCode};
+  t.{core::Object::hashCode};
+  b.{core::Object::hashCode};
+  s.{core::Object::toString}();
+  a.{core::Object::toString}();
+  t.{core::Object::toString}();
+  b.{self::B::toString}();
   try {
-    let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:40:11: Error: Method 'noSuchMethod' cannot be called on 'String?' because it is potentially null.
-Try calling using ?. instead.
-  try { s.noSuchMethod(i); } catch (e, t) {}
-          ^^^^^^^^^^^^" in s.{core::Object::noSuchMethod}(i);
+    s.{core::Object::noSuchMethod}(i);
   }
   on dynamic catch(final dynamic e, final core::StackTrace t) {
   }
   try {
-    let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:41:11: Error: Method 'noSuchMethod' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
-  try { a.noSuchMethod(i); } catch (e, t) {}
-          ^^^^^^^^^^^^" in a.{core::Object::noSuchMethod}(i);
+    a.{core::Object::noSuchMethod}(i);
   }
   on dynamic catch(final dynamic e, final core::StackTrace t) {
   }
-  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:43:5: Error: Property 'runtimeType' cannot be accessed on 'String?' because it is potentially null.
-Try accessing using ?. instead.
-  s.runtimeType;
-    ^^^^^^^^^^^" in s.{core::Object::runtimeType};
-  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:44:5: Error: Property 'runtimeType' cannot be accessed on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try accessing using ?. instead.
-  a.runtimeType;
-    ^^^^^^^^^^^" in a.{core::Object::runtimeType};
+  try {
+    t.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
+  try {
+    b.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
+  s.{core::Object::runtimeType};
+  a.{core::Object::runtimeType};
+  t.{core::Object::runtimeType};
+  b.{core::Object::runtimeType};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
index 3e30a27..54ee84d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
@@ -2,93 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:16:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
 // Try accessing using ?. instead.
 //   s.length;
 //     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:17:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
 // Try calling using ?. instead.
 //   s.substring(1, 1);
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:19:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   a.foo();
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.bar;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:22:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Method 'call' is called on 'A?' which is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   a();
+//    ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
 //   a();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:12: Warning: Assigning value of type 'void Function()?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Warning: Method 'toString' is called on 'B?' which is potentially null.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   b.toString(0);
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:12: Warning: Assigning value of type 'void Function()?' to a variable of type 'Function'.
 //  - 'Function' is from 'dart:core'.
 //   Function f1 = a;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:19: Warning: Assigning value of type 'void Function()?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:19: Warning: Assigning value of type 'void Function()?' to a variable of type 'void Function()'.
 //   void Function() f2 = a;
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:34:5: Warning: Property 'hashCode' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-//   s.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:35:5: Warning: Property 'hashCode' is accessed on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:37:5: Warning: Method 'toString' is called on 'String?' which is potentially null.
-// Try calling using ?. instead.
-//   s.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:38:5: Warning: Method 'toString' is called on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:40:11: Warning: Method 'noSuchMethod' is called on 'String?' which is potentially null.
-// Try calling using ?. instead.
-//   try { s.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:41:11: Warning: Method 'noSuchMethod' is called on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   try { a.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:43:5: Warning: Property 'runtimeType' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-//   s.runtimeType;
-//     ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:44:5: Warning: Property 'runtimeType' is accessed on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.runtimeType;
-//     ^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -102,24 +70,38 @@
   set baz(core::int value) → void {}
   method call() → void {}
 }
-static method error(core::String? s, self::A? a) → dynamic {
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method toString([core::int extra = #C1]) → core::String
+    return super.{core::Object::toString}();
+}
+static method error(core::String? s, self::A? a, self::B? b) → dynamic {
   s.{core::String::length};
   s.{core::String::substring}(1, 1);
   a.{self::A::foo}();
   a.{self::A::bar};
   a.{self::A::baz} = 42;
   a.{self::A::call}();
+  b.{self::B::toString}(0);
   core::Function f1 = let final self::A? #t1 = a in #t1.==(null) ?{() →? void} null : #t1.{self::A::call};
   () → void f2 = let final self::A? #t2 = a in #t2.==(null) ?{() →? void} null : #t2.{self::A::call};
   () →? void f3 = let final self::A? #t3 = a in #t3.==(null) ?{() →? void} null : #t3.{self::A::call};
 }
-static method ok(core::String? s, self::A? a, core::Invocation i) → dynamic {
+static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
   a.{core::Object::==}(a);
+  t.{core::Object::==}(t);
+  b.{core::Object::==}(b);
   s.{core::String::hashCode};
   a.{core::Object::hashCode};
+  t.{core::Object::hashCode};
+  b.{core::Object::hashCode};
   s.{core::Object::toString}();
   a.{core::Object::toString}();
+  t.{core::Object::toString}();
+  b.{self::B::toString}();
   try {
     s.{core::Object::noSuchMethod}(i);
   }
@@ -130,7 +112,23 @@
   }
   on dynamic catch(final dynamic e, final core::StackTrace t) {
   }
+  try {
+    t.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
+  try {
+    b.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
   s.{core::Object::runtimeType};
   a.{core::Object::runtimeType};
+  t.{core::Object::runtimeType};
+  b.{core::Object::runtimeType};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
index 3e30a27..54ee84d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
@@ -2,93 +2,61 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:16:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
 // Try accessing using ?. instead.
 //   s.length;
 //     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:17:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
 // Try calling using ?. instead.
 //   s.substring(1, 1);
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:19:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   a.foo();
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.bar;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:22:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Method 'call' is called on 'A?' which is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   a();
+//    ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
 //   a();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:12: Warning: Assigning value of type 'void Function()?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Warning: Method 'toString' is called on 'B?' which is potentially null.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   b.toString(0);
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:12: Warning: Assigning value of type 'void Function()?' to a variable of type 'Function'.
 //  - 'Function' is from 'dart:core'.
 //   Function f1 = a;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:19: Warning: Assigning value of type 'void Function()?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:19: Warning: Assigning value of type 'void Function()?' to a variable of type 'void Function()'.
 //   void Function() f2 = a;
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:34:5: Warning: Property 'hashCode' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-//   s.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:35:5: Warning: Property 'hashCode' is accessed on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.hashCode;
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:37:5: Warning: Method 'toString' is called on 'String?' which is potentially null.
-// Try calling using ?. instead.
-//   s.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:38:5: Warning: Method 'toString' is called on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a.toString();
-//     ^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:40:11: Warning: Method 'noSuchMethod' is called on 'String?' which is potentially null.
-// Try calling using ?. instead.
-//   try { s.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:41:11: Warning: Method 'noSuchMethod' is called on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   try { a.noSuchMethod(i); } catch (e, t) {}
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:43:5: Warning: Property 'runtimeType' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-//   s.runtimeType;
-//     ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:44:5: Warning: Property 'runtimeType' is accessed on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try accessing using ?. instead.
-//   a.runtimeType;
-//     ^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -102,24 +70,38 @@
   set baz(core::int value) → void {}
   method call() → void {}
 }
-static method error(core::String? s, self::A? a) → dynamic {
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method toString([core::int extra = #C1]) → core::String
+    return super.{core::Object::toString}();
+}
+static method error(core::String? s, self::A? a, self::B? b) → dynamic {
   s.{core::String::length};
   s.{core::String::substring}(1, 1);
   a.{self::A::foo}();
   a.{self::A::bar};
   a.{self::A::baz} = 42;
   a.{self::A::call}();
+  b.{self::B::toString}(0);
   core::Function f1 = let final self::A? #t1 = a in #t1.==(null) ?{() →? void} null : #t1.{self::A::call};
   () → void f2 = let final self::A? #t2 = a in #t2.==(null) ?{() →? void} null : #t2.{self::A::call};
   () →? void f3 = let final self::A? #t3 = a in #t3.==(null) ?{() →? void} null : #t3.{self::A::call};
 }
-static method ok(core::String? s, self::A? a, core::Invocation i) → dynamic {
+static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
   a.{core::Object::==}(a);
+  t.{core::Object::==}(t);
+  b.{core::Object::==}(b);
   s.{core::String::hashCode};
   a.{core::Object::hashCode};
+  t.{core::Object::hashCode};
+  b.{core::Object::hashCode};
   s.{core::Object::toString}();
   a.{core::Object::toString}();
+  t.{core::Object::toString}();
+  b.{self::B::toString}();
   try {
     s.{core::Object::noSuchMethod}(i);
   }
@@ -130,7 +112,23 @@
   }
   on dynamic catch(final dynamic e, final core::StackTrace t) {
   }
+  try {
+    t.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
+  try {
+    b.{core::Object::noSuchMethod}(i);
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace t) {
+  }
   s.{core::Object::runtimeType};
   a.{core::Object::runtimeType};
+  t.{core::Object::runtimeType};
+  b.{core::Object::runtimeType};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 22e9751..4bf3b34 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -1208,6 +1208,7 @@
 nnbd/intersection_types: TextSerializationFailure
 nnbd/issue39659: TextSerializationFailure
 nnbd/issue39822: TextSerializationFailure
+nnbd/issue40134: TextSerializationFailure
 nnbd/issue_39286: TextSerializationFailure
 nnbd/issue_39286_2: TextSerializationFailure
 nnbd/late: TextSerializationFailure
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 6f73514..90e2696 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -25,6 +25,7 @@
 import 'package:kernel/kernel.dart'
     show Component, loadComponentSourceFromBytes;
 import 'package:kernel/target/targets.dart' show targets, TargetFlags;
+import 'package:package_resolver/package_resolver.dart';
 import 'package:path/path.dart' as path;
 import 'package:usage/uuid/uuid.dart';
 
@@ -456,7 +457,8 @@
       transformer?.transform(results.component);
 
       if (_compilerOptions.target.name == 'dartdevc') {
-        await writeJavascriptBundle(results, _kernelBinaryFilename);
+        await writeJavascriptBundle(
+            results, _kernelBinaryFilename, options['filesystem-scheme']);
       } else {
         await writeDillFile(results, _kernelBinaryFilename,
             filterExternal: importDill != null,
@@ -526,16 +528,14 @@
   }
 
   /// Write a JavaScript bundle containg the provided component.
-  Future<void> writeJavascriptBundle(
-      KernelCompilationResults results, String filename) async {
+  Future<void> writeJavascriptBundle(KernelCompilationResults results,
+      String filename, String fileSystemScheme) async {
+    var packageResolver = await PackageResolver.loadConfig(
+        _compilerOptions.packagesFileUri ?? '.packages');
     final Component component = results.component;
     // Compute strongly connected components.
-    final strongComponents = StrongComponents(
-        component,
-        results.loadedLibraries,
-        _mainSource,
-        _compilerOptions.packagesFileUri,
-        _compilerOptions.fileSystem);
+    final strongComponents = StrongComponents(component,
+        results.loadedLibraries, _mainSource, _compilerOptions.fileSystem);
     await strongComponents.computeModules();
 
     // Create JavaScript bundler.
@@ -545,11 +545,12 @@
     if (!sourceFile.parent.existsSync()) {
       sourceFile.parent.createSync(recursive: true);
     }
-    final bundler = JavaScriptBundler(component, strongComponents);
+    final bundler = JavaScriptBundler(
+        component, strongComponents, fileSystemScheme, packageResolver);
     final sourceFileSink = sourceFile.openWrite();
     final manifestFileSink = manifestFile.openWrite();
     final sourceMapsFileSink = sourceMapsFile.openWrite();
-    bundler.compile(
+    await bundler.compile(
         results.classHierarchy,
         results.coreTypes,
         results.loadedLibraries,
@@ -790,7 +791,8 @@
         deltaProgram.uriToSource.keys);
 
     if (_compilerOptions.target.name == 'dartdevc') {
-      await writeJavascriptBundle(results, _kernelBinaryFilename);
+      await writeJavascriptBundle(
+          results, _kernelBinaryFilename, _options['filesystem-scheme']);
     } else {
       await writeDillFile(results, _kernelBinaryFilename,
           incrementalSerializer: _generator.incrementalSerializer);
diff --git a/pkg/frontend_server/lib/src/javascript_bundle.dart b/pkg/frontend_server/lib/src/javascript_bundle.dart
index 1178433..5c92591 100644
--- a/pkg/frontend_server/lib/src/javascript_bundle.dart
+++ b/pkg/frontend_server/lib/src/javascript_bundle.dart
@@ -9,6 +9,8 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
+import 'package:path/path.dart' as p;
+import 'package:package_resolver/package_resolver.dart';
 
 import 'strong_components.dart';
 
@@ -22,7 +24,8 @@
 /// an incremental build, a different file is written for each which contains
 /// only the updated libraries.
 class JavaScriptBundler {
-  JavaScriptBundler(this._originalComponent, this._strongComponents) {
+  JavaScriptBundler(this._originalComponent, this._strongComponents,
+      this._fileSystemScheme, this._packageResolver) {
     _summaries = <Component>[];
     _summaryUris = <Uri>[];
     _moduleImportForSummary = <Uri, String>{};
@@ -36,13 +39,15 @@
       );
       _summaries.add(summaryComponent);
       _summaryUris.add(uri);
-      _moduleImportForSummary[uri] = '${uri.path}.js';
+      _moduleImportForSummary[uri] = '${urlForComponentUri(uri)}.lib.js';
       _uriToComponent[uri] = summaryComponent;
     }
   }
 
   final StrongComponents _strongComponents;
   final Component _originalComponent;
+  final String _fileSystemScheme;
+  final PackageResolver _packageResolver;
 
   List<Component> _summaries;
   List<Uri> _summaryUris;
@@ -50,13 +55,13 @@
   Map<Uri, Component> _uriToComponent;
 
   /// Compile each component into a single JavaScript module.
-  void compile(
+  Future<void> compile(
       ClassHierarchy classHierarchy,
       CoreTypes coreTypes,
       Set<Library> loadedLibraries,
       IOSink codeSink,
       IOSink manifestSink,
-      IOSink sourceMapsSink) {
+      IOSink sourceMapsSink) async {
     var codeOffset = 0;
     var sourceMapOffset = 0;
     final manifest = <String, Map<String, List<int>>>{};
@@ -66,7 +71,8 @@
           library.importUri.scheme == 'dart') {
         continue;
       }
-      final Uri moduleUri = _strongComponents.moduleAssignment[library.fileUri];
+      final Uri moduleUri =
+          _strongComponents.moduleAssignment[library.importUri];
       if (visited.contains(moduleUri)) {
         continue;
       }
@@ -81,12 +87,29 @@
       );
       final jsModule = compiler.emitModule(
           summaryComponent, _summaries, _summaryUris, _moduleImportForSummary);
-      final moduleUrl = moduleUri.toString();
-      final code = jsProgramToCode(jsModule, ModuleFormat.amd,
-          inlineSourceMap: true,
-          buildSourceMap: true,
-          jsUrl: '$moduleUrl',
-          mapUrl: '$moduleUrl.js.map');
+
+      final moduleUrl = urlForComponentUri(moduleUri);
+      String sourceMapBase;
+      if (moduleUri.scheme == 'package') {
+        // Source locations come through as absolute file uris. In order to
+        // make relative paths in the source map we get the absolute uri for
+        // the module and make them relative to that.
+        sourceMapBase =
+            p.dirname((await _packageResolver.resolveUri(moduleUri)).path);
+      }
+      final code = jsProgramToCode(
+        jsModule,
+        ModuleFormat.amd,
+        inlineSourceMap: true,
+        buildSourceMap: true,
+        jsUrl: '$moduleUrl.lib.js',
+        mapUrl: '$moduleUrl.lib.js.map',
+        sourceMapBase: sourceMapBase,
+        customScheme: _fileSystemScheme,
+        multiRootOutputPath: moduleUri.scheme == 'package'
+            ? '/packages/${moduleUri.pathSegments.first}'
+            : null,
+      );
       final codeBytes = utf8.encode(code.code);
       final sourceMapBytes = utf8.encode(json.encode(code.sourceMap));
       codeSink.add(codeBytes);
@@ -104,3 +127,7 @@
     manifestSink.add(utf8.encode(json.encode(manifest)));
   }
 }
+
+String urlForComponentUri(Uri componentUri) => componentUri.scheme == 'package'
+    ? '/packages/${componentUri.path}'
+    : componentUri.path;
diff --git a/pkg/frontend_server/lib/src/strong_components.dart b/pkg/frontend_server/lib/src/strong_components.dart
index 534cb30..ef24a10 100644
--- a/pkg/frontend_server/lib/src/strong_components.dart
+++ b/pkg/frontend_server/lib/src/strong_components.dart
@@ -2,12 +2,9 @@
 // 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:kernel/ast.dart';
 import 'package:kernel/util/graph.dart';
 
-import 'package:vm/kernel_front_end.dart';
 import 'package:front_end/src/api_unstable/vm.dart' show FileSystem;
 
 /// Compute the strongly connected components for JavaScript compilation.
@@ -31,7 +28,6 @@
     this.component,
     this.loadedLibraries,
     this.mainUri, [
-    this.packagesUri,
     this.fileSystem,
   ]);
 
@@ -47,9 +43,6 @@
   /// The main URI for thiis application.
   final Uri mainUri;
 
-  /// The URI of the .packages file.
-  final Uri packagesUri;
-
   /// The filesystem instance for resolving files.
   final FileSystem fileSystem;
 
@@ -72,84 +65,28 @@
     if (component.libraries.isEmpty) {
       return;
     }
-    Uri entrypointFileUri = mainUri;
-    if (!entrypointFileUri.isScheme('file')) {
-      entrypointFileUri = await asFileUri(fileSystem,
-          await _convertToFileUri(fileSystem, entrypointFileUri, packagesUri));
-    }
-    if (entrypointFileUri == null || !entrypointFileUri.isScheme('file')) {
-      throw Exception(
-          'Unable to map ${entrypointFileUri} back to file scheme.');
-    }
-
     // If we don't have a file uri, just use the first library in the
     // component.
     Library entrypoint = component.libraries.firstWhere(
-        (Library library) => library.fileUri == entrypointFileUri,
+        (Library library) =>
+            library.fileUri == mainUri || library.importUri == mainUri,
         orElse: () => null);
 
     if (entrypoint == null) {
-      throw Exception(
-          'Could not find entrypoint ${entrypointFileUri} in Component.');
+      throw Exception('Could not find entrypoint ${mainUri} in Component.');
     }
 
     final List<List<Library>> results =
         computeStrongComponents(_LibraryGraph(entrypoint, loadedLibraries));
     for (List<Library> component in results) {
       assert(component.length > 0);
-      final Uri moduleUri = component.first.fileUri;
+      final Uri moduleUri = component.first.importUri;
       modules[moduleUri] = component;
       for (Library componentLibrary in component) {
-        moduleAssignment[componentLibrary.fileUri] = moduleUri;
+        moduleAssignment[componentLibrary.importUri] = moduleUri;
       }
     }
   }
-
-  // Convert package URI to file URI if it is inside one of the packages.
-  Future<Uri> _convertToFileUri(
-      FileSystem fileSystem, Uri uri, Uri packagesUri) async {
-    if (uri == null || uri.scheme != 'package') {
-      return uri;
-    }
-    // Convert virtual URI to a real file URI.
-    // String uriString = (await asFileUri(fileSystem, uri)).toString();
-    List<String> packages;
-    try {
-      packages =
-          await File((await asFileUri(fileSystem, packagesUri)).toFilePath())
-              .readAsLines();
-    } on IOException {
-      // Can't read packages file - silently give up.
-      return uri;
-    }
-    // package:x.y/main.dart -> file:///a/b/x/y/main.dart
-    for (var line in packages) {
-      if (line.isEmpty || line.startsWith("#")) {
-        continue;
-      }
-
-      final colon = line.indexOf(':');
-      if (colon == -1) {
-        continue;
-      }
-      final packageName = line.substring(0, colon);
-      if (!uri.path.startsWith('$packageName/')) {
-        continue;
-      }
-      String packagePath;
-      try {
-        packagePath = (await asFileUri(
-                fileSystem, packagesUri.resolve(line.substring(colon + 1))))
-            .toString();
-      } on FileSystemException {
-        // Can't resolve package path.
-        continue;
-      }
-      return Uri.parse(
-          '$packagePath${uri.path.substring(packageName.length + 1)}');
-    }
-    return uri;
-  }
 }
 
 class _LibraryGraph implements Graph<Library> {
diff --git a/pkg/frontend_server/pubspec.yaml b/pkg/frontend_server/pubspec.yaml
index a64d956..0436be0 100644
--- a/pkg/frontend_server/pubspec.yaml
+++ b/pkg/frontend_server/pubspec.yaml
@@ -13,6 +13,7 @@
   front_end: ^0.1.6
   kernel: ^0.3.6
   args: ^1.4.4
+  package_resolver: ^1.0.0
 
 dev_dependencies:
-  test: any
\ No newline at end of file
+  test: any
diff --git a/pkg/frontend_server/test/src/javascript_bundle_test.dart b/pkg/frontend_server/test/src/javascript_bundle_test.dart
index 67aaff0..e410461 100644
--- a/pkg/frontend_server/test/src/javascript_bundle_test.dart
+++ b/pkg/frontend_server/test/src/javascript_bundle_test.dart
@@ -10,6 +10,7 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
+import 'package:package_resolver/package_resolver.dart';
 import 'package:test/test.dart';
 
 /// Additional indexed types required by the dev_compiler's NativeTypeSet.
@@ -72,6 +73,9 @@
       ]),
   ];
 
+  final packageResolver = PackageResolver.config({'a': Uri.file('/pkg/a')});
+  final multiRootScheme = 'org-dartlang-app';
+
   test('compiles JavaScript code', () async {
     final library = Library(
       Uri.file('/c.dart'),
@@ -85,21 +89,21 @@
     final strongComponents =
         StrongComponents(testComponent, {}, Uri.file('/c.dart'));
     strongComponents.computeModules();
-    final javaScriptBundler =
-        JavaScriptBundler(testComponent, strongComponents);
+    final javaScriptBundler = JavaScriptBundler(
+        testComponent, strongComponents, multiRootScheme, packageResolver);
     final manifestSink = _MemorySink();
     final codeSink = _MemorySink();
     final sourcemapSink = _MemorySink();
     final coreTypes = CoreTypes(testComponent);
 
-    javaScriptBundler.compile(ClassHierarchy(testComponent, coreTypes),
+    await javaScriptBundler.compile(ClassHierarchy(testComponent, coreTypes),
         coreTypes, {}, codeSink, manifestSink, sourcemapSink);
 
     final Map manifest = json.decode(utf8.decode(manifestSink.buffer));
     final String code = utf8.decode(codeSink.buffer);
 
     expect(manifest, {
-      '/c.dart.js': {
+      '/c.dart.lib.js': {
         'code': [0, codeSink.buffer.length],
         'sourcemap': [0, sourcemapSink.buffer.length],
       },
@@ -107,7 +111,87 @@
     expect(code, contains('ArbitrarilyChosen'));
 
     // verify source map url is correct.
-    expect(code, contains('sourceMappingURL=c.dart.js.map'));
+    expect(code, contains('sourceMappingURL=c.dart.lib.js.map'));
+  });
+
+  test('converts package: uris into /packages/ uris', () async {
+    var importUri = Uri.parse('package:a/a.dart');
+    var fileUri = await packageResolver.resolveUri(importUri);
+    final library = Library(
+      importUri,
+      fileUri: fileUri,
+      procedures: [
+        Procedure(Name('ArbitrarilyChosen'), ProcedureKind.Method,
+            FunctionNode(Block([])))
+      ],
+    );
+
+    final testComponent = Component(libraries: [library, ...testCoreLibraries]);
+    final strongComponents = StrongComponents(testComponent, {}, fileUri);
+    strongComponents.computeModules();
+    final javaScriptBundler = JavaScriptBundler(
+        testComponent, strongComponents, multiRootScheme, packageResolver);
+    final manifestSink = _MemorySink();
+    final codeSink = _MemorySink();
+    final sourcemapSink = _MemorySink();
+    final coreTypes = CoreTypes(testComponent);
+
+    await javaScriptBundler.compile(ClassHierarchy(testComponent, coreTypes),
+        coreTypes, {}, codeSink, manifestSink, sourcemapSink);
+
+    final Map manifest = json.decode(utf8.decode(manifestSink.buffer));
+    final String code = utf8.decode(codeSink.buffer);
+
+    expect(manifest, {
+      '/packages/a/a.dart.lib.js': {
+        'code': [0, codeSink.buffer.length],
+        'sourcemap': [0, sourcemapSink.buffer.length],
+      },
+    });
+    expect(code, contains('ArbitrarilyChosen'));
+
+    // verify source map url is correct.
+    expect(code, contains('sourceMappingURL=a.dart.lib.js.map'));
+  });
+
+  test('multi-root uris create modules relative to the root', () async {
+    var importUri = Uri.parse('$multiRootScheme:/web/main.dart');
+    var fileUri = importUri;
+    final library = Library(
+      importUri,
+      fileUri: fileUri,
+      procedures: [
+        Procedure(Name('ArbitrarilyChosen'), ProcedureKind.Method,
+            FunctionNode(Block([])))
+      ],
+    );
+
+    final testComponent = Component(libraries: [library, ...testCoreLibraries]);
+    final strongComponents = StrongComponents(testComponent, {}, fileUri);
+    strongComponents.computeModules();
+    final javaScriptBundler = JavaScriptBundler(
+        testComponent, strongComponents, multiRootScheme, packageResolver);
+    final manifestSink = _MemorySink();
+    final codeSink = _MemorySink();
+    final sourcemapSink = _MemorySink();
+    final coreTypes = CoreTypes(testComponent);
+
+    await javaScriptBundler.compile(ClassHierarchy(testComponent, coreTypes),
+        coreTypes, {}, codeSink, manifestSink, sourcemapSink);
+
+    final Map manifest = json.decode(utf8.decode(manifestSink.buffer));
+    final String code = utf8.decode(codeSink.buffer);
+
+    expect(manifest, {
+      '${importUri.path}.lib.js': {
+        'code': [0, codeSink.buffer.length],
+        'sourcemap': [0, sourcemapSink.buffer.length],
+      },
+    });
+    expect(code, contains('ArbitrarilyChosen'));
+
+    // verify source map url is correct.
+    expect(code, contains('sourceMappingURL=main.dart.lib.js.map'));
   });
 
   test('can combine strongly connected components', () {
@@ -134,8 +218,8 @@
     final strongComponents =
         StrongComponents(testComponent, {}, Uri.file('/a.dart'));
     strongComponents.computeModules();
-    final javaScriptBundler =
-        JavaScriptBundler(testComponent, strongComponents);
+    final javaScriptBundler = JavaScriptBundler(
+        testComponent, strongComponents, multiRootScheme, packageResolver);
     final manifestSink = _MemorySink();
     final codeSink = _MemorySink();
     final sourcemapSink = _MemorySink();
@@ -153,14 +237,14 @@
     expect(moduleHeader.allMatches(code), hasLength(2));
 
     // verify source map url is correct.
-    expect(code, contains('sourceMappingURL=a.dart.js.map'));
+    expect(code, contains('sourceMappingURL=a.dart.lib.js.map'));
 
-    final offsets = manifest['/a.dart.js']['sourcemap'];
+    final offsets = manifest['/a.dart.lib.js']['sourcemap'];
     final sourcemapModuleA = json.decode(
         utf8.decode(sourcemapSink.buffer.sublist(offsets.first, offsets.last)));
 
     // verify source maps are pointing at correct source files.
-    expect(sourcemapModuleA['file'], 'a.dart');
+    expect(sourcemapModuleA['file'], 'a.dart.lib.js');
   });
 }
 
diff --git a/pkg/front_end/test/fasta/types/mock_sdk.dart b/pkg/kernel/lib/testing/mock_sdk.dart
similarity index 100%
rename from pkg/front_end/test/fasta/types/mock_sdk.dart
rename to pkg/kernel/lib/testing/mock_sdk.dart
diff --git a/pkg/front_end/test/fasta/types/type_parser.dart b/pkg/kernel/lib/testing/type_parser.dart
similarity index 82%
rename from pkg/front_end/test/fasta/types/type_parser.dart
rename to pkg/kernel/lib/testing/type_parser.dart
index 66bad3b..4744340 100644
--- a/pkg/front_end/test/fasta/types/type_parser.dart
+++ b/pkg/kernel/lib/testing/type_parser.dart
@@ -2,16 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:_fe_analyzer_shared/src/parser/type_info_impl.dart"
-    show splitCloser;
-
-import "package:_fe_analyzer_shared/src/scanner/scanner.dart"
-    show scanString, ScannerConfiguration, Token;
-
-import "package:front_end/src/fasta/problems.dart";
-
 import 'package:kernel/ast.dart' show Nullability;
-import 'package:kernel/text/text_serialization_verifier.dart';
 
 abstract class ParsedType {
   R accept<R, A>(Visitor<R, A> visitor, [A a]);
@@ -38,8 +29,8 @@
     case ParsedNullability.omitted:
       return ifOmitted;
   }
-  return unhandled(
-      "$parsedNullability", "interpretParsedNullability", noOffset, noUri);
+  return throw new UnsupportedError(
+      "$parsedNullability in interpretParsedNullability");
 }
 
 String parsedNullabilityToString(ParsedNullability parsedNullability) {
@@ -51,8 +42,8 @@
     case ParsedNullability.omitted:
       return '';
   }
-  return unhandled(
-      "$parsedNullability", "interpretParsedNullability", noOffset, noUri);
+  return throw new UnsupportedError(
+      "$parsedNullability parsedNullabilityToString");
 }
 
 class ParsedInterfaceType extends ParsedType {
@@ -290,6 +281,18 @@
   }
 }
 
+class Token {
+  final int charOffset;
+  final String text;
+  final bool isIdentifier;
+
+  Token next;
+
+  Token(this.charOffset, this.text, {this.isIdentifier: false});
+
+  bool get isEof => text == null;
+}
+
 class Parser {
   Token peek;
 
@@ -309,15 +312,15 @@
   }
 
   void expect(String string) {
-    if (!identical(string, peek.stringValue)) {
+    if (string != peek.text) {
       throw "Expected '$string', "
-          "but got '${peek.lexeme}'\n${computeLocation()}";
+          "but got '${peek.text}'\n${computeLocation()}";
     }
     advance();
   }
 
   bool optional(String value) {
-    return identical(value, peek.stringValue);
+    return value == peek.text;
   }
 
   bool optionalAdvance(String value) {
@@ -361,7 +364,6 @@
             advance();
             arguments.add(parseType());
           }
-          peek = splitCloser(peek) ?? peek;
           expect(">");
         }
         ParsedNullability parsedNullability = parseNullability();
@@ -395,9 +397,9 @@
   String parseName() {
     if (!peek.isIdentifier) {
       throw "Expected a name, "
-          "but got '${peek.stringValue}'\n${computeLocation()}";
+          "but got '${peek.text}'\n${computeLocation()}";
     }
-    String result = peek.lexeme;
+    String result = peek.text;
     advance();
     return result;
   }
@@ -439,7 +441,6 @@
       do {
         typeVariables.add(parseTypeVariable());
       } while (optionalAdvance(","));
-      peek = splitCloser(peek) ?? peek;
       expect(">");
     }
     return typeVariables;
@@ -498,10 +499,86 @@
   }
 }
 
+final int codeUnitUppercaseA = 'A'.codeUnitAt(0);
+final int codeUnitUppercaseZ = 'Z'.codeUnitAt(0);
+
+bool isUppercaseLetter(int c) =>
+    codeUnitUppercaseA <= c && c <= codeUnitUppercaseZ;
+
+final int codeUnitLowercaseA = 'a'.codeUnitAt(0);
+final int codeUnitLowercaseZ = 'z'.codeUnitAt(0);
+
+bool isLowercaseLetter(int c) =>
+    codeUnitLowercaseA <= c && c <= codeUnitLowercaseZ;
+
+final int codeUnitUnderscore = '_'.codeUnitAt(0);
+
+bool isUnderscore(int c) => c == codeUnitUnderscore;
+
+final int codeUnit0 = '0'.codeUnitAt(0);
+final int codeUnit9 = '9'.codeUnitAt(0);
+
+bool isNumber(int c) => codeUnit0 <= c && c <= codeUnit9;
+
+bool isNameStart(int c) =>
+    isUppercaseLetter(c) || isLowercaseLetter(c) || isUnderscore(c);
+
+bool isNamePart(int c) => isNameStart(c) || isNumber(c);
+
+final int codeUnitLineFeed = '\n'.codeUnitAt(0);
+final int codeUnitCarriageReturn = '\r'.codeUnitAt(0);
+final int codeUnitTab = '\t'.codeUnitAt(0);
+final int codeUnitSpace = ' '.codeUnitAt(0);
+
+bool isWhiteSpace(int c) =>
+    c == codeUnitCarriageReturn ||
+    c == codeUnitLineFeed ||
+    c == codeUnitTab ||
+    c == codeUnitSpace;
+
+Token scanString(String text) {
+  int offset = 0;
+  Token first;
+  Token current;
+  while (offset < text.length) {
+    int c = text.codeUnitAt(offset);
+    if (isWhiteSpace(c)) {
+      offset++;
+      continue;
+    }
+    Token token;
+    if (isNameStart(c)) {
+      int startOffset = offset;
+      offset++;
+      while (offset < text.length) {
+        int c = text.codeUnitAt(offset);
+        if (isNamePart(c)) {
+          offset++;
+        } else {
+          break;
+        }
+      }
+      token = new Token(startOffset, text.substring(startOffset, offset),
+          isIdentifier: true);
+    } else {
+      token = new Token(offset, text.substring(offset, offset + 1));
+      offset += 1;
+    }
+    first ??= token;
+    current?.next = token;
+    current = token;
+  }
+  Token eof = new Token(offset, null);
+  if (current == null) {
+    current = first = eof;
+  } else {
+    current.next = eof;
+  }
+  return first;
+}
+
 List<ParsedType> parse(String text) {
-  Parser parser = new Parser(
-      scanString(text, configuration: ScannerConfiguration.nonNullable).tokens,
-      text);
+  Parser parser = new Parser(scanString(text), text);
   List<ParsedType> types = <ParsedType>[];
   while (!parser.atEof) {
     types.add(parser.parseType());
@@ -510,10 +587,10 @@
 }
 
 List<ParsedTypeVariable> parseTypeVariables(String text) {
-  Parser parser = new Parser(scanString(text).tokens, text);
+  Parser parser = new Parser(scanString(text), text);
   List<ParsedType> result = parser.parseTypeVariablesOpt();
   if (!parser.atEof) {
-    throw "Expected EOF, but got '${parser.peek.stringValue}'\n"
+    throw "Expected EOF, but got '${parser.peek.text}'\n"
         "${parser.computeLocation()}";
   }
   return result;
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
similarity index 63%
rename from pkg/front_end/test/fasta/types/kernel_type_parser.dart
rename to pkg/kernel/lib/testing/type_parser_environment.dart
index af8840b..4129fc5 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import "package:kernel/ast.dart"
     show
         BottomType,
@@ -26,13 +25,15 @@
         VoidType,
         setParents;
 
-import "package:kernel/src/bounds_checks.dart" show calculateBounds;
+import 'package:kernel/core_types.dart' show CoreTypes;
 
-import "mock_sdk.dart" show mockSdk;
+import 'package:kernel/src/bounds_checks.dart' show calculateBounds;
 
-import "type_parser.dart" as type_parser show parse;
+import 'package:kernel/testing/mock_sdk.dart' show mockSdk;
 
-import "type_parser.dart"
+import 'package:kernel/testing/type_parser.dart' as type_parser show parse;
+
+import 'package:kernel/testing/type_parser.dart'
     show
         ParsedClass,
         ParsedIntersectionType,
@@ -43,37 +44,40 @@
         ParsedTypedef,
         ParsedVoidType,
         Visitor;
-import 'type_parser.dart';
+import 'package:kernel/testing/type_parser.dart';
 
 Component parseComponent(String source, Uri uri) {
   Uri coreUri = Uri.parse("dart:core");
-  KernelEnvironment coreEnvironment = new KernelEnvironment(coreUri, coreUri);
+  TypeParserEnvironment coreEnvironment =
+      new TypeParserEnvironment(coreUri, coreUri);
   Library coreLibrary =
       parseLibrary(coreUri, mockSdk, environment: coreEnvironment);
-  KernelEnvironment libraryEnvironment =
-      new KernelEnvironment(uri, uri).extend(coreEnvironment.declarations);
+  TypeParserEnvironment libraryEnvironment = new TypeParserEnvironment(uri, uri)
+      ._extend(coreEnvironment._declarations);
   Library library = parseLibrary(uri, source, environment: libraryEnvironment);
   library.name = "lib";
   return new Component(libraries: <Library>[coreLibrary, library]);
 }
 
 Library parseLibrary(Uri uri, String text,
-    {Uri fileUri, KernelEnvironment environment}) {
+    {Uri fileUri, TypeParserEnvironment environment}) {
   fileUri ??= uri;
-  environment ??= new KernelEnvironment(uri, fileUri);
+  environment ??= new TypeParserEnvironment(uri, fileUri);
   Library library =
       new Library(uri, fileUri: fileUri, name: uri.path.replaceAll("/", "."));
   List<ParsedType> types = type_parser.parse(text);
   for (ParsedType type in types) {
     if (type is ParsedClass) {
       String name = type.name;
-      environment[name] = new Class(fileUri: fileUri, name: name)
-        ..typeParameters.addAll(
-            new List<TypeParameter>.filled(type.typeVariables.length, null));
+      environment._registerDeclaration(
+          name,
+          new Class(fileUri: fileUri, name: name)
+            ..typeParameters.addAll(new List<TypeParameter>.filled(
+                type.typeVariables.length, null)));
     }
   }
   for (ParsedType type in types) {
-    Node node = environment.kernelFromParsedType(type);
+    Node node = environment._kernelFromParsedType(type);
     if (node is Class) {
       library.addClass(node);
     } else if (node is Typedef) {
@@ -85,14 +89,42 @@
   return library;
 }
 
-class KernelEnvironment {
+class Env {
+  Component component;
+
+  CoreTypes coreTypes;
+
+  TypeParserEnvironment _libraryEnvironment;
+
+  Env(String source) {
+    Uri libraryUri = Uri.parse('memory:main.dart');
+    Uri coreUri = Uri.parse("dart:core");
+    TypeParserEnvironment coreEnvironment =
+        new TypeParserEnvironment(coreUri, coreUri);
+    Library coreLibrary =
+        parseLibrary(coreUri, mockSdk, environment: coreEnvironment);
+    _libraryEnvironment = new TypeParserEnvironment(libraryUri, libraryUri)
+        ._extend(coreEnvironment._declarations);
+    Library library =
+        parseLibrary(libraryUri, source, environment: _libraryEnvironment);
+    library.name = "lib";
+    component = new Component(libraries: <Library>[coreLibrary, library]);
+    coreTypes = new CoreTypes(component);
+  }
+
+  DartType parseType(String text) {
+    return _libraryEnvironment.parseType(text);
+  }
+}
+
+class TypeParserEnvironment {
   final Uri uri;
 
   final Uri fileUri;
 
-  final Map<String, TreeNode> declarations = <String, TreeNode>{};
+  final Map<String, TreeNode> _declarations = <String, TreeNode>{};
 
-  final KernelEnvironment parent;
+  final TypeParserEnvironment _parent;
 
   /// Collects types to set their nullabilities after type parameters are ready.
   ///
@@ -106,47 +138,72 @@
   /// updated when the bound of the [TypeParameter] is ready.
   final List<TypeParameterType> pendingNullabilities = <TypeParameterType>[];
 
-  KernelEnvironment(this.uri, this.fileUri, [this.parent]);
+  TypeParserEnvironment(this.uri, this.fileUri, [this._parent]);
 
-  Node kernelFromParsedType(ParsedType type) {
-    Node node = type.accept(const KernelFromParsedType(), this);
+  Node _kernelFromParsedType(ParsedType type) {
+    Node node = type.accept(const _KernelFromParsedType(), this);
     return node;
   }
 
+  DartType parseType(String text) {
+    return _kernelFromParsedType(type_parser.parse(text).single);
+  }
+
   bool isObject(String name) => name == "Object" && "$uri" == "dart:core";
 
-  Class get objectClass => this["Object"];
+  Class get objectClass => lookupDeclaration("Object");
 
-  TreeNode operator [](String name) {
-    TreeNode result = declarations[name];
-    if (result == null && parent != null) {
-      return parent[name];
+  TreeNode lookupDeclaration(String name) {
+    TreeNode result = _declarations[name];
+    if (result == null && _parent != null) {
+      return _parent.lookupDeclaration(name);
     }
     if (result == null) throw "Not found: $name";
     return result;
   }
 
-  void operator []=(String name, TreeNode declaration) {
-    TreeNode existing = declarations[name];
+  TreeNode _registerDeclaration(String name, TreeNode declaration) {
+    TreeNode existing = _declarations[name];
     if (existing != null) {
       throw "Duplicated declaration: $name";
     }
-    declarations[name] = declaration;
+    return _declarations[name] = declaration;
   }
 
-  KernelEnvironment extend(Map<String, TreeNode> declarations) {
-    return new KernelEnvironment(uri, fileUri, this)
-      ..declarations.addAll(declarations);
+  TypeParserEnvironment _extend(Map<String, TreeNode> declarations) {
+    return new TypeParserEnvironment(uri, fileUri, this)
+      .._declarations.addAll(declarations);
+  }
+
+  TypeParserEnvironment extendWithTypeParameters(String typeParameters) {
+    if (typeParameters?.isEmpty ?? true) return this;
+    return const _KernelFromParsedType()
+        .computeTypeParameterEnvironment(
+            parseTypeVariables("<${typeParameters}>"), this)
+        .environment;
+  }
+
+  /// Returns the predefined type by the [name], if any.
+  ///
+  /// Use this in subclasses to add support for additional predefined types.
+  DartType getPredefinedNamedType(String name) {
+    if (_parent != null) {
+      return _parent.getPredefinedNamedType(name);
+    }
+    return null;
   }
 }
 
-class KernelFromParsedType implements Visitor<Node, KernelEnvironment> {
-  const KernelFromParsedType();
+class _KernelFromParsedType implements Visitor<Node, TypeParserEnvironment> {
+  const _KernelFromParsedType();
 
   DartType visitInterfaceType(
-      ParsedInterfaceType node, KernelEnvironment environment) {
+      ParsedInterfaceType node, TypeParserEnvironment environment) {
     String name = node.name;
-    if (name == "dynamic") {
+    DartType predefined = environment.getPredefinedNamedType(name);
+    if (predefined != null) {
+      return predefined;
+    } else if (name == "dynamic") {
       // Don't return a const object to ensure we test implementations that use
       // identical.
       return new DynamicType();
@@ -162,18 +219,14 @@
       // Don't return a const object to ensure we test implementations that use
       // identical.
       return new NeverType(interpretParsedNullability(node.parsedNullability));
-    } else if (name == "unknown") {
-      // Don't return a const object to ensure we test implementations that use
-      // identical.
-      return new UnknownType();
     }
-    TreeNode declaration = environment[name];
+    TreeNode declaration = environment.lookupDeclaration(name);
     List<ParsedType> arguments = node.arguments;
     List<DartType> kernelArguments =
         new List<DartType>.filled(arguments.length, null);
     for (int i = 0; i < arguments.length; i++) {
       kernelArguments[i] =
-          arguments[i].accept<Node, KernelEnvironment>(this, environment);
+          arguments[i].accept<Node, TypeParserEnvironment>(this, environment);
     }
     if (declaration is Class) {
       if (declaration.name == 'Null' &&
@@ -220,9 +273,9 @@
     }
   }
 
-  Class visitClass(ParsedClass node, KernelEnvironment environment) {
+  Class visitClass(ParsedClass node, TypeParserEnvironment environment) {
     String name = node.name;
-    Class cls = environment[name];
+    Class cls = environment.lookupDeclaration(name);
     ParameterEnvironment parameterEnvironment =
         computeTypeParameterEnvironment(node.typeVariables, environment);
     List<TypeParameter> parameters = parameterEnvironment.parameters;
@@ -231,9 +284,9 @@
       ..clear()
       ..addAll(parameters);
     {
-      KernelEnvironment environment = parameterEnvironment.environment;
-      InterfaceType type =
-          node.supertype?.accept<Node, KernelEnvironment>(this, environment);
+      TypeParserEnvironment environment = parameterEnvironment.environment;
+      InterfaceType type = node.supertype
+          ?.accept<Node, TypeParserEnvironment>(this, environment);
       if (type == null) {
         if (!environment.isObject(name)) {
           cls.supertype = environment.objectClass.asRawSupertype;
@@ -241,31 +294,31 @@
       } else {
         cls.supertype = toSupertype(type);
       }
-      InterfaceType mixedInType =
-          node.mixedInType?.accept<Node, KernelEnvironment>(this, environment);
+      InterfaceType mixedInType = node.mixedInType
+          ?.accept<Node, TypeParserEnvironment>(this, environment);
       if (mixedInType != null) {
         cls.mixedInType = toSupertype(mixedInType);
       }
       List<ParsedType> interfaces = node.interfaces;
       for (int i = 0; i < interfaces.length; i++) {
-        cls.implementedTypes.add(toSupertype(
-            interfaces[i].accept<Node, KernelEnvironment>(this, environment)));
+        cls.implementedTypes.add(toSupertype(interfaces[i]
+            .accept<Node, TypeParserEnvironment>(this, environment)));
       }
     }
     return cls;
   }
 
-  Typedef visitTypedef(ParsedTypedef node, KernelEnvironment environment) {
+  Typedef visitTypedef(ParsedTypedef node, TypeParserEnvironment environment) {
     String name = node.name;
-    Typedef def = environment[name] =
-        new Typedef(name, null, fileUri: environment.fileUri);
+    Typedef def = environment._registerDeclaration(
+        name, new Typedef(name, null, fileUri: environment.fileUri));
     ParameterEnvironment parameterEnvironment =
         computeTypeParameterEnvironment(node.typeVariables, environment);
     def.typeParameters.addAll(parameterEnvironment.parameters);
     DartType type;
     {
-      KernelEnvironment environment = parameterEnvironment.environment;
-      type = node.type.accept<Node, KernelEnvironment>(this, environment);
+      TypeParserEnvironment environment = parameterEnvironment.environment;
+      type = node.type.accept<Node, TypeParserEnvironment>(this, environment);
       if (type is FunctionType) {
         FunctionType f = type;
         type = new FunctionType(
@@ -286,27 +339,29 @@
   }
 
   FunctionType visitFunctionType(
-      ParsedFunctionType node, KernelEnvironment environment) {
+      ParsedFunctionType node, TypeParserEnvironment environment) {
     ParameterEnvironment parameterEnvironment =
         computeTypeParameterEnvironment(node.typeVariables, environment);
     List<DartType> positionalParameters = <DartType>[];
     List<NamedType> namedParameters = <NamedType>[];
     DartType returnType;
     {
-      KernelEnvironment environment = parameterEnvironment.environment;
-      returnType =
-          node.returnType?.accept<Node, KernelEnvironment>(this, environment);
+      TypeParserEnvironment environment = parameterEnvironment.environment;
+      returnType = node.returnType
+          ?.accept<Node, TypeParserEnvironment>(this, environment);
       for (ParsedType argument in node.arguments.required) {
-        positionalParameters
-            .add(argument.accept<Node, KernelEnvironment>(this, environment));
+        positionalParameters.add(
+            argument.accept<Node, TypeParserEnvironment>(this, environment));
       }
       for (ParsedType argument in node.arguments.positional) {
-        positionalParameters
-            .add(argument.accept<Node, KernelEnvironment>(this, environment));
+        positionalParameters.add(
+            argument.accept<Node, TypeParserEnvironment>(this, environment));
       }
       for (ParsedNamedArgument argument in node.arguments.named) {
-        namedParameters.add(new NamedType(argument.name,
-            argument.type.accept<Node, KernelEnvironment>(this, environment),
+        namedParameters.add(new NamedType(
+            argument.name,
+            argument.type
+                .accept<Node, TypeParserEnvironment>(this, environment),
             isRequired: argument.isRequired));
       }
     }
@@ -318,20 +373,22 @@
         typeParameters: parameterEnvironment.parameters);
   }
 
-  VoidType visitVoidType(ParsedVoidType node, KernelEnvironment environment) {
+  VoidType visitVoidType(
+      ParsedVoidType node, TypeParserEnvironment environment) {
     return const VoidType();
   }
 
   TypeParameter visitTypeVariable(
-      ParsedTypeVariable node, KernelEnvironment environment) {
+      ParsedTypeVariable node, TypeParserEnvironment environment) {
     throw "not implemented: $node";
   }
 
   TypeParameterType visitIntersectionType(
-      ParsedIntersectionType node, KernelEnvironment environment) {
+      ParsedIntersectionType node, TypeParserEnvironment environment) {
     TypeParameterType type =
-        node.a.accept<Node, KernelEnvironment>(this, environment);
-    DartType bound = node.b.accept<Node, KernelEnvironment>(this, environment);
+        node.a.accept<Node, TypeParserEnvironment>(this, environment);
+    DartType bound =
+        node.b.accept<Node, TypeParserEnvironment>(this, environment);
     return new TypeParameterType.intersection(
         type.parameter, type.nullability, bound);
   }
@@ -341,7 +398,8 @@
   }
 
   ParameterEnvironment computeTypeParameterEnvironment(
-      List<ParsedTypeVariable> typeVariables, KernelEnvironment environment) {
+      List<ParsedTypeVariable> typeVariables,
+      TypeParserEnvironment environment) {
     List<TypeParameter> typeParameters =
         new List<TypeParameter>.filled(typeVariables.length, null);
     Map<String, TypeParameter> typeParametersByName = <String, TypeParameter>{};
@@ -349,8 +407,8 @@
       String name = typeVariables[i].name;
       typeParametersByName[name] = typeParameters[i] = new TypeParameter(name);
     }
-    KernelEnvironment nestedEnvironment =
-        environment.extend(typeParametersByName);
+    TypeParserEnvironment nestedEnvironment =
+        environment._extend(typeParametersByName);
     Class objectClass = environment.objectClass;
     for (int i = 0; i < typeVariables.length; i++) {
       ParsedType bound = typeVariables[i].bound;
@@ -362,7 +420,7 @@
           ..defaultType = const DynamicType();
       } else {
         DartType type =
-            bound.accept<Node, KernelEnvironment>(this, nestedEnvironment);
+            bound.accept<Node, TypeParserEnvironment>(this, nestedEnvironment);
         typeParameter
           ..bound = type
           // The default type will be overridden below, but we need to set it
@@ -387,7 +445,7 @@
 
 class ParameterEnvironment {
   final List<TypeParameter> parameters;
-  final KernelEnvironment environment;
+  final TypeParserEnvironment environment;
 
   const ParameterEnvironment(this.parameters, this.environment);
 }
diff --git a/pkg/front_end/test/fasta/types/legacy_erasure_test.dart b/pkg/kernel/test/legacy_erasure_test.dart
similarity index 97%
rename from pkg/front_end/test/fasta/types/legacy_erasure_test.dart
rename to pkg/kernel/test/legacy_erasure_test.dart
index d59a4af..bf32877 100644
--- a/pkg/front_end/test/fasta/types/legacy_erasure_test.dart
+++ b/pkg/kernel/test/legacy_erasure_test.dart
@@ -6,8 +6,7 @@
 
 import 'package:kernel/ast.dart' hide MapEntry;
 import 'package:kernel/src/legacy_erasure.dart';
-
-import 'type_test_helper.dart';
+import 'package:kernel/testing/type_parser_environment.dart';
 
 const Map<String, String> data = {
   'Null?': 'Null?',
diff --git a/pkg/front_end/test/fasta/types/nnbd_top_merge_test.dart b/pkg/kernel/test/nnbd_top_merge_test.dart
similarity index 98%
rename from pkg/front_end/test/fasta/types/nnbd_top_merge_test.dart
rename to pkg/kernel/test/nnbd_top_merge_test.dart
index 3476495..91afe96 100644
--- a/pkg/front_end/test/fasta/types/nnbd_top_merge_test.dart
+++ b/pkg/kernel/test/nnbd_top_merge_test.dart
@@ -6,8 +6,7 @@
 
 import 'package:kernel/ast.dart' hide MapEntry;
 import 'package:kernel/src/nnbd_top_merge.dart';
-
-import 'type_test_helper.dart';
+import 'package:kernel/testing/type_parser_environment.dart';
 
 const Map<String, dynamic> data = {
   'Object? vs Object?': 'Object?',
diff --git a/pkg/front_end/test/fasta/types/type_parser_test.dart b/pkg/kernel/test/type_parser_test.dart
similarity index 92%
rename from pkg/front_end/test/fasta/types/type_parser_test.dart
rename to pkg/kernel/test/type_parser_test.dart
index 55fe2ac..76bb490 100644
--- a/pkg/front_end/test/fasta/types/type_parser_test.dart
+++ b/pkg/kernel/test/type_parser_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart" show Expect;
+import 'package:expect/expect.dart' show Expect;
 
-import "type_parser.dart";
+import 'package:kernel/testing/type_parser.dart';
 
 testParse(String text) {
   Expect.stringEquals(text.trim(), "${parse(text).join('\n')}");
diff --git a/pkg/nnbd_migration/lib/nnbd_migration.dart b/pkg/nnbd_migration/lib/nnbd_migration.dart
index 66be294..3040d66 100644
--- a/pkg/nnbd_migration/lib/nnbd_migration.dart
+++ b/pkg/nnbd_migration/lib/nnbd_migration.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:convert';
+
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -40,6 +42,12 @@
     kind: NullabilityFixKind.checkExpression,
   );
 
+  /// An unnecessary downcast has been discarded.
+  static const removeAs = const NullabilityFixDescription._(
+    appliedMessage: 'Discarded a downcast that is now unnecessary',
+    kind: NullabilityFixKind.removeAs,
+  );
+
   /// A message used by dartfix to indicate a fix has been applied.
   final String appliedMessage;
 
@@ -79,6 +87,10 @@
       other is NullabilityFixDescription &&
       appliedMessage == other.appliedMessage &&
       kind == other.kind;
+
+  @override
+  toString() =>
+      'NullabilityFixDescription(${json.encode(appliedMessage)}, $kind)';
 }
 
 /// An enumeration of the various kinds of nullability fixes.
@@ -90,6 +102,7 @@
   discardThen,
   makeTypeNullable,
   noModification,
+  removeAs,
 }
 
 /// Provisional API for DartFix to perform nullability migration.
diff --git a/pkg/nnbd_migration/lib/src/conditional_discard.dart b/pkg/nnbd_migration/lib/src/conditional_discard.dart
index dfddc9b..ab4c7c8 100644
--- a/pkg/nnbd_migration/lib/src/conditional_discard.dart
+++ b/pkg/nnbd_migration/lib/src/conditional_discard.dart
@@ -54,7 +54,7 @@
   bool get keepTrue => trueGuard == null || trueGuard.isNullable;
 
   Iterable<FixReasonInfo> get reasons sync* {
-    if (!keepTrue) yield falseGuard;
-    if (!keepFalse) yield trueGuard;
+    if (!keepTrue) yield trueGuard;
+    if (!keepFalse) yield falseGuard;
   }
 }
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index a30e61d..4da69d5 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -9,11 +9,12 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
+import 'package:analyzer/src/error/best_practices_verifier.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/type_system.dart';
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
@@ -264,6 +265,9 @@
 
   @override
   DecoratedType visitAsExpression(AsExpression node) {
+    if (BestPracticesVerifier.isUnnecessaryCast(node, _typeSystem)) {
+      _variables.recordUnnecessaryCast(source, node);
+    }
     final typeNode = _variables.decoratedTypeAnnotation(source, node.type);
     _handleAssignment(node.expression, destinationType: typeNode);
     _flowAnalysis.asExpression_end(node.expression, typeNode);
@@ -897,6 +901,13 @@
     var createdType = DecoratedType(node.staticType, nullabilityNode,
         typeArguments: decoratedTypeArguments);
     var calleeType = getOrComputeElementType(callee, targetType: createdType);
+    for (var i = 0; i < decoratedTypeArguments.length; ++i) {
+      _checkAssignment(null,
+          source: decoratedTypeArguments[i],
+          destination:
+              _variables.decoratedTypeParameterBound(typeParameters[i]),
+          hard: true);
+    }
     _handleInvocationArguments(node, node.argumentList.arguments, typeArguments,
         typeArgumentTypes, calleeType, typeParameters);
     return createdType;
@@ -2111,6 +2122,20 @@
     });
   }
 
+  /// Instantiate [type] with [argumentTypes], assigning [argumentTypes] to
+  /// [bounds].
+  DecoratedType _handleInstantiation(
+      DecoratedType type, List<DecoratedType> argumentTypes) {
+    for (var i = 0; i < argumentTypes.length; ++i) {
+      _checkAssignment(null,
+          source: argumentTypes[i],
+          destination: type.typeFormalBounds[i],
+          hard: true);
+    }
+
+    return type.instantiate(argumentTypes);
+  }
+
   /// Creates the necessary constraint(s) for an [ArgumentList] when invoking an
   /// executable element whose type is [calleeType].
   ///
@@ -2125,7 +2150,7 @@
       TypeArgumentList typeArguments,
       Iterable<DartType> typeArgumentTypes,
       DecoratedType calleeType,
-      Iterable<TypeParameterElement> constructorTypeParameters,
+      List<TypeParameterElement> constructorTypeParameters,
       {DartType invokeType}) {
     var typeFormals = constructorTypeParameters ?? calleeType.typeFormals;
     if (typeFormals.isNotEmpty) {
@@ -2138,7 +2163,7 @@
               Map<TypeParameterElement, DecoratedType>.fromIterables(
                   constructorTypeParameters, argumentTypes));
         } else {
-          calleeType = calleeType.instantiate(argumentTypes);
+          calleeType = _handleInstantiation(calleeType, argumentTypes);
         }
       } else {
         if (invokeType is FunctionType) {
@@ -2147,7 +2172,7 @@
                   DecoratedType.forImplicitType(typeProvider, argType, _graph))
               .toList();
           instrumentation?.implicitTypeArguments(source, node, argumentTypes);
-          calleeType = calleeType.instantiate(argumentTypes);
+          calleeType = _handleInstantiation(calleeType, argumentTypes);
         } else if (constructorTypeParameters != null) {
           // No need to instantiate; caller has already substituted in the
           // correct type arguments.
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index 0b21911..07be747 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -15,28 +15,28 @@
 import 'package:nnbd_migration/nnbd_migration.dart';
 
 Map<int, List<AtomicEdit>> _removeCode(
-    int offset, int end, _RemovalStyle removalStyle) {
+    int offset, int end, _RemovalStyle removalStyle, AtomicEditInfo info) {
   if (offset < end) {
     // TODO(paulberry): handle preexisting comments?
     switch (removalStyle) {
       case _RemovalStyle.commentSpace:
         return {
-          offset: [AtomicEdit.insert('/* ')],
-          end: [AtomicEdit.insert('*/ ')]
+          offset: [AtomicEdit.insert('/* ', info: info)],
+          end: [AtomicEdit.insert('*/ ', info: info)]
         };
       case _RemovalStyle.delete:
         return {
-          offset: [AtomicEdit.delete(end - offset)]
+          offset: [AtomicEdit.delete(end - offset, info: info)]
         };
       case _RemovalStyle.spaceComment:
         return {
-          offset: [AtomicEdit.insert(' /*')],
-          end: [AtomicEdit.insert(' */')]
+          offset: [AtomicEdit.insert(' /*', info: info)],
+          end: [AtomicEdit.insert(' */', info: info)]
         };
       case _RemovalStyle.spaceInsideComment:
         return {
-          offset: [AtomicEdit.insert('/* ')],
-          end: [AtomicEdit.insert(' */')]
+          offset: [AtomicEdit.insert('/* ', info: info)],
+          end: [AtomicEdit.insert(' */', info: info)]
         };
     }
     throw StateError('Null value for removalStyle');
@@ -57,6 +57,10 @@
 /// May be subclassed to allow additional information to be recorded about the
 /// edit.
 class AtomicEdit {
+  /// Additional information about this edit, or `null` if no additional
+  /// information is available.
+  final AtomicEditInfo info;
+
   /// The number of characters that should be deleted by this edit, or `0` if no
   /// characters should be deleted.
   final int length;
@@ -66,18 +70,27 @@
   final String replacement;
 
   /// Initialize an edit to delete [length] characters.
-  const AtomicEdit.delete(this.length)
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  const AtomicEdit.delete(this.length, {this.info})
       : assert(length > 0),
         replacement = '';
 
   /// Initialize an edit to insert the [replacement] characters.
-  const AtomicEdit.insert(this.replacement)
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  const AtomicEdit.insert(this.replacement, {this.info})
       : assert(replacement.length > 0),
         length = 0;
 
   /// Initialize an edit to replace [length] characters with the [replacement]
   /// characters.
-  const AtomicEdit.replace(this.length, this.replacement)
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  const AtomicEdit.replace(this.length, this.replacement, {this.info})
       : assert(length > 0 || replacement.length > 0);
 
   /// Return `true` if this edit is a deletion (no characters added).
@@ -112,23 +125,6 @@
   AtomicEditInfo(this.description, this.fixReasons);
 }
 
-/// An atomic edit that has additional information associated with it.
-class AtomicEditWithInfo extends AtomicEdit {
-  final AtomicEditInfo info;
-
-  /// Initialize an edit to delete [length] characters.
-  const AtomicEditWithInfo.delete(int length, this.info) : super.delete(length);
-
-  /// Initialize an edit to insert the [replacement] characters.
-  const AtomicEditWithInfo.insert(String replacement, this.info)
-      : super.insert(replacement);
-
-  /// Initialize an edit to replace [length] characters with the [replacement]
-  /// characters.
-  const AtomicEditWithInfo.replace(int length, String replacement, this.info)
-      : super.replace(length, replacement);
-}
-
 /// An [EditPlan] is a builder capable of accumulating a set of edits to be
 /// applied to a given [AstNode].
 ///
@@ -173,6 +169,84 @@
 
   EditPlanner(this.lineInfo, this.sourceText, {this.removeViaComments = false});
 
+  /// Creates a new edit plan that consists of executing [innerPlan], and then
+  /// appending the given [operand], with an intervening binary [operator].
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  NodeProducingEditPlan addBinaryPostfix(
+      NodeProducingEditPlan innerPlan, TokenType operator, String operand,
+      {AtomicEditInfo info}) {
+    assert(innerPlan.sourceNode is Expression);
+    var precedence = Precedence.forTokenType(operator);
+    var isAssociative = precedence != Precedence.relational &&
+        precedence != Precedence.equality &&
+        precedence != Precedence.assignment;
+    return surround(innerPlan,
+        suffix: [AtomicEdit.insert(' ${operator.lexeme} $operand', info: info)],
+        outerPrecedence: precedence,
+        innerPrecedence: precedence,
+        associative: isAssociative);
+  }
+
+  /// Creates a new edit plan that consists of executing [innerPlan], and then
+  /// prepending the given [operand], with an intervening binary [operator].
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  ///
+  /// If the expression represented by [operand] is known not to end in a
+  /// cascade expression, caller may optionally set [allowCascade] to `true` to
+  /// prevent a rare corner case where parentheses would be added unnecessarily.
+  /// Note that it is always safe to leave [allowCascade] at its default value
+  /// of `false`.
+  NodeProducingEditPlan addBinaryPrefix(
+      String operand, TokenType operator, NodeProducingEditPlan innerPlan,
+      {AtomicEditInfo info, bool allowCascade = false}) {
+    assert(innerPlan.sourceNode is Expression);
+    var precedence = Precedence.forTokenType(operator);
+    var isAssociative = precedence == Precedence.assignment;
+    return surround(innerPlan,
+        prefix: [AtomicEdit.insert('$operand ${operator.lexeme} ', info: info)],
+        outerPrecedence: precedence,
+        innerPrecedence: precedence,
+        associative: isAssociative,
+        allowCascade: allowCascade);
+  }
+
+  /// Creates a new edit plan that consists of executing [innerPlan], and then
+  /// appending the given postfix [operator].  This could be used, for example,
+  /// to add a null check.
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  NodeProducingEditPlan addUnaryPostfix(
+      NodeProducingEditPlan innerPlan, TokenType operator,
+      {AtomicEditInfo info}) {
+    assert(innerPlan.sourceNode is Expression);
+    return surround(innerPlan,
+        suffix: [AtomicEdit.insert(operator.lexeme, info: info)],
+        outerPrecedence: Precedence.postfix,
+        innerPrecedence: Precedence.postfix,
+        associative: true);
+  }
+
+  /// Creates a new edit plan that consists of executing [innerPlan], and then
+  /// prepending the given prefix [operator].
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  NodeProducingEditPlan addUnaryPrefix(
+      TokenType operator, NodeProducingEditPlan innerPlan,
+      {AtomicEditInfo info}) {
+    assert(innerPlan.sourceNode is Expression);
+    return surround(innerPlan,
+        prefix: [AtomicEdit.insert(operator.lexeme, info: info)],
+        outerPrecedence: Precedence.prefix,
+        innerPrecedence: Precedence.prefix,
+        associative: true);
+  }
+
   /// Creates a [_PassThroughBuilder] object based around [node].
   ///
   /// Exposed so that we can substitute a mock class in unit tests.
@@ -188,16 +262,20 @@
   /// If no changes are required to the AST node that is being extracted, the
   /// caller may create innerPlan using [EditPlan.passThrough].
   ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  ///
   /// [innerPlan] will be finalized as a side effect (either immediately or when
   /// the newly created plan is finalized), so it should not be re-used by the
   /// caller.
   NodeProducingEditPlan extract(
-      AstNode sourceNode, NodeProducingEditPlan innerPlan) {
+      AstNode sourceNode, NodeProducingEditPlan innerPlan,
+      {AtomicEditInfo info}) {
     var parent = innerPlan.sourceNode.parent;
     if (!identical(parent, sourceNode) && parent is ParenthesizedExpression) {
       innerPlan = _ProvisionalParenEditPlan(parent, innerPlan);
     }
-    return _ExtractEditPlan(sourceNode, innerPlan, this);
+    return _ExtractEditPlan(sourceNode, innerPlan, this, info);
   }
 
   /// Converts [plan] to a representation of the concrete edits that need
@@ -218,6 +296,17 @@
     return (plan as NodeProducingEditPlan)._getChanges(false);
   }
 
+  /// Creates a new edit plan that consists of executing [innerPlan], and then
+  /// appending a `?`, to make a type nullable.
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  NodeProducingEditPlan makeNullable(NodeProducingEditPlan innerPlan,
+      {AtomicEditInfo info}) {
+    assert(innerPlan.sourceNode is TypeAnnotation);
+    return surround(innerPlan, suffix: [AtomicEdit.insert('?', info: info)]);
+  }
+
   /// Creates a new edit plan that makes no changes to [node], but may make
   /// changes to some of its descendants (specified via [innerPlans]).
   ///
@@ -284,7 +373,10 @@
   /// [node] must be one element of a variable length sequence maintained by
   /// [node]'s parent (for example, a statement in a block, an element in a
   /// list, a declaration in a class, etc.)
-  EditPlan removeNode(AstNode sourceNode) {
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  EditPlan removeNode(AstNode sourceNode, {AtomicEditInfo info}) {
     var parent = sourceNode.parent;
     var sequenceNodes = _computeSequenceNodes(parent);
     if (sequenceNodes == null) {
@@ -293,7 +385,7 @@
     }
     var index = sequenceNodes.indexOf(sourceNode);
     assert(index != -1);
-    return _RemoveEditPlan(parent, index, index);
+    return _RemoveEditPlan(parent, index, index, info);
   }
 
   /// Creates a new edit plan that removes a sequence of adjacent nodes from
@@ -306,7 +398,11 @@
   ///
   /// If [firstSourceNode] and [lastSourceNode] are the same node, then the
   /// behavior is identical to [removeNode] (i.e. just the one node is removed).
-  EditPlan removeNodes(AstNode firstSourceNode, AstNode lastSourceNode) {
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  EditPlan removeNodes(AstNode firstSourceNode, AstNode lastSourceNode,
+      {AtomicEditInfo info}) {
     var parent = firstSourceNode.parent;
     assert(identical(lastSourceNode.parent, parent));
     var sequenceNodes = _computeSequenceNodes(parent);
@@ -318,7 +414,7 @@
     assert(firstIndex != -1);
     var lastIndex = sequenceNodes.indexOf(lastSourceNode, firstIndex);
     assert(lastIndex >= firstIndex);
-    return _RemoveEditPlan(parent, firstIndex, lastIndex);
+    return _RemoveEditPlan(parent, firstIndex, lastIndex, info);
   }
 
   /// Creates a new edit plan that replaces the contents of [sourceNode] with
@@ -329,12 +425,19 @@
   /// of parentheses insertion and deletion: [precedence] indicates the
   /// precedence of the resulting expression.  [endsInCascade] indicates whether
   /// the resulting plan will end in a cascade.
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
   NodeProducingEditPlan replace(
       AstNode sourceNode, List<AtomicEdit> replacement,
       {Precedence precedence = Precedence.primary,
-      bool endsInCascade = false}) {
+      bool endsInCascade = false,
+      AtomicEditInfo info}) {
     return _SimpleEditPlan(sourceNode, precedence, endsInCascade, {
-      sourceNode.offset: [AtomicEdit.delete(sourceNode.length), ...replacement]
+      sourceNode.offset: [
+        AtomicEdit.delete(sourceNode.length, info: info),
+        ...replacement
+      ]
     });
   }
 
@@ -342,6 +445,10 @@
   /// surrounding it with [prefix] and [suffix] text.  This could be used, for
   /// example, to add a cast.
   ///
+  /// Note that it's tricky to get precedence correct.  When possible, use one
+  /// of the other methods in this class, such as [addBinaryPostfix],
+  /// [addBinaryPrefix], [addUnaryPostfix], or [addUnaryPrefix].
+  ///
   /// If the edit plan is going to be used in a context where an expression is
   /// expected, additional arguments should be provided to control the behavior
   /// of parentheses insertion and deletion: [outerPrecedence] indicates the
@@ -614,8 +721,10 @@
 class _ExtractEditPlan extends _NestedEditPlan {
   final EditPlanner _planner;
 
-  _ExtractEditPlan(
-      AstNode sourceNode, NodeProducingEditPlan innerPlan, this._planner)
+  final AtomicEditInfo _info;
+
+  _ExtractEditPlan(AstNode sourceNode, NodeProducingEditPlan innerPlan,
+      this._planner, this._info)
       : super(sourceNode, innerPlan);
 
   @override
@@ -631,14 +740,16 @@
             innerPlan.sourceNode.offset,
             _planner.removeViaComments
                 ? _RemovalStyle.commentSpace
-                : _RemovalStyle.delete) +
+                : _RemovalStyle.delete,
+            _info) +
         changes +
         _removeCode(
             innerPlan.sourceNode.end,
             sourceNode.end,
             _planner.removeViaComments
                 ? _RemovalStyle.spaceComment
-                : _RemovalStyle.delete);
+                : _RemovalStyle.delete,
+            _info);
     // Apply parens if needed.
     if (parens && !useInnerParens) {
       changes = _createAddParenChanges(changes);
@@ -1055,14 +1166,15 @@
     }
 
     for (; planIndex <= lastPlanIndex; planIndex++) {
+      var innerPlan = innerPlans[planIndex] as _RemoveEditPlan;
       var offset = nextRemovalOffset;
       int end;
       if (planIndex == lastPlanIndex) {
         end = lastRemovalEnd;
       } else {
-        var innerPlan = innerPlans[planIndex + 1] as _RemoveEditPlan;
-        assert(identical(innerPlan.parentNode, node));
-        nextRemovalOffset = _removalOffset(innerPlan);
+        var nextInnerPlan = innerPlans[planIndex + 1] as _RemoveEditPlan;
+        assert(identical(nextInnerPlan.parentNode, node));
+        nextRemovalOffset = _removalOffset(nextInnerPlan);
         if (planner.removeViaComments) {
           end = _removalEnd(innerPlans[planIndex] as _RemoveEditPlan);
         } else {
@@ -1081,7 +1193,8 @@
           end,
           planner.removeViaComments
               ? _RemovalStyle.spaceInsideComment
-              : _RemovalStyle.delete);
+              : _RemovalStyle.delete,
+          innerPlan.info);
     }
 
     return planIndex;
@@ -1232,7 +1345,10 @@
   /// Index of the node to be removed within the parent.
   final int lastChildIndex;
 
-  _RemoveEditPlan(this.parentNode, this.firstChildIndex, this.lastChildIndex)
+  final AtomicEditInfo info;
+
+  _RemoveEditPlan(
+      this.parentNode, this.firstChildIndex, this.lastChildIndex, this.info)
       : super._();
 }
 
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index ebac706..2301471 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -3,27 +3,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/precedence.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
 
 /// Implementation of [NodeChange] representing the addition of the keyword
 /// `required` to a named parameter.
-///
-/// TODO(paulberry): store additional information necessary to include in the
-/// preview.
 class AddRequiredKeyword extends _NestableChange {
-  const AddRequiredKeyword(
+  /// Information about why the change should be made.
+  final AtomicEditInfo info;
+
+  const AddRequiredKeyword(this.info,
       [NodeChange<NodeProducingEditPlan> inner = const NoChange()])
       : super(inner);
 
   @override
   EditPlan apply(AstNode node, FixAggregator aggregator) {
     var innerPlan = _inner.apply(node, aggregator);
-    return aggregator.planner
-        .surround(innerPlan, prefix: [const AtomicEdit.insert('required ')]);
+    return aggregator.planner.surround(innerPlan,
+        prefix: [AtomicEdit.insert('required ', info: info)]);
   }
 }
 
@@ -31,37 +32,55 @@
 /// because the conditional expression in an if statement, if element, or
 /// conditional expression has been determined to always evaluate to either
 /// `true` or `false`.
-///
-/// TODO(paulberry): store additional information necessary to include in the
-/// preview.
 class EliminateDeadIf extends NodeChange {
   /// The value that the conditional expression has been determined to always
   /// evaluate to
   final bool conditionValue;
 
-  const EliminateDeadIf(this.conditionValue);
+  /// Reasons for the change.
+  final List<FixReasonInfo> reasons;
+
+  const EliminateDeadIf(this.conditionValue, {this.reasons = const []});
 
   @override
   EditPlan apply(AstNode node, FixAggregator aggregator) {
     // TODO(paulberry): do we need to detect whether the condition has side
     // effects?  For now, assuming no.
-    AstNode nodeToKeep;
+    AstNode thenNode;
+    AstNode elseNode;
     if (node is IfStatement) {
-      nodeToKeep = conditionValue ? node.thenStatement : node.elseStatement;
+      thenNode = node.thenStatement;
+      elseNode = node.elseStatement;
     } else if (node is ConditionalExpression) {
-      nodeToKeep = conditionValue ? node.thenExpression : node.elseExpression;
+      thenNode = node.thenExpression;
+      elseNode = node.elseExpression;
     } else if (node is IfElement) {
-      nodeToKeep = conditionValue ? node.thenElement : node.elseElement;
+      thenNode = node.thenElement;
+      elseNode = node.elseElement;
     } else {
       throw StateError(
           "EliminateDeadIf applied to an AST node that's not an if");
     }
+    AstNode nodeToKeep;
+    NullabilityFixDescription description;
+    if (conditionValue) {
+      nodeToKeep = thenNode;
+      if (elseNode == null) {
+        description = NullabilityFixDescription.discardCondition;
+      } else {
+        description = NullabilityFixDescription.discardElse;
+      }
+    } else {
+      nodeToKeep = elseNode;
+      description = NullabilityFixDescription.discardThen;
+    }
+    var info = AtomicEditInfo(description, reasons);
     if (nodeToKeep == null) {
-      return aggregator.planner.removeNode(node);
+      return aggregator.planner.removeNode(node, info: info);
     }
     if (nodeToKeep is Block) {
       if (nodeToKeep.statements.isEmpty) {
-        return aggregator.planner.removeNode(node);
+        return aggregator.planner.removeNode(node, info: info);
       } else if (nodeToKeep.statements.length == 1) {
         var singleStatement = nodeToKeep.statements[0];
         if (singleStatement is VariableDeclarationStatement) {
@@ -69,12 +88,13 @@
           // the variable declarations
         } else {
           return aggregator.planner.extract(
-              node, aggregator.innerPlanForNode(nodeToKeep.statements.single));
+              node, aggregator.innerPlanForNode(nodeToKeep.statements.single),
+              info: info);
         }
       }
     }
     return aggregator.planner
-        .extract(node, aggregator.innerPlanForNode(nodeToKeep));
+        .extract(node, aggregator.innerPlanForNode(nodeToKeep), info: info);
   }
 
   @override
@@ -147,24 +167,21 @@
 
 /// Implementation of [NodeChange] representing introduction of an explicit
 /// downcast.
-///
-/// TODO(paulberry): store additional information necessary to include in the
-/// preview.
 class IntroduceAs extends _NestableChange {
   /// TODO(paulberry): shouldn't be a String
   final String type;
 
-  const IntroduceAs(this.type,
+  /// Information about why the change should be made.
+  final AtomicEditInfo info;
+
+  const IntroduceAs(this.type, this.info,
       [NodeChange<NodeProducingEditPlan> inner = const NoChange()])
       : super(inner);
 
   @override
   EditPlan apply(AstNode node, FixAggregator aggregator) {
     var innerPlan = _inner.apply(node, aggregator);
-    return aggregator.planner.surround(innerPlan,
-        suffix: [AtomicEdit.insert(' as $type')],
-        outerPrecedence: Precedence.relational,
-        innerPrecedence: Precedence.relational);
+    return aggregator.planner.addBinaryPostfix(innerPlan, TokenType.AS, type);
   }
 }
 
@@ -181,14 +198,11 @@
   @override
   EditPlan apply(AstNode node, FixAggregator aggregator) {
     var innerPlan = _inner.apply(node, aggregator);
-    return aggregator.planner.surround(innerPlan, suffix: [
-      AtomicEditWithInfo.insert(
-          '?',
-          AtomicEditInfo(
-              NullabilityFixDescription.makeTypeNullable(
-                  decoratedType.type.toString()),
-              [decoratedType.node]))
-    ]);
+    return aggregator.planner.makeNullable(innerPlan,
+        info: AtomicEditInfo(
+            NullabilityFixDescription.makeTypeNullable(
+                decoratedType.type.toString()),
+            [decoratedType.node]));
   }
 }
 
@@ -223,29 +237,24 @@
 
 /// Implementation of [NodeChange] representing the addition of a null check to
 /// an expression.
-///
-/// TODO(paulberry): store additional information necessary to include in the
-/// preview.
 class NullCheck extends _NestableChange {
-  const NullCheck([NodeChange<NodeProducingEditPlan> inner = const NoChange()])
+  /// Information about why the change should be made.
+  final AtomicEditInfo info;
+
+  const NullCheck(this.info,
+      [NodeChange<NodeProducingEditPlan> inner = const NoChange()])
       : super(inner);
 
   @override
   EditPlan apply(AstNode node, FixAggregator aggregator) {
     var innerPlan = _inner.apply(node, aggregator);
-    return aggregator.planner.surround(innerPlan,
-        suffix: [const AtomicEdit.insert('!')],
-        outerPrecedence: Precedence.postfix,
-        innerPrecedence: Precedence.postfix,
-        associative: true);
+    return aggregator.planner
+        .addUnaryPostfix(innerPlan, TokenType.BANG, info: info);
   }
 }
 
 /// Implementation of [NodeChange] representing the removal of an unnecessary
 /// cast.
-///
-/// TODO(paulberry): store additional information necessary to include in the
-/// preview.
 class RemoveAs extends _NestableChange {
   const RemoveAs([NodeChange<NodeProducingEditPlan> inner = const NoChange()])
       : super(inner);
@@ -253,17 +262,18 @@
   @override
   EditPlan apply(AstNode node, FixAggregator aggregator) {
     return aggregator.planner.extract(
-        node, _inner.apply((node as AsExpression).expression, aggregator));
+        node, _inner.apply((node as AsExpression).expression, aggregator),
+        info: AtomicEditInfo(NullabilityFixDescription.removeAs, const []));
   }
 }
 
 /// Implementation of [NodeChange] that changes an `@required` annotation into
 /// a `required` keyword.
-///
-/// TODO(paulberry): store additional information necessary to include in the
-/// preview.
 class RequiredAnnotationToRequiredKeyword extends _NestableChange {
-  const RequiredAnnotationToRequiredKeyword(
+  /// Information about why the change should be made.
+  final AtomicEditInfo info;
+
+  const RequiredAnnotationToRequiredKeyword(this.info,
       [NodeChange<NodeProducingEditPlan> inner = const NoChange()])
       : super(inner);
 
@@ -279,9 +289,11 @@
             'required') {
       // The text `required` already exists in the annotation; we can just
       // extract it.
-      return aggregator.planner.extract(node, _inner.apply(name, aggregator));
+      return aggregator.planner
+          .extract(node, _inner.apply(name, aggregator), info: info);
     } else {
-      return aggregator.planner.replace(node, [AtomicEdit.insert('required')]);
+      return aggregator.planner
+          .replace(node, [AtomicEdit.insert('required', info: info)]);
     }
   }
 }
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 1577668..4e2b9a8 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -18,12 +18,16 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
+import 'package:analyzer/src/error/best_practices_verifier.dart';
 import 'package:analyzer/src/generated/migration.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:nnbd_migration/nnbd_migration.dart';
 import 'package:nnbd_migration/src/decorated_class_hierarchy.dart';
+import 'package:nnbd_migration/src/edit_plan.dart';
 import 'package:nnbd_migration/src/fix_aggregator.dart';
+import 'package:nnbd_migration/src/nullability_node.dart';
 import 'package:nnbd_migration/src/variables.dart';
 
 /// Problem reported by [FixBuilder] when encountering a compound assignment
@@ -125,8 +129,9 @@
   /// Visits the entire compilation [unit] using the analyzer's resolver and
   /// makes note of changes that need to be made.
   void visitAll(CompilationUnit unit) {
-    unit.accept(_AdditionalMigrationsVisitor(this));
+    unit.accept(_FixBuilderPreVisitor(this));
     unit.accept(_resolver);
+    unit.accept(_FixBuilderPostVisitor(this));
   }
 
   /// Called whenever an AST node is found that needs to be changed.
@@ -213,7 +218,10 @@
         return null;
       }
       var conditionValue = conditionalDiscard.keepTrue;
-      _fixBuilder._addChange(node, EliminateDeadIf(conditionValue));
+      _fixBuilder._addChange(
+          node,
+          EliminateDeadIf(conditionValue,
+              reasons: conditionalDiscard.reasons.toList()));
       return conditionValue;
     }
   }
@@ -289,7 +297,13 @@
   }
 
   DartType _addNullCheck(Expression node, DartType type) {
-    _fixBuilder._addChange(node, NullCheck());
+    var checks =
+        _fixBuilder._variables.expressionChecks(_fixBuilder.source, node);
+    var info = checks != null
+        ? AtomicEditInfo(
+            NullabilityFixDescription.checkExpression, checks.edges)
+        : null;
+    _fixBuilder._addChange(node, NullCheck(info));
     _flowAnalysis.nonNullAssert_end(node);
     return _fixBuilder._typeSystem.promoteToNonNull(type as TypeImpl);
   }
@@ -383,22 +397,43 @@
 abstract class Problem {}
 
 /// Visitor that computes additional migrations on behalf of [FixBuilder] that
-/// don't need to be integrated into the resolver itself.
-class _AdditionalMigrationsVisitor extends RecursiveAstVisitor<void> {
+/// should be run after resolution
+class _FixBuilderPostVisitor extends RecursiveAstVisitor<void> {
   final FixBuilder _fixBuilder;
 
-  _AdditionalMigrationsVisitor(this._fixBuilder);
+  _FixBuilderPostVisitor(this._fixBuilder);
+
+  @override
+  void visitAsExpression(AsExpression node) {
+    if (!_fixBuilder._variables.wasUnnecessaryCast(_fixBuilder.source, node) &&
+        BestPracticesVerifier.isUnnecessaryCast(
+            node, _fixBuilder._typeSystem)) {
+      _fixBuilder._addChange(node, const RemoveAs());
+    }
+  }
+}
+
+/// Visitor that computes additional migrations on behalf of [FixBuilder] that
+/// don't need to be integrated into the resolver itself, and should be run
+/// prior to resolution
+class _FixBuilderPreVisitor extends RecursiveAstVisitor<void> {
+  final FixBuilder _fixBuilder;
+
+  _FixBuilderPreVisitor(this._fixBuilder);
 
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
     var element = node.declaredElement;
-    if (node.defaultValue == null &&
-        !_fixBuilder._variables.decoratedElementType(element).node.isNullable) {
-      if (element.isNamed) {
-        _addRequiredKeyword(node);
-      } else {
-        _fixBuilder._addProblem(
-            node, const NonNullableUnnamedOptionalParameter());
+    if (node.defaultValue == null) {
+      var nullabilityNode =
+          _fixBuilder._variables.decoratedElementType(element).node;
+      if (!nullabilityNode.isNullable) {
+        if (element.isNamed) {
+          _addRequiredKeyword(node, nullabilityNode);
+        } else {
+          _fixBuilder._addProblem(
+              node, const NonNullableUnnamedOptionalParameter());
+        }
       }
     }
     super.visitDefaultFormalParameter(node);
@@ -428,20 +463,28 @@
     super.visitTypeName(node);
   }
 
-  void _addRequiredKeyword(DefaultFormalParameter node) {
+  void _addRequiredKeyword(
+      DefaultFormalParameter parameter, NullabilityNode node) {
     // Change an existing `@required` annotation into a `required` keyword if
     // possible.
-    var metadata = node.metadata;
+    final element = parameter.declaredElement;
+    final method = element.enclosingElement;
+    final cls = method.enclosingElement;
+    var info = AtomicEditInfo(
+        NullabilityFixDescription.addRequired(
+            cls.name, method.name, element.name),
+        [node]);
+    var metadata = parameter.metadata;
     for (var annotation in metadata) {
       if (annotation.elementAnnotation.isRequired) {
         // TODO(paulberry): what if `@required` isn't the first annotation?
         // Will we produce something that isn't grammatical?
         _fixBuilder._addChange(
-            annotation, const RequiredAnnotationToRequiredKeyword());
+            annotation, RequiredAnnotationToRequiredKeyword(info));
         return;
       }
     }
     // Otherwise create a new `required` keyword.
-    _fixBuilder._addChange(node, const AddRequiredKeyword());
+    _fixBuilder._addChange(parameter, AddRequiredKeyword(info));
   }
 }
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 0359dde..33b620e 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -790,6 +790,10 @@
   /// Associates a set of nullability checks with the given expression [node].
   void recordExpressionChecks(
       Source source, Expression expression, ExpressionChecksOrigin origin);
+
+  /// Records the fact that prior to migration, an unnecessary cast existed at
+  /// [node].
+  void recordUnnecessaryCast(Source source, AsExpression node);
 }
 
 /// Types of comments that can influence nullability
diff --git a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
index 8c62582..47574a2 100644
--- a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
@@ -134,8 +134,9 @@
     for (var offset in offsets) {
       var edits = changes[offset];
       var descriptions = edits
-          .whereType<AtomicEditWithInfo>()
-          .map((edit) => edit.info.description.appliedMessage)
+          .map((edit) => edit.info)
+          .where((info) => info != null)
+          .map((info) => info.description.appliedMessage)
           .join(', ');
       var sourceEdit = edits.toSourceEdit(offset);
       listener.addSuggestion(
@@ -199,19 +200,19 @@
     return location;
   }
 
-  static List<MapEntry<Location, AtomicEditWithInfo>>
-      _gatherAtomicEditsByLocation(
-          Source source,
-          PotentialModification potentialModification,
-          LineInfo lineInfo,
-          AtomicEditInfo info) {
-    List<MapEntry<Location, AtomicEditWithInfo>> result = [];
+  static List<MapEntry<Location, AtomicEdit>> _gatherAtomicEditsByLocation(
+      Source source,
+      PotentialModification potentialModification,
+      LineInfo lineInfo,
+      AtomicEditInfo info) {
+    List<MapEntry<Location, AtomicEdit>> result = [];
 
     for (var modification in potentialModification.modifications) {
-      var atomicEditWithInfo = AtomicEditWithInfo.replace(
-          modification.length, modification.replacement, info);
-      result.add(MapEntry(_computeLocation(lineInfo, modification, source),
-          atomicEditWithInfo));
+      var atomicEdit = AtomicEdit.replace(
+          modification.length, modification.replacement,
+          info: info);
+      result.add(MapEntry(
+          _computeLocation(lineInfo, modification, source), atomicEdit));
     }
     return result;
   }
diff --git a/pkg/nnbd_migration/lib/src/variables.dart b/pkg/nnbd_migration/lib/src/variables.dart
index 8db150a..d55477d 100644
--- a/pkg/nnbd_migration/lib/src/variables.dart
+++ b/pkg/nnbd_migration/lib/src/variables.dart
@@ -2,14 +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.
 
+import 'dart:math' as math;
+
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:meta/meta.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/already_migrated_code_decorator.dart';
 import 'package:nnbd_migration/src/conditional_discard.dart';
@@ -19,6 +22,16 @@
 import 'package:nnbd_migration/src/nullability_node.dart';
 import 'package:nnbd_migration/src/potential_modification.dart';
 
+/// Data structure used by [Variables.spanForUniqueIdentifier] to return an
+/// offset/end pair.
+class OffsetEndPair {
+  final int offset;
+
+  final int end;
+
+  OffsetEndPair(this.offset, this.end);
+}
+
 class Variables implements VariableRecorder, VariableRepository {
   final NullabilityGraph _graph;
 
@@ -33,8 +46,12 @@
 
   final _decoratedTypeAnnotations = <Source, Map<int, DecoratedType>>{};
 
+  final _expressionChecks = <Source, Map<int, ExpressionChecks>>{};
+
   final _potentialModifications = <Source, List<PotentialModification>>{};
 
+  final _unnecessaryCasts = <Source, Set<int>>{};
+
   final AlreadyMigratedCodeDecorator _alreadyMigratedCodeDecorator;
 
   final NullabilityMigrationInstrumentation /*?*/ instrumentation;
@@ -66,8 +83,8 @@
       throw StateError('No declarated type annotations in ${source.fullName}; '
           'expected one for ${typeAnnotation.toSource()}');
     }
-    DecoratedType decoratedTypeAnnotation =
-        annotationsInSource[_uniqueOffsetForTypeAnnotation(typeAnnotation)];
+    DecoratedType decoratedTypeAnnotation = annotationsInSource[
+        uniqueIdentifierForSpan(typeAnnotation.offset, typeAnnotation.end)];
     if (decoratedTypeAnnotation == null) {
       throw StateError('Missing declarated type annotation'
           ' in ${source.fullName}; for ${typeAnnotation.toSource()}');
@@ -106,6 +123,13 @@
     }
   }
 
+  /// Retrieves the [ExpressionChecks] object corresponding to the given
+  /// [expression], if one exists; otherwise null.
+  ExpressionChecks expressionChecks(Source source, Expression expression) {
+    return (_expressionChecks[source] ??
+        {})[uniqueIdentifierForSpan(expression.offset, expression.end)];
+  }
+
   ConditionalDiscard getConditionalDiscard(Source source, AstNode node) =>
       (_conditionalDiscards[source] ?? {})[node.offset];
 
@@ -150,7 +174,7 @@
     if (potentialModification != null)
       _addPotentialModification(source, potentialModification);
     (_decoratedTypeAnnotations[source] ??=
-        {})[_uniqueOffsetForTypeAnnotation(node)] = type;
+        {})[uniqueIdentifierForSpan(node.offset, node.end)] = type;
   }
 
   @override
@@ -167,6 +191,9 @@
   void recordExpressionChecks(
       Source source, Expression expression, ExpressionChecksOrigin origin) {
     _addPotentialModification(source, origin.checks);
+    (_expressionChecks[source] ??=
+            {})[uniqueIdentifierForSpan(expression.offset, expression.end)] =
+        origin.checks;
   }
 
   @override
@@ -176,6 +203,19 @@
     _addPotentialModification(source, modification);
   }
 
+  @override
+  void recordUnnecessaryCast(Source source, AsExpression node) {
+    bool newlyAdded = (_unnecessaryCasts[source] ??= {})
+        .add(uniqueIdentifierForSpan(node.offset, node.end));
+    assert(newlyAdded);
+  }
+
+  /// Queries whether, prior to migration, an unnecessary cast existed at
+  /// [node].
+  bool wasUnnecessaryCast(Source source, AsExpression node) =>
+      (_unnecessaryCasts[source] ?? const {})
+          .contains(uniqueIdentifierForSpan(node.offset, node.end));
+
   void _addPotentialModification(
       Source source, PotentialModification potentialModification) {
     (_potentialModifications[source] ??= []).add(potentialModification);
@@ -222,8 +262,73 @@
     return result;
   }
 
-  int _uniqueOffsetForTypeAnnotation(TypeAnnotation typeAnnotation) =>
-      typeAnnotation is GenericFunctionType
-          ? typeAnnotation.functionKeyword.offset
-          : typeAnnotation.offset;
+  /// Inverts the logic of [uniqueIdentifierForSpan], producing an (offset, end)
+  /// pair.
+  @visibleForTesting
+  static OffsetEndPair spanForUniqueIdentifier(int span) {
+    // The formula for uniqueIdentifierForSpan was:
+    //   span = end*(end + 1) / 2 + offset
+    // In other words, all encodings with the same `end` value are consecutive.
+    // So we just have to figure out the `end` value for this `span`, then
+    // use [uniqueIdentifierForSpan] to find the first encoding with this `end`
+    // value, and subtract to find the offset.
+    //
+    // To find the `end` value, we assume offset = 0 and solve for `end` using
+    // the quadratic formula:
+    //   span = end*(end + 1) / 2
+    //   end^2 + end - 2*span = 0
+    //   end = -1 +/- sqrt(1 + 8*span)
+    // We can reslove the `+/-` to `+` (since the result we seek can't be
+    // negative), so that yields:
+    //   end = sqrt(1 + 8*span) - 1
+    int end = (math.sqrt(1 + 8.0 * span) - 1).floor();
+    assert(end >= 0);
+
+    // There's a slight chance of numerical instabilities in `sqrt` leading to
+    // a result for `end` that's off by 1, so we loop to find the correct
+    // result:
+    while (true) {
+      // Compute the first `span` value corresponding to this `end` value.
+      int firstSpanForThisEnd = uniqueIdentifierForSpan(0, end);
+
+      // Offsets are encoded consecutively so we can find the offset by
+      // subtracting:
+      int offset = span - firstSpanForThisEnd;
+
+      if (offset < 0) {
+        // Oops, `end` must have been too large.  Decrement and try again.
+        assert(end > 0);
+        --end;
+      } else if (offset > end) {
+        // Oops, `end` must have been too small.  Increment and try again.
+        ++end;
+      } else {
+        return OffsetEndPair(offset, end);
+      }
+    }
+  }
+
+  /// Combine the given [offset] and [end] into a unique integer that depends
+  /// on both of them, taking advantage of the fact that `0 <= offset <= end`.
+  @visibleForTesting
+  static int uniqueIdentifierForSpan(int offset, int end) {
+    assert(0 <= offset && offset <= end);
+    // Our encoding is based on the observation that if you make a graph of the
+    // set of all possible (offset, end) pairs, marking those that satisfy
+    // `0 <= offset <= end` with an `x`, you get a triangle shape:
+    //
+    //       offset
+    //     +-------->
+    //     |x
+    //     |xx
+    // end |xxx
+    //     |xxxx
+    //     V
+    //
+    // If we assign integers to the `x`s in the order they appear in this graph,
+    // then the rows start with numbers 0, 1, 3, 6, 10, etc.  This can be
+    // computed from `end` as `end*(end + 1)/2`.  We use `~/` for integer
+    // division.
+    return end * (end + 1) ~/ 2 + offset;
+  }
 }
diff --git a/pkg/nnbd_migration/test/abstract_single_unit.dart b/pkg/nnbd_migration/test/abstract_single_unit.dart
index 9ccb588..75a42a9 100644
--- a/pkg/nnbd_migration/test/abstract_single_unit.dart
+++ b/pkg/nnbd_migration/test/abstract_single_unit.dart
@@ -30,6 +30,13 @@
   FindNode findNode;
   FindElement findElement;
 
+  /// Whether the test should perform analysis with NNBD enabled.
+  ///
+  /// `false` by default.  May be overridden in derived test classes.
+  ///
+  /// TODO(paulberry): once NNBD ships, this should no longer be needed.
+  bool get analyzeWithNnbd => false;
+
   void addTestSource(String code, [Uri uri]) {
     testCode = code;
     testSource = addSource(testFile, code, uri);
@@ -58,8 +65,16 @@
 
   @override
   void setUp() {
+    var testRoot = '/home/test';
+    if (analyzeWithNnbd) {
+      newFile(convertPath('$testRoot/analysis_options.yaml'), content: '''
+analyzer:
+  enable-experiment:
+    - non-nullable
+''');
+    }
     super.setUp();
-    testFile = convertPath('/home/test/lib/test.dart');
+    testFile = convertPath('$testRoot/lib/test.dart');
     testUri = Uri.parse('package:test/test.dart');
   }
 }
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index f0c7f50..d076779 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -107,6 +107,22 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_as_allows_null() async {
+    var content = '''
+int f(Object o) => (o as int)?.gcd(1);
+main() {
+  f(null);
+}
+''';
+    var expected = '''
+int? f(Object? o) => (o as int?)?.gcd(1);
+main() {
+  f(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_assign_null_to_generic_type() async {
     var content = '''
 main() {
@@ -2311,6 +2327,88 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_instance_creation_generic_explicit_nonNullable() async {
+    var content = '''
+class C<T extends Object/*!*/> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int> c = C<int>(null);
+}
+''';
+    var expected = '''
+class C<T extends Object/*!*/> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int> c = C<int>(null!);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void>
+      test_instance_creation_generic_explicit_nonNullableParam() async {
+    var content = '''
+class C<T> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int> c = C<int>(null);
+}
+''';
+    var expected = '''
+class C<T> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int?> c = C<int?>(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_instance_creation_generic_implicit_nonNullable() async {
+    var content = '''
+class C<T extends Object/*!*/> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int> c = C(null);
+}
+''';
+    var expected = '''
+class C<T extends Object/*!*/> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int> c = C(null!);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void>
+      test_instance_creation_generic_implicit_nonNullableParam() async {
+    var content = '''
+class C<T> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int> c = C(null);
+}
+''';
+    var expected = '''
+class C<T> {
+  C(T/*!*/ t);
+}
+main() {
+  C<int?> c = C(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_instanceCreation_noTypeArguments_noParameters() async {
     var content = '''
 void main() {
@@ -2511,6 +2609,40 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void>
+      test_methodInvocation_typeArguments_explicit_nonNullable() async {
+    var content = '''
+T f<T extends Object/*!*/>(T/*!*/ t) => t;
+void g() {
+  int x = f<int>(null);
+}
+''';
+    var expected = '''
+T f<T extends Object/*!*/>(T/*!*/ t) => t;
+void g() {
+  int x = f<int>(null!);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void>
+      test_methodInvocation_typeArguments_explicit_nonNullableParam() async {
+    var content = '''
+T f<T>(T/*!*/ t) => t;
+void g() {
+  int x = f<int>(null);
+}
+''';
+    var expected = '''
+T f<T>(T/*!*/ t) => t;
+void g() {
+  int? x = f<int?>(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_methodInvocation_typeArguments_inferred() async {
     var content = '''
 T f<T>(T t) => t;
@@ -2527,6 +2659,40 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void>
+      test_methodInvocation_typeArguments_inferred_nonNullable() async {
+    var content = '''
+T f<T extends Object/*!*/>(T/*!*/ t) => t;
+void g() {
+  int x = f(null);
+}
+''';
+    var expected = '''
+T f<T extends Object/*!*/>(T/*!*/ t) => t;
+void g() {
+  int x = f(null!);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void>
+      test_methodInvocation_typeArguments_inferred_nonNullableParam() async {
+    var content = '''
+T f<T>(T/*!*/ t) => t;
+void g() {
+  int x = f(null);
+}
+''';
+    var expected = '''
+T f<T>(T/*!*/ t) => t;
+void g() {
+  int? x = f(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_multiDeclaration_innerUsage() async {
     var content = '''
 void test() {
@@ -3877,6 +4043,23 @@
 ''';
     await _checkSingleFileChanges(content, expected);
   }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/38472')
+  Future<void> test_unnecessary_cast_remove() async {
+    var content = '''
+_f(Object x) {
+  if (x is! int) return;
+  print((x as int) + 1);
+}
+''';
+    var expected = '''
+_f(Object x) {
+  if (x is! int) return;
+  print(x + 1);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
 }
 
 @reflectiveTest
@@ -3927,6 +4110,11 @@
   @override
   Future<void> test_removed_if_element_doesnt_introduce_nullability() =>
       super.test_removed_if_element_doesnt_introduce_nullability();
+
+  /// Test fails under the pre-FixBuilder implementation; passes now.
+  @override
+  Future<void> test_unnecessary_cast_remove() =>
+      super.test_unnecessary_cast_remove();
 }
 
 /// Tests of the provisional API, where the driver is reset between calls to
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index a63a9a3..71b31b2 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -2,12 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeSystemImpl;
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:nnbd_migration/src/decorated_class_hierarchy.dart';
@@ -480,6 +482,38 @@
         hard: true);
     // TODO(mfairhurst): these should probably be hard edges.
     assertEdge(decoratedTypeAnnotation('int').node, never, hard: false);
+    expect(
+        variables.wasUnnecessaryCast(testSource, findNode.as_('o as')), false);
+  }
+
+  Future<void> test_as_int_null_ok() async {
+    await analyze('''
+void f(Object o) {
+  (o as int)?.gcd(1);
+}
+''');
+    assertEdge(decoratedTypeAnnotation('Object o').node,
+        decoratedTypeAnnotation('int').node,
+        hard: true);
+    assertNoEdge(decoratedTypeAnnotation('int').node, never);
+  }
+
+  Future<void> test_as_int_unnecessary() async {
+    verifyNoTestUnitErrors = false;
+    await analyze('''
+void f(int i) {
+  (i as int).gcd(1);
+}
+''');
+    expect(
+        testAnalysisResult.errors.single.errorCode, HintCode.UNNECESSARY_CAST);
+    assertEdge(decoratedTypeAnnotation('int i').node,
+        decoratedTypeAnnotation('int)').node,
+        hard: true);
+    // TODO(mfairhurst): these should probably be hard edges.
+    assertEdge(decoratedTypeAnnotation('int)').node, never, hard: false);
+    expect(
+        variables.wasUnnecessaryCast(testSource, findNode.as_('i as')), true);
   }
 
   Future<void> test_as_side_cast() async {
@@ -3127,6 +3161,19 @@
         hard: false);
   }
 
+  Future<void> test_instanceCreation_generic_bound() async {
+    await analyze('''
+class C<T extends Object> {}
+C<int> f() => C<int>();
+''');
+    assertEdge(decoratedTypeAnnotation('int>(').node,
+        decoratedTypeAnnotation('int> f').node,
+        hard: false);
+    assertEdge(decoratedTypeAnnotation('int>(').node,
+        decoratedTypeAnnotation('Object').node,
+        hard: true);
+  }
+
   Future<void> test_instanceCreation_generic_dynamic() async {
     await analyze('''
 class C<T> {}
@@ -3988,10 +4035,11 @@
 
   Future<void> test_methodInvocation_return_type_generic_function() async {
     await analyze('''
-T f<T>(T t) => t;
+T f<T extends Object>(T t) => t;
 int g() => (f<int>(1));
 ''');
     var check_i = checkExpression('(f<int>(1))');
+    var t_bound = decoratedTypeAnnotation('Object').node;
     var nullable_f_t = decoratedTypeAnnotation('int>').node;
     var nullable_f_t_or_nullable_t = check_i.checks.edges.single.sourceNode
         as NullabilityNodeForSubstitution;
@@ -4001,6 +4049,7 @@
     var nullable_return = decoratedTypeAnnotation('int g').node;
     assertNullCheck(check_i,
         assertEdge(nullable_f_t_or_nullable_t, nullable_return, hard: false));
+    assertEdge(nullable_f_t, t_bound, hard: true);
   }
 
   Future<void> test_methodInvocation_return_type_null_aware() async {
diff --git a/pkg/nnbd_migration/test/edit_plan_test.dart b/pkg/nnbd_migration/test/edit_plan_test.dart
index 1fbe84d..85538b8 100644
--- a/pkg/nnbd_migration/test/edit_plan_test.dart
+++ b/pkg/nnbd_migration/test/edit_plan_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/precedence.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
@@ -26,6 +27,9 @@
 
   EditPlanner _planner;
 
+  @override
+  bool get analyzeWithNnbd => true;
+
   EditPlanner get planner {
     if (_planner == null) createPlanner();
     return _planner;
@@ -50,6 +54,177 @@
   NodeProducingEditPlan extract(AstNode inner, AstNode outer) =>
       planner.extract(outer, planner.passThrough(inner));
 
+  Future<void> test_addBinaryPostfix_assignment_right_associative() async {
+    await analyze('_f(a, b, c) => a = b;');
+    // Admittedly this is sort of a bogus test case, since the code it produces
+    // (`(a = b) = c`) is non-grammatical.  But we still want to verify that it
+    // *doesn't* produce `a = b = c`, which would be grammatical but which would
+    // break apart the subexpression `a = b`.
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.assignment('a = b')),
+            TokenType.EQ,
+            'c'),
+        '_f(a, b, c) => (a = b) = c;');
+  }
+
+  Future<void> test_addBinaryPostfix_associative() async {
+    await analyze('var x = 1 - 2;');
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.binary('-')), TokenType.MINUS, '3'),
+        'var x = 1 - 2 - 3;');
+  }
+
+  Future<void> test_addBinaryPostfix_endsInCascade() async {
+    await analyze('f(x) => x..y = 1;');
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.integerLiteral('1')),
+            TokenType.PLUS,
+            '2'),
+        'f(x) => x..y = 1 + 2;');
+  }
+
+  Future<void> test_addBinaryPostfix_equality_non_associative() async {
+    await analyze('var x = 1 == 2;');
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.binary('==')), TokenType.EQ_EQ, '3'),
+        'var x = (1 == 2) == 3;');
+  }
+
+  Future<void> test_addBinaryPostfix_inner_precedence() async {
+    await analyze('var x = 1 < 2;');
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.binary('<')), TokenType.EQ_EQ, 'true'),
+        'var x = 1 < 2 == true;');
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.binary('<')), TokenType.AS, 'bool'),
+        'var x = (1 < 2) as bool;');
+  }
+
+  Future<void> test_addBinaryPostfix_outer_precedence() async {
+    await analyze('var x = 1 == true;');
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.integerLiteral('1')),
+            TokenType.LT,
+            '2'),
+        'var x = 1 < 2 == true;');
+    checkPlan(
+        planner.addBinaryPostfix(
+            planner.passThrough(findNode.integerLiteral('1')),
+            TokenType.EQ_EQ,
+            '2'),
+        'var x = (1 == 2) == true;');
+  }
+
+  Future<void> test_addBinaryPrefix_allowCascade() async {
+    await analyze('f(x) => 1..isEven;');
+    checkPlan(
+        planner.addBinaryPrefix(
+            'x..y', TokenType.EQ, planner.passThrough(findNode.cascade('..'))),
+        'f(x) => x..y = (1..isEven);');
+    checkPlan(
+        planner.addBinaryPrefix(
+            'x', TokenType.EQ, planner.passThrough(findNode.cascade('..')),
+            allowCascade: true),
+        'f(x) => x = 1..isEven;');
+  }
+
+  Future<void> test_addBinaryPrefix_assignment_right_associative() async {
+    await analyze('_f(a, b, c) => b = c;');
+    checkPlan(
+        planner.addBinaryPrefix('a', TokenType.EQ,
+            planner.passThrough(findNode.assignment('b = c'))),
+        '_f(a, b, c) => a = b = c;');
+  }
+
+  Future<void> test_addBinaryPrefix_associative() async {
+    await analyze('var x = 1 - 2;');
+    checkPlan(
+        planner.addBinaryPrefix(
+            '0', TokenType.MINUS, planner.passThrough(findNode.binary('-'))),
+        'var x = 0 - (1 - 2);');
+  }
+
+  Future<void> test_addBinaryPrefix_outer_precedence() async {
+    await analyze('var x = 2 == true;');
+    checkPlan(
+        planner.addBinaryPrefix('1', TokenType.LT,
+            planner.passThrough(findNode.integerLiteral('2'))),
+        'var x = 1 < 2 == true;');
+    checkPlan(
+        planner.addBinaryPrefix('1', TokenType.EQ_EQ,
+            planner.passThrough(findNode.integerLiteral('2'))),
+        'var x = (1 == 2) == true;');
+  }
+
+  Future<void> test_addUnaryPostfix_inner_precedence_add_parens() async {
+    await analyze('f(x) => -x;');
+    checkPlan(
+        planner.addUnaryPostfix(
+            planner.passThrough(findNode.prefix('-x')), TokenType.BANG),
+        'f(x) => (-x)!;');
+  }
+
+  Future<void> test_addUnaryPostfix_inner_precedence_no_parens() async {
+    await analyze('f(x) => x++;');
+    checkPlan(
+        planner.addUnaryPostfix(
+            planner.passThrough(findNode.postfix('x++')), TokenType.BANG),
+        'f(x) => x++!;');
+  }
+
+  Future<void> test_addUnaryPostfix_outer_precedence() async {
+    await analyze('f(x) => x!;');
+    checkPlan(
+        planner.addUnaryPostfix(
+            planner.passThrough(findNode.simple('x!')), TokenType.PLUS_PLUS),
+        'f(x) => x++!;');
+  }
+
+  Future<void> test_addUnaryPrefix_inner_precedence_add_parens() async {
+    await analyze('f(x, y) => x * y;');
+    checkPlan(
+        planner.addUnaryPrefix(
+            TokenType.MINUS, planner.passThrough(findNode.binary('*'))),
+        'f(x, y) => -(x * y);');
+  }
+
+  Future<void> test_addUnaryPrefix_inner_precedence_no_parens() async {
+    await analyze('f(x) => -x;');
+    // TODO(paulberry): if we added a `-` instead of a `~`, the result would
+    // scan as a single `--` token, so we would need parens.  Add support for
+    // this corner case.
+    checkPlan(
+        planner.addUnaryPrefix(
+            TokenType.TILDE, planner.passThrough(findNode.prefix('-x'))),
+        'f(x) => ~-x;');
+  }
+
+  Future<void> test_addUnaryPrefix_outer_precedence_add_parens() async {
+    await analyze('f(x) => x!;');
+    checkPlan(
+        planner.addUnaryPrefix(
+            TokenType.MINUS, planner.passThrough(findNode.simple('x!'))),
+        'f(x) => (-x)!;');
+  }
+
+  Future<void> test_addUnaryPrefix_outer_precedence_no_parens() async {
+    await analyze('f(x) => -x;');
+    // TODO(paulberry): if we added a `-` instead of a `~`, the result would
+    // scan as a single `--` token, so we would need parens.  Add support for
+    // this corner case.
+    checkPlan(
+        planner.addUnaryPrefix(
+            TokenType.TILDE, planner.passThrough(findNode.simple('x;'))),
+        'f(x) => -~x;');
+  }
+
   Future<void> test_cascadeSearchLimit() async {
     // Ok, we have to ask each parent if it represents a cascade section.
     // If we create a passThrough at node N, then when we create an enclosing
@@ -186,6 +361,14 @@
         'var x = 0; var y = 0;');
   }
 
+  Future<void> test_makeNullable() async {
+    await analyze('int x = 0;');
+    checkPlan(
+        planner
+            .makeNullable(planner.passThrough(findNode.typeAnnotation('int'))),
+        'int? x = 0;');
+  }
+
   Future<void> test_passThrough_remove_statement() async {
     await analyze('''
 void f() {
@@ -229,16 +412,16 @@
   Future<void> test_remove_class_member() async {
     await analyze('''
 class C {
-  int x;
-  int y;
-  int z;
+  int? x;
+  int? y;
+  int? z;
 }
 ''');
     var declaration = findNode.fieldDeclaration('y');
     var changes = checkPlan(planner.removeNode(declaration), '''
 class C {
-  int x;
-  int z;
+  int? x;
+  int? z;
 }
 ''');
     expect(changes.keys, [declaration.offset - 2]);
@@ -297,13 +480,13 @@
   Future<void> test_remove_field_declaration() async {
     await analyze('''
 class C {
-  int x, y, z;
+  int? x, y, z;
 }
 ''');
     var declaration = findNode.simple('y').parent;
     var changes = checkPlan(planner.removeNode(declaration), '''
 class C {
-  int x, z;
+  int? x, z;
 }
 ''');
     expect(changes.keys, [declaration.offset]);
@@ -740,12 +923,12 @@
   Future<void> test_remove_type_argument() async {
     await analyze('''
 class C<T, U, V> {}
-C<int, double, String> c;
+C<int, double, String>? c;
 ''');
     var typeArgument = findNode.simple('double').parent;
     var changes = checkPlan(planner.removeNode(typeArgument), '''
 class C<T, U, V> {}
-C<int, String> c;
+C<int, String>? c;
 ''');
     expect(changes.keys, [typeArgument.offset]);
   }
@@ -758,9 +941,9 @@
   }
 
   Future<void> test_remove_variable_declaration() async {
-    await analyze('int x, y, z;');
+    await analyze('int? x, y, z;');
     var declaration = findNode.simple('y').parent;
-    var changes = checkPlan(planner.removeNode(declaration), 'int x, z;');
+    var changes = checkPlan(planner.removeNode(declaration), 'int? x, z;');
     expect(changes.keys, [declaration.offset]);
   }
 
diff --git a/pkg/nnbd_migration/test/fix_aggregator_test.dart b/pkg/nnbd_migration/test/fix_aggregator_test.dart
index 44a5dfd..4beab66 100644
--- a/pkg/nnbd_migration/test/fix_aggregator_test.dart
+++ b/pkg/nnbd_migration/test/fix_aggregator_test.dart
@@ -23,8 +23,8 @@
 class FixAggregatorTest extends FixAggregatorTestBase {
   Future<void> test_addRequired() async {
     await analyze('f({int x}) => 0;');
-    var previewInfo =
-        run({findNode.defaultParameter('int x'): const AddRequiredKeyword()});
+    var previewInfo = run(
+        {findNode.defaultParameter('int x'): const AddRequiredKeyword(null)});
     expect(previewInfo.applyTo(code), 'f({required int x}) => 0;');
   }
 
@@ -33,9 +33,9 @@
     var aRef = findNode.simple('a +');
     var bRef = findNode.simple('b;');
     var previewInfo = run({
-      aRef: const NullCheck(),
-      bRef: const NullCheck(),
-      findNode.binary('a + b'): const NullCheck()
+      aRef: const NullCheck(null),
+      bRef: const NullCheck(null),
+      findNode.binary('a + b'): const NullCheck(null)
     });
     expect(previewInfo.applyTo(code), 'f(a, b) => (a! + b!)!;');
   }
@@ -48,7 +48,7 @@
 ''');
     var previewInfo = run({
       findNode.statement('if'): EliminateDeadIf(true),
-      findNode.simple('j.isEven'): const NullCheck()
+      findNode.simple('j.isEven'): const NullCheck(null)
     });
     expect(previewInfo.applyTo(code), '''
 f(int i, int/*?*/ j) {
@@ -67,7 +67,7 @@
 ''');
     var previewInfo = run({
       findNode.statement('if'): EliminateDeadIf(true),
-      findNode.simple('j.isEven'): const NullCheck()
+      findNode.simple('j.isEven'): const NullCheck(null)
     });
     expect(previewInfo.applyTo(code), '''
 f(int i, int/*?*/ j) {
@@ -291,7 +291,7 @@
     // leave them.
     await analyze('f(a, c) => a..b = (throw c..d);');
     var cd = findNode.cascade('c..d');
-    var previewInfo = run({cd: const IntroduceAs('int')});
+    var previewInfo = run({cd: const IntroduceAs('int', null)});
     expect(
         previewInfo.applyTo(code), 'f(a, c) => a..b = (throw (c..d) as int);');
   }
@@ -299,14 +299,14 @@
   Future<void> test_introduceAs_no_parens() async {
     await analyze('f(a, b) => a | b;');
     var expr = findNode.binary('a | b');
-    var previewInfo = run({expr: const IntroduceAs('int')});
+    var previewInfo = run({expr: const IntroduceAs('int', null)});
     expect(previewInfo.applyTo(code), 'f(a, b) => a | b as int;');
   }
 
   Future<void> test_introduceAs_parens() async {
     await analyze('f(a, b) => a < b;');
     var expr = findNode.binary('a < b');
-    var previewInfo = run({expr: const IntroduceAs('bool')});
+    var previewInfo = run({expr: const IntroduceAs('bool', null)});
     expect(previewInfo.applyTo(code), 'f(a, b) => (a < b) as bool;');
   }
 
@@ -327,14 +327,14 @@
   Future<void> test_nullCheck_no_parens() async {
     await analyze('f(a) => a++;');
     var expr = findNode.postfix('a++');
-    var previewInfo = run({expr: const NullCheck()});
+    var previewInfo = run({expr: const NullCheck(null)});
     expect(previewInfo.applyTo(code), 'f(a) => a++!;');
   }
 
   Future<void> test_nullCheck_parens() async {
     await analyze('f(a) => -a;');
     var expr = findNode.prefix('-a');
-    var previewInfo = run({expr: const NullCheck()});
+    var previewInfo = run({expr: const NullCheck(null)});
     expect(previewInfo.applyTo(code), 'f(a) => (-a)!;');
   }
 
@@ -455,7 +455,7 @@
 ''');
     var annotation = findNode.annotation('required');
     var previewInfo =
-        run({annotation: const RequiredAnnotationToRequiredKeyword()});
+        run({annotation: const RequiredAnnotationToRequiredKeyword(null)});
     expect(previewInfo.applyTo(code), '''
 import 'package:meta/meta.dart' as meta;
 f({required int x}) {}
@@ -472,7 +472,7 @@
 ''');
     var annotation = findNode.annotation('@foo');
     var previewInfo =
-        run({annotation: const RequiredAnnotationToRequiredKeyword()});
+        run({annotation: const RequiredAnnotationToRequiredKeyword(null)});
     expect(previewInfo.applyTo(code), '''
 import 'package:meta/meta.dart';
 const foo = required;
@@ -488,7 +488,7 @@
 ''');
     var annotation = findNode.annotation('required');
     var previewInfo =
-        run({annotation: const RequiredAnnotationToRequiredKeyword()});
+        run({annotation: const RequiredAnnotationToRequiredKeyword(null)});
     expect(previewInfo.applyTo(code), '''
 import 'package:meta/meta.dart';
 f({required int x}) {}
diff --git a/pkg/nnbd_migration/test/fix_builder_test.dart b/pkg/nnbd_migration/test/fix_builder_test.dart
index 8cd817d..370d4ce 100644
--- a/pkg/nnbd_migration/test/fix_builder_test.dart
+++ b/pkg/nnbd_migration/test/fix_builder_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
 import 'package:nnbd_migration/src/fix_aggregator.dart';
 import 'package:nnbd_migration/src/fix_builder.dart';
@@ -43,6 +44,8 @@
 
   static const isMakeNullable = TypeMatcher<MakeNullable>();
 
+  static const isRemoveAs = TypeMatcher<RemoveAs>();
+
   static const isRequiredAnnotationToRequiredKeyword =
       TypeMatcher<RequiredAnnotationToRequiredKeyword>();
 
@@ -74,6 +77,41 @@
           if (_isInScope(entry.key, scope)) entry.key: entry.value
       };
 
+  Future<void> test_asExpression_keep() async {
+    await analyze('''
+_f(Object x) {
+  print((x as int) + 1);
+}
+''');
+    var asExpression = findNode.simple('x as').parent as Expression;
+    visitSubexpression(asExpression, 'int');
+  }
+
+  Future<void> test_asExpression_keep_previously_unnecessary() async {
+    verifyNoTestUnitErrors = false;
+    await analyze('''
+f(int i) {
+  print((i as int) + 1);
+}
+''');
+    expect(
+        testAnalysisResult.errors.single.errorCode, HintCode.UNNECESSARY_CAST);
+    var asExpression = findNode.simple('i as').parent as Expression;
+    visitSubexpression(asExpression, 'int');
+  }
+
+  Future<void> test_asExpression_remove() async {
+    await analyze('''
+_f(Object x) {
+  if (x is! int) return;
+  print((x as int) + 1);
+}
+''');
+    var asExpression = findNode.simple('x as').parent as Expression;
+    visitSubexpression(asExpression, 'int',
+        changes: {asExpression: isRemoveAs});
+  }
+
   Future<void>
       test_assignmentExpression_compound_combined_nullable_noProblem() async {
     await analyze('''
diff --git a/pkg/nnbd_migration/test/instrumentation_test.dart b/pkg/nnbd_migration/test/instrumentation_test.dart
index aa5e98a..473b669 100644
--- a/pkg/nnbd_migration/test/instrumentation_test.dart
+++ b/pkg/nnbd_migration/test/instrumentation_test.dart
@@ -212,6 +212,167 @@
     expect(origin.node, null);
   }
 
+  Future<void> test_fix_reason_add_required_function() async {
+    await analyze('_f({int/*!*/ i) {}');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description,
+            NullabilityFixDescription.addRequired(null, '_f', 'i'));
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
+  Future<void> test_fix_reason_add_required_method() async {
+    await analyze('class C { _f({int/*!*/ i) {} }');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description,
+            NullabilityFixDescription.addRequired('C', '_f', 'i'));
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
+  Future<void> test_fix_reason_discard_condition() async {
+    await analyze('''
+_f(int/*!*/ i) {
+  if (i != null) {
+    return i;
+  }
+}
+''');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description, NullabilityFixDescription.discardCondition);
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
+  Future<void> test_fix_reason_discard_condition_no_block() async {
+    await analyze('''
+_f(int/*!*/ i) {
+  if (i != null) return i;
+}
+''');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description, NullabilityFixDescription.discardCondition);
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
+  Future<void> test_fix_reason_discard_else() async {
+    await analyze('''
+_f(int/*!*/ i) {
+  if (i != null) {
+    return i;
+  } else {
+    return 'null';
+  }
+}
+''');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description, NullabilityFixDescription.discardElse);
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
+  Future<void> test_fix_reason_discard_else_empty_then() async {
+    await analyze('''
+_f(int/*!*/ i) {
+  if (i != null) {} else {
+    return 'null';
+  }
+}
+''');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description, NullabilityFixDescription.discardElse);
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
+  Future<void> test_fix_reason_discard_then() async {
+    await analyze('''
+_f(int/*!*/ i) {
+  if (i == null) {
+    return 'null';
+  } else {
+    return i;
+  }
+}
+''');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description, NullabilityFixDescription.discardThen);
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
+  @FailingTest(reason: 'Produces no changes')
+  Future<void> test_fix_reason_discard_then_no_else() async {
+    await analyze('''
+_f(int/*!*/ i) {
+  if (i == null) {
+    return 'null';
+  }
+}
+''');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description, NullabilityFixDescription.discardThen);
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
   Future<void> test_fix_reason_edge() async {
     await analyze('''
 void f(int x) {
@@ -227,7 +388,7 @@
 }
 ''');
     var yUsage = findNode.simple('y);');
-    var edit = changes[yUsage.end].single as AtomicEditWithInfo;
+    var edit = changes[yUsage.end].single;
     expect(edit.isInsertion, true);
     expect(edit.replacement, '!');
     var info = edit.info;
@@ -251,7 +412,7 @@
     var entries = changes.entries.toList();
     expect(entries, hasLength(1));
     expect(entries.single.key, intAnnotation.end);
-    var edit = entries.single.value.single as AtomicEditWithInfo;
+    var edit = entries.single.value.single;
     expect(edit.isInsertion, true);
     expect(edit.replacement, '?');
     var info = edit.info;
@@ -261,6 +422,56 @@
     expect(reasons.single, same(explicitTypeNullability[intAnnotation]));
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/38472')
+  Future<void> test_fix_reason_remove_unnecessary_cast() async {
+    await analyze('''
+_f(Object x) {
+  if (x is! int) return;
+  print((x as int) + 1);
+}
+''');
+    var xRef = findNode.simple('x as');
+    var asExpression = xRef.parent as Expression;
+    expect(changes, hasLength(3));
+    // Change #1: drop the `(` before the cast
+    var dropLeadingParen = changes[asExpression.offset - 1].single;
+    expect(dropLeadingParen.isDeletion, true);
+    expect(dropLeadingParen.length, 1);
+    expect(dropLeadingParen.info, null);
+    // Change #2: drop the text ` as int`
+    var dropAsInt = changes[xRef.end].single;
+    expect(dropAsInt.isDeletion, true);
+    expect(dropAsInt.length, 7);
+    expect(dropAsInt.info.description, NullabilityFixDescription.removeAs);
+    expect(dropAsInt.info.fixReasons, isEmpty);
+    // Change #3: drop the `)` after the cast
+    var dropTrailingParen = changes[asExpression.end].single;
+    expect(dropTrailingParen.isDeletion, true);
+    expect(dropTrailingParen.length, 1);
+    expect(dropTrailingParen.info, null);
+  }
+
+  @FailingTest(reason: 'Produces no changes')
+  Future<void> test_fix_reason_rewrite_required() async {
+    addMetaPackage();
+    await analyze('''
+import 'package:meta/meta.dart';
+_f({@required int i}) {}
+''');
+    var intAnnotation = findNode.typeAnnotation('int');
+    expect(changes, isNotEmpty);
+    for (var change in changes.values) {
+      expect(change, isNotEmpty);
+      for (var edit in change) {
+        var info = edit.info;
+        expect(info.description,
+            NullabilityFixDescription.addRequired(null, '_f', 'i'));
+        expect(info.fixReasons.single,
+            same(explicitTypeNullability[intAnnotation]));
+      }
+    }
+  }
+
   Future<void> test_graphEdge() async {
     await analyze('''
 int f(int x) => x;
@@ -1026,7 +1237,18 @@
   @override
   bool get useFixBuilder => true;
 
+  /// Test fails under the pre-FixBuilder implementation; passes now.
   @override
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/38472')
-  Future<void> test_fix_reason_edge() => super.test_fix_reason_edge();
+  Future<void> test_fix_reason_discard_then_no_else() =>
+      super.test_fix_reason_discard_then_no_else();
+
+  /// Test fails under the pre-FixBuilder implementation; passes now.
+  @override
+  Future<void> test_fix_reason_remove_unnecessary_cast() =>
+      super.test_fix_reason_remove_unnecessary_cast();
+
+  /// Test fails under the pre-FixBuilder implementation; passes now.
+  @override
+  Future<void> test_fix_reason_rewrite_required() =>
+      super.test_fix_reason_rewrite_required();
 }
diff --git a/pkg/nnbd_migration/test/test.dart b/pkg/nnbd_migration/test/test.dart
new file mode 100644
index 0000000..e3c67ce
--- /dev/null
+++ b/pkg/nnbd_migration/test/test.dart
@@ -0,0 +1,20 @@
+class B<T extends Object> {
+  B([C<T> t]);
+}
+
+abstract class C<T extends Object> {
+  void f(T t);
+}
+
+class E {
+  final C<Object> _base;
+  E([C base]) : _base = base;
+  f(Object t) {
+    _base.f(t);
+  }
+}
+
+void main() {
+  E e = E();
+  e.f(null);
+}
diff --git a/pkg/nnbd_migration/test/test_all.dart b/pkg/nnbd_migration/test/test_all.dart
index 0267b31..6b604595 100644
--- a/pkg/nnbd_migration/test/test_all.dart
+++ b/pkg/nnbd_migration/test/test_all.dart
@@ -23,6 +23,7 @@
     as nullability_migration_impl_test;
 import 'nullability_node_test.dart' as nullability_node_test;
 import 'utilities/test_all.dart' as utilities;
+import 'variables_test.dart' as variables;
 
 main() {
   defineReflectiveSuite(() {
@@ -41,5 +42,6 @@
     nullability_migration_impl_test.main();
     nullability_node_test.main();
     utilities.main();
+    variables.main();
   });
 }
diff --git a/pkg/nnbd_migration/test/variables_test.dart b/pkg/nnbd_migration/test/variables_test.dart
new file mode 100644
index 0000000..fd1e510
--- /dev/null
+++ b/pkg/nnbd_migration/test/variables_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:nnbd_migration/src/variables.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(_UniqueIdentifierForSpanTest);
+  });
+}
+
+@reflectiveTest
+class _UniqueIdentifierForSpanTest {
+  void test_inverse() {
+    const maxEnd = 1000;
+    for (int offset = 0; offset <= maxEnd; offset++) {
+      for (int end = offset; end <= maxEnd; end++) {
+        var uniqueId = Variables.uniqueIdentifierForSpan(offset, end);
+        var decoded = Variables.spanForUniqueIdentifier(uniqueId);
+        expect(decoded.offset, offset);
+        expect(decoded.end, end);
+      }
+    }
+  }
+
+  void test_uniqueness() {
+    const maxEnd = 1000;
+    const maxExpectedId = maxEnd * maxEnd;
+    var idsSeen = <int, String>{};
+    for (int offset = 0; offset <= maxEnd; offset++) {
+      for (int end = offset; end <= maxEnd; end++) {
+        var pairDescription = '($offset, $end)';
+        var uniqueId = Variables.uniqueIdentifierForSpan(offset, end);
+        expect(uniqueId, lessThanOrEqualTo(maxExpectedId));
+        var previousUseOfThisId = idsSeen[uniqueId];
+        expect(previousUseOfThisId, isNull,
+            reason:
+                '$pairDescription maps to $uniqueId, which was previously used '
+                'by $previousUseOfThisId');
+        idsSeen[uniqueId] = pairDescription;
+      }
+    }
+  }
+}
diff --git a/pkg/test_runner/lib/src/browser.dart b/pkg/test_runner/lib/src/browser.dart
index 0f6a1f3..1ba0fe4 100644
--- a/pkg/test_runner/lib/src/browser.dart
+++ b/pkg/test_runner/lib/src/browser.dart
@@ -183,6 +183,8 @@
   baseUrl: "/root_dart/$testJSDir",
   paths: {
     "dart_sdk": "/root_build/gen/utils/dartdevc/$sdkPath",
+    "browser-source-map-support":
+      "/root_dart/third_party/node-source-map-support/browser-source-map-support",
 $packagePaths
   },
   waitSeconds: 30,
@@ -192,8 +194,9 @@
 <script type="text/javascript"
         src="/root_dart/third_party/requirejs/require.js"></script>
 <script type="text/javascript">
-requirejs(["$testName", "dart_sdk", "async_helper"],
-    function($testId, sdk, async_helper) {
+requirejs(["$testName", "dart_sdk", "browser-source-map-support", "async_helper"],
+    function($testId, sdk, sm, async_helper) {
+  sm.install();
   sdk._isolate_helper.startRootIsolate(function() {}, []);
   sdk._debugger.registerDevtoolsFormatter();
 
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index 4d63d5b..a73d480 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -534,7 +534,6 @@
     args.addAll([
       "--ignore-unrecognized-flags",
       "--no-summarize",
-      "--no-source-map",
       "-o",
       outputFile,
       inputFile,
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 487bae6..5dd9fe5 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -289,6 +289,189 @@
   bool visitFunctionDeclaration(FunctionDeclaration node) => true;
 }
 
+/// Collects sets of captured variables, as well as variables
+/// modified in loops and try blocks.
+class _VariablesInfoCollector extends RecursiveVisitor<Null> {
+  /// Maps declared variables to their declaration index.
+  final Map<VariableDeclaration, int> varIndex = <VariableDeclaration, int>{};
+
+  /// Variable declarations.
+  final List<VariableDeclaration> varDeclarations = <VariableDeclaration>[];
+
+  /// Set of captured variables.
+  Set<VariableDeclaration> captured;
+
+  /// Set of variables which were modified for each loop, switch statement
+  /// and try block statement. Doesn't include captured variables and
+  /// variables declared inside the statement's body.
+  final Map<ast.Statement, Set<int>> modifiedSets = <ast.Statement, Set<int>>{};
+
+  /// Number of variables at function entry.
+  int numVariablesAtFunctionEntry = 0;
+
+  /// Active loops, switch statements and try blocks.
+  List<ast.Statement> activeStatements;
+
+  /// Number of variables at entry of active statements.
+  List<int> numVariablesAtActiveStatements;
+
+  _VariablesInfoCollector(Member member) {
+    member.accept(this);
+  }
+
+  int get numVariables => varDeclarations.length;
+
+  bool isCaptured(VariableDeclaration variable) =>
+      captured != null && captured.contains(variable);
+
+  Set<int> getModifiedVariables(ast.Statement st) {
+    return modifiedSets[st] ?? const <int>{};
+  }
+
+  void _visitFunction(LocalFunction node) {
+    final savedActiveStatements = activeStatements;
+    activeStatements = null;
+    final savedNumVariablesAtActiveStatements = numVariablesAtActiveStatements;
+    numVariablesAtActiveStatements = null;
+    final savedNumVariablesAtFunctionEntry = numVariablesAtFunctionEntry;
+    numVariablesAtFunctionEntry = numVariables;
+
+    node.function.accept(this);
+
+    activeStatements = savedActiveStatements;
+    numVariablesAtActiveStatements = savedNumVariablesAtActiveStatements;
+    numVariablesAtFunctionEntry = savedNumVariablesAtFunctionEntry;
+  }
+
+  bool _isDeclaredBefore(int variableIndex, int entryDeclarationCounter) =>
+      variableIndex < entryDeclarationCounter;
+
+  void _useVariable(VariableDeclaration variable, bool isVarAssignment) {
+    final index = varIndex[variable];
+    if (_isDeclaredBefore(index, numVariablesAtFunctionEntry)) {
+      (captured ??= <VariableDeclaration>{}).add(variable);
+      return;
+    }
+    if (isVarAssignment && activeStatements != null) {
+      for (int i = activeStatements.length - 1; i >= 0; --i) {
+        if (_isDeclaredBefore(index, numVariablesAtActiveStatements[i])) {
+          final st = activeStatements[i];
+          (modifiedSets[st] ??= <int>{}).add(index);
+        } else {
+          break;
+        }
+      }
+    }
+  }
+
+  void _startCollectingModifiedVariables(ast.Statement node) {
+    (activeStatements ??= <ast.Statement>[]).add(node);
+    (numVariablesAtActiveStatements ??= <int>[]).add(numVariables);
+  }
+
+  void _endCollectingModifiedVariables() {
+    activeStatements.removeLast();
+    numVariablesAtActiveStatements.removeLast();
+  }
+
+  @override
+  visitConstructor(Constructor node) {
+    // Need to visit parameters before initializers.
+    visitList(node.function.positionalParameters, this);
+    visitList(node.function.namedParameters, this);
+    visitList(node.initializers, this);
+    node.function.body?.accept(this);
+  }
+
+  @override
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    node.variable.accept(this);
+    _visitFunction(node);
+  }
+
+  @override
+  visitFunctionExpression(FunctionExpression node) {
+    _visitFunction(node);
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    final int index = numVariables;
+    varDeclarations.add(node);
+    varIndex[node] = index;
+    node.visitChildren(this);
+  }
+
+  @override
+  visitVariableGet(VariableGet node) {
+    node.visitChildren(this);
+    _useVariable(node.variable, false);
+  }
+
+  @override
+  visitVariableSet(VariableSet node) {
+    node.visitChildren(this);
+    _useVariable(node.variable, true);
+  }
+
+  @override
+  visitTryCatch(TryCatch node) {
+    _startCollectingModifiedVariables(node);
+    node.body?.accept(this);
+    _endCollectingModifiedVariables();
+    visitList(node.catches, this);
+  }
+
+  @override
+  visitTryFinally(TryFinally node) {
+    _startCollectingModifiedVariables(node);
+    node.body?.accept(this);
+    _endCollectingModifiedVariables();
+    node.finalizer?.accept(this);
+  }
+
+  @override
+  visitWhileStatement(WhileStatement node) {
+    _startCollectingModifiedVariables(node);
+    node.visitChildren(this);
+    _endCollectingModifiedVariables();
+  }
+
+  @override
+  visitDoStatement(DoStatement node) {
+    _startCollectingModifiedVariables(node);
+    node.visitChildren(this);
+    _endCollectingModifiedVariables();
+  }
+
+  @override
+  visitForStatement(ForStatement node) {
+    visitList(node.variables, this);
+    _startCollectingModifiedVariables(node);
+    node.condition?.accept(this);
+    node.body?.accept(this);
+    visitList(node.updates, this);
+    _endCollectingModifiedVariables();
+  }
+
+  @override
+  visitForInStatement(ForInStatement node) {
+    node.iterable.accept(this);
+    _startCollectingModifiedVariables(node);
+    node.variable.accept(this);
+    node.body.accept(this);
+    _endCollectingModifiedVariables();
+  }
+
+  @override
+  visitSwitchStatement(SwitchStatement node) {
+    node.expression.accept(this);
+    _startCollectingModifiedVariables(node);
+    visitList(node.cases, this);
+    _endCollectingModifiedVariables();
+  }
+}
+
 enum FieldSummaryType { kFieldGuard, kInitializer }
 
 /// Create a type flow summary for a member from the kernel AST.
@@ -307,8 +490,40 @@
   final _FallthroughDetector _fallthroughDetector = new _FallthroughDetector();
 
   Summary _summary;
-  Map<VariableDeclaration, Join> _variables;
+  _VariablesInfoCollector _variablesInfo;
+
+  // Current value of each variable. May contain null if variable is not
+  // declared yet, or EmptyType if current location is unreachable
+  // (e.g. after return or throw).
+  List<TypeExpr> _variableValues;
+
+  // Contains Joins which accumulate all values of certain variables.
+  // Used only when all variable values should be merged regardless of control
+  // flow. Such accumulating joins are used for
+  // 1. captured variables, as closures may potentially see any value;
+  // 2. variables modified inside try blocks (while in the try block), as
+  // catch can potentially see any value assigned to a variable inside try
+  // block.
+  // If _variableCells[i] != null, then all values are accumulated in the
+  // _variableCells[i]. _variableValues[i] does not change and remains equal
+  // to _variableCells[i].
+  List<Join> _variableCells;
+
+  // Counts number of Joins inserted for each variable. Only used to set
+  // readable names for such joins (foo_0, foo_1 etc.)
+  List<int> _variableVersions;
+
+  // State of variables after corresponding LabeledStatement.
+  // Used to collect states from BreakStatements.
+  Map<LabeledStatement, List<TypeExpr>> _variableValuesAfterLabeledStatements;
+
+  // Joins corresponding to variables on entry to switch cases.
+  // Used to propagate state from ContinueSwitchStatement to a target case.
+  Map<SwitchCase, List<Join>> _joinsAtSwitchCases;
+
+  // Join which accumulates all return values.
   Join _returnValue;
+
   Parameter _receiver;
   ConstantAllocationCollector constantAllocationCollector;
   RuntimeTypeTranslatorImpl _translator;
@@ -335,7 +550,12 @@
     assertx(!member.isAbstract);
 
     _staticTypeContext = new StaticTypeContext(member, _environment);
-    _variables = <VariableDeclaration, Join>{};
+    _variablesInfo = new _VariablesInfoCollector(member);
+    _variableValues = new List<TypeExpr>(_variablesInfo.numVariables);
+    _variableCells = new List<Join>(_variablesInfo.numVariables);
+    _variableVersions = new List<int>.filled(_variablesInfo.numVariables, 0);
+    _variableValuesAfterLabeledStatements = null;
+    _joinsAtSwitchCases = null;
     _returnValue = null;
     _receiver = null;
 
@@ -422,7 +642,7 @@
             _useTypeCheckForParameter(decl)
                 ? null
                 : useTypesFrom.positionalParameters[i].type,
-            function.positionalParameters[i].initializer);
+            decl.initializer);
       }
       for (int i = 0; i < function.namedParameters.length; ++i) {
         final decl = function.namedParameters[i];
@@ -431,7 +651,7 @@
             _useTypeCheckForParameter(decl)
                 ? null
                 : useTypesFrom.namedParameters[i].type,
-            function.namedParameters[i].initializer);
+            decl.initializer);
       }
 
       int count = firstParamIndex;
@@ -442,8 +662,7 @@
         if (_useTypeCheckForParameter(decl)) {
           param = _typeCheck(param, type, decl);
         }
-        final Join v = _declareVariable(decl, type: type);
-        v.values.add(param);
+        _declareVariable(decl, param);
       }
       for (int i = 0; i < function.namedParameters.length; ++i) {
         final decl = function.namedParameters[i];
@@ -452,8 +671,7 @@
         if (_useTypeCheckForParameter(decl)) {
           param = _typeCheck(param, type, decl);
         }
-        final Join v = _declareVariable(decl, type: type);
-        v.values.add(param);
+        _declareVariable(decl, param);
       }
       assertx(count == _summary.parameterCount);
 
@@ -635,23 +853,115 @@
     return param;
   }
 
-  Join _declareVariable(VariableDeclaration decl,
-      {bool addInitType: false, DartType type}) {
-    type ??= decl.type;
-    Join join = new Join(decl.name, type);
-    _summary.add(join);
-    _variables[decl] = join;
+  void _declareVariable(VariableDeclaration decl, TypeExpr initialValue) {
+    final int varIndex = _variablesInfo.varIndex[decl];
+    assertx(varIndex != null);
+    assertx(_variablesInfo.varDeclarations[varIndex] == decl);
+    assertx(_variableValues[varIndex] == null);
+    if (_variablesInfo.isCaptured(decl)) {
+      final join = _makeJoin(varIndex, initialValue);
+      _variableCells[varIndex] = join;
+      _variableValues[varIndex] = join;
+    } else {
+      _variableValues[varIndex] = initialValue;
+    }
+  }
 
-    if (decl.initializer != null) {
-      TypeExpr initType = _visit(decl.initializer);
-      if (addInitType) {
-        join.values.add(initType);
+  void _writeVariable(VariableDeclaration variable, TypeExpr value) {
+    final int varIndex = _variablesInfo.varIndex[variable];
+    final Join join = _variableCells[varIndex];
+    if (join != null) {
+      join.values.add(value);
+    } else {
+      _variableValues[varIndex] = value;
+    }
+  }
+
+  List<TypeExpr> _cloneVariableValues(List<TypeExpr> values) =>
+      new List<TypeExpr>.from(values);
+
+  List<TypeExpr> _makeEmptyVariableValues() {
+    final values = new List<TypeExpr>(_variablesInfo.numVariables);
+    for (int i = 0; i < values.length; ++i) {
+      if (_variableCells[i] != null) {
+        values[i] = _variableValues[i];
+      } else if (_variableValues[i] != null) {
+        values[i] = const EmptyType();
       }
     }
+    return values;
+  }
 
+  Join _makeJoin(int varIndex, TypeExpr value) {
+    final VariableDeclaration variable =
+        _variablesInfo.varDeclarations[varIndex];
+    final name = '${variable.name}_${_variableVersions[varIndex]++}';
+    final Join join = new Join(name, variable.type);
+    _summary.add(join);
+    join.values.add(value);
     return join;
   }
 
+  void _mergeVariableValues(List<TypeExpr> dst, List<TypeExpr> src) {
+    assertx(dst.length == src.length);
+    for (int i = 0; i < dst.length; ++i) {
+      if (!identical(dst[i], src[i])) {
+        if (dst[i] == null || src[i] == null) {
+          dst[i] = null;
+        } else if (dst[i] is EmptyType) {
+          dst[i] = src[i];
+        } else if (src[i] is! EmptyType) {
+          final Join join = _makeJoin(i, dst[i]);
+          join.values.add(src[i]);
+          dst[i] = join;
+        }
+      }
+    }
+  }
+
+  List<Join> _insertJoinsForModifiedVariables(TreeNode node, bool isTry) {
+    final List<Join> joins = new List<Join>(_variablesInfo.numVariables);
+    for (var i in _variablesInfo.getModifiedVariables(node)) {
+      if (_variableCells[i] != null) {
+        assertx(_variableCells[i] == _variableValues[i]);
+      } else {
+        final join = _makeJoin(i, _variableValues[i]);
+        joins[i] = join;
+        _variableValues[i] = join;
+        if (isTry) {
+          // Inside try blocks all values of modified variables are merged,
+          // as catch can potentially see any value (in case exception
+          // is thrown after each assignment).
+          _variableCells[i] = join;
+        }
+      }
+    }
+    return joins;
+  }
+
+  /// Stops accumulating values in [joins] by removing them from
+  /// _variableCells.
+  void _restoreVariableCellsAfterTry(List<Join> joins) {
+    for (int i = 0; i < joins.length; ++i) {
+      if (joins[i] != null) {
+        assertx(_variableCells[i] == joins[i]);
+        _variableCells[i] = null;
+      }
+    }
+  }
+
+  void _mergeVariableValuesToJoins(List<TypeExpr> values, List<Join> joins) {
+    for (int i = 0; i < joins.length; ++i) {
+      final join = joins[i];
+      final value = values[i];
+      if (join != null &&
+          !identical(join, value) &&
+          !identical(join.values.first, value)) {
+        join.values.add(value);
+      }
+    }
+  }
+
   TypeCheck _typeCheck(TypeExpr value, DartType type, TreeNode node) {
     final TypeExpr runtimeType = _translator.translate(type);
     final typeCheck = new TypeCheck(
@@ -662,8 +972,10 @@
 
   // TODO(alexmarkov): Avoid declaring variables with static types.
   void _declareVariableWithStaticType(VariableDeclaration decl) {
-    Join v = _declareVariable(decl);
-    v.values.add(_typesBuilder.fromStaticType(v.staticType, true));
+    if (decl.initializer != null) {
+      _visit(decl.initializer);
+    }
+    _declareVariable(decl, _typesBuilder.fromStaticType(decl.type, true));
   }
 
   Call _makeCall(TreeNode node, Selector selector, Args<TypeExpr> args) {
@@ -798,11 +1110,10 @@
   }
 
   void _handleNestedFunctionNode(FunctionNode node) {
-    final oldReturn = _returnValue;
-    final oldVariables = _variables;
+    final savedReturn = _returnValue;
     _returnValue = null;
-    _variables = <VariableDeclaration, Join>{};
-    _variables.addAll(oldVariables);
+    final savedVariableValues = _variableValues;
+    _variableValues = _makeEmptyVariableValues();
 
     // Approximate parameters of nested functions with static types.
     // TODO(sjindel/tfa): Use TypeCheck for closure parameters.
@@ -811,8 +1122,8 @@
 
     _visit(node.body);
 
-    _returnValue = oldReturn;
-    _variables = oldVariables;
+    _variableValues = savedVariableValues;
+    _returnValue = savedReturn;
   }
 
   @override
@@ -845,11 +1156,15 @@
   @override
   TypeExpr visitConditionalExpression(ConditionalExpression node) {
     _addUse(_visit(node.condition));
-
+    final stateBefore = _cloneVariableValues(_variableValues);
     Join v = new Join(null, _staticDartType(node));
     _summary.add(v);
     v.values.add(_visit(node.then));
+    final stateAfter = _variableValues;
+    _variableValues = stateBefore;
     v.values.add(_visit(node.otherwise));
+    _mergeVariableValues(stateAfter, _variableValues);
+    _variableValues = stateAfter;
     return _makeNarrow(v, _staticType(node));
   }
 
@@ -939,7 +1254,7 @@
 
   @override
   TypeExpr visitLet(Let node) {
-    _declareVariable(node.variable, addInitType: true);
+    _declareVariable(node.variable, _visit(node.variable.initializer));
     return _visit(node.body);
   }
 
@@ -965,7 +1280,9 @@
   @override
   TypeExpr visitLogicalExpression(LogicalExpression node) {
     _addUse(_visit(node.left));
+    final stateAfterShortCircuit = _cloneVariableValues(_variableValues);
     _addUse(_visit(node.right));
+    _mergeVariableValues(_variableValues, stateAfterShortCircuit);
     return _boolType;
   }
 
@@ -1172,6 +1489,7 @@
 
   @override
   TypeExpr visitRethrow(Rethrow node) {
+    _variableValues = _makeEmptyVariableValues();
     return const EmptyType();
   }
 
@@ -1228,6 +1546,7 @@
   @override
   TypeExpr visitThrow(Throw node) {
     _visit(node.expression);
+    _variableValues = _makeEmptyVariableValues();
     return const EmptyType();
   }
 
@@ -1238,9 +1557,9 @@
 
   @override
   TypeExpr visitVariableGet(VariableGet node) {
-    final v = _variables[node.variable];
+    final v = _variableValues[_variablesInfo.varIndex[node.variable]];
     if (v == null) {
-      throw 'Unable to find variable ${node.variable}';
+      throw 'Unable to find variable ${node.variable} at ${node.location}';
     }
 
     if ((node.promotedType != null) &&
@@ -1254,11 +1573,8 @@
 
   @override
   TypeExpr visitVariableSet(VariableSet node) {
-    final Join v = _variables[node.variable];
-    assertx(v != null, details: node);
-
     final TypeExpr value = _visit(node.value);
-    v.values.add(value);
+    _writeVariable(node.variable, value);
     return value;
   }
 
@@ -1298,15 +1614,33 @@
   }
 
   @override
-  TypeExpr visitBreakStatement(BreakStatement node) => null;
+  TypeExpr visitBreakStatement(BreakStatement node) {
+    _variableValuesAfterLabeledStatements ??=
+        <LabeledStatement, List<TypeExpr>>{};
+    final state = _variableValuesAfterLabeledStatements[node.target];
+    if (state != null) {
+      _mergeVariableValues(state, _variableValues);
+    } else {
+      _variableValuesAfterLabeledStatements[node.target] = _variableValues;
+    }
+    _variableValues = _makeEmptyVariableValues();
+    return null;
+  }
 
   @override
-  TypeExpr visitContinueSwitchStatement(ContinueSwitchStatement node) => null;
+  TypeExpr visitContinueSwitchStatement(ContinueSwitchStatement node) {
+    _mergeVariableValuesToJoins(
+        _variableValues, _joinsAtSwitchCases[node.target]);
+    _variableValues = _makeEmptyVariableValues();
+    return null;
+  }
 
   @override
   TypeExpr visitDoStatement(DoStatement node) {
+    final List<Join> joins = _insertJoinsForModifiedVariables(node, false);
     _visit(node.body);
     _visit(node.condition);
+    _mergeVariableValuesToJoins(_variableValues, joins);
     return null;
   }
 
@@ -1324,27 +1658,34 @@
     _visit(node.iterable);
     // TODO(alexmarkov): try to infer more precise type from 'iterable'
     _declareVariableWithStaticType(node.variable);
+
+    final List<Join> joins = _insertJoinsForModifiedVariables(node, false);
+    final stateAfterLoop = _cloneVariableValues(_variableValues);
     _visit(node.body);
+    _mergeVariableValuesToJoins(_variableValues, joins);
+    _variableValues = stateAfterLoop;
     return null;
   }
 
   @override
   TypeExpr visitForStatement(ForStatement node) {
     node.variables.forEach(visitVariableDeclaration);
+    final List<Join> joins = _insertJoinsForModifiedVariables(node, false);
     if (node.condition != null) {
       _addUse(_visit(node.condition));
     }
-    node.updates.forEach(_visit);
+    final stateAfterLoop = _cloneVariableValues(_variableValues);
     _visit(node.body);
+    node.updates.forEach(_visit);
+    _mergeVariableValuesToJoins(_variableValues, joins);
+    _variableValues = stateAfterLoop;
     return null;
   }
 
   @override
   TypeExpr visitFunctionDeclaration(FunctionDeclaration node) {
-    Join v = _declareVariable(node.variable);
     // TODO(alexmarkov): support function types.
-    // v.values.add(_concreteType(node.function.functionType));
-    v.values.add(_typesBuilder.fromStaticType(v.staticType, true));
+    _declareVariableWithStaticType(node.variable);
     _handleNestedFunctionNode(node.function);
     return null;
   }
@@ -1352,16 +1693,26 @@
   @override
   TypeExpr visitIfStatement(IfStatement node) {
     _addUse(_visit(node.condition));
+
+    final stateBefore = _cloneVariableValues(_variableValues);
     _visit(node.then);
+    final stateAfter = _variableValues;
+    _variableValues = stateBefore;
     if (node.otherwise != null) {
       _visit(node.otherwise);
     }
+    _mergeVariableValues(stateAfter, _variableValues);
+    _variableValues = stateAfter;
     return null;
   }
 
   @override
   TypeExpr visitLabeledStatement(LabeledStatement node) {
     _visit(node.body);
+    final state = _variableValuesAfterLabeledStatements?.remove(node);
+    if (state != null) {
+      _mergeVariableValues(_variableValues, state);
+    }
     return null;
   }
 
@@ -1372,23 +1723,45 @@
     if (_returnValue != null) {
       _returnValue.values.add(ret);
     }
+    _variableValues = _makeEmptyVariableValues();
     return null;
   }
 
   @override
   TypeExpr visitSwitchStatement(SwitchStatement node) {
     _visit(node.expression);
+    // Insert joins at each case in case there are 'continue' statements.
+    final stateOnEntry = _variableValues;
+    final variableValuesAtCaseEntry = <SwitchCase, List<TypeExpr>>{};
+    _joinsAtSwitchCases ??= <SwitchCase, List<Join>>{};
     for (var switchCase in node.cases) {
+      _variableValues = _cloneVariableValues(stateOnEntry);
+      _joinsAtSwitchCases[switchCase] =
+          _insertJoinsForModifiedVariables(node, false);
+      variableValuesAtCaseEntry[switchCase] = _variableValues;
+    }
+    bool hasDefault = false;
+    for (var switchCase in node.cases) {
+      _variableValues = variableValuesAtCaseEntry[switchCase];
       switchCase.expressions.forEach(_visit);
       _visit(switchCase.body);
+      hasDefault = hasDefault || switchCase.isDefault;
+    }
+    if (!hasDefault) {
+      _mergeVariableValues(_variableValues, stateOnEntry);
     }
     return null;
   }
 
   @override
   TypeExpr visitTryCatch(TryCatch node) {
+    final joins = _insertJoinsForModifiedVariables(node, true);
+    final stateAfterTry = _cloneVariableValues(_variableValues);
     _visit(node.body);
+    _restoreVariableCellsAfterTry(joins);
+    List<TypeExpr> stateAfterCatch;
     for (var catchClause in node.catches) {
+      _variableValues = _cloneVariableValues(stateAfterTry);
       if (catchClause.exception != null) {
         _declareVariableWithStaticType(catchClause.exception);
       }
@@ -1396,30 +1769,44 @@
         _declareVariableWithStaticType(catchClause.stackTrace);
       }
       _visit(catchClause.body);
+      if (stateAfterCatch == null) {
+        stateAfterCatch = _variableValues;
+      } else {
+        _mergeVariableValues(stateAfterCatch, _variableValues);
+      }
     }
+    _variableValues = stateAfterTry;
+    _mergeVariableValues(_variableValues, stateAfterCatch);
     return null;
   }
 
   @override
   TypeExpr visitTryFinally(TryFinally node) {
+    final joins = _insertJoinsForModifiedVariables(node, true);
+    final stateAfterTry = _cloneVariableValues(_variableValues);
     _visit(node.body);
+    _restoreVariableCellsAfterTry(joins);
+    _variableValues = stateAfterTry;
     _visit(node.finalizer);
     return null;
   }
 
   @override
   TypeExpr visitVariableDeclaration(VariableDeclaration node) {
-    final v = _declareVariable(node, addInitType: true);
-    if (node.initializer == null) {
-      v.values.add(_nullType);
-    }
+    final TypeExpr initialValue =
+        node.initializer == null ? _nullType : _visit(node.initializer);
+    _declareVariable(node, initialValue);
     return null;
   }
 
   @override
   TypeExpr visitWhileStatement(WhileStatement node) {
+    final List<Join> joins = _insertJoinsForModifiedVariables(node, false);
     _addUse(_visit(node.condition));
+    final stateAfterLoop = _cloneVariableValues(_variableValues);
     _visit(node.body);
+    _mergeVariableValuesToJoins(_variableValues, joins);
+    _variableValues = stateAfterLoop;
     return null;
   }
 
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index 12eb6e9..b206c1d 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -9,21 +9,20 @@
 t1 = _TypeCheck (t0 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
 t2* = _Call direct [#lib::bar] ()
 t3* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi, 1))
-i = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t3)
-t5* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi, 10))
+i_0 = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t3)
+t5* = _Call [dart.core::num::<] (i_0, _T (dart.core::_Smi, 10))
 t6* = _Call direct [#lib::bar] ()
-x = _Join [dart.core::bool*] (t6, _T (dart.core::bool))
-t8* = _Call direct [#lib::foo] ()
-t9 = _Join [dynamic] (_T (dart.core::bool, true), t8)
-t10 = _Narrow (t9 to _T ANY?)
-t11 = _TypeCheck (t10 against dart.core::bool) (for (x{dart.core::bool*} ?{dynamic} true : #lib::foo()) as{TypeError} dart.core::bool*)
+t7* = _Call direct [#lib::foo] ()
+t8 = _Join [dynamic] (_T (dart.core::bool, true), t7)
+t9 = _Narrow (t8 to _T ANY?)
+t10 = _TypeCheck (t9 against dart.core::bool) (for (x{dart.core::bool*} ?{dynamic} true : #lib::foo()) as{TypeError} dart.core::bool*)
+t11* = _Call direct [#lib::bar] ()
 t12* = _Call direct [#lib::bar] ()
-t13* = _Call direct [#lib::bar] ()
-t14* = _Call direct [#lib::foo] ()
-t15 = _TypeCheck (t14 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
-t16* = _Call direct [#lib::foo] ()
-t17 = _TypeCheck (t16 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
-y = _Join [dart.core::bool*] (_T (dart.core::bool, true), t11, _T (dart.core::bool), _T (dart.core::bool))
+t13* = _Call direct [#lib::foo] ()
+t14 = _TypeCheck (t13 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
+t15* = _Call direct [#lib::foo] ()
+t16 = _TypeCheck (t15 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
+y_0 = _Join [dart.core::bool*] (_T (dart.core::bool), _T (dart.core::bool, true))
 RESULT: _T {}?
 ------------ #lib::main ------------
 
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
index 55cbdec..19e394c 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
@@ -42,8 +42,7 @@
 t10* = _Call get [#lib::A::foo1] (%aa)
 t11* = _Call get [#lib::A::foo2] (%aa)
 t12 = _Call dynamic [call] (t11, %a2, %a3, t10)
-a4 = _Join [dart.core::Object*] (%a4, _T ANY?)
-RESULT: a4
+RESULT: _T ANY?
 ------------ #lib::C::dynamicCalls ------------
 %this = _Parameter #0 [_T (#lib::C)+]
 %aa = _Parameter #1 [_T ANY?]
@@ -56,8 +55,7 @@
 t8 = _Call dynamic set [foo3] (%aa, t7)
 t9* = _Call dynamic get [foo1] (%aa)
 t10* = _Call dynamic [foo2] (%aa, %a2, %a3, t9)
-a4 = _Join [dart.core::Object*] (%a4, t10)
-RESULT: a4
+RESULT: t10
 ------------ #lib::D:: ------------
 %this = _Parameter #0 [_T (#lib::D)+]
 t1 = _Call direct [#lib::B::] (%this)
@@ -74,8 +72,7 @@
 t8* = _Call direct get [#lib::B::bar2] (%this)
 t9* = _Call direct get [#lib::B::bar1] (%this)
 t10* = _Call dynamic [call] (t8, %a2, %a3, t9)
-a4 = _Join [dart.core::Object*] (%a4, t10)
-RESULT: a4
+RESULT: t10
 ------------ #lib::main ------------
 
 RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
index d127a8a..45a84b6 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
@@ -89,11 +89,11 @@
 RESULT: t5
 ------------ #lib::main ------------
 t0 = _Call direct [#lib::C::] (_T (#lib::C<dart.core::int>))
-t1* = _Call [#lib::C::foo] (_T (#lib::C<dart.core::int>))
+t1 = _Call [#lib::C::foo] (_T (#lib::C<dart.core::int>))
 t2 = _Call direct [#lib::E::] (_T (#lib::E<dart.core::int, dart.core::String>))
-t3* = _Call [#lib::E::foo] (_T (#lib::E<dart.core::int, dart.core::String>))
+t3 = _Call [#lib::E::foo] (_T (#lib::E<dart.core::int, dart.core::String>))
 t4 = _Call direct [#lib::E::] (_T (#lib::E<dart.core::int, dart.core::String>))
-t5* = _Call [#lib::E::bar] (_T (#lib::E<dart.core::int, dart.core::String>))
+t5 = _Call [#lib::E::bar] (_T (#lib::E<dart.core::int, dart.core::String>))
 t6 = _Call direct [#lib::E::] (_T (#lib::E<dart.core::int, dart.core::String>))
 t7* = _Call [#lib::E::baz] (_T (#lib::E<dart.core::int, dart.core::String>))
 t8 = _Call direct [#lib::C::] (_T (#lib::C<#lib::Y>))
@@ -105,5 +105,4 @@
 t14 = _Call [#lib::C2::id3] (_T (#lib::C2<dart.core::num>), _T (dart.core::_Double, 3.0))
 t15 = _Call direct [#lib::K::] (_T (#lib::K<#lib::J>))
 t16 = _Call [#lib::C2::id4] (_T (#lib::C2<dart.core::num>), _T (#lib::K<#lib::J>))
-used = _Join [dynamic] (_T {}?, t1, t3, t5, t7)
-RESULT: used
+RESULT: t7
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart
new file mode 100644
index 0000000..8ee3002
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart
@@ -0,0 +1,218 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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 C1 {}
+
+class C2 {}
+
+class C3 {}
+
+class C4 {}
+
+foo(x) {}
+bar(x) {}
+
+sequence() {
+  dynamic x = C1();
+  x = C2();
+  x = C3();
+  return x;
+}
+
+if1(bool cond) {
+  dynamic x = C1();
+  if (cond) {
+    x = C2();
+    foo(x);
+  }
+  return x;
+}
+
+if2(bool cond1, bool cond2) {
+  dynamic x = C1();
+  if (cond1) {
+    foo(x);
+  } else {
+    x = C2();
+    if (cond2) {
+      bar(x);
+    }
+  }
+  return x;
+}
+
+if3(bool cond1, bool cond2) {
+  dynamic x = C1();
+  if (foo(x = C2()) || foo(x = C3())) {
+    bar(x);
+  }
+  return x;
+}
+
+if4() {
+  dynamic x = C1();
+  if (foo(x = C2()) && foo(x = C3())) {
+    bar(x);
+  }
+  return x;
+}
+
+if5(bool cond) {
+  dynamic x = C1();
+  if (cond) {
+    x = C2();
+    return;
+  }
+  foo(x);
+}
+
+conditional1(bool cond1, bool cond2) {
+  dynamic x = C1();
+  dynamic y = foo(x = C2()) ? (x = C3()) : (x = C4());
+  foo(x);
+  bar(y);
+}
+
+conditional2(bool cond1, bool cond2) {
+  dynamic x = C1();
+  dynamic y = foo(x = C2()) ? (x = C3()) : foo([x = C4(), throw 'error']);
+  foo(x);
+  bar(y);
+}
+
+loop1() {
+  dynamic x = C1();
+  while (foo(x)) {
+    var y = C2();
+    bar(x);
+    x = y;
+  }
+  return x;
+}
+
+loop2() {
+  dynamic x = C1();
+  do {
+    foo(x);
+    x = C2();
+    bar(x);
+  } while (bar(x = C3()));
+  return x;
+}
+
+loop3() {
+  dynamic x = C1();
+  while (foo(x = C2())) {
+    var y = C3();
+    bar(x);
+    x = y;
+  }
+  return x;
+}
+
+loop4() {
+  dynamic x = C1();
+  for (var y in [foo(x = C2())]) {
+    foo(x);
+    x = C3();
+  }
+  return x;
+}
+
+loop5() {
+  dynamic x = C1();
+  while (foo(x)) {
+    x = C2();
+    if (bar(x)) {
+      break;
+    }
+    x = C3();
+  }
+  return x;
+}
+
+loop6() {
+  dynamic x = C1();
+  while (foo(x)) {
+    x = C2();
+    if (bar(x)) {
+      continue;
+    }
+    x = C3();
+  }
+  return x;
+}
+
+try1() {
+  dynamic x = C1();
+  try {
+    x = C2();
+  } catch (e, st) {
+    foo(x);
+    x = C3();
+  } finally {
+    bar(x);
+    x = C4();
+  }
+  return x;
+}
+
+closure1() {
+  dynamic x = C1();
+  foo(x);
+  foo(() {
+    bar(x);
+  });
+  x = C2();
+}
+
+closure2() {
+  dynamic x = C1();
+  foo(x);
+  foo(() {
+    x = C2();
+  });
+  return x;
+}
+
+switch1(int selector) {
+  dynamic x = C1();
+  switch (selector) {
+    case 1:
+      x = C2();
+      break;
+    case 2:
+      x = C3();
+  }
+  return x;
+}
+
+switch2(int selector) {
+  dynamic x = C1();
+  switch (selector) {
+    case 1:
+      x = C2();
+      break;
+    default:
+      x = C3();
+  }
+  return x;
+}
+
+switch3(int selector) {
+  dynamic x = C1();
+  switch (selector) {
+    case 1:
+      x = C2();
+      continue L2;
+    L2:
+    case 2:
+      foo(x);
+      x = C3();
+      break;
+  }
+  return x;
+}
+
+main() {}
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
new file mode 100644
index 0000000..028f10f
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
@@ -0,0 +1,214 @@
+------------ #lib::C1:: ------------
+%this = _Parameter #0 [_T (#lib::C1)+]
+t1 = _Call direct [dart.core::Object::] (%this)
+RESULT: _T {}?
+------------ #lib::C2:: ------------
+%this = _Parameter #0 [_T (#lib::C2)+]
+t1 = _Call direct [dart.core::Object::] (%this)
+RESULT: _T {}?
+------------ #lib::C3:: ------------
+%this = _Parameter #0 [_T (#lib::C3)+]
+t1 = _Call direct [dart.core::Object::] (%this)
+RESULT: _T {}?
+------------ #lib::C4:: ------------
+%this = _Parameter #0 [_T (#lib::C4)+]
+t1 = _Call direct [dart.core::Object::] (%this)
+RESULT: _T {}?
+------------ #lib::foo ------------
+%x = _Parameter #0 [_T ANY?]
+RESULT: _T {}?
+------------ #lib::bar ------------
+%x = _Parameter #0 [_T ANY?]
+RESULT: _T {}?
+------------ #lib::sequence ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t2 = _Call direct [#lib::C3::] (_T (#lib::C3))
+RESULT: _T (#lib::C3)
+------------ #lib::if1 ------------
+%cond = _Parameter #0 [_T (dart.core::bool)+?]
+t1 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t2 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t3 = _Call direct [#lib::foo] (_T (#lib::C2))
+x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C1))
+RESULT: x_0
+------------ #lib::if2 ------------
+%cond1 = _Parameter #0 [_T (dart.core::bool)+?]
+%cond2 = _Parameter #1 [_T (dart.core::bool)+?]
+t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t3 = _Call direct [#lib::foo] (_T (#lib::C1))
+t4 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t5 = _Call direct [#lib::bar] (_T (#lib::C2))
+x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
+RESULT: x_0
+------------ #lib::if3 ------------
+%cond1 = _Parameter #0 [_T (dart.core::bool)+?]
+%cond2 = _Parameter #1 [_T (dart.core::bool)+?]
+t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t4* = _Call direct [#lib::foo] (_T (#lib::C2))
+t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError} dart.core::bool*)
+t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
+t7* = _Call direct [#lib::foo] (_T (#lib::C3))
+t8 = _TypeCheck (t7 against dart.core::bool) (for #lib::foo(x = new #lib::C3::•()) as{TypeError} dart.core::bool*)
+x_0 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C2))
+t10 = _Call direct [#lib::bar] (x_0)
+RESULT: x_0
+------------ #lib::if4 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t2* = _Call direct [#lib::foo] (_T (#lib::C2))
+t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError} dart.core::bool*)
+t4 = _Call direct [#lib::C3::] (_T (#lib::C3))
+t5* = _Call direct [#lib::foo] (_T (#lib::C3))
+t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::foo(x = new #lib::C3::•()) as{TypeError} dart.core::bool*)
+x_0 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C2))
+t8 = _Call direct [#lib::bar] (x_0)
+RESULT: x_0
+------------ #lib::if5 ------------
+%cond = _Parameter #0 [_T (dart.core::bool)+?]
+t1 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t2 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t3 = _Call direct [#lib::foo] (_T (#lib::C1))
+RESULT: _T {}?
+------------ #lib::conditional1 ------------
+%cond1 = _Parameter #0 [_T (dart.core::bool)+?]
+%cond2 = _Parameter #1 [_T (dart.core::bool)+?]
+t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t4* = _Call direct [#lib::foo] (_T (#lib::C2))
+t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError} dart.core::bool*)
+t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
+t7 = _Call direct [#lib::C4::] (_T (#lib::C4))
+x_0 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C4))
+t9 = _Call direct [#lib::foo] (x_0)
+t10 = _Join [dart.core::Object*] (_T (#lib::C3), _T (#lib::C4))
+t11 = _Narrow (t10 to _T (dart.core::Object)+?)
+t12 = _Call direct [#lib::bar] (t11)
+RESULT: _T {}?
+------------ #lib::conditional2 ------------
+%cond1 = _Parameter #0 [_T (dart.core::bool)+?]
+%cond2 = _Parameter #1 [_T (dart.core::bool)+?]
+t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t4* = _Call direct [#lib::foo] (_T (#lib::C2))
+t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError} dart.core::bool*)
+t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
+t7 = _Call direct [#lib::C4::] (_T (#lib::C4))
+t8* = _Call direct [#lib::foo] (_T (dart.core::_GrowableList<#lib::C4>))
+t9 = _Call direct [#lib::foo] (_T (#lib::C3))
+t10 = _Join [dynamic] (_T (#lib::C3), t8)
+t11 = _Narrow (t10 to _T ANY?)
+t12 = _Call direct [#lib::bar] (t11)
+RESULT: _T {}?
+------------ #lib::loop1 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
+t2* = _Call direct [#lib::foo] (x_0)
+t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x) as{TypeError} dart.core::bool*)
+t4 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t5 = _Call direct [#lib::bar] (x_0)
+RESULT: x_0
+------------ #lib::loop2 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C3))
+t2 = _Call direct [#lib::foo] (x_0)
+t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t4 = _Call direct [#lib::bar] (_T (#lib::C2))
+t5 = _Call direct [#lib::C3::] (_T (#lib::C3))
+t6* = _Call direct [#lib::bar] (_T (#lib::C3))
+t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x = new #lib::C3::•()) as{TypeError} dart.core::bool*)
+RESULT: _T (#lib::C3)
+------------ #lib::loop3 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t2* = _Call direct [#lib::foo] (_T (#lib::C2))
+t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError} dart.core::bool*)
+t4 = _Call direct [#lib::C3::] (_T (#lib::C3))
+t5 = _Call direct [#lib::bar] (_T (#lib::C2))
+RESULT: _T (#lib::C2)
+------------ #lib::loop4 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t2 = _Call direct [#lib::foo] (_T (#lib::C2))
+t3* = _Call direct [dart._internal::unsafeCast] (_T (dart.core::_GrowableList<dynamic>))
+t4* = _Call get [dart.core::Iterable::iterator] (t3)
+t5* = _Call [dart.core::Iterator::moveNext] (t4)
+t6 = _Call get [dart.core::Iterator::current] (t4)
+x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C3))
+t8 = _Call direct [#lib::foo] (x_0)
+t9 = _Call direct [#lib::C3::] (_T (#lib::C3))
+RESULT: x_0
+------------ #lib::loop5 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C3))
+t2* = _Call direct [#lib::foo] (x_0)
+t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x) as{TypeError} dart.core::bool*)
+t4 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t5* = _Call direct [#lib::bar] (_T (#lib::C2))
+t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::bar(x) as{TypeError} dart.core::bool*)
+t7 = _Call direct [#lib::C3::] (_T (#lib::C3))
+x_1 = _Join [dynamic] (x_0, _T (#lib::C2))
+RESULT: x_1
+------------ #lib::loop6 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+x_1 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C2))
+x_0 = _Join [dynamic] (_T (#lib::C1), x_1)
+t3* = _Call direct [#lib::foo] (x_0)
+t4 = _TypeCheck (t3 against dart.core::bool) (for #lib::foo(x) as{TypeError} dart.core::bool*)
+t5 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t6* = _Call direct [#lib::bar] (_T (#lib::C2))
+t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x) as{TypeError} dart.core::bool*)
+t8 = _Call direct [#lib::C3::] (_T (#lib::C3))
+RESULT: x_0
+------------ #lib::try1 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
+x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2), _T (#lib::C3))
+t3 = _Call direct [#lib::foo] (x_0)
+t4 = _Call direct [#lib::C3::] (_T (#lib::C3))
+t5 = _Call direct [#lib::bar] (x_0)
+t6 = _Call direct [#lib::C4::] (_T (#lib::C4))
+RESULT: _T (#lib::C4)
+------------ #lib::closure1 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
+t2 = _Call direct [#lib::foo] (x_0)
+t3 = _Call direct [#lib::bar] (x_0)
+t4 = _Call direct [#lib::foo] (_T ANY?)
+t5 = _Call direct [#lib::C2::] (_T (#lib::C2))
+RESULT: _T {}?
+------------ #lib::closure2 ------------
+t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
+x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
+t2 = _Call direct [#lib::foo] (x_0)
+t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t4 = _Call direct [#lib::foo] (_T ANY?)
+RESULT: x_0
+------------ #lib::switch1 ------------
+%selector = _Parameter #0 [_T (dart.core::int)+?]
+t1 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t2 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t3 = _Call direct [#lib::C3::] (_T (#lib::C3))
+x_2 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C1))
+x_3 = _Join [dynamic] (x_2, _T (#lib::C2))
+RESULT: x_3
+------------ #lib::switch2 ------------
+%selector = _Parameter #0 [_T (dart.core::int)+?]
+t1 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t2 = _Call direct [#lib::C2::] (_T (#lib::C2))
+t3 = _Call direct [#lib::C3::] (_T (#lib::C3))
+x_2 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C2))
+RESULT: x_2
+------------ #lib::switch3 ------------
+%selector = _Parameter #0 [_T (dart.core::int)+?]
+t1 = _Call direct [#lib::C1::] (_T (#lib::C1))
+t2 = _Call direct [#lib::C2::] (_T (#lib::C2))
+x_1 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
+t4 = _Call direct [#lib::foo] (x_1)
+t5 = _Call direct [#lib::C3::] (_T (#lib::C3))
+x_2 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C3))
+RESULT: x_2
+------------ #lib::main ------------
+
+RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
index ff8eaf9..c85e5b1 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
@@ -11,11 +11,11 @@
 %a2 = _Parameter #1 [_T (dart.core::Object)+?]
 t2* = _Call direct get [#lib::someStatic] ()
 t3 = _Call direct [#lib::A::] (_T (#lib::A))
-a1 = _Join [dart.core::Object*] (%a1, _T (#lib::A), _T (#lib::B))
-t5 = _Call direct [#lib::bar] (a1, _T (dart.core::_Smi, 42))
+a1_0 = _Join [dart.core::Object*] (_T (#lib::A), %a1)
+t5 = _Call direct [#lib::bar] (a1_0, _T (dart.core::_Smi, 42))
 t6 = _Call direct [#lib::B::] (_T (#lib::B))
-t7* = _Call [dart.core::Object::==] (a1, %a2)
-t8 = _Join [dart.core::Object*] (a1, %a2)
+t7* = _Call [dart.core::Object::==] (_T (#lib::B), %a2)
+t8 = _Join [dart.core::Object*] (_T (#lib::B), %a2)
 t9 = _Narrow (t8 to _T (dart.core::Object)+?)
 RESULT: t9
 ------------ #lib::bar ------------
@@ -30,17 +30,16 @@
 ------------ #lib::loop1 ------------
 %a1 = _Parameter #0 [_T (dart.core::Object)+?]
 %a2 = _Parameter #1 [_T (dart.core::Object)+?]
-t2* = _Call direct [#lib::loop1] (_T (dart.core::Object)+?, %a1)
-x = _Join [dart.core::Object*] (%a1, t2, %a2)
-RESULT: x
+t2 = _Call direct [#lib::loop1] (%a1, %a1)
+RESULT: %a2
 ------------ #lib::loop2 ------------
 %x = _Parameter #0 [_T (dart.core::int)+?]
 t1* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi, 1))
-i = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t1)
-t3* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi, 5))
+i_0 = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t1)
+t3* = _Call [dart.core::num::<] (i_0, _T (dart.core::_Smi, 5))
 t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi, 10))
-x = _Join [dart.core::int*] (%x, t4)
-RESULT: x
+x_0 = _Join [dart.core::int*] (%x, t4)
+RESULT: x_0
 ------------ #lib::main ------------
 
 RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index 7944a4a..dae1516 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -17,7 +17,7 @@
   for (core::int* i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
       counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] counter.{core::num::+}(1);
-    if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] counter.{core::num::==}(n)) {
+    if([@vm.inferred-type.metadata=dart.core::bool] counter.{core::num::==}(n)) {
       return i;
     }
   }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart
index 2cb9cfb..7c7cf6e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart
@@ -35,11 +35,10 @@
 
 main() {
   // Test that type arguments are instantiated correctly on concrete types.
-  dynamic used;
-  used = C<int>().foo();
-  used = E<int, String>().foo();
-  used = E<int, String>().bar();
-  used = E<int, String>().baz();
+  print(C<int>().foo());
+  print(E<int, String>().foo());
+  print(E<int, String>().bar());
+  print(E<int, String>().baz());
 
   // Test that narrow against type-parameters works.
   C<X> c = new C<Y>();
@@ -50,6 +49,4 @@
   C2<num> c2 = new C2<num>();
   c2.id3(3.0);
   c2.id4(K<J>());
-
-  return used;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
index 8bf5b99..b55b811 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
@@ -63,16 +63,14 @@
     return x;
 }
 static method main() → dynamic {
-  dynamic used;
-  used = [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}();
-  used = [@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}();
-  used = [@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}();
-  used = [@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}();
+  core::print([@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
+  core::print([@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
+  core::print([@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
+  core::print([@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}());
   self::C<self::X*>* c = new self::C::•<self::Y*>();
   [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
   [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
   self::C2<core::num*>* c2 = new self::C2::•<core::num*>();
   [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
   [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
-  return used;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
index f0f9ed3..4fb48c4 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
@@ -28,7 +28,7 @@
     : super self::Stream::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → self::StreamSubscription* {
-    return [@vm.inferred-type.metadata=!] this.{self::_StreamImpl::_createSubscription}();
+    return [@vm.inferred-type.metadata=! (skip check)] this.{self::_StreamImpl::_createSubscription}();
   }
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method _createSubscription() → self::StreamSubscription* {
     return new self::_BufferingStreamSubscription::•();
@@ -88,13 +88,13 @@
   new self::_ControllerStream::•();
   self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
-  x.{self::Stream::foobar}(onData, onError: onError);
+  [@vm.direct-call.metadata=#lib::StreamView::foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
 }
 static method round3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
   self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   x = new self::_ControllerStream::•();
-  x.{self::Stream::foobar}(onData, onError: onError);
+  [@vm.direct-call.metadata=#lib::_StreamImpl::foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
 }
 static method round4({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
   self::ByteStream* x = new self::ByteStream::•(new self::_ControllerStream::•());
diff --git a/runtime/bin/ffi_test/ffi_test_dynamic_library.cc b/runtime/bin/ffi_test/ffi_test_dynamic_library.cc
index a74d197..c281d3e 100644
--- a/runtime/bin/ffi_test/ffi_test_dynamic_library.cc
+++ b/runtime/bin/ffi_test/ffi_test_dynamic_library.cc
@@ -13,7 +13,7 @@
   extern "C" __attribute__((visibility("default"))) __attribute((used))
 #endif
 
-DART_EXPORT int return42() {
+DART_EXPORT intptr_t return42() {
   return 42;
 }
 
diff --git a/runtime/bin/ffi_test/ffi_test_functions.cc b/runtime/bin/ffi_test/ffi_test_functions.cc
index 1767209..13e67e5 100644
--- a/runtime/bin/ffi_test/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions.cc
@@ -199,7 +199,7 @@
   return retval;
 }
 
-// Multiplies pointer sized int by three.
+// Multiplies pointer sized intptr_t by three.
 // Used for testing pointer sized parameter and return value.
 DART_EXPORT intptr_t Times3(intptr_t a) {
   std::cout << "Times3(" << a << ")\n";
@@ -317,25 +317,25 @@
 // Sums many numbers.
 // Used for testing calling conventions. With so many parameters we are using
 // both registers and stack slots.
-DART_EXPORT double SumManyNumbers(int a,
+DART_EXPORT double SumManyNumbers(intptr_t a,
                                   float b,
-                                  int c,
+                                  intptr_t c,
                                   double d,
-                                  int e,
+                                  intptr_t e,
                                   float f,
-                                  int g,
+                                  intptr_t g,
                                   double h,
-                                  int i,
+                                  intptr_t i,
                                   float j,
-                                  int k,
+                                  intptr_t k,
                                   double l,
-                                  int m,
+                                  intptr_t m,
                                   float n,
-                                  int o,
+                                  intptr_t o,
                                   double p,
-                                  int q,
+                                  intptr_t q,
                                   float r,
-                                  int s,
+                                  intptr_t s,
                                   double t) {
   std::cout << "SumManyNumbers(" << a << ", " << b << ", " << c << ", " << d
             << ", " << e << ", " << f << ", " << g << ", " << h << ", " << i
@@ -532,7 +532,7 @@
     retval += vls->parent->a;
   }
   std::cout << "has " << vls->numChildren << " children\n";
-  for (int i = 0; i < vls->numChildren; i++) {
+  for (intptr_t i = 0; i < vls->numChildren; i++) {
     retval += vls->children[i].a;
   }
   std::cout << "returning " << retval << "\n";
@@ -577,7 +577,7 @@
   std::cout << "returning nothing\n";
 }
 
-// Invents an elite floating point number.
+// Invents an elite floating pointptr_t number.
 // Used for testing functions that do not take any arguments.
 DART_EXPORT float InventFloatValue() {
   std::cout << "InventFloatValue()\n";
@@ -590,7 +590,7 @@
 // Tests for callbacks.
 
 // Sanity test.
-DART_EXPORT int TestSimpleAddition(int (*add)(int, int)) {
+DART_EXPORT intptr_t TestSimpleAddition(intptr_t (*add)(int, int)) {
   CHECK_EQ(add(10, 20), 30);
   return 0;
 }
@@ -598,8 +598,8 @@
 //// Following tests are copied from above, with the role of Dart and C++ code
 //// reversed.
 
-DART_EXPORT int TestIntComputation(
-    int64_t (*fn)(int8_t, int16_t, int32_t, int64_t)) {
+DART_EXPORT intptr_t
+TestIntComputation(int64_t (*fn)(int8_t, int16_t, int32_t, int64_t)) {
   CHECK_EQ(fn(125, 250, 500, 1000), 625);
   CHECK_EQ(0x7FFFFFFFFFFFFFFFLL, fn(0, 0, 0, 0x7FFFFFFFFFFFFFFFLL));
   CHECK_EQ(((int64_t)-0x8000000000000000LL),
@@ -607,78 +607,78 @@
   return 0;
 }
 
-DART_EXPORT int TestUintComputation(
-    uint64_t (*fn)(uint8_t, uint16_t, uint32_t, uint64_t)) {
+DART_EXPORT intptr_t
+TestUintComputation(uint64_t (*fn)(uint8_t, uint16_t, uint32_t, uint64_t)) {
   CHECK_EQ(0x7FFFFFFFFFFFFFFFLL, fn(0, 0, 0, 0x7FFFFFFFFFFFFFFFLL));
   CHECK_EQ(-0x8000000000000000LL, fn(0, 0, 0, -0x8000000000000000LL));
   CHECK_EQ(-1, (int64_t)fn(0, 0, 0, -1));
   return 0;
 }
 
-DART_EXPORT int TestSimpleMultiply(double (*fn)(double)) {
+DART_EXPORT intptr_t TestSimpleMultiply(double (*fn)(double)) {
   CHECK_EQ(fn(2.0), 2.0 * 1.337);
   return 0;
 }
 
-DART_EXPORT int TestSimpleMultiplyFloat(float (*fn)(float)) {
+DART_EXPORT intptr_t TestSimpleMultiplyFloat(float (*fn)(float)) {
   CHECK(::std::abs(fn(2.0) - 2.0 * 1.337) < 0.001);
   return 0;
 }
 
-DART_EXPORT int TestManyInts(intptr_t (*fn)(intptr_t,
-                                            intptr_t,
-                                            intptr_t,
-                                            intptr_t,
-                                            intptr_t,
-                                            intptr_t,
-                                            intptr_t,
-                                            intptr_t,
-                                            intptr_t,
-                                            intptr_t)) {
+DART_EXPORT intptr_t TestManyInts(intptr_t (*fn)(intptr_t,
+                                                 intptr_t,
+                                                 intptr_t,
+                                                 intptr_t,
+                                                 intptr_t,
+                                                 intptr_t,
+                                                 intptr_t,
+                                                 intptr_t,
+                                                 intptr_t,
+                                                 intptr_t)) {
   CHECK_EQ(55, fn(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
   return 0;
 }
 
-DART_EXPORT int TestManyDoubles(double (*fn)(double,
-                                             double,
-                                             double,
-                                             double,
-                                             double,
-                                             double,
-                                             double,
-                                             double,
-                                             double,
-                                             double)) {
+DART_EXPORT intptr_t TestManyDoubles(double (*fn)(double,
+                                                  double,
+                                                  double,
+                                                  double,
+                                                  double,
+                                                  double,
+                                                  double,
+                                                  double,
+                                                  double,
+                                                  double)) {
   CHECK_EQ(55, fn(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
   return 0;
 }
 
-DART_EXPORT int TestManyArgs(double (*fn)(intptr_t a,
-                                          float b,
-                                          intptr_t c,
-                                          double d,
-                                          intptr_t e,
-                                          float f,
-                                          intptr_t g,
-                                          double h,
-                                          intptr_t i,
-                                          float j,
-                                          intptr_t k,
-                                          double l,
-                                          intptr_t m,
-                                          float n,
-                                          intptr_t o,
-                                          double p,
-                                          intptr_t q,
-                                          float r,
-                                          intptr_t s,
-                                          double t)) {
+DART_EXPORT intptr_t TestManyArgs(double (*fn)(intptr_t a,
+                                               float b,
+                                               intptr_t c,
+                                               double d,
+                                               intptr_t e,
+                                               float f,
+                                               intptr_t g,
+                                               double h,
+                                               intptr_t i,
+                                               float j,
+                                               intptr_t k,
+                                               double l,
+                                               intptr_t m,
+                                               float n,
+                                               intptr_t o,
+                                               double p,
+                                               intptr_t q,
+                                               float r,
+                                               intptr_t s,
+                                               double t)) {
   CHECK(210.0 == fn(1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9, 10.0, 11, 12.0, 13, 14.0,
                     15, 16.0, 17, 18.0, 19, 20.0));
   return 0;
 }
 
-DART_EXPORT int TestStore(int64_t* (*fn)(int64_t* a)) {
+DART_EXPORT intptr_t TestStore(int64_t* (*fn)(int64_t* a)) {
   int64_t p[2] = {42, 1000};
   int64_t* result = fn(p);
   CHECK_EQ(*result, 1337);
@@ -687,48 +687,48 @@
   return 0;
 }
 
-DART_EXPORT int TestReturnNull(int32_t (*fn)()) {
+DART_EXPORT intptr_t TestReturnNull(int32_t (*fn)()) {
   CHECK_EQ(fn(), 42);
   return 0;
 }
 
-DART_EXPORT int TestNullPointers(int64_t* (*fn)(int64_t* ptr)) {
+DART_EXPORT intptr_t TestNullPointers(int64_t* (*fn)(int64_t* ptr)) {
   CHECK_EQ(fn(nullptr), reinterpret_cast<void*>(sizeof(int64_t)));
   int64_t p[2] = {0};
   CHECK_EQ(fn(p), p + 1);
   return 0;
 }
 
-DART_EXPORT int TestReturnVoid(int (*return_void)()) {
+DART_EXPORT intptr_t TestReturnVoid(intptr_t (*return_void)()) {
   CHECK_EQ(return_void(), 0);
   return 0;
 }
 
-DART_EXPORT int TestThrowExceptionDouble(double (*fn)()) {
+DART_EXPORT intptr_t TestThrowExceptionDouble(double (*fn)()) {
   CHECK_EQ(fn(), 42.0);
   return 0;
 }
 
-DART_EXPORT int TestThrowExceptionPointer(void* (*fn)()) {
+DART_EXPORT intptr_t TestThrowExceptionPointer(void* (*fn)()) {
   CHECK_EQ(fn(), nullptr);
   return 0;
 }
 
-DART_EXPORT int TestThrowException(int (*fn)()) {
+DART_EXPORT intptr_t TestThrowException(intptr_t (*fn)()) {
   CHECK_EQ(fn(), 42);
   return 0;
 }
 
-DART_EXPORT int TestTakeMaxUint8x10(intptr_t (*fn)(uint8_t,
-                                                   uint8_t,
-                                                   uint8_t,
-                                                   uint8_t,
-                                                   uint8_t,
-                                                   uint8_t,
-                                                   uint8_t,
-                                                   uint8_t,
-                                                   uint8_t,
-                                                   uint8_t)) {
+DART_EXPORT intptr_t TestTakeMaxUint8x10(intptr_t (*fn)(uint8_t,
+                                                        uint8_t,
+                                                        uint8_t,
+                                                        uint8_t,
+                                                        uint8_t,
+                                                        uint8_t,
+                                                        uint8_t,
+                                                        uint8_t,
+                                                        uint8_t,
+                                                        uint8_t)) {
   CHECK_EQ(1, fn(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF));
   // Check the argument values are properly truncated.
   uint64_t v = 0xabcFF;
@@ -736,7 +736,7 @@
   return 0;
 }
 
-DART_EXPORT int TestReturnMaxUint8(uint8_t (*fn)()) {
+DART_EXPORT intptr_t TestReturnMaxUint8(uint8_t (*fn)()) {
   std::cout << "TestReturnMaxUint8(fn): " << static_cast<int>(fn()) << "\n";
   CHECK_EQ(0xFF, fn());
   return 0;
diff --git a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
index 8e13bf1..43ffd06 100644
--- a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
@@ -172,13 +172,13 @@
 extern "C" void ClobberAndCall(void (*fn)());
 #endif
 
-DART_EXPORT int TestGC(void (*do_gc)()) {
+DART_EXPORT intptr_t TestGC(void (*do_gc)()) {
   ClobberAndCall(do_gc);
   return 0;
 }
 
 struct CallbackTestData {
-  int success;
+  intptr_t success;
   void (*callback)();
 };
 
@@ -189,11 +189,11 @@
   siglongjmp(buf, 1);
 }
 
-int ExpectAbort(void (*fn)()) {
+intptr_t ExpectAbort(void (*fn)()) {
   fprintf(stderr, "**** EXPECT STACKTRACE TO FOLLOW. THIS IS OK. ****\n");
 
   struct sigaction old_action = {};
-  int result = __sigsetjmp(buf, /*savesigs=*/1);
+  intptr_t result = __sigsetjmp(buf, /*savesigs=*/1);
   if (result == 0) {
     // Install signal handler.
     struct sigaction handler = {};
@@ -219,10 +219,10 @@
   return NULL;
 }
 
-int TestCallbackOtherThreadHelper(void* (*tester)(void*), void (*fn)()) {
+intptr_t TestCallbackOtherThreadHelper(void* (*tester)(void*), void (*fn)()) {
   CallbackTestData data = {1, fn};
   pthread_attr_t attr;
-  int result = pthread_attr_init(&attr);
+  intptr_t result = pthread_attr_init(&attr);
   CHECK_EQ(result, 0);
 
   pthread_t tid;
@@ -241,13 +241,13 @@
 }
 
 // Run a callback on another thread and verify that it triggers SIGABRT.
-DART_EXPORT int TestCallbackWrongThread(void (*fn)()) {
+DART_EXPORT intptr_t TestCallbackWrongThread(void (*fn)()) {
   return TestCallbackOtherThreadHelper(&TestCallbackOnThreadOutsideIsolate, fn);
 }
 
 // Verify that we get SIGABRT when invoking a native callback outside an
 // isolate.
-DART_EXPORT int TestCallbackOutsideIsolate(void (*fn)()) {
+DART_EXPORT intptr_t TestCallbackOutsideIsolate(void (*fn)()) {
   Dart_Isolate current = Dart_CurrentIsolate();
 
   Dart_ExitIsolate();
@@ -258,7 +258,7 @@
   return data.success;
 }
 
-DART_EXPORT int TestCallbackWrongIsolate(void (*fn)()) {
+DART_EXPORT intptr_t TestCallbackWrongIsolate(void (*fn)()) {
   return ExpectAbort(fn);
 }
 
diff --git a/runtime/tests/vm/dart/double_field_assignment_test.dart b/runtime/tests/vm/dart/double_field_assignment_test.dart
new file mode 100644
index 0000000..ba95348
--- /dev/null
+++ b/runtime/tests/vm/dart/double_field_assignment_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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";
+
+final bool alwaysTrue = int.parse('1') == 1;
+
+abstract class I {
+  double get val;
+  void set val(double v);
+}
+
+class Foo implements I {
+  double val;
+  @pragma('vm:never-inline')
+  Foo(this.val);
+}
+
+class Bar implements I {
+  double val = alwaysTrue ? 1.1 : 2.2;
+}
+
+@pragma('vm:never-inline')
+double identity(double x) => x;
+
+@pragma('vm:never-inline')
+void testGetter() {
+  final I a = alwaysTrue ? Foo(4.2) : Bar();
+
+  // Call intrinsic getter (which should make a copy if field is unboxed)
+  final value = a.val;
+  final valueAlias = identity(value);
+
+  if (a is Foo) {
+    // Override the mutable box via direct StoreInstanceField instruction.
+    a.val = 99.0;
+  }
+
+  // Ensure value (aka valueAlias) was not overriden with 99.0
+  Expect.equals(4.2, valueAlias);
+}
+
+@pragma('vm:never-inline')
+void testSetter() {
+  final I a = alwaysTrue ? Foo(1.0) : Bar();
+
+  final value = alwaysTrue ? 4.2 : 2.1;
+  final valueAlias = identity(value);
+
+  // Call intrinsic setter (which should make a copy if field is unboxed)
+  a.val = value;
+  if (a is Foo) {
+    // Override the mutable box via direct StoreInstanceField instruction.
+    a.val = 99.0;
+  }
+
+  // Ensure value (aka valueAlias) was not overriden with 99.0
+  Expect.equals(4.2, valueAlias);
+}
+
+main() {
+  testGetter();
+  testSetter();
+}
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index d622a6e..f0c8324 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -70,16 +70,14 @@
   if (is_fuchsia) {
     if (using_fuchsia_sdk) {
       extra_deps += [
-        "$fuchsia_sdk_root/fidl:fuchsia.deprecatedtimezone",
+        "$fuchsia_sdk_root/fidl:fuchsia.intl",
         "$fuchsia_sdk_root/pkg:sys_cpp",
         "$fuchsia_sdk_root/pkg:trace-engine",
       ]
     } else {
       extra_deps += [
-        # TODO(US-399): Remove time_service specific code when it is no longer
-        # necessary.
+        "//sdk/fidl/fuchsia.intl",
         "//sdk/lib/sys/cpp",
-        "//sdk/fidl/fuchsia.deprecatedtimezone",
 
         "//zircon/public/lib/fbl",
         "//zircon/public/lib/trace-engine",
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index c023bf1..32a947e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -1202,8 +1202,7 @@
         // Only intrinsify getter if the field cannot contain a mutable double.
         // Reading from a mutable double box requires allocating a fresh double.
         if (field.is_instance() && !field.needs_load_guard() &&
-            !field.is_late() &&
-            (FLAG_precompiled_mode || !IsPotentialUnboxedField(field))) {
+            !field.is_late() && !IsPotentialUnboxedField(field)) {
           SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
           GenerateGetterIntrinsic(compiler::target::Field::OffsetOf(field));
           SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
@@ -1221,8 +1220,7 @@
           field = field.CloneFromOriginal();
 #endif
 
-          if (field.is_instance() &&
-              (FLAG_precompiled_mode || field.guarded_cid() == kDynamicCid)) {
+          if (field.is_instance() && field.guarded_cid() == kDynamicCid) {
             SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
             GenerateSetterIntrinsic(compiler::target::Field::OffsetOf(field));
             SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 05985ab..d65e9fb 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -11,14 +11,18 @@
 #include <fcntl.h>
 #include <stdint.h>
 
-#include <fuchsia/deprecatedtimezone/cpp/fidl.h>
+#include <fuchsia/intl/cpp/fidl.h>
 #include <lib/sys/cpp/service_directory.h>
 #include <zircon/process.h>
 #include <zircon/syscalls.h>
 #include <zircon/syscalls/object.h>
 #include <zircon/types.h>
 
+#include "third_party/icu/source/common/unicode/errorcode.h"
+#include "third_party/icu/source/i18n/unicode/timezone.h"
+
 #include "platform/assert.h"
+#include "platform/syslog.h"
 #include "vm/zone.h"
 
 namespace dart {
@@ -61,33 +65,72 @@
   return static_cast<intptr_t>(getpid());
 }
 
+// This is the default timezone returned if it could not be obtained.  For
+// Fuchsia, the default device timezone is always UTC.
+static const char kDefaultTimezone[] = "UTC";
+
 // TODO(FL-98): Change this to talk to fuchsia.dart to get timezone service to
 // directly get timezone.
 //
 // Putting this hack right now due to CP-120 as I need to remove
 // component:ConnectToEnvironmentServices and this is the only thing that is
 // blocking it and FL-98 will take time.
-static fuchsia::deprecatedtimezone::TimezoneSyncPtr tz;
+static fuchsia::intl::PropertyProviderSyncPtr property_provider;
+
+// 1000 milliseconds do one second make.
+static const int32_t kMSPerSec = 1000;
 
 static zx_status_t GetLocalAndDstOffsetInSeconds(int64_t seconds_since_epoch,
                                                  int32_t* local_offset,
                                                  int32_t* dst_offset) {
-  zx_status_t status = tz->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
-                                                    local_offset, dst_offset);
-  if (status != ZX_OK) {
-    return status;
+  const char* timezone_id = OS::GetTimeZoneName(seconds_since_epoch);
+  std::unique_ptr<icu::TimeZone> timezone(
+      icu::TimeZone::createTimeZone(timezone_id));
+  UErrorCode error = U_ZERO_ERROR;
+  const auto ms_since_epoch =
+      static_cast<UDate>(kMSPerSec * seconds_since_epoch);
+  // The units of time that local_offset and dst_offset are returned from this
+  // function is, usefully, not documented, but it seems that the units are
+  // milliseconds.  Add these variables here for clarity.
+  int32_t local_offset_ms = 0;
+  int32_t dst_offset_ms = 0;
+  timezone->getOffset(ms_since_epoch, /*local_time=*/false, local_offset_ms,
+                      dst_offset_ms, error);
+  if (error != U_ZERO_ERROR) {
+    icu::ErrorCode icu_error;
+    icu_error.set(error);
+    // Sadly there is no way to report the actual error.  Next best thing is to
+    // log.  On the upside, a direct call to timezone->getOffset should fail
+    // rarely, so this should not amount to log spam.
+    Syslog::PrintErr("could not get DST offset: %s\n", icu_error.errorName());
+    return ZX_ERR_INTERNAL;
   }
-  *local_offset *= 60;
-  *dst_offset *= 60;
+  // We must return offset in seconds, so convert.
+  *local_offset = local_offset_ms / kMSPerSec;
+  *dst_offset = dst_offset_ms / kMSPerSec;
   return ZX_OK;
 }
 
 const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
   // TODO(abarth): Handle time zone changes.
-  static const auto* tz_name = new std::string([] {
-    std::string result;
-    tz->GetTimezoneId(&result);
-    return result;
+  static const std::string* tz_name = new std::string([]() -> std::string {
+    fuchsia::intl::Profile profile;
+    zx_status_t status = property_provider->GetProfile(&profile);
+    if (status != ZX_OK) {
+      // Shrug.  Let's continue with UTC.  Printing the error here as there is
+      // no way to report it from this API.
+      Syslog::PrintErr("no intl profile available\n");
+      return kDefaultTimezone;
+    }
+    const std::vector<fuchsia::intl::TimeZoneId>& timezones =
+        profile.time_zones();
+    if (timezones.empty()) {
+      // Empty timezone array is not up to fuchsia::intl spec.  The serving
+      // endpoint is broken and should be fixed.
+      Syslog::PrintErr("got empty timezone value\n");
+      return kDefaultTimezone;
+    }
+    return timezones[0].id;
   }());
   return tz_name->c_str();
 }
@@ -265,7 +308,7 @@
 void OS::Init() {
   InitializeTZData();
   auto services = sys::ServiceDirectory::CreateFromNamespace();
-  services->Connect(tz.NewRequest());
+  services->Connect(property_provider.NewRequest());
 }
 
 void OS::Cleanup() {}
diff --git a/sdk/lib/_internal/js_dev_runtime/lib/js/dart2js/js_dart2js.dart b/sdk/lib/_internal/js_dev_runtime/lib/js/dart2js/js_dart2js.dart
deleted file mode 100644
index 1be2417..0000000
--- a/sdk/lib/_internal/js_dev_runtime/lib/js/dart2js/js_dart2js.dart
+++ /dev/null
@@ -1,568 +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.
-
-// @dart = 2.6
-
-// DDC version of sdk/lib/js/dart2js/js_dart2js.dart
-
-/// Low-level support for interoperating with JavaScript.
-///
-/// You should usually use `package:js` instead of this library. For more
-/// information, see the [JS interop page](https://dart.dev/web/js-interop).
-///
-/// This library provides access to JavaScript objects from Dart, allowing
-/// Dart code to get and set properties, and call methods of JavaScript objects
-/// and invoke JavaScript functions. The library takes care of converting
-/// between Dart and JavaScript objects where possible, or providing proxies if
-/// conversion isn't possible.
-///
-/// This library does not make Dart objects usable from JavaScript, their
-/// methods and properties are not accessible, though it does allow Dart
-/// functions to be passed into and called from JavaScript.
-///
-/// [JsObject] is the core type and represents a proxy of a JavaScript object.
-/// JsObject gives access to the underlying JavaScript objects properties and
-/// methods. `JsObject`s can be acquired by calls to JavaScript, or they can be
-/// created from proxies to JavaScript constructors.
-///
-/// The top-level getter [context] provides a [JsObject] that represents the
-/// global object in JavaScript, usually `window`.
-///
-/// The following example shows an alert dialog via a JavaScript call to the
-/// global function `alert()`:
-///
-///     import 'dart:js';
-///
-///     main() => context.callMethod('alert', ['Hello from Dart!']);
-///
-/// This example shows how to create a [JsObject] from a JavaScript constructor
-/// and access its properties:
-///
-///     import 'dart:js';
-///
-///     main() {
-///       var object = JsObject(context['Object']);
-///       object['greeting'] = 'Hello';
-///       object['greet'] = (name) => "${object['greeting']} $name";
-///       var message = object.callMethod('greet', ['JavaScript']);
-///       context['console'].callMethod('log', [message]);
-///     }
-///
-/// ## Proxying and automatic conversion
-///
-/// When setting properties on a JsObject or passing arguments to a Javascript
-/// method or function, Dart objects are automatically converted or proxied to
-/// JavaScript objects. When accessing JavaScript properties, or when a Dart
-/// closure is invoked from JavaScript, the JavaScript objects are also
-/// converted to Dart.
-///
-/// Functions and closures are proxied in such a way that they are callable. A
-/// Dart closure assigned to a JavaScript property is proxied by a function in
-/// JavaScript. A JavaScript function accessed from Dart is proxied by a
-/// [JsFunction], which has a [apply] method to invoke it.
-///
-/// The following types are transferred directly and not proxied:
-///
-///   * Basic types: `null`, `bool`, `num`, `String`, `DateTime`
-///   * `TypedData`, including its subclasses like `Int32List`, but _not_
-///     `ByteBuffer`
-///   * When compiling for the web, also: `Blob`, `Event`, `ImageData`,
-///     `KeyRange`, `Node`, and `Window`.
-///
-/// ## Converting collections with JsObject.jsify()
-///
-/// To create a JavaScript collection from a Dart collection use the
-/// [JsObject.jsify] constructor, which converts Dart [Map]s and [Iterable]s
-/// into JavaScript Objects and Arrays.
-///
-/// The following expression creates a new JavaScript object with the properties
-/// `a` and `b` defined:
-///
-///     var jsMap = JsObject.jsify({'a': 1, 'b': 2});
-///
-/// This expression creates a JavaScript array:
-///
-///     var jsArray = JsObject.jsify([1, 2, 3]);
-///
-/// {@category Web}
-library dart.js;
-
-import 'dart:collection' show HashMap, ListMixin;
-
-import 'dart:_js_helper' show Primitives;
-import 'dart:_foreign_helper' show JS;
-import 'dart:_runtime' as dart;
-
-/// The JavaScript global object, usually `window`.
-final JsObject context = _wrapToDart(dart.global_);
-
-/// A proxy on a JavaScript object.
-///
-/// The properties of the JavaScript object are accessible via the `[]` and
-/// `[]=` operators. Methods are callable via [callMethod].
-class JsObject {
-  // The wrapped JS object.
-  final dynamic _jsObject;
-
-  // This should only be called from _wrapToDart
-  JsObject._fromJs(this._jsObject) {
-    assert(_jsObject != null);
-  }
-
-  /// Constructs a JavaScript object from its native [constructor] and returns
-  /// a proxy to it.
-  factory JsObject(JsFunction constructor, [List arguments]) {
-    var ctor = constructor._jsObject;
-    if (arguments == null) {
-      return _wrapToDart(JS('', 'new #()', ctor));
-    }
-    var unwrapped = List.from(arguments.map(_convertToJS));
-    return _wrapToDart(JS('', 'new #(...#)', ctor, unwrapped));
-  }
-
-  /// Constructs a [JsObject] that proxies a native Dart object; _for expert use
-  /// only_.
-  ///
-  /// Use this constructor only if you wish to get access to JavaScript
-  /// properties attached to a browser host object, such as a Node or Blob, that
-  /// is normally automatically converted into a native Dart object.
-  ///
-  /// An exception will be thrown if [object] either is `null` or has the type
-  /// `bool`, `num`, or `String`.
-  factory JsObject.fromBrowserObject(object) {
-    if (object is num || object is String || object is bool || object == null) {
-      throw ArgumentError("object cannot be a num, string, bool, or null");
-    }
-    return _wrapToDart(_convertToJS(object));
-  }
-
-  /// Recursively converts a JSON-like collection of Dart objects to a
-  /// collection of JavaScript objects and returns a [JsObject] proxy to it.
-  ///
-  /// [object] must be a [Map] or [Iterable], the contents of which are also
-  /// converted. Maps and Iterables are copied to a new JavaScript object.
-  /// Primitives and other transferable values are directly converted to their
-  /// JavaScript type, and all other objects are proxied.
-  factory JsObject.jsify(object) {
-    if ((object is! Map) && (object is! Iterable)) {
-      throw ArgumentError("object must be a Map or Iterable");
-    }
-    return _wrapToDart(_convertDataTree(object));
-  }
-
-  static _convertDataTree(data) {
-    var _convertedObjects = HashMap.identity();
-
-    _convert(o) {
-      if (_convertedObjects.containsKey(o)) {
-        return _convertedObjects[o];
-      }
-      if (o is Map) {
-        final convertedMap = JS('', '{}');
-        _convertedObjects[o] = convertedMap;
-        for (var key in o.keys) {
-          JS('', '#[#] = #', convertedMap, key, _convert(o[key]));
-        }
-        return convertedMap;
-      } else if (o is Iterable) {
-        var convertedList = [];
-        _convertedObjects[o] = convertedList;
-        convertedList.addAll(o.map(_convert));
-        return convertedList;
-      } else {
-        return _convertToJS(o);
-      }
-    }
-
-    return _convert(data);
-  }
-
-  /// Returns the value associated with [property] from the proxied JavaScript
-  /// object.
-  ///
-  /// The type of [property] must be either [String] or [num].
-  dynamic operator [](Object property) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    return _convertToDart(JS('', '#[#]', _jsObject, property));
-  }
-
-  // Sets the value associated with [property] on the proxied JavaScript
-  // object.
-  //
-  // The type of [property] must be either [String] or [num].
-  void operator []=(Object property, value) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    JS('', '#[#] = #', _jsObject, property, _convertToJS(value));
-  }
-
-  int get hashCode => 0;
-
-  bool operator ==(other) =>
-      other is JsObject && JS<bool>('!', '# === #', _jsObject, other._jsObject);
-
-  /// Returns `true` if the JavaScript object contains the specified property
-  /// either directly or though its prototype chain.
-  ///
-  /// This is the equivalent of the `in` operator in JavaScript.
-  bool hasProperty(property) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    return JS<bool>('!', '# in #', property, _jsObject);
-  }
-
-  /// Removes [property] from the JavaScript object.
-  ///
-  /// This is the equivalent of the `delete` operator in JavaScript.
-  void deleteProperty(property) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    JS<bool>('!', 'delete #[#]', _jsObject, property);
-  }
-
-  /// Returns `true` if the JavaScript object has [type] in its prototype chain.
-  ///
-  /// This is the equivalent of the `instanceof` operator in JavaScript.
-  bool instanceof(JsFunction type) {
-    return JS<bool>('!', '# instanceof #', _jsObject, _convertToJS(type));
-  }
-
-  /// Returns the result of the JavaScript objects `toString` method.
-  String toString() {
-    try {
-      return JS<String>('!', 'String(#)', _jsObject);
-    } catch (e) {
-      return super.toString();
-    }
-  }
-
-  /// Calls [method] on the JavaScript object with the arguments [args] and
-  /// returns the result.
-  ///
-  /// The type of [method] must be either [String] or [num].
-  dynamic callMethod(method, [List args]) {
-    if (method is! String && method is! num) {
-      throw ArgumentError("method is not a String or num");
-    }
-    if (args != null) args = List.from(args.map(_convertToJS));
-    var fn = JS('', '#[#]', _jsObject, method);
-    if (JS<bool>('!', 'typeof(#) !== "function"', fn)) {
-      throw NoSuchMethodError(_jsObject, Symbol(method), args, {});
-    }
-    return _convertToDart(JS('', '#.apply(#, #)', fn, _jsObject, args));
-  }
-}
-
-/// A proxy on a JavaScript Function object.
-class JsFunction extends JsObject {
-  /// Returns a [JsFunction] that captures its 'this' binding and calls [f]
-  /// with the value of JavaScript `this` passed as the first argument.
-  factory JsFunction.withThis(Function f) {
-    return JsFunction._fromJs(JS(
-        '',
-        'function(/*...arguments*/) {'
-            '  let args = [#(this)];'
-            '  for (let arg of arguments) {'
-            '    args.push(#(arg));'
-            '  }'
-            '  return #(#(...args));'
-            '}',
-        _convertToDart,
-        _convertToDart,
-        _convertToJS,
-        f));
-  }
-
-  JsFunction._fromJs(jsObject) : super._fromJs(jsObject);
-
-  /// Invokes the JavaScript function with arguments [args]. If [thisArg] is
-  /// supplied it is the value of `this` for the invocation.
-  dynamic apply(List args, {thisArg}) => _convertToDart(JS(
-      '',
-      '#.apply(#, #)',
-      _jsObject,
-      _convertToJS(thisArg),
-      args == null ? null : List.from(args.map(_convertToJS))));
-}
-
-// TODO(jmesserly): this is totally unnecessary in dev_compiler.
-/// A [List] that proxies a JavaScript array.
-class JsArray<E> extends JsObject with ListMixin<E> {
-  /// Creates an empty JavaScript array.
-  JsArray() : super._fromJs([]);
-
-  /// Creates a new JavaScript array and initializes it to the contents of
-  /// [other].
-  JsArray.from(Iterable<E> other)
-      : super._fromJs([]..addAll(other.map(_convertToJS)));
-
-  JsArray._fromJs(jsObject) : super._fromJs(jsObject);
-
-  _checkIndex(int index) {
-    if (index is int && (index < 0 || index >= length)) {
-      throw RangeError.range(index, 0, length);
-    }
-  }
-
-  _checkInsertIndex(int index) {
-    if (index is int && (index < 0 || index >= length + 1)) {
-      throw RangeError.range(index, 0, length);
-    }
-  }
-
-  static _checkRange(int start, int end, int length) {
-    if (start < 0 || start > length) {
-      throw RangeError.range(start, 0, length);
-    }
-    if (end < start || end > length) {
-      throw RangeError.range(end, start, length);
-    }
-  }
-
-  // Methods required by ListMixin
-
-  E operator [](Object index) {
-    // TODO(justinfagnani): fix the semantics for non-ints
-    // dartbug.com/14605
-    if (index is num && index == index.toInt()) {
-      _checkIndex(index);
-    }
-    return super[index] as E;
-  }
-
-  void operator []=(Object index, value) {
-    // TODO(justinfagnani): fix the semantics for non-ints
-    // dartbug.com/14605
-    if (index is num && index == index.toInt()) {
-      _checkIndex(index);
-    }
-    super[index] = value;
-  }
-
-  int get length {
-    // Check the length honours the List contract.
-    var len = JS('', '#.length', _jsObject);
-    // JavaScript arrays have lengths which are unsigned 32-bit integers.
-    if (JS<bool>(
-        '!', 'typeof # === "number" && (# >>> 0) === #', len, len, len)) {
-      return JS<int>('!', '#', len);
-    }
-    throw StateError('Bad JsArray length');
-  }
-
-  void set length(int length) {
-    super['length'] = length;
-  }
-
-  // Methods overridden for better performance
-
-  void add(E value) {
-    callMethod('push', [value]);
-  }
-
-  void addAll(Iterable<E> iterable) {
-    var list = (JS<bool>('!', '# instanceof Array', iterable))
-        ? iterable
-        : List.from(iterable);
-    callMethod('push', list);
-  }
-
-  void insert(int index, E element) {
-    _checkInsertIndex(index);
-    callMethod('splice', [index, 0, element]);
-  }
-
-  E removeAt(int index) {
-    _checkIndex(index);
-    return callMethod('splice', [index, 1])[0] as E;
-  }
-
-  E removeLast() {
-    if (length == 0) throw RangeError(-1);
-    return callMethod('pop') as E;
-  }
-
-  void removeRange(int start, int end) {
-    _checkRange(start, end, length);
-    callMethod('splice', [start, end - start]);
-  }
-
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    _checkRange(start, end, this.length);
-    int length = end - start;
-    if (length == 0) return;
-    if (skipCount < 0) throw ArgumentError(skipCount);
-    var args = <Object>[start, length]
-      ..addAll(iterable.skip(skipCount).take(length));
-    callMethod('splice', args);
-  }
-
-  void sort([int compare(E a, E b)]) {
-    // Note: arr.sort(null) is a type error in FF
-    callMethod('sort', compare == null ? [] : [compare]);
-  }
-}
-
-// Cross frame objects should not be considered browser types.
-// We include the instanceof Object test to filter out cross frame objects
-// on FireFox. Surprisingly on FireFox the instanceof Window test succeeds for
-// cross frame windows while the instanceof Object test fails.
-bool _isBrowserType(o) => JS(
-    'bool',
-    '# instanceof Object && ('
-        '# instanceof Blob || '
-        '# instanceof Event || '
-        '(window.KeyRange && # instanceof KeyRange) || '
-        '(window.IDBKeyRange && # instanceof IDBKeyRange) || '
-        '# instanceof ImageData || '
-        '# instanceof Node || '
-        // Int8Array.__proto__ is TypedArray.
-        '(window.Int8Array && # instanceof Int8Array.__proto__) || '
-        '# instanceof Window)',
-    o,
-    o,
-    o,
-    o,
-    o,
-    o,
-    o,
-    o,
-    o);
-
-class _DartObject {
-  final _dartObj;
-  _DartObject(this._dartObj);
-}
-
-dynamic _convertToJS(dynamic o) {
-  if (o == null || o is String || o is num || o is bool || _isBrowserType(o)) {
-    return o;
-  } else if (o is DateTime) {
-    return Primitives.lazyAsJsDate(o);
-  } else if (o is JsObject) {
-    return o._jsObject;
-  } else if (o is Function) {
-    return _putIfAbsent(_jsProxies, o, _wrapDartFunction);
-  } else {
-    // TODO(jmesserly): for now, we wrap other objects, to keep compatibility
-    // with the original dart:js behavior.
-    return _putIfAbsent(_jsProxies, o, (o) => _DartObject(o));
-  }
-}
-
-dynamic _wrapDartFunction(f) {
-  var wrapper = JS(
-      '',
-      'function(/*...arguments*/) {'
-          '  let args = Array.prototype.map.call(arguments, #);'
-          '  return #(#(...args));'
-          '}',
-      _convertToDart,
-      _convertToJS,
-      f);
-  JS('', '#.set(#, #)', _dartProxies, wrapper, f);
-
-  return wrapper;
-}
-
-// converts a Dart object to a reference to a native JS object
-// which might be a DartObject JS->Dart proxy
-Object _convertToDart(o) {
-  if (o == null || o is String || o is num || o is bool || _isBrowserType(o)) {
-    return o;
-  } else if (JS('!', '# instanceof Date', o)) {
-    num ms = JS('!', '#.getTime()', o);
-    return DateTime.fromMillisecondsSinceEpoch(ms);
-  } else if (o is _DartObject &&
-      !identical(dart.getReifiedType(o), dart.jsobject)) {
-    return o._dartObj;
-  } else {
-    return _wrapToDart(o);
-  }
-}
-
-Object _wrapToDart(o) => _putIfAbsent(_dartProxies, o, _wrapToDartHelper);
-
-Object _wrapToDartHelper(o) {
-  if (JS<bool>('!', 'typeof # == "function"', o)) {
-    return JsFunction._fromJs(o);
-  }
-  if (JS<bool>('!', '# instanceof Array', o)) {
-    return JsArray._fromJs(o);
-  }
-  return JsObject._fromJs(o);
-}
-
-final _dartProxies = JS('', 'new WeakMap()');
-final _jsProxies = JS('', 'new WeakMap()');
-
-Object _putIfAbsent(weakMap, o, getValue(o)) {
-  var value = JS('', '#.get(#)', weakMap, o);
-  if (value == null) {
-    value = getValue(o);
-    JS('', '#.set(#, #)', weakMap, o, value);
-  }
-  return value;
-}
-
-Expando<Function> _interopExpando = Expando<Function>();
-
-/// Returns a wrapper around function [f] that can be called from JavaScript
-/// using `package:js` JavaScript interop.
-///
-/// The calling conventions in Dart2Js differ from JavaScript and so, by
-/// default, it is not possible to call a Dart function directly. Wrapping with
-/// `allowInterop` creates a function that can be called from JavaScript or
-/// Dart. The semantics of the wrapped function are still more strict than
-/// JavaScript, and the function will throw if called with too many or too few
-/// arguments.
-///
-/// Calling this method repeatedly on a function will return the same result.
-F allowInterop<F extends Function>(F f) {
-  if (!dart.isDartFunction(f)) return f;
-  var ret = _interopExpando[f];
-  if (ret == null) {
-    ret = JS(
-        '',
-        'function (...args) {'
-            ' return #(#, args);'
-            '}',
-        dart.dcall,
-        f);
-    _interopExpando[f] = ret;
-  }
-  return ret;
-}
-
-Expando<Function> _interopCaptureThisExpando = Expando<Function>();
-
-/// Returns a wrapper around function [f] that can be called from JavaScript
-/// using `package:js` JavaScript interop, passing JavaScript `this` as the first
-/// argument.
-///
-/// See [allowInterop].
-///
-/// When called from Dart, [null] will be passed as the first argument.
-Function allowInteropCaptureThis(Function f) {
-  if (!dart.isDartFunction(f)) return f;
-  var ret = _interopCaptureThisExpando[f];
-  if (ret == null) {
-    ret = JS(
-        '',
-        'function(...arguments) {'
-            '  let args = [this];'
-            '  args.push.apply(args, arguments);'
-            '  return #(#, args);'
-            '}',
-        dart.dcall,
-        f);
-    _interopCaptureThisExpando[f] = ret;
-  }
-  return ret;
-}
diff --git a/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart b/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
deleted file mode 100644
index feda1c1..0000000
--- a/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.6
-
-/// Utility methods to efficiently manipulate typed JSInterop objects in cases
-/// where the name to call is not known at runtime. You should only use these
-/// methods when the same effect cannot be achieved with @JS annotations.
-/// These methods would be extension methods on JSObject if Dart supported
-/// extension methods.
-library dart.js_util;
-
-import 'dart:_foreign_helper' show JS;
-import 'dart:collection' show HashMap;
-import 'dart:async' show Completer;
-import 'dart:_js_helper' show convertDartClosureToJS;
-
-/// WARNING: performance of this method is much worse than other uitil
-/// methods in this library. Only use this method as a last resort.
-///
-/// Recursively converts a JSON-like collection of Dart objects to a
-/// collection of JavaScript objects and returns a [JsObject] proxy to it.
-///
-/// [object] must be a [Map] or [Iterable], the contents of which are also
-/// converted. Maps and Iterables are copied to a new JavaScript object.
-/// Primitives and other transferrable values are directly converted to their
-/// JavaScript type, and all other objects are proxied.
-jsify(object) {
-  if ((object is! Map) && (object is! Iterable)) {
-    throw ArgumentError("object must be a Map or Iterable");
-  }
-  return _convertDataTree(object);
-}
-
-_convertDataTree(data) {
-  var _convertedObjects = HashMap.identity();
-
-  _convert(o) {
-    if (_convertedObjects.containsKey(o)) {
-      return _convertedObjects[o];
-    }
-    if (o is Map) {
-      final convertedMap = JS('=Object', '{}');
-      _convertedObjects[o] = convertedMap;
-      for (var key in o.keys) {
-        JS('=Object', '#[#]=#', convertedMap, key, _convert(o[key]));
-      }
-      return convertedMap;
-    } else if (o is Iterable) {
-      var convertedList = [];
-      _convertedObjects[o] = convertedList;
-      convertedList.addAll(o.map(_convert));
-      return convertedList;
-    } else {
-      return o;
-    }
-  }
-
-  return _convert(data);
-}
-
-newObject() => JS('=Object', '{}');
-
-hasProperty(o, name) => JS<bool>('!', '# in #', name, o);
-getProperty(o, name) => JS('Object', '#[#]', o, name);
-setProperty(o, name, value) => JS('', '#[#]=#', o, name, value);
-
-callMethod(o, String method, List args) =>
-    JS('Object', '#[#].apply(#, #)', o, method, o, args);
-
-instanceof(o, Function type) => JS<bool>('!', '# instanceof #', o, type);
-callConstructor(Function constr, List arguments) {
-  if (arguments == null) {
-    return JS('Object', 'new #()', constr);
-  }
-
-  if (JS<bool>('!', '# instanceof Array', arguments)) {
-    int argumentCount = JS('!', '#.length', arguments);
-    switch (argumentCount) {
-      case 0:
-        return JS('Object', 'new #()', constr);
-
-      case 1:
-        var arg0 = JS('', '#[0]', arguments);
-        return JS('Object', 'new #(#)', constr, arg0);
-
-      case 2:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        return JS('Object', 'new #(#, #)', constr, arg0, arg1);
-
-      case 3:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        var arg2 = JS('', '#[2]', arguments);
-        return JS('Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
-
-      case 4:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        var arg2 = JS('', '#[2]', arguments);
-        var arg3 = JS('', '#[3]', arguments);
-        return JS(
-            'Object', 'new #(#, #, #, #)', constr, arg0, arg1, arg2, arg3);
-    }
-  }
-
-  // The following code solves the problem of invoking a JavaScript
-  // constructor with an unknown number arguments.
-  // First bind the constructor to the argument list using bind.apply().
-  // The first argument to bind() is the binding of 't', so add 'null' to
-  // the arguments list passed to apply().
-  // After that, use the JavaScript 'new' operator which overrides any binding
-  // of 'this' with the new instance.
-  var args = <dynamic>[null]..addAll(arguments);
-  var factoryFunction = JS('', '#.bind.apply(#, #)', constr, constr, args);
-  // Without this line, calling factoryFunction as a constructor throws
-  JS<String>('!', 'String(#)', factoryFunction);
-  // This could return an UnknownJavaScriptObject, or a native
-  // object for which there is an interceptor
-  return JS('Object', 'new #()', factoryFunction);
-
-  // TODO(sra): Investigate:
-  //
-  //     var jsObj = JS('', 'Object.create(#.prototype)', constr);
-  //     JS('', '#.apply(#, #)', constr, jsObj,
-  //         []..addAll(arguments.map(_convertToJS)));
-  //     return _wrapToDart(jsObj);
-}
-
-/// Converts a JavaScript Promise to a Dart [Future].
-///
-/// ```dart
-/// @JS()
-/// external Promise<num> get threePromise; // Resolves to 3
-///
-/// final Future<num> threeFuture = promiseToFuture(threePromise);
-///
-/// final three = await threeFuture; // == 3
-/// ```
-Future<T> promiseToFuture<T>(jsPromise) {
-  final completer = Completer<T>();
-
-  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
-  final error = convertDartClosureToJS((e) => completer.completeError(e), 1);
-
-  JS('', '#.then(#, #)', jsPromise, success, error);
-  return completer.future;
-}
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 23b2a9a..53692d4 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -100,8 +100,15 @@
 class AssertionError extends Error {
   /** Message describing the assertion error. */
   final Object message;
+
   AssertionError([this.message]);
-  String toString() => "Assertion failed";
+
+  String toString() {
+    if (message != null) {
+      return "Assertion failed: ${Error.safeToString(message)}";
+    }
+    return "Assertion failed";
+  }
 }
 
 /**
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index c6aba41..382b6d3 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -637,7 +637,7 @@
    *
    * May iterate through the elements in iteration order, ignoring the
    * first [index] elements and then returning the next.
-   * Some iterables may have more a efficient way to find the element.
+   * Some iterables may have a more efficient way to find the element.
    */
   E elementAt(int index) {
     ArgumentError.checkNotNull(index, "index");
diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart
deleted file mode 100644
index 317ee7f..0000000
--- a/sdk/lib/js/dart2js/js_dart2js.dart
+++ /dev/null
@@ -1,698 +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.
-
-// @dart = 2.6
-
-/// Low-level support for interoperating with JavaScript.
-///
-/// You should usually use `package:js` instead of this library. For more
-/// information, see the [JS interop page](https://dart.dev/web/js-interop).
-///
-/// This library provides access to JavaScript objects from Dart, allowing
-/// Dart code to get and set properties, and call methods of JavaScript objects
-/// and invoke JavaScript functions. The library takes care of converting
-/// between Dart and JavaScript objects where possible, or providing proxies if
-/// conversion isn't possible.
-///
-/// This library does not make Dart objects usable from JavaScript, their
-/// methods and properties are not accessible, though it does allow Dart
-/// functions to be passed into and called from JavaScript.
-///
-/// [JsObject] is the core type and represents a proxy of a JavaScript object.
-/// JsObject gives access to the underlying JavaScript objects properties and
-/// methods. `JsObject`s can be acquired by calls to JavaScript, or they can be
-/// created from proxies to JavaScript constructors.
-///
-/// The top-level getter [context] provides a [JsObject] that represents the
-/// global object in JavaScript, usually `window`.
-///
-/// The following example shows an alert dialog via a JavaScript call to the
-/// global function `alert()`:
-///
-///     import 'dart:js';
-///
-///     main() => context.callMethod('alert', ['Hello from Dart!']);
-///
-/// This example shows how to create a [JsObject] from a JavaScript constructor
-/// and access its properties:
-///
-///     import 'dart:js';
-///
-///     main() {
-///       var object = JsObject(context['Object']);
-///       object['greeting'] = 'Hello';
-///       object['greet'] = (name) => "${object['greeting']} $name";
-///       var message = object.callMethod('greet', ['JavaScript']);
-///       context['console'].callMethod('log', [message]);
-///     }
-///
-/// ## Proxying and automatic conversion
-///
-/// When setting properties on a JsObject or passing arguments to a Javascript
-/// method or function, Dart objects are automatically converted or proxied to
-/// JavaScript objects. When accessing JavaScript properties, or when a Dart
-/// closure is invoked from JavaScript, the JavaScript objects are also
-/// converted to Dart.
-///
-/// Functions and closures are proxied in such a way that they are callable. A
-/// Dart closure assigned to a JavaScript property is proxied by a function in
-/// JavaScript. A JavaScript function accessed from Dart is proxied by a
-/// [JsFunction], which has a [JsFunction.apply] method to invoke it.
-///
-/// The following types are transferred directly and not proxied:
-///
-///   * Basic types: `null`, `bool`, `num`, `String`, `DateTime`
-///   * `TypedData`, including its subclasses like `Int32List`, but _not_
-///     `ByteBuffer`
-///   * When compiling for the web, also: `Blob`, `Event`, `ImageData`,
-///     `KeyRange`, `Node`, and `Window`.
-///
-/// ## Converting collections with JsObject.jsify()
-///
-/// To create a JavaScript collection from a Dart collection use the
-/// [JsObject.jsify] constructor, which converts Dart [Map]s and [Iterable]s
-/// into JavaScript Objects and Arrays.
-///
-/// The following expression creates a new JavaScript object with the properties
-/// `a` and `b` defined:
-///
-///     var jsMap = JsObject.jsify({'a': 1, 'b': 2});
-///
-/// This expression creates a JavaScript array:
-///
-///     var jsArray = JsObject.jsify([1, 2, 3]);
-///
-/// {@category Web}
-library dart.js;
-
-import 'dart:collection' show HashMap, ListMixin;
-import 'dart:typed_data' show TypedData;
-
-import 'dart:_foreign_helper' show JS, JS_CONST, DART_CLOSURE_TO_JS;
-import 'dart:_interceptors'
-    show
-        JavaScriptFunction,
-        JavaScriptObject,
-        UnknownJavaScriptObject,
-        DART_CLOSURE_PROPERTY_NAME;
-import 'dart:_js_helper'
-    show Primitives, convertDartClosureToJS, getIsolateAffinityTag;
-import 'dart:_js' show isBrowserObject, convertFromBrowserObject;
-
-export 'dart:_interceptors' show JavaScriptObject;
-
-/// The JavaScript global object, usually `window`.
-final JsObject context = _wrapToDart(JS('', 'self'));
-
-_convertDartFunction(Function f, {bool captureThis: false}) {
-  return JS(
-      'JavaScriptFunction',
-      '''
-        function(_call, f, captureThis) {
-          return function() {
-            return _call(f, captureThis, this,
-                Array.prototype.slice.apply(arguments));
-          }
-        }(#, #, #)
-      ''',
-      DART_CLOSURE_TO_JS(_callDartFunction),
-      f,
-      captureThis);
-}
-
-_callDartFunction(callback, bool captureThis, self, List arguments) {
-  if (captureThis) {
-    arguments = [self]..addAll(arguments);
-  }
-  var dartArgs = List.from(arguments.map(_convertToDart));
-  return _convertToJS(Function.apply(callback, dartArgs));
-}
-
-/// A proxy on a JavaScript object.
-///
-/// The properties of the JavaScript object are accessible via the `[]` and
-/// `[]=` operators. Methods are callable via [callMethod].
-class JsObject {
-  // The wrapped JS object.
-  final dynamic _jsObject;
-
-  // This should only be called from _wrapToDart
-  JsObject._fromJs(this._jsObject) {
-    assert(_jsObject != null);
-  }
-
-  /// Constructs a JavaScript object from its native [constructor] and returns
-  /// a proxy to it.
-  factory JsObject(JsFunction constructor, [List arguments]) {
-    var ctor = _convertToJS(constructor);
-    if (arguments == null) {
-      return _wrapToDart(JS('', 'new #()', ctor));
-    }
-
-    if (JS('bool', '# instanceof Array', arguments)) {
-      int argumentCount = JS('int', '#.length', arguments);
-      switch (argumentCount) {
-        case 0:
-          return _wrapToDart(JS('', 'new #()', ctor));
-
-        case 1:
-          var arg0 = _convertToJS(JS('', '#[0]', arguments));
-          return _wrapToDart(JS('', 'new #(#)', ctor, arg0));
-
-        case 2:
-          var arg0 = _convertToJS(JS('', '#[0]', arguments));
-          var arg1 = _convertToJS(JS('', '#[1]', arguments));
-          return _wrapToDart(JS('', 'new #(#, #)', ctor, arg0, arg1));
-
-        case 3:
-          var arg0 = _convertToJS(JS('', '#[0]', arguments));
-          var arg1 = _convertToJS(JS('', '#[1]', arguments));
-          var arg2 = _convertToJS(JS('', '#[2]', arguments));
-          return _wrapToDart(JS('', 'new #(#, #, #)', ctor, arg0, arg1, arg2));
-
-        case 4:
-          var arg0 = _convertToJS(JS('', '#[0]', arguments));
-          var arg1 = _convertToJS(JS('', '#[1]', arguments));
-          var arg2 = _convertToJS(JS('', '#[2]', arguments));
-          var arg3 = _convertToJS(JS('', '#[3]', arguments));
-          return _wrapToDart(
-              JS('', 'new #(#, #, #, #)', ctor, arg0, arg1, arg2, arg3));
-      }
-    }
-
-    // The following code solves the problem of invoking a JavaScript
-    // constructor with an unknown number arguments.
-    // First bind the constructor to the argument list using bind.apply().
-    // The first argument to bind() is the binding of 'this', so add 'null' to
-    // the arguments list passed to apply().
-    // After that, use the JavaScript 'new' operator which overrides any binding
-    // of 'this' with the new instance.
-    var args = <dynamic>[null]..addAll(arguments.map(_convertToJS));
-    var factoryFunction = JS('', '#.bind.apply(#, #)', ctor, ctor, args);
-    // Without this line, calling factoryFunction as a constructor throws
-    JS('String', 'String(#)', factoryFunction);
-    // This could return an UnknownJavaScriptObject, or a native
-    // object for which there is an interceptor
-    var jsObj = JS('', 'new #()', factoryFunction);
-
-    return _wrapToDart(jsObj);
-
-    // TODO(sra): Investigate:
-    //
-    //     var jsObj = JS('', 'Object.create(#.prototype)', ctor);
-    //     JS('', '#.apply(#, #)', ctor, jsObj,
-    //         []..addAll(arguments.map(_convertToJS)));
-    //     return _wrapToDart(jsObj);
-  }
-
-  /// Constructs a [JsObject] that proxies a native Dart object; _for expert use
-  /// only_.
-  ///
-  /// Use this constructor only if you wish to get access to JavaScript
-  /// properties attached to a browser host object, such as a Node or Blob, that
-  /// is normally automatically converted into a native Dart object.
-  ///
-  /// An exception will be thrown if [object] either is `null` or has the type
-  /// `bool`, `num`, or `String`.
-  factory JsObject.fromBrowserObject(object) {
-    if (object is num || object is String || object is bool || object == null) {
-      throw ArgumentError("object cannot be a num, string, bool, or null");
-    }
-    return _wrapToDart(_convertToJS(object));
-  }
-
-  /// Recursively converts a JSON-like collection of Dart objects to a
-  /// collection of JavaScript objects and returns a [JsObject] proxy to it.
-  ///
-  /// [object] must be a [Map] or [Iterable], the contents of which are also
-  /// converted. Maps and Iterables are copied to a new JavaScript object.
-  /// Primitives and other transferable values are directly converted to their
-  /// JavaScript type, and all other objects are proxied.
-  factory JsObject.jsify(object) {
-    if ((object is! Map) && (object is! Iterable)) {
-      throw ArgumentError("object must be a Map or Iterable");
-    }
-    return _wrapToDart(_convertDataTree(object));
-  }
-
-  static _convertDataTree(data) {
-    var _convertedObjects = HashMap.identity();
-
-    _convert(o) {
-      if (_convertedObjects.containsKey(o)) {
-        return _convertedObjects[o];
-      }
-      if (o is Map) {
-        final convertedMap = JS('=Object', '{}');
-        _convertedObjects[o] = convertedMap;
-        for (var key in o.keys) {
-          JS('=Object', '#[#] = #', convertedMap, key, _convert(o[key]));
-        }
-        return convertedMap;
-      } else if (o is Iterable) {
-        var convertedList = [];
-        _convertedObjects[o] = convertedList;
-        convertedList.addAll(o.map(_convert));
-        return convertedList;
-      } else {
-        return _convertToJS(o);
-      }
-    }
-
-    return _convert(data);
-  }
-
-  /// Returns the value associated with [property] from the proxied JavaScript
-  /// object.
-  ///
-  /// The type of [property] must be either [String] or [num].
-  dynamic operator [](property) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    return _convertToDart(JS('', '#[#]', _jsObject, property));
-  }
-
-  // Sets the value associated with [property] on the proxied JavaScript
-  // object.
-  //
-  // The type of [property] must be either [String] or [num].
-  void operator []=(property, value) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    JS('', '#[#] = #', _jsObject, property, _convertToJS(value));
-  }
-
-  int get hashCode => 0;
-
-  bool operator ==(other) =>
-      other is JsObject && JS('bool', '# === #', _jsObject, other._jsObject);
-
-  /// Returns `true` if the JavaScript object contains the specified property
-  /// either directly or though its prototype chain.
-  ///
-  /// This is the equivalent of the `in` operator in JavaScript.
-  bool hasProperty(property) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    return JS('bool', '# in #', property, _jsObject);
-  }
-
-  /// Removes [property] from the JavaScript object.
-  ///
-  /// This is the equivalent of the `delete` operator in JavaScript.
-  void deleteProperty(property) {
-    if (property is! String && property is! num) {
-      throw ArgumentError("property is not a String or num");
-    }
-    JS('bool', 'delete #[#]', _jsObject, property);
-  }
-
-  /// Returns `true` if the JavaScript object has [type] in its prototype chain.
-  ///
-  /// This is the equivalent of the `instanceof` operator in JavaScript.
-  bool instanceof(JsFunction type) {
-    return JS('bool', '# instanceof #', _jsObject, _convertToJS(type));
-  }
-
-  /// Returns the result of the JavaScript objects `toString` method.
-  String toString() {
-    try {
-      return JS('String', 'String(#)', _jsObject);
-    } catch (e) {
-      return super.toString();
-    }
-  }
-
-  /// Calls [method] on the JavaScript object with the arguments [args] and
-  /// returns the result.
-  ///
-  /// The type of [method] must be either [String] or [num].
-  dynamic callMethod(method, [List args]) {
-    if (method is! String && method is! num) {
-      throw ArgumentError("method is not a String or num");
-    }
-    return _convertToDart(JS('', '#[#].apply(#, #)', _jsObject, method,
-        _jsObject, args == null ? null : List.from(args.map(_convertToJS))));
-  }
-}
-
-/// A proxy on a JavaScript Function object.
-class JsFunction extends JsObject {
-  /// Returns a [JsFunction] that captures its 'this' binding and calls [f]
-  /// with the value of JavaScript `this` passed as the first argument.
-  factory JsFunction.withThis(Function f) {
-    var jsFunc = _convertDartFunction(f, captureThis: true);
-    return JsFunction._fromJs(jsFunc);
-  }
-
-  JsFunction._fromJs(jsObject) : super._fromJs(jsObject);
-
-  /// Invokes the JavaScript function with arguments [args]. If [thisArg] is
-  /// supplied it is the value of `this` for the invocation.
-  dynamic apply(List args, {thisArg}) => _convertToDart(JS(
-      '',
-      '#.apply(#, #)',
-      _jsObject,
-      _convertToJS(thisArg),
-      args == null ? null : List.from(args.map(_convertToJS))));
-}
-
-/// A [List] that proxies a JavaScript array.
-class JsArray<E> extends JsObject with ListMixin<E> {
-  /// Creates an empty JavaScript array.
-  JsArray() : super._fromJs([]);
-
-  /// Creates a new JavaScript array and initializes it to the contents of
-  /// [other].
-  JsArray.from(Iterable<E> other)
-      : super._fromJs([]..addAll(other.map(_convertToJS)));
-
-  JsArray._fromJs(jsObject) : super._fromJs(jsObject);
-
-  _checkIndex(int index) {
-    if (index is int && (index < 0 || index >= length)) {
-      throw RangeError.range(index, 0, length);
-    }
-  }
-
-  _checkInsertIndex(int index) {
-    if (index is int && (index < 0 || index >= length + 1)) {
-      throw RangeError.range(index, 0, length);
-    }
-  }
-
-  static _checkRange(int start, int end, int length) {
-    if (start < 0 || start > length) {
-      throw RangeError.range(start, 0, length);
-    }
-    if (end < start || end > length) {
-      throw RangeError.range(end, start, length);
-    }
-  }
-
-  // Methods required by ListMixin
-
-  E operator [](dynamic index) {
-    // TODO(justinfagnani): fix the semantics for non-ints
-    // dartbug.com/14605
-    if (index is num && index == index.toInt()) {
-      _checkIndex(index);
-    }
-    return super[index];
-  }
-
-  void operator []=(dynamic index, E value) {
-    // TODO(justinfagnani): fix the semantics for non-ints
-    // dartbug.com/14605
-    if (index is num && index == index.toInt()) {
-      _checkIndex(index);
-    }
-    super[index] = value;
-  }
-
-  int get length {
-    // Check the length honours the List contract.
-    var len = JS('', '#.length', _jsObject);
-    // JavaScript arrays have lengths which are unsigned 32-bit integers.
-    if (JS('bool', 'typeof # === "number" && (# >>> 0) === #', len, len, len)) {
-      return JS('int', '#', len);
-    }
-    throw StateError('Bad JsArray length');
-  }
-
-  void set length(int length) {
-    super['length'] = length;
-  }
-
-  // Methods overridden for better performance
-
-  void add(E value) {
-    callMethod('push', [value]);
-  }
-
-  void addAll(Iterable<E> iterable) {
-    var list = (JS('bool', '# instanceof Array', iterable))
-        ? iterable
-        : List.from(iterable);
-    callMethod('push', list);
-  }
-
-  void insert(int index, E element) {
-    _checkInsertIndex(index);
-    callMethod('splice', [index, 0, element]);
-  }
-
-  E removeAt(int index) {
-    _checkIndex(index);
-    return callMethod('splice', [index, 1])[0];
-  }
-
-  E removeLast() {
-    if (length == 0) throw RangeError(-1);
-    return callMethod('pop');
-  }
-
-  void removeRange(int start, int end) {
-    _checkRange(start, end, length);
-    callMethod('splice', [start, end - start]);
-  }
-
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    _checkRange(start, end, this.length);
-    int length = end - start;
-    if (length == 0) return;
-    if (skipCount < 0) throw ArgumentError(skipCount);
-    var args = <dynamic>[start, length]
-      ..addAll(iterable.skip(skipCount).take(length));
-    callMethod('splice', args);
-  }
-
-  void sort([int compare(E a, E b)]) {
-    // Note: arr.sort(null) is a type error in FF
-    callMethod('sort', compare == null ? [] : [compare]);
-  }
-}
-
-// property added to a Dart object referencing its JS-side DartObject proxy
-final String _DART_OBJECT_PROPERTY_NAME =
-    getIsolateAffinityTag(r'_$dart_dartObject');
-
-// property added to a JS object referencing its Dart-side JsObject proxy
-const _JS_OBJECT_PROPERTY_NAME = r'_$dart_jsObject';
-const _JS_FUNCTION_PROPERTY_NAME = r'$dart_jsFunction';
-const _JS_FUNCTION_PROPERTY_NAME_CAPTURE_THIS = r'_$dart_jsFunctionCaptureThis';
-
-bool _defineProperty(o, String name, value) {
-  try {
-    if (_isExtensible(o) &&
-        // TODO(ahe): Calling _hasOwnProperty to work around
-        // https://code.google.com/p/dart/issues/detail?id=21331.
-        !_hasOwnProperty(o, name)) {
-      JS('void', 'Object.defineProperty(#, #, { value: #})', o, name, value);
-      return true;
-    }
-  } catch (e) {
-    // object is native and lies about being extensible
-    // see https://bugzilla.mozilla.org/show_bug.cgi?id=775185
-    // Or, isExtensible throws for this object.
-  }
-  return false;
-}
-
-bool _hasOwnProperty(o, String name) {
-  return JS('bool', 'Object.prototype.hasOwnProperty.call(#, #)', o, name);
-}
-
-bool _isExtensible(o) => JS('bool', 'Object.isExtensible(#)', o);
-
-Object _getOwnProperty(o, String name) {
-  if (_hasOwnProperty(o, name)) {
-    return JS('', '#[#]', o, name);
-  }
-  return null;
-}
-
-bool _isLocalObject(o) => JS('bool', '# instanceof Object', o);
-
-// The shared constructor function for proxies to Dart objects in JavaScript.
-final _dartProxyCtor = JS('', 'function DartObject(o) { this.o = o; }');
-
-dynamic _convertToJS(dynamic o) {
-  // Note: we don't write `if (o == null) return null;` to make sure dart2js
-  // doesn't convert `return null;` into `return;` (which would make `null` be
-  // `undefined` in Javascprit). See dartbug.com/20305 for details.
-  if (o == null || o is String || o is num || o is bool) {
-    return o;
-  }
-  if (o is JsObject) {
-    return o._jsObject;
-  }
-  if (isBrowserObject(o)) {
-    return o;
-  }
-  if (o is TypedData) {
-    return o;
-  }
-  if (o is DateTime) {
-    return Primitives.lazyAsJsDate(o);
-  }
-  if (o is Function) {
-    return _getJsProxy(o, _JS_FUNCTION_PROPERTY_NAME, (o) {
-      var jsFunction = _convertDartFunction(o);
-      // set a property on the JS closure referencing the Dart closure
-      _defineProperty(jsFunction, DART_CLOSURE_PROPERTY_NAME, o);
-      return jsFunction;
-    });
-  }
-  var ctor = _dartProxyCtor;
-  return _getJsProxy(
-      o, _JS_OBJECT_PROPERTY_NAME, (o) => JS('', 'new #(#)', ctor, o));
-}
-
-Object _getJsProxy(o, String propertyName, createProxy(o)) {
-  var jsProxy = _getOwnProperty(o, propertyName);
-  if (jsProxy == null) {
-    jsProxy = createProxy(o);
-    _defineProperty(o, propertyName, jsProxy);
-  }
-  return jsProxy;
-}
-
-// converts a Dart object to a reference to a native JS object
-// which might be a DartObject JS->Dart proxy
-Object _convertToDart(o) {
-  if (JS('bool', '# == null', o) ||
-      JS('bool', 'typeof # == "string"', o) ||
-      JS('bool', 'typeof # == "number"', o) ||
-      JS('bool', 'typeof # == "boolean"', o)) {
-    return o;
-  } else if (_isLocalObject(o) && isBrowserObject(o)) {
-    return convertFromBrowserObject(o);
-  } else if (_isLocalObject(o) && o is TypedData) {
-    return JS('TypedData', '#', o);
-  } else if (JS('bool', '# instanceof Date', o)) {
-    var ms = JS('num', '#.getTime()', o);
-    return DateTime.fromMillisecondsSinceEpoch(ms);
-  } else if (JS('bool', '#.constructor === #', o, _dartProxyCtor)) {
-    return JS('', '#.o', o);
-  } else {
-    return _wrapToDart(o);
-  }
-}
-
-Object _wrapToDart(o) {
-  if (JS('bool', 'typeof # == "function"', o)) {
-    return _getDartProxy(
-        o, DART_CLOSURE_PROPERTY_NAME, (o) => JsFunction._fromJs(o));
-  }
-  if (JS('bool', '# instanceof Array', o)) {
-    return _getDartProxy(
-        o, _DART_OBJECT_PROPERTY_NAME, (o) => JsArray._fromJs(o));
-  }
-  return _getDartProxy(
-      o, _DART_OBJECT_PROPERTY_NAME, (o) => JsObject._fromJs(o));
-}
-
-Object _getDartProxy(o, String propertyName, createProxy(o)) {
-  var dartProxy = _getOwnProperty(o, propertyName);
-  // Temporary fix for dartbug.com/15193
-  // In some cases it's possible to see a JavaScript object that
-  // came from a different context and was previously proxied to
-  // Dart in that context. The JS object will have a cached proxy
-  // but it won't be a valid Dart object in this context.
-  // For now we throw away the cached proxy, but we should be able
-  // to cache proxies from multiple JS contexts and Dart isolates.
-  if (dartProxy == null || !_isLocalObject(o)) {
-    dartProxy = createProxy(o);
-    _defineProperty(o, propertyName, dartProxy);
-  }
-  return dartProxy;
-}
-
-_convertDartFunctionFast(Function f) {
-  var existing = JS('', '#.#', f, _JS_FUNCTION_PROPERTY_NAME);
-  if (existing != null) return existing;
-  var ret = JS(
-      'JavaScriptFunction',
-      '''
-        function(_call, f) {
-          return function() {
-            return _call(f, Array.prototype.slice.apply(arguments));
-          }
-        }(#, #)
-      ''',
-      DART_CLOSURE_TO_JS(_callDartFunctionFast),
-      f);
-  JS('', '#.# = #', ret, DART_CLOSURE_PROPERTY_NAME, f);
-  JS('', '#.# = #', f, _JS_FUNCTION_PROPERTY_NAME, ret);
-  return ret;
-}
-
-_convertDartFunctionFastCaptureThis(Function f) {
-  var existing = JS('', '#.#', f, _JS_FUNCTION_PROPERTY_NAME_CAPTURE_THIS);
-  if (existing != null) return existing;
-  var ret = JS(
-      'JavaScriptFunction',
-      '''
-        function(_call, f) {
-          return function() {
-            return _call(f, this,Array.prototype.slice.apply(arguments));
-          }
-        }(#, #)
-      ''',
-      DART_CLOSURE_TO_JS(_callDartFunctionFastCaptureThis),
-      f);
-  JS('', '#.# = #', ret, DART_CLOSURE_PROPERTY_NAME, f);
-  JS('', '#.# = #', f, _JS_FUNCTION_PROPERTY_NAME_CAPTURE_THIS, ret);
-  return ret;
-}
-
-_callDartFunctionFast(callback, List arguments) {
-  return Function.apply(callback, arguments);
-}
-
-_callDartFunctionFastCaptureThis(callback, self, List arguments) {
-  return Function.apply(callback, [self]..addAll(arguments));
-}
-
-/// Returns a wrapper around function [f] that can be called from JavaScript
-/// using `package:js` JavaScript interop.
-///
-/// The calling conventions in Dart2Js differ from JavaScript and so, by
-/// default, it is not possible to call a Dart function directly. Wrapping with
-/// `allowInterop` creates a function that can be called from JavaScript or
-/// Dart. The semantics of the wrapped function are still more strict than
-/// JavaScript, and the function will throw if called with too many or too few
-/// arguments.
-///
-/// Calling this method repeatedly on a function will return the same result.
-F allowInterop<F extends Function>(F f) {
-  if (JS('bool', 'typeof(#) == "function"', f)) {
-    // Already supports interop, just use the existing function.
-    return f;
-  } else {
-    return _convertDartFunctionFast(f);
-  }
-}
-
-/// Returns a wrapper around function [f] that can be called from JavaScript
-/// using `package:js` JavaScript interop, passing JavaScript `this` as the first
-/// argument.
-///
-/// See [allowInterop].
-///
-/// When called from Dart, [null] will be passed as the first argument.
-Function allowInteropCaptureThis(Function f) {
-  if (JS('bool', 'typeof(#) == "function"', f)) {
-    // Behavior when the function is already a JS function is unspecified.
-    throw ArgumentError(
-        "Function is already a JS function so cannot capture this.");
-    return f;
-  } else {
-    return _convertDartFunctionFastCaptureThis(f);
-  }
-}
diff --git a/sdk/lib/js/js_sources.gni b/sdk/lib/js/js_sources.gni
index 67d1660..6308b38 100644
--- a/sdk/lib/js/js_sources.gni
+++ b/sdk/lib/js/js_sources.gni
@@ -2,4 +2,4 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-js_sdk_sources = [ "js.dart", "dart2js/js_dart2js.dart" ]
+js_sdk_sources = [ "js.dart" ]
diff --git a/sdk/lib/js_util/dart2js/js_util_dart2js.dart b/sdk/lib/js_util/dart2js/js_util_dart2js.dart
deleted file mode 100644
index 3ed2098..0000000
--- a/sdk/lib/js_util/dart2js/js_util_dart2js.dart
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.6
-
-/// Utility methods to efficiently manipulate typed JSInterop objects in cases
-/// where the name to call is not known at runtime. You should only use these
-/// methods when the same effect cannot be achieved with @JS annotations.
-/// These methods would be extension methods on JSObject if Dart supported
-/// extension methods.
-///
-/// {@category Web}
-library dart.js_util;
-
-import 'dart:_foreign_helper' show JS;
-import 'dart:collection' show HashMap;
-import 'dart:async' show Completer;
-import 'dart:_js_helper' show convertDartClosureToJS;
-
-/// WARNING: performance of this method is much worse than other util
-/// methods in this library. Only use this method as a last resort.
-///
-/// Recursively converts a JSON-like collection of Dart objects to a
-/// collection of JavaScript objects and returns a [JsObject] proxy to it.
-///
-/// [object] must be a [Map] or [Iterable], the contents of which are also
-/// converted. Maps and Iterables are copied to a new JavaScript object.
-/// Primitives and other transferable values are directly converted to their
-/// 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");
-  }
-  return _convertDataTree(object);
-}
-
-_convertDataTree(data) {
-  var _convertedObjects = new HashMap.identity();
-
-  _convert(o) {
-    if (_convertedObjects.containsKey(o)) {
-      return _convertedObjects[o];
-    }
-    if (o is Map) {
-      final convertedMap = JS('=Object', '{}');
-      _convertedObjects[o] = convertedMap;
-      for (var key in o.keys) {
-        JS('=Object', '#[#]=#', convertedMap, key, _convert(o[key]));
-      }
-      return convertedMap;
-    } else if (o is Iterable) {
-      var convertedList = [];
-      _convertedObjects[o] = convertedList;
-      convertedList.addAll(o.map(_convert));
-      return convertedList;
-    } else {
-      return o;
-    }
-  }
-
-  return _convert(data);
-}
-
-newObject() => JS('=Object', '{}');
-
-bool hasProperty(o, name) => JS('bool', '# in #', name, o);
-getProperty(o, name) => JS('Object|Null', '#[#]', o, name);
-setProperty(o, name, value) => JS('', '#[#]=#', o, name, value);
-
-callMethod(o, String method, List args) =>
-    JS('Object|Null', '#[#].apply(#, #)', o, method, o, args);
-
-bool instanceof(o, Function type) => JS('bool', '# instanceof #', o, type);
-callConstructor(Function constr, List arguments) {
-  if (arguments == null) {
-    return JS('Object', 'new #()', constr);
-  }
-
-  if (JS('bool', '# instanceof Array', arguments)) {
-    int argumentCount = JS('int', '#.length', arguments);
-    switch (argumentCount) {
-      case 0:
-        return JS('Object', 'new #()', constr);
-
-      case 1:
-        var arg0 = JS('', '#[0]', arguments);
-        return JS('Object', 'new #(#)', constr, arg0);
-
-      case 2:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        return JS('Object', 'new #(#, #)', constr, arg0, arg1);
-
-      case 3:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        var arg2 = JS('', '#[2]', arguments);
-        return JS('Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
-
-      case 4:
-        var arg0 = JS('', '#[0]', arguments);
-        var arg1 = JS('', '#[1]', arguments);
-        var arg2 = JS('', '#[2]', arguments);
-        var arg3 = JS('', '#[3]', arguments);
-        return JS(
-            'Object', 'new #(#, #, #, #)', constr, arg0, arg1, arg2, arg3);
-    }
-  }
-
-  // The following code solves the problem of invoking a JavaScript
-  // constructor with an unknown number arguments.
-  // First bind the constructor to the argument list using bind.apply().
-  // The first argument to bind() is the binding of 't', so add 'null' to
-  // the arguments list passed to apply().
-  // After that, use the JavaScript 'new' operator which overrides any binding
-  // of 'this' with the new instance.
-  var args = <dynamic>[null]..addAll(arguments);
-  var factoryFunction = JS('', '#.bind.apply(#, #)', constr, constr, args);
-  // Without this line, calling factoryFunction as a constructor throws
-  JS('String', 'String(#)', factoryFunction);
-  // This could return an UnknownJavaScriptObject, or a native
-  // object for which there is an interceptor
-  return JS('Object', 'new #()', factoryFunction);
-
-  // TODO(sra): Investigate:
-  //
-  //     var jsObj = JS('', 'Object.create(#.prototype)', constr);
-  //     JS('', '#.apply(#, #)', constr, jsObj,
-  //         []..addAll(arguments.map(_convertToJS)));
-  //     return _wrapToDart(jsObj);
-}
-
-/// Converts a JavaScript Promise to a Dart [Future].
-///
-/// ```dart
-/// @JS()
-/// external Promise<num> get threePromise; // Resolves to 3
-///
-/// final Future<num> threeFuture = promiseToFuture(threePromise);
-///
-/// final three = await threeFuture; // == 3
-/// ```
-Future<T> promiseToFuture<T>(jsPromise) {
-  final completer = Completer<T>();
-
-  final success = convertDartClosureToJS((r) => completer.complete(r), 1);
-  final error = convertDartClosureToJS((e) => completer.completeError(e), 1);
-
-  JS('', '#.then(#, #)', jsPromise, success, error);
-  return completer.future;
-}
diff --git a/sdk/lib/js_util/js_util_sources.gni b/sdk/lib/js_util/js_util_sources.gni
index ad6a4f0..d3ac6d2 100644
--- a/sdk/lib/js_util/js_util_sources.gni
+++ b/sdk/lib/js_util/js_util_sources.gni
@@ -2,4 +2,4 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-js_util_sdk_sources = [ "js_util.dart", "dart2js/js_util_dart2js.dart" ]
+js_util_sdk_sources = [ "js_util.dart" ]
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index 6de748b..3078863 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -388,15 +388,12 @@
   Type get runtimeType => Type;
 }
 
-/// Given an internal runtime type object, wraps it in a `_Type` object
+/// Given an internal runtime type object [type], wraps it in a `_Type` object
 /// that implements the dart:core Type interface.
-Type wrapType(type) => _wrapType(type, false);
-
-/// Helper function to wrap a type.
 ///
-/// When isNormalized is true, the parameter is known to be in a canonicalized
+/// [isNormalized] is true when [type] is known to be in a canonicalized
 /// normal form, so the algorithm can directly wrap and return the value.
-Type _wrapType(type, isNormalized) {
+Type wrapType(type, {isNormalized = false}) {
   // If we've already wrapped this type once, use the previous wrapper. This
   // way, multiple references to the same type return an identical Type.
   if (JS('!', '#.hasOwnProperty(#)', type, _typeObject)) {
@@ -405,7 +402,7 @@
   var result = isNormalized
       ? _Type(type)
       : (type is LegacyType
-          ? _wrapType(type.type, false)
+          ? wrapType(type.type)
           : _canonicalizeNormalizedTypeObject(type));
   JS('', '#[#] = #', type, _typeObject, result);
   return result;
@@ -413,25 +410,57 @@
 
 /// Constructs a normalized version of a type.
 ///
-/// Used for type object identity. Currently only removes legacy wrappers,
-/// ignoring other normalization operations.
+/// Used for type object identity. Normalization requires us to return a
+/// canonicalized version of the input with all legacy wrappers removed.
 Type _canonicalizeNormalizedTypeObject(type) {
   assert(type is! LegacyType);
+  // We don't call _canonicalizeNormalizedTypeObject recursively but call wrap
+  // + unwrap to handle legacy types automatically and force caching the
+  // canonicalized type under the _typeObject cache property directly. This
+  // way we ensure we always use the canonical normalized instance for each
+  // type term.
+  Object normalizeHelper(a) => unwrapType(wrapType(a));
+
+  if (type is FunctionType) {
+    var normReturnType = normalizeHelper(type.returnType);
+    var normArgs = type.args.map(normalizeHelper).toList();
+    if (JS<bool>('!', '#.Object.keys(#).length === 0', global_, type.named) &&
+        JS<bool>('!', '#.Object.keys(#).length === 0', global_,
+            type.requiredNamed)) {
+      if (type.optionals.isEmpty) {
+        var normType = fnType(normReturnType, normArgs);
+        return wrapType(normType, isNormalized: true);
+      }
+      var normOptionals = type.optionals.map(normalizeHelper).toList();
+      var normType = fnType(normReturnType, normArgs, normOptionals);
+      return wrapType(normType, isNormalized: true);
+    }
+    var normNamed = JS('', '{}');
+    _transformJSObject(type.named, normNamed, normalizeHelper);
+    var normRequiredNamed = JS('', '{}');
+    _transformJSObject(type.requiredNamed, normRequiredNamed, normalizeHelper);
+    var normType =
+        fnType(normReturnType, normArgs, normNamed, normRequiredNamed);
+    return wrapType(normType, isNormalized: true);
+  }
   var args = getGenericArgs(type);
   var normType;
   if (args == null || args.isEmpty) {
     normType = type;
   } else {
     var genericClass = getGenericClass(type);
-    // We don't call _canonicalizeNormalizedTypeObject recursively but call wrap
-    // + unwrap to handle legacy types automatically and force caching the
-    // canonicalized type under the _typeObject cache property directly. This
-    // way we ensure we always use the canonical normalized instance for each
-    // type parameter.
-    var normArgs = args.map((a) => unwrapType(wrapType(a))).toList();
+    var normArgs = args.map(normalizeHelper).toList();
     normType = JS('!', '#(...#)', genericClass, normArgs);
   }
-  return _wrapType(normType, true);
+  return wrapType(normType, isNormalized: true);
+}
+
+/// Generates new values by applying [transform] to the keys of [srcObject],
+/// storing them in [dstObject].
+void _transformJSObject(srcObject, dstObject, Function transform) {
+  for (Object key in JS('!', '#.Object.keys(#)', global_, srcObject)) {
+    JS('', '#[#] = #', dstObject, key, transform(key));
+  }
 }
 
 /// The symbol used to store the cached `Type` object associated with a class.
@@ -488,8 +517,10 @@
 List _canonicalizeArray(List array, map) =>
     _memoizeArray(map, array, () => array);
 
-// TODO(leafp): This only canonicalizes of the names are
-// emitted in a consistent order.
+// TODO(leafp): This only canonicalizes if the names are emitted
+// in a consistent order.
+// TODO(markzipan): Update this to differentiate named
+// from required named parameters.
 _canonicalizeNamed(named, map) => JS('', '''(() => {
   let key = [];
   let names = $getOwnPropertyNames($named);
@@ -828,6 +859,10 @@
     }
 
     bool hasFreeFormal(t) {
+      // Ignore nullability wrappers.
+      if (_isLegacy(t) || _isNullable(t)) {
+        return hasFreeFormal(JS<Type>('', '#.type', t));
+      }
       if (partials.containsKey(t)) return true;
       // Generic classes and typedefs.
       var typeArgs = getGenericArgs(t);
@@ -1805,4 +1840,4 @@
   }
 
   return null;
-}
+}
\ No newline at end of file
diff --git a/sdk_nnbd/lib/async/stream.dart b/sdk_nnbd/lib/async/stream.dart
index 2a24b97..b874e5e1 100644
--- a/sdk_nnbd/lib/async/stream.dart
+++ b/sdk_nnbd/lib/async/stream.dart
@@ -957,9 +957,9 @@
    * Whether this stream contains any elements.
    *
    * Waits for the first element of this stream, then completes the returned
-   * future with `true`.
+   * future with `false`.
    * If this stream ends without emitting any elements, the returned future is
-   * completed with `false`.
+   * completed with `true`.
    *
    * If the first event is an error, the returned future is completed with that
    * error.
diff --git a/sdk_nnbd/lib/collection/list.dart b/sdk_nnbd/lib/collection/list.dart
index 2b5452a..6f106e2 100644
--- a/sdk_nnbd/lib/collection/list.dart
+++ b/sdk_nnbd/lib/collection/list.dart
@@ -19,7 +19,7 @@
 /// repeatedly increasing the length of a growable list is not efficient.
 /// To avoid this, either override 'add' and 'addAll' to also forward directly
 /// to the growable list, or, preferably, use `DelegatingList` from
-/// "package:collection/wrappers.dart" instead.
+/// "package:collection/collection.dart" instead.
 abstract class ListBase<E> extends Object with ListMixin<E> {
   /// Converts a [List] to a [String].
   ///
@@ -49,7 +49,7 @@
 /// repeatedly increasing the length of a growable list is not efficient.
 /// To avoid this, either override 'add' and 'addAll' to also forward directly
 /// to the growable list, or, if possible, use `DelegatingList` from
-/// "package:collection/wrappers.dart" instead.
+/// "package:collection/collection.dart" instead.
 abstract class ListMixin<E> implements List<E> {
   // Iterable interface.
   // TODO(lrn): When we get composable mixins, reuse IterableMixin instead
diff --git a/sdk_nnbd/lib/collection/queue.dart b/sdk_nnbd/lib/collection/queue.dart
index 600ea6b..864ebfc 100644
--- a/sdk_nnbd/lib/collection/queue.dart
+++ b/sdk_nnbd/lib/collection/queue.dart
@@ -191,15 +191,15 @@
 
   E get _element => super._element as E;
 
-  DoubleLinkedQueueEntry<E> nextEntry() {
+  DoubleLinkedQueueEntry<E>? nextEntry() {
     _DoubleLinkedQueueEntry<E> entry = _nextLink as _DoubleLinkedQueueEntry<E>;
-    return entry._asNonSentinelEntry()!;
+    return entry._asNonSentinelEntry();
   }
 
-  DoubleLinkedQueueEntry<E> previousEntry() {
+  DoubleLinkedQueueEntry<E>? previousEntry() {
     _DoubleLinkedQueueEntry<E> entry =
         _previousLink as _DoubleLinkedQueueEntry<E>;
-    return entry._asNonSentinelEntry()!;
+    return entry._asNonSentinelEntry();
   }
 }
 
@@ -418,7 +418,7 @@
   /// and they can be iterated using [DoubleLinkedQueueEntry.nextEntry()] and
   /// [DoubleLinkedQueueEntry.previousEntry()].
   DoubleLinkedQueueEntry<E> firstEntry() {
-    return _sentinel.nextEntry();
+    return _sentinel.nextEntry()!;
   }
 
   /// The entry object of the last element in the queue.
@@ -430,7 +430,7 @@
   /// and they can be iterated using [DoubleLinkedQueueEntry.nextEntry()] and
   /// [DoubleLinkedQueueEntry.previousEntry()].
   DoubleLinkedQueueEntry<E> lastEntry() {
-    return _sentinel.previousEntry();
+    return _sentinel.previousEntry()!;
   }
 
   bool get isEmpty {
diff --git a/sdk_nnbd/lib/core/errors.dart b/sdk_nnbd/lib/core/errors.dart
index 58ca190..9445339 100644
--- a/sdk_nnbd/lib/core/errors.dart
+++ b/sdk_nnbd/lib/core/errors.dart
@@ -98,8 +98,15 @@
 class AssertionError extends Error {
   /** Message describing the assertion error. */
   final Object? message;
+
   AssertionError([this.message]);
-  String toString() => "Assertion failed";
+
+  String toString() {
+    if (message != null) {
+      return "Assertion failed: ${Error.safeToString(message)}";
+    }
+    return "Assertion failed";
+  }
 }
 
 /**
diff --git a/sdk_nnbd/lib/core/iterable.dart b/sdk_nnbd/lib/core/iterable.dart
index b00549c..539a993 100644
--- a/sdk_nnbd/lib/core/iterable.dart
+++ b/sdk_nnbd/lib/core/iterable.dart
@@ -637,7 +637,7 @@
    *
    * May iterate through the elements in iteration order, ignoring the
    * first [index] elements and then returning the next.
-   * Some iterables may have more a efficient way to find the element.
+   * Some iterables may have a more efficient way to find the element.
    */
   E elementAt(int index) {
     RangeError.checkNotNegative(index, "index");
diff --git a/sdk_nnbd/lib/core/list.dart b/sdk_nnbd/lib/core/list.dart
index e78f478..c204b65 100644
--- a/sdk_nnbd/lib/core/list.dart
+++ b/sdk_nnbd/lib/core/list.dart
@@ -166,17 +166,17 @@
    * Creates a list with [length] positions and fills it with values created by
    * calling [generator] for each index in the range `0` .. `length - 1`
    * in increasing order.
+   * ```dart
+   * List<int>.generate(3, (int index) => index * index); // [0, 1, 4]
+   * ```
+   * The created list is fixed-length if [growable] is set to false.
    *
-   *     new List<int>.generate(3, (int index) => index * index); // [0, 1, 4]
-   *
-   * The created list is fixed-length unless [growable] is true.
+   * The [length] must be non-negative.
    */
   factory List.generate(int length, E generator(int index),
       {bool growable = true}) {
-    if (length <= 0) {
-      if (growable) return <E>[];
-      return List<E>.empty();
-    }
+    if (length < 0) throw RangeError.index(length, 0, null, "length");
+    if (length == 0) return List<E>.empty(growable: growable);
     List<E> result = List<E>.filled(length, generator(0), growable: growable);
     for (int i = 1; i < length; i++) {
       result[i] = generator(i);
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index 0570d7a..6400609 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -5,19 +5,13 @@
 [ $builder_tag == asan ]
 data_not_asan_test: SkipByDesign # This test tries to allocate too much memory on purpose.
 
-# These tests trigger and catch an abort (intentionally) and terminate the VM.
-# They're incompatible with ASAN because not all memory is freed when aborting and
-# with AppJit because the abort the VM before it can generate a snapshot.
-[ $compiler == app_jitk || $builder_tag == asan ]
-vmspecific_function_callbacks_exit_test: SkipByDesign
+[ $system == android ]
+*: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
 
 [ $arch == arm && $system != android ]
 *: Skip # "hardfp" calling convention is not yet supported (iOS is also supported but not tested): dartbug.com/36309
 
-[ $compiler == dart2analyzer ]
-vmspecific_enable_ffi_test: SkipByDesign # This is a check for VM only.
-
-[ $runtime != dart_precompiled && $runtime != vm && $compiler != dart2analyzer ]
+[ $compiler != dart2analyzer && $compiler != fasta && $runtime != dart_precompiled && $runtime != vm ]
 *: SkipByDesign # FFI is a VM-only feature. (This test suite is part of the default set.)
 
 [ $system != android && $system != linux && $system != macos && $system != windows ]
@@ -26,9 +20,15 @@
 [ $arch == simarm || $arch == simarm64 ]
 *: Skip # FFI not yet supported on the arm simulator.
 
-[ $system == android ]
-*: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
+# These tests trigger and catch an abort (intentionally) and terminate the VM.
+# They're incompatible with ASAN because not all memory is freed when aborting and
+# with AppJit because the abort the VM before it can generate a snapshot.
+[ $builder_tag == asan || $compiler == app_jitk ]
+vmspecific_function_callbacks_exit_test: SkipByDesign
+
+[ $compiler == dart2analyzer || $compiler == fasta ]
+vmspecific_enable_ffi_test: SkipByDesign # This is a check for VM only.
 
 [ $hot_reload || $hot_reload_rollback ]
-vmspecific_function_callbacks_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
 snapshot_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+vmspecific_function_callbacks_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
diff --git a/tests/lib/lib_kernel.status b/tests/lib/lib_kernel.status
index 1c24f7b..51d3d73 100644
--- a/tests/lib/lib_kernel.status
+++ b/tests/lib/lib_kernel.status
@@ -55,8 +55,6 @@
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
 mirrors/invocation_fuzz_test: Crash
 mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
-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.
-mirrors/native_class_test: SkipByDesign # Imports dart:html
 
 [ $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
 isolate/illegal_msg_function_test: Skip # Timeout
diff --git a/tests/lib/lib_vm.status b/tests/lib/lib_vm.status
index aba92ff..4412dcf 100644
--- a/tests/lib/lib_vm.status
+++ b/tests/lib/lib_vm.status
@@ -32,8 +32,6 @@
 mirrors/generics_test/01: MissingCompileTimeError
 mirrors/initializing_formals_test/01: Fail # initializing formals are implicitly final as of Dart 1.21
 mirrors/metadata_nested_constructor_call_test/none: CompileTimeError
-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.
-mirrors/native_class_test: SkipByDesign # Imports dart:html
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
 mirrors/redirecting_factory_test/01: RuntimeError
 mirrors/redirecting_factory_test/none: RuntimeError
diff --git a/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.dart b/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.dart
deleted file mode 100644
index 9b6818b..0000000
--- a/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.dart
+++ /dev/null
@@ -1,68 +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.
-
-library constructor_calls_created_synchronously_test;
-
-import 'dart:html';
-import 'dart:mirrors';
-
-import 'package:unittest/unittest.dart';
-
-import 'utils.dart';
-
-class A extends HtmlElement {
-  static final tag = 'x-a';
-  factory A() => new Element.tag(tag);
-  A.created() : super.created() {
-    ncallbacks++;
-  }
-
-  static int ncallbacks = 0;
-}
-
-main() {
-  // Adapted from Blink's
-  // fast/dom/custom/constructor-calls-created-synchronously test.
-
-  var registered = false;
-  setUp(() {
-    return customElementsReady.then((_) {
-      if (!registered) {
-        registered = true;
-        document.registerElement2(A.tag, {'prototype': A});
-      }
-    });
-  });
-
-  test('createdCallback', () {
-    var x = new A();
-    expect(A.ncallbacks, 1);
-  });
-
-  test('clone node', () {
-    A.ncallbacks = 0;
-
-    var a = new A();
-    expect(A.ncallbacks, 1);
-    var b = a.clone(false);
-    expect(A.ncallbacks, 2);
-    expect(b is A, isTrue);
-  });
-
-  test("can extend elements that don't have special prototypes", () {
-    document.registerElement2(
-        'fancy-section', {'prototype': FancySection, 'extends': 'section'});
-    var fancy = document.createElement('section', 'fancy-section');
-    expect(fancy is FancySection, true, reason: 'fancy-section was registered');
-    expect((fancy as FancySection).wasCreated, true,
-        reason: 'FancySection ctor was called');
-  });
-}
-
-class FancySection extends HtmlElement {
-  bool wasCreated = false;
-  FancySection.created() : super.created() {
-    wasCreated = true;
-  }
-}
diff --git a/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.html b/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.html
deleted file mode 100644
index e77e7c7..0000000
--- a/tests/lib_2/html/custom/constructor_calls_created_synchronously_test.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="dart.unittest" content="full-stack-traces">
-  <title> entered_left_view_test </title>
-  <style>
-     .unittest-table { font-family:monospace; border:1px; }
-     .unittest-pass { background: #6b3;}
-     .unittest-fail { background: #d55;}
-     .unittest-error { background: #a11;}
-  </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-</head>
-<body>
-  <h1> Running entered_left_view_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
-  %TEST_SCRIPTS%
-</body>
-</html>
diff --git a/tests/lib_2/html/custom/js_custom_test.dart b/tests/lib_2/html/custom/js_custom_test.dart
deleted file mode 100644
index 1a7fd47..0000000
--- a/tests/lib_2/html/custom/js_custom_test.dart
+++ /dev/null
@@ -1,72 +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.
-
-import 'dart:html';
-import 'dart:mirrors';
-
-import 'package:unittest/html_individual_config.dart';
-import 'package:unittest/unittest.dart';
-
-import 'utils.dart';
-
-class A extends HtmlElement {
-  static final tag = 'x-a';
-  factory A() => new Element.tag(tag);
-  A.created() : super.created() {
-    ncallbacks++;
-  }
-
-  static int ncallbacks = 0;
-}
-
-main() {
-  useHtmlIndividualConfiguration();
-
-  // Adapted from Blink's
-  // fast/dom/custom/constructor-calls-created-synchronously test.
-
-  var registered = false;
-  setUp(() {
-    return customElementsReady.then((_) {
-      if (!registered) {
-        registered = true;
-        document.registerElement2(A.tag, {'prototype': A});
-      }
-    });
-  });
-
-  test('accessing custom Dart element from JS', () {
-    var a = new A();
-    a.id = 'a';
-    document.body.append(a);
-
-    var script = '''
-      document.querySelector('#a').setAttribute('fromJS', 'true');
-    ''';
-    document.body.append(new ScriptElement()..text = script);
-
-    expect(a.attributes['fromJS'], 'true');
-  });
-
-  test('accessing custom JS element from Dart', () {
-    var script = '''
-    var Foo = document.registerElement2('x-foo', {
-      prototype: Object.create(HTMLElement.prototype, {
-        createdCallback: {
-          value: function() {
-            this.setAttribute('fromJS', 'true');
-          }
-        }
-      })});
-    var foo = new Foo();
-    foo.id = 'b';
-    document.body.appendChild(foo);
-    ''';
-
-    document.body.append(new ScriptElement()..text = script);
-    var custom = document.querySelector('#b');
-    expect(custom is HtmlElement, isTrue);
-    expect(custom.attributes['fromJS'], 'true');
-  });
-}
diff --git a/tests/lib_2/html/custom/js_custom_test.html b/tests/lib_2/html/custom/js_custom_test.html
deleted file mode 100644
index 323f54c..0000000
--- a/tests/lib_2/html/custom/js_custom_test.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="dart.unittest" content="full-stack-traces">
-  <title> js_custom_test </title>
-  <style>
-     .unittest-table { font-family:monospace; border:1px; }
-     .unittest-pass { background: #6b3;}
-     .unittest-fail { background: #d55;}
-     .unittest-error { background: #a11;}
-  </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-</head>
-<body>
-  <h1> Running js_custom_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
-  %TEST_SCRIPTS%
-</body>
-</html>
diff --git a/tests/lib_2/html/custom/mirrors_2_test.dart b/tests/lib_2/html/custom/mirrors_2_test.dart
deleted file mode 100644
index f92022e..0000000
--- a/tests/lib_2/html/custom/mirrors_2_test.dart
+++ /dev/null
@@ -1,74 +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.
-
-import 'dart:html';
-@MirrorsUsed(targets: "tests.html.mirrors_2_test")
-import 'dart:mirrors';
-
-import 'package:expect/expect.dart' show NoInline;
-import 'package:unittest/unittest.dart';
-
-import 'utils.dart';
-
-/// Regression test for http://dartbug/28196
-///
-/// The constructor of a mixin application of a subclass of a Html element is
-/// normally not used. With mirrors the constructor can become available. The
-/// body of the factory has a 'receiver' with an exact type that is the mixin
-/// application. The constructor body functions of the superclasses are called
-/// using the interceptor calling convention. This creates an interceptor
-/// constant of the mixin application type.  In issue 28196 the constant has a
-/// name containing '+' symbols, causing the program to crash during
-/// initializing the constant pool.
-
-main() {
-  var registered = false;
-  setUp(() => customElementsReady.then((_) {
-        if (!registered) {
-          registered = true;
-          document.registerElement2(A.tag, {'prototype': A});
-          document.registerElement2(B.tag, {'prototype': B});
-        }
-      }));
-
-  test('reflectClass', () {
-    expect('AA', new A().token());
-    expect('MM', new B().token());
-    reflectClass(B);
-  });
-}
-
-class A extends HtmlElement {
-  static final tag = 'x-a';
-  factory A() => new Element.tag(tag);
-
-  A.created() : super.created() {
-    // This function must not be inlined otherwise there is no reference to the
-    // interceptor constant. The `@pragma('dart2js:noInline')` annotation does not seem reliable
-    // on generative constructor bodies.
-    try {
-      uninlinedMethod();
-      uninlinedMethod();
-      uninlinedMethod();
-    } finally {
-      uninlinedMethod();
-      uninlinedMethod();
-      uninlinedMethod();
-    }
-  }
-  @pragma('dart2js:noInline')
-  uninlinedMethod() {}
-
-  token() => 'AA';
-}
-
-class B extends A with M {
-  static final tag = 'x-b';
-  factory B() => new Element.tag(tag);
-  B.created() : super.created();
-}
-
-class M {
-  token() => 'MM';
-}
diff --git a/tests/lib_2/html/custom/mirrors_2_test.html b/tests/lib_2/html/custom/mirrors_2_test.html
deleted file mode 100644
index 225759b..0000000
--- a/tests/lib_2/html/custom/mirrors_2_test.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="dart.unittest" content="full-stack-traces">
-  <title> mirrors_2_test </title>
-  <style>
-     .unittest-table { font-family:monospace; border:1px; }
-     .unittest-pass { background: #6b3;}
-     .unittest-fail { background: #d55;}
-     .unittest-error { background: #a11;}
-  </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-</head>
-<body>
-  <h1> Running mirrors_2_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
-  %TEST_SCRIPTS%
-</body>
-</html>
diff --git a/tests/lib_2/html/custom/mirrors_test.dart b/tests/lib_2/html/custom/mirrors_test.dart
deleted file mode 100644
index c08e777..0000000
--- a/tests/lib_2/html/custom/mirrors_test.dart
+++ /dev/null
@@ -1,67 +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.
-
-import 'dart:html';
-@MirrorsUsed(targets: const [A, B])
-import 'dart:mirrors';
-
-import 'package:unittest/html_individual_config.dart';
-import 'package:unittest/unittest.dart';
-
-import 'utils.dart';
-
-/// Regression test for a tricky mirrors+custom_elements issue:
-/// dart2js mirrors cache dispatch information on the Object's constructor.
-/// This was failing for custom elements on IE 10, because the constructor was
-/// HTMLUnknownElement for all of them. So mirrors called the wrong method.
-main() {
-  useHtmlIndividualConfiguration();
-
-  var registered = false;
-  setUp(() => customElementsReady.then((_) {
-        if (!registered) {
-          registered = true;
-          document.registerElement2(A.tag, {'prototype': A});
-          document.registerElement2(B.tag, {'prototype': B});
-        }
-      }));
-
-  test('dynamic dispatch', () {
-    var a = new A();
-    expect(a.fooBar, 1);
-    reflect(a).setField(#fooBar, 123);
-    expect(a.fooBar, 123);
-
-    // Even though A was set first, B.fooBar= should dispatch to B.
-    var b = new B();
-    expect(b.fooBar, 2);
-    expect(b._fooBarSet, 0);
-    reflect(b).setField(#fooBar, 123);
-    expect(b.fooBar, 123);
-    expect(b._fooBarSet, 1);
-  });
-}
-
-class A extends HtmlElement {
-  static final tag = 'x-a';
-  factory A() => new Element.tag(tag);
-  A.created() : super.created();
-
-  int fooBar = 1;
-}
-
-class B extends HtmlElement {
-  static final tag = 'x-b';
-  factory B() => new Element.tag(tag);
-  B.created() : super.created();
-
-  int _fooBar = 2;
-  int _fooBarSet = 0;
-
-  int get fooBar => _fooBar;
-  set fooBar(value) {
-    _fooBarSet++;
-    _fooBar = value;
-  }
-}
diff --git a/tests/lib_2/html/custom/mirrors_test.html b/tests/lib_2/html/custom/mirrors_test.html
deleted file mode 100644
index 34d84b9..0000000
--- a/tests/lib_2/html/custom/mirrors_test.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="dart.unittest" content="full-stack-traces">
-  <title> mirrors_test </title>
-  <style>
-     .unittest-table { font-family:monospace; border:1px; }
-     .unittest-pass { background: #6b3;}
-     .unittest-fail { background: #d55;}
-     .unittest-error { background: #a11;}
-  </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-</head>
-<body>
-  <h1> Running mirrors_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
-  %TEST_SCRIPTS%
-</body>
-</html>
diff --git a/tests/lib_2/html/mirrors_js_typed_interop_test.dart b/tests/lib_2/html/mirrors_js_typed_interop_test.dart
deleted file mode 100644
index 22a43b3..0000000
--- a/tests/lib_2/html/mirrors_js_typed_interop_test.dart
+++ /dev/null
@@ -1,60 +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.
-// dartdevcOptions=--emit-metadata
-
-// TODO(jmesserly): delete this test file once `dart:mirrors` is fully diabled
-// in dart4web compilers.
-
-@JS()
-library tests.html.mirrors_js_typed_interop_test;
-
-import 'dart:mirrors';
-import 'dart:html';
-
-import 'package:js/js.dart';
-import 'package:expect/minitest.dart';
-
-_injectJs() {
-  document.body.append(new ScriptElement()
-    ..type = 'text/javascript'
-    ..innerHtml = r"""
-  window.foo = {
-    x: 3,
-    z: 100,
-    multiplyBy2: function(arg) { return arg * 2; },
-  };
-""");
-}
-
-@JS()
-external Foo get foo;
-
-@JS()
-class Foo {
-  external int get x;
-  external set x(v);
-  external num multiplyBy2(num y);
-}
-
-main() {
-  _injectJs();
-
-  test('dynamic dispatch', () {
-    var f = foo;
-    expect(f.x, 3);
-    // JsInterop methods are not accessible using reflection.
-    expect(() => reflect(f).setField(#x, 123), throws);
-    expect(f.x, 3);
-  });
-
-  test('generic function metadata', () {
-    // TODO(jmesserly): this test is not related to JS interop, but this is the
-    // only test we have for DDC's deprecated --emit-metadata flag.
-    expect(testGenericFunctionMetadata(42), int);
-    var testFn = testGenericFunctionMetadata;
-    expect(reflect(testFn).type.reflectedType, testFn.runtimeType); //# 01: ok
-  });
-}
-
-Type testGenericFunctionMetadata<T>(T _) => T;
diff --git a/tests/lib_2/isolate/illegal_msg_mirror_test.dart b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
index 856e4e8..a15572d 100644
--- a/tests/lib_2/isolate/illegal_msg_mirror_test.dart
+++ b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
@@ -8,7 +8,6 @@
 library illegal_msg_mirror_test;
 
 import "dart:isolate";
-@MirrorsUsed(targets: "Class")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/remote_unittest_helper.dart b/tests/lib_2/isolate/remote_unittest_helper.dart
index 521956a3..ea440d1 100644
--- a/tests/lib_2/isolate/remote_unittest_helper.dart
+++ b/tests/lib_2/isolate/remote_unittest_helper.dart
@@ -9,7 +9,6 @@
 
 import "dart:isolate";
 import "package:unittest/unittest.dart";
-@MirrorsUsed(symbols: "main", targets: "main", override: "*")
 import "dart:mirrors";
 
 /**
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 1c24f7b..8151fcf 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -55,7 +55,6 @@
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
 mirrors/invocation_fuzz_test: Crash
 mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
-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.
 mirrors/native_class_test: SkipByDesign # Imports dart:html
 
 [ $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
diff --git a/tests/lib_2/lib_2_vm.status b/tests/lib_2/lib_2_vm.status
index 58d98a9..4fd19d7 100644
--- a/tests/lib_2/lib_2_vm.status
+++ b/tests/lib_2/lib_2_vm.status
@@ -23,8 +23,6 @@
 mirrors/generics_test/01: MissingCompileTimeError
 mirrors/initializing_formals_test/01: Fail # initializing formals are implicitly final as of Dart 1.21
 mirrors/metadata_nested_constructor_call_test/none: CompileTimeError
-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.
-mirrors/native_class_test: SkipByDesign # Imports dart:html
 mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
 mirrors/redirecting_factory_test/01: RuntimeError
 mirrors/redirecting_factory_test/none: RuntimeError
diff --git a/tests/lib_2/mirrors/array_tracing3_test.dart b/tests/lib_2/mirrors/array_tracing3_test.dart
index 38a6a61..092feac 100644
--- a/tests/lib_2/mirrors/array_tracing3_test.dart
+++ b/tests/lib_2/mirrors/array_tracing3_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@MirrorsUsed(targets: 'A, List')
 import 'dart:mirrors';
 
 class A {
diff --git a/tests/lib_2/mirrors/bad_argument_types_test.dart b/tests/lib_2/mirrors/bad_argument_types_test.dart
index 8063803..a6d129f 100644
--- a/tests/lib_2/mirrors/bad_argument_types_test.dart
+++ b/tests/lib_2/mirrors/bad_argument_types_test.dart
@@ -80,7 +80,7 @@
 }
 
 void badStaticInvoke() {
-  final ClosureMirror im = reflect(foo);
+  final im = reflect(foo) as ClosureMirror;
   Expect.throwsTypeError(() => im.apply(['Hello world!']));
 }
 
@@ -124,7 +124,7 @@
 }
 
 void badGenericStaticInvoke() {
-  final ClosureMirror im = reflect(bar);
+  final im = reflect(bar) as ClosureMirror;
   Expect.throwsTypeError(() => im.apply(['Hello world!']));
 }
 
diff --git a/tests/lib_2/mirrors/basic_types_in_dart_core_test.dart b/tests/lib_2/mirrors/basic_types_in_dart_core_test.dart
index 4ef60f8..50e9203 100644
--- a/tests/lib_2/mirrors/basic_types_in_dart_core_test.dart
+++ b/tests/lib_2/mirrors/basic_types_in_dart_core_test.dart
@@ -10,42 +10,43 @@
 main() {
   LibraryMirror dartcore = currentMirrorSystem().findLibrary(#dart.core);
   ClassMirror cm;
+  TypeMirror tm;
 
-  cm = dartcore.declarations[#int];
+  cm = dartcore.declarations[#int] as ClassMirror;
   Expect.equals(reflectClass(int), cm);
   Expect.equals(#int, cm.simpleName);
 
-  cm = dartcore.declarations[#double];
+  cm = dartcore.declarations[#double] as ClassMirror;
   Expect.equals(reflectClass(double), cm);
   Expect.equals(#double, cm.simpleName);
 
-  cm = dartcore.declarations[#num];
+  cm = dartcore.declarations[#num] as ClassMirror;
   Expect.equals(reflectClass(num), cm);
   Expect.equals(#num, cm.simpleName);
 
-  cm = dartcore.declarations[#bool];
+  cm = dartcore.declarations[#bool] as ClassMirror;
   Expect.equals(reflectClass(bool), cm);
   Expect.equals(#bool, cm.simpleName);
 
-  cm = dartcore.declarations[#String];
+  cm = dartcore.declarations[#String] as ClassMirror;
   Expect.equals(reflectClass(String), cm);
   Expect.equals(#String, cm.simpleName);
 
-  cm = dartcore.declarations[#List];
+  cm = dartcore.declarations[#List] as ClassMirror;
   Expect.equals(reflectClass(List), cm);
   Expect.equals(#List, cm.simpleName);
 
-  cm = dartcore.declarations[#Null];
+  cm = dartcore.declarations[#Null] as ClassMirror;
   Expect.equals(reflectClass(Null), cm);
   Expect.equals(#Null, cm.simpleName);
 
-  cm = dartcore.declarations[#Object];
+  cm = dartcore.declarations[#Object] as ClassMirror;
   Expect.equals(reflectClass(Object), cm);
   Expect.equals(#Object, cm.simpleName);
 
-  cm = dartcore.declarations[#dynamic];
-  Expect.isNull(cm);
+  tm = dartcore.declarations[#dynamic] as TypeMirror;
+  Expect.isNull(tm);
 
-  cm = dartcore.declarations[const Symbol('void')];
-  Expect.isNull(cm);
+  tm = dartcore.declarations[const Symbol('void')] as TypeMirror;
+  Expect.isNull(tm);
 }
diff --git a/tests/lib_2/mirrors/class_mirror_location_test.dart b/tests/lib_2/mirrors/class_mirror_location_test.dart
index 95fe444..3132b0d 100644
--- a/tests/lib_2/mirrors/class_mirror_location_test.dart
+++ b/tests/lib_2/mirrors/class_mirror_location_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 library test.class_location;
 
-@MirrorsUsed(targets: "test.class_location")
 import "dart:mirrors";
 import "package:expect/expect.dart";
 
@@ -35,11 +34,12 @@
 // any number of absolute paths.
 expectLocation(
     DeclarationMirror mirror, String uriSuffix, int line, int column) {
-  Uri uri = mirror.location.sourceUri;
+  final location = mirror.location;
+  final uri = location.sourceUri;
   Expect.isTrue(
       uri.toString().endsWith(uriSuffix), "Expected suffix $uriSuffix in $uri");
-  Expect.equals(line, mirror.location.line, "line");
-  Expect.equals(column, mirror.location.column, "column");
+  Expect.equals(line, location.line, "line");
+  Expect.equals(column, location.column, "column");
 }
 
 main() {
diff --git a/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart b/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart
index a1d2f58..adee190 100644
--- a/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart
+++ b/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart
@@ -45,8 +45,8 @@
 
   TypeVariableMirror aT = a.typeVariables[0];
   TypeVariableMirror aS = a.typeVariables[1];
-  ClassMirror aTBound = aT.upperBound;
-  ClassMirror aSBound = aS.upperBound;
+  ClassMirror aTBound = aT.upperBound as ClassMirror;
+  ClassMirror aSBound = aS.upperBound as ClassMirror;
 
   Expect.isTrue(aTBound.isOriginalDeclaration);
   Expect.isTrue(aSBound.isOriginalDeclaration);
@@ -64,8 +64,8 @@
 
   TypeVariableMirror bZ = b.typeVariables[0];
   TypeVariableMirror cZ = c.typeVariables[0];
-  ClassMirror bZBound = bZ.upperBound;
-  ClassMirror cZBound = cZ.upperBound;
+  ClassMirror bZBound = bZ.upperBound as ClassMirror;
+  ClassMirror cZBound = cZ.upperBound as ClassMirror;
 
   Expect.isFalse(bZBound.isOriginalDeclaration);
   Expect.isFalse(cZBound.isOriginalDeclaration);
@@ -108,7 +108,7 @@
 void testE(Env env) {
   ClassMirror e = env.getE();
   TypeVariableMirror eR = e.typeVariables.single;
-  ClassMirror mapRAndHelperOfString = eR.upperBound;
+  ClassMirror mapRAndHelperOfString = eR.upperBound as ClassMirror;
 
   Expect.isFalse(mapRAndHelperOfString.isOriginalDeclaration);
   Expect.equals(eR, mapRAndHelperOfString.typeArguments.first);
@@ -119,8 +119,8 @@
 void testF(Env env) {
   ClassMirror f = env.getF();
   TypeVariableMirror fZ = f.typeVariables[0];
-  ClassMirror fZBound = fZ.upperBound;
-  ClassMirror fZBoundTypeArgument = fZBound.typeArguments.single;
+  ClassMirror fZBound = fZ.upperBound as ClassMirror;
+  ClassMirror fZBoundTypeArgument = fZBound.typeArguments.single as ClassMirror;
 
   Expect.equals(1, f.typeVariables.length);
   Expect.isFalse(fZBound.isOriginalDeclaration);
diff --git a/tests/lib_2/mirrors/closurization_equivalence_test.dart b/tests/lib_2/mirrors/closurization_equivalence_test.dart
index 2ac9161..e1cdbed 100644
--- a/tests/lib_2/mirrors/closurization_equivalence_test.dart
+++ b/tests/lib_2/mirrors/closurization_equivalence_test.dart
@@ -13,7 +13,7 @@
 }
 
 main() {
-  LibraryMirror thisLibrary = reflectClass(C).owner;
+  LibraryMirror thisLibrary = reflectClass(C).owner as LibraryMirror;
   Expect.equals(thisLibrary.declarations[#topLevelMethod],
       (reflect(topLevelMethod) as ClosureMirror).function, "topLevel");
 
diff --git a/tests/lib_2/mirrors/constructor_kinds_test.dart b/tests/lib_2/mirrors/constructor_kinds_test.dart
index be4550b..185e7d0 100644
--- a/tests/lib_2/mirrors/constructor_kinds_test.dart
+++ b/tests/lib_2/mirrors/constructor_kinds_test.dart
@@ -44,7 +44,7 @@
   cm = reflectClass(ClassWithDefaultConstructor);
   mm = cm.declarations.values
       .where((d) => d is MethodMirror && d.isConstructor)
-      .single;
+      .single as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
@@ -53,42 +53,42 @@
 
   cm = reflectClass(Class);
 
-  mm = cm.declarations[#Class.generativeConstructor];
+  mm = cm.declarations[#Class.generativeConstructor] as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
   Expect.isFalse(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.declarations[#Class.redirectingGenerativeConstructor];
+  mm = cm.declarations[#Class.redirectingGenerativeConstructor] as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
   Expect.isTrue(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.declarations[#Class.factoryConstructor];
+  mm = cm.declarations[#Class.factoryConstructor] as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isFalse(mm.isGenerativeConstructor);
   Expect.isTrue(mm.isFactoryConstructor);
   Expect.isFalse(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.declarations[#Class.redirectingFactoryConstructor];
+  mm = cm.declarations[#Class.redirectingFactoryConstructor] as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isFalse(mm.isGenerativeConstructor);
   Expect.isTrue(mm.isFactoryConstructor);
   Expect.isTrue(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.declarations[#Class.constGenerativeConstructor];
+  mm = cm.declarations[#Class.constGenerativeConstructor] as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
   Expect.isFalse(mm.isRedirectingConstructor);
   Expect.isTrue(mm.isConstConstructor);
 
-  mm = cm.declarations[#Class.constRedirectingGenerativeConstructor];
+  mm = cm.declarations[#Class.constRedirectingGenerativeConstructor] as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
@@ -96,14 +96,14 @@
   Expect.isTrue(mm.isConstConstructor);
 
   // Not legal.
-  // mm = cm.declarations[#Class.constFactoryConstructor];
+  // mm = cm.declarations[#Class.constFactoryConstructor] as MethodMirror;
   // Expect.isTrue(mm.isConstructor);
   // Expect.isFalse(mm.isGenerativeConstructor);
   // Expect.isTrue(mm.isFactoryConstructor);
   // Expect.isFalse(mm.isRedirectingConstructor);
   // Expect.isTrue(mm.isConstConstructor);
 
-  mm = cm.declarations[#Class.constRedirectingFactoryConstructor];
+  mm = cm.declarations[#Class.constRedirectingFactoryConstructor] as MethodMirror;
   Expect.isTrue(mm.isConstructor);
   Expect.isFalse(mm.isGenerativeConstructor);
   Expect.isTrue(mm.isFactoryConstructor);
diff --git a/tests/lib_2/mirrors/constructor_optional_args_test.dart b/tests/lib_2/mirrors/constructor_optional_args_test.dart
index 94f84f7..5592fd2 100644
--- a/tests/lib_2/mirrors/constructor_optional_args_test.dart
+++ b/tests/lib_2/mirrors/constructor_optional_args_test.dart
@@ -4,7 +4,6 @@
 
 library test.constructor_test;
 
-@MirrorsUsed(targets: const [A])
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart b/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart
index 81d67c8..80b43b9 100644
--- a/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart
+++ b/tests/lib_2/mirrors/deferred_mirrors_metadata_lib.dart
@@ -1,8 +1,6 @@
 library lib;
 
 import "deferred_mirrors_metadata_test.dart";
-@MirrorsUsed(
-    targets: const ["main", "main.A", "main.B", "main.C", "main.D", "lib.E"])
 import "dart:mirrors";
 
 class H {
@@ -11,13 +9,13 @@
 
 class F {
   @H()
-  int f;
+  int f = 0;
 }
 
 @C()
 class E {
   @D()
-  var f;
+  dynamic f;
 }
 
 String foo() {
diff --git a/tests/lib_2/mirrors/deferred_mirrors_metatarget_lib.dart b/tests/lib_2/mirrors/deferred_mirrors_metatarget_lib.dart
index a5f49e2..e48c4cc 100644
--- a/tests/lib_2/mirrors/deferred_mirrors_metatarget_lib.dart
+++ b/tests/lib_2/mirrors/deferred_mirrors_metatarget_lib.dart
@@ -4,7 +4,6 @@
 
 library lib;
 
-@MirrorsUsed(metaTargets: "MetaTarget")
 import "dart:mirrors";
 
 class MetaTarget {
@@ -17,6 +16,7 @@
 }
 
 String foo() {
-  ClassMirror a = currentMirrorSystem().findLibrary(#lib).declarations[#A];
+  final a =
+      currentMirrorSystem().findLibrary(#lib).declarations[#A] as ClassMirror;
   return a.newInstance(Symbol.empty, []).invoke(#toString, []).reflectee;
 }
diff --git a/tests/lib_2/mirrors/deferred_mirrors_update_lib.dart b/tests/lib_2/mirrors/deferred_mirrors_update_lib.dart
index a0427e3..02b1f3b 100644
--- a/tests/lib_2/mirrors/deferred_mirrors_update_lib.dart
+++ b/tests/lib_2/mirrors/deferred_mirrors_update_lib.dart
@@ -1,6 +1,5 @@
 library lib;
 
-@MirrorsUsed(targets: "lib.C")
 import "dart:mirrors";
 
 class C {}
diff --git a/tests/lib_2/mirrors/deferred_mirrors_update_test.dart b/tests/lib_2/mirrors/deferred_mirrors_update_test.dart
index 74c76d4..bf1fbbc 100644
--- a/tests/lib_2/mirrors/deferred_mirrors_update_test.dart
+++ b/tests/lib_2/mirrors/deferred_mirrors_update_test.dart
@@ -2,7 +2,6 @@
 
 // Test that the library-mirrors are updated after loading a deferred library.
 
-@MirrorsUsed(targets: "D")
 import "dart:mirrors";
 
 import "deferred_mirrors_update_lib.dart" deferred as l;
diff --git a/tests/lib_2/mirrors/equality_test.dart b/tests/lib_2/mirrors/equality_test.dart
index e71b11e..0fa6fb4 100644
--- a/tests/lib_2/mirrors/equality_test.dart
+++ b/tests/lib_2/mirrors/equality_test.dart
@@ -26,9 +26,9 @@
 }
 
 typedef bool Predicate(Object o);
-Predicate somePredicate;
+Predicate somePredicate = (Object o) => false;
 
-checkEquality(List<Map> equivalenceClasses) {
+checkEquality(List<Map<String, Object>> equivalenceClasses) {
   for (var equivalenceClass in equivalenceClasses) {
     equivalenceClass.forEach((name, member) {
       equivalenceClass.forEach((otherName, otherMember) {
@@ -61,7 +61,7 @@
   var badEqualityHash1 = new BadEqualityHash();
   var badEqualityHash2 = new BadEqualityHash();
 
-  checkEquality([
+  checkEquality(<Map<String, Object>>[
     {'reflect(o1)': reflect(o1), 'reflect(o1), again': reflect(o1)},
     {'reflect(o2)': reflect(o2), 'reflect(o2), again': reflect(o2)},
     {
diff --git a/tests/lib_2/mirrors/fake_function_with_call_test.dart b/tests/lib_2/mirrors/fake_function_with_call_test.dart
index 8c98cba..43522bc 100644
--- a/tests/lib_2/mirrors/fake_function_with_call_test.dart
+++ b/tests/lib_2/mirrors/fake_function_with_call_test.dart
@@ -23,7 +23,7 @@
 main() {
   Expect.isTrue(new WannabeFunction() is Function);
 
-  ClosureMirror cm = reflect(new WannabeFunction());
+  ClosureMirror cm = reflect(new WannabeFunction()) as ClosureMirror;
   Expect.equals(7, cm.invoke(#call, [3, 4]).reflectee);
   Expect.throwsNoSuchMethodError(() => cm.invoke(#call, [3]), "Wrong arity");
   Expect.equals(49, cm.invoke(#method, [7]).reflectee);
diff --git a/tests/lib_2/mirrors/fake_function_without_call_test.dart b/tests/lib_2/mirrors/fake_function_without_call_test.dart
index 1d341ea..3d80c03 100644
--- a/tests/lib_2/mirrors/fake_function_without_call_test.dart
+++ b/tests/lib_2/mirrors/fake_function_without_call_test.dart
@@ -25,7 +25,7 @@
   Expect.equals('a,b,c', Function.apply(f, ['a', 'b', 'c']));
   Expect.throwsNoSuchMethodError(() => f.foo('a', 'b', 'c'));
 
-  ClosureMirror cm = reflect(f);
+  ClosureMirror cm = reflect(f) as ClosureMirror;
   Expect.isTrue(cm is ClosureMirror);
   Expect.equals('a', cm.apply(['a']).reflectee);
   Expect.equals('a,b', cm.apply(['a', 'b']).reflectee);
diff --git a/tests/lib_2/mirrors/field_metadata2_test.dart b/tests/lib_2/mirrors/field_metadata2_test.dart
index e3dc834..60e1b6c 100644
--- a/tests/lib_2/mirrors/field_metadata2_test.dart
+++ b/tests/lib_2/mirrors/field_metadata2_test.dart
@@ -18,9 +18,11 @@
   // Check that we can now reflect on the annotations.
   dynamic f = new Foo();
   var members = reflect(f).type.declarations;
-  var bar = members[#x].metadata.first.reflectee as Bar;
+  var x = members[#x] as VariableMirror;
+  var bar = x.metadata.first.reflectee as Bar;
   Expect.equals(bar.name, 'bar');
 
-  var baz = members[#y].metadata.first.reflectee as Bar;
+  var y = members[#y] as VariableMirror;
+  var baz = y.metadata.first.reflectee as Bar;
   Expect.equals(baz.name, 'baz');
 }
diff --git a/tests/lib_2/mirrors/field_type_test.dart b/tests/lib_2/mirrors/field_type_test.dart
index 9e56745..9b2356b 100644
--- a/tests/lib_2/mirrors/field_type_test.dart
+++ b/tests/lib_2/mirrors/field_type_test.dart
@@ -7,7 +7,7 @@
 import 'dart:mirrors';
 import "package:expect/expect.dart";
 
-String toplevelVariable;
+String toplevelVariable = "";
 
 class C {
   final int i;
@@ -15,10 +15,10 @@
 }
 
 class A<T> {
-  static int staticField;
+  static int staticField = 0;
   @C(42)
   @C(44)
-  String field;
+  String field = "";
   var dynamicTypeField;
   T typeVariableField;
   H<int> parameterizedTypeField;
@@ -28,12 +28,14 @@
 
 testOriginalDeclaration() {
   ClassMirror a = reflectClass(A);
-  VariableMirror staticField = a.declarations[#staticField];
-  VariableMirror field = a.declarations[#field];
-  VariableMirror dynamicTypeField = a.declarations[#dynamicTypeField];
-  VariableMirror typeVariableField = a.declarations[#typeVariableField];
+  VariableMirror staticField = a.declarations[#staticField] as VariableMirror;
+  VariableMirror field = a.declarations[#field] as VariableMirror;
+  VariableMirror dynamicTypeField =
+      a.declarations[#dynamicTypeField] as VariableMirror;
+  VariableMirror typeVariableField =
+      a.declarations[#typeVariableField] as VariableMirror;
   VariableMirror parameterizedTypeField =
-      a.declarations[#parameterizedTypeField];
+      a.declarations[#parameterizedTypeField] as VariableMirror;
 
   Expect.equals(reflectType(int), staticField.type);
   Expect.equals(reflectClass(String), field.type);
@@ -48,12 +50,15 @@
 
 testInstance() {
   ClassMirror aOfString = reflect(new A<String>()).type;
-  VariableMirror staticField = aOfString.declarations[#staticField];
-  VariableMirror field = aOfString.declarations[#field];
-  VariableMirror dynamicTypeField = aOfString.declarations[#dynamicTypeField];
-  VariableMirror typeVariableField = aOfString.declarations[#typeVariableField];
+  VariableMirror staticField =
+      aOfString.declarations[#staticField] as VariableMirror;
+  VariableMirror field = aOfString.declarations[#field] as VariableMirror;
+  VariableMirror dynamicTypeField =
+      aOfString.declarations[#dynamicTypeField] as VariableMirror;
+  VariableMirror typeVariableField =
+      aOfString.declarations[#typeVariableField] as VariableMirror;
   VariableMirror parameterizedTypeField =
-      aOfString.declarations[#parameterizedTypeField];
+      aOfString.declarations[#parameterizedTypeField] as VariableMirror;
 
   Expect.equals(reflectType(int), staticField.type);
   Expect.equals(reflectClass(String), field.type);
@@ -68,7 +73,8 @@
 
 testTopLevel() {
   LibraryMirror currentLibrary = currentMirrorSystem().findLibrary(#field_test);
-  VariableMirror topLevel = currentLibrary.declarations[#toplevelVariable];
+  VariableMirror topLevel =
+      currentLibrary.declarations[#toplevelVariable] as VariableMirror;
   Expect.equals(reflectClass(String), topLevel.type);
 }
 
diff --git a/tests/lib_2/mirrors/function_apply_mirrors_lib.dart b/tests/lib_2/mirrors/function_apply_mirrors_lib.dart
index e94a55a..3c4c510 100644
--- a/tests/lib_2/mirrors/function_apply_mirrors_lib.dart
+++ b/tests/lib_2/mirrors/function_apply_mirrors_lib.dart
@@ -4,7 +4,6 @@
 
 library function_apply_mirrors_lib;
 
-@MirrorsUsed(targets: "function_apply_mirrors_lib")
 import "dart:mirrors";
 
 bar() => reflect(499).reflectee;
diff --git a/tests/lib_2/mirrors/function_apply_test.dart b/tests/lib_2/mirrors/function_apply_test.dart
index f9a861e..206d08b 100644
--- a/tests/lib_2/mirrors/function_apply_test.dart
+++ b/tests/lib_2/mirrors/function_apply_test.dart
@@ -4,7 +4,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
@@ -18,23 +17,23 @@
 
 main() {
   // Static function.
-  ClosureMirror f1 = reflect(foo);
+  ClosureMirror f1 = reflect(foo) as ClosureMirror;
   Expect.equals(1456, f1.apply([1000]).reflectee);
 
   // Local declaration.
   chomp(int z) => z + 42;
-  ClosureMirror f2 = reflect(chomp);
+  ClosureMirror f2 = reflect(chomp) as ClosureMirror;
   Expect.equals(1042, f2.apply([1000]).reflectee);
 
   // Local expression.
-  ClosureMirror f3 = reflect((u) => u + 987);
+  ClosureMirror f3 = reflect((u) => u + 987) as ClosureMirror;
   Expect.equals(1987, f3.apply([1000]).reflectee);
 
   // Instance property extraction.
-  ClosureMirror f4 = reflect(new A().bar);
+  ClosureMirror f4 = reflect(new A().bar) as ClosureMirror;
   Expect.equals(1321, f4.apply([1000]).reflectee);
 
   // Instance implementing Function via call method.
-  ClosureMirror f5 = reflect(new A());
+  ClosureMirror f5 = reflect(new A()) as ClosureMirror;
   Expect.equals(1123, f5.apply([1000]).reflectee);
 }
diff --git a/tests/lib_2/mirrors/function_type_mirror_test.dart b/tests/lib_2/mirrors/function_type_mirror_test.dart
index 3b547e3..3b2a595 100644
--- a/tests/lib_2/mirrors/function_type_mirror_test.dart
+++ b/tests/lib_2/mirrors/function_type_mirror_test.dart
@@ -11,13 +11,13 @@
 bar(int a) {}
 
 main() {
-  TypedefMirror tm = reflectType(FooFunction);
+  TypedefMirror tm = reflectType(FooFunction) as TypedefMirror;
   FunctionTypeMirror ftm = tm.referent;
   Expect.equals(const Symbol('void'), ftm.returnType.simpleName);
   Expect.equals(#int, ftm.parameters[0].type.simpleName);
   Expect.equals(#double, ftm.parameters[1].type.simpleName);
-  ClosureMirror cm = reflect(bar);
-  ftm = cm.type;
+  ClosureMirror cm = reflect(bar) as ClosureMirror;
+  ftm = cm.type as FunctionTypeMirror;
   Expect.equals(#dynamic, ftm.returnType.simpleName);
   Expect.equals(#int, ftm.parameters[0].type.simpleName);
 }
diff --git a/tests/lib_2/mirrors/generic_f_bounded_mixin_application_test.dart b/tests/lib_2/mirrors/generic_f_bounded_mixin_application_test.dart
index 2b8d81e..5df9521 100644
--- a/tests/lib_2/mirrors/generic_f_bounded_mixin_application_test.dart
+++ b/tests/lib_2/mirrors/generic_f_bounded_mixin_application_test.dart
@@ -80,7 +80,7 @@
       collectionWithSerializableOfOrderedCollection.isOriginalDeclaration);
 
   TypeVariableMirror rFromSerializer = serializerDecl.typeVariables.single;
-  ClassMirror serializableOfR = rFromSerializer.upperBound;
+  ClassMirror serializableOfR = rFromSerializer.upperBound as ClassMirror;
   Expect.isFalse(serializableOfR.isOriginalDeclaration);
   Expect.equals(serializableDecl, serializableOfR.originalDeclaration);
   Expect.equals(rFromSerializer, serializableOfR.typeArguments.single);
diff --git a/tests/lib_2/mirrors/generic_function_typedef_test.dart b/tests/lib_2/mirrors/generic_function_typedef_test.dart
index e119d51..6b0d44b 100644
--- a/tests/lib_2/mirrors/generic_function_typedef_test.dart
+++ b/tests/lib_2/mirrors/generic_function_typedef_test.dart
@@ -26,15 +26,18 @@
   TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;
 
   TypedefMirror predicateOfNum =
-      (reflectClass(C).declarations[#predicateOfNum] as VariableMirror).type;
+      (reflectClass(C).declarations[#predicateOfNum] as VariableMirror).type
+          as TypedefMirror;
   TypedefMirror transformOfString =
-      (reflectClass(C).declarations[#transformOfString] as VariableMirror).type;
+      (reflectClass(C).declarations[#transformOfString] as VariableMirror).type
+          as TypedefMirror;
   TypedefMirror transformOfR =
-      (reflectClass(C).declarations[#transformOfR] as VariableMirror).type;
+      (reflectClass(C).declarations[#transformOfR] as VariableMirror).type
+          as TypedefMirror;
   TypedefMirror transformOfDouble = (reflect(new C<double>())
           .type
           .declarations[#transformOfR] as VariableMirror)
-      .type;
+      .type as TypedefMirror;
 
   TypeVariableMirror tFromGenericPredicate =
       reflectTypeDeclaration(GenericPredicate).typeVariables[0];
diff --git a/tests/lib_2/mirrors/generic_local_function_test.dart b/tests/lib_2/mirrors/generic_local_function_test.dart
index 92a02a3..bc56f29 100644
--- a/tests/lib_2/mirrors/generic_local_function_test.dart
+++ b/tests/lib_2/mirrors/generic_local_function_test.dart
@@ -28,11 +28,13 @@
 }
 
 main() {
-  ClosureMirror closure1 = reflect(new C<String>().makeClosure1());
+  ClosureMirror closure1 =
+      reflect(new C<String>().makeClosure1()) as ClosureMirror;
   Expect.equals(reflectClass(String), closure1.function.returnType);
   Expect.equals(reflectClass(String), closure1.function.parameters[0].type);
 
-  ClosureMirror closure2 = reflect(new C<String>().makeClosure2());
+  ClosureMirror closure2 =
+      reflect(new C<String>().makeClosure2()) as ClosureMirror;
   Expect.equals(reflectClass(String), closure2.function.returnType);
   Expect.equals(reflectClass(String), closure2.function.parameters[0].type);
 }
diff --git a/tests/lib_2/mirrors/generic_type_mirror_test.dart b/tests/lib_2/mirrors/generic_type_mirror_test.dart
index 684f5f3..97603d5 100644
--- a/tests/lib_2/mirrors/generic_type_mirror_test.dart
+++ b/tests/lib_2/mirrors/generic_type_mirror_test.dart
@@ -26,13 +26,13 @@
   ClassMirror bar = reflect(new Bar()).type;
   ClassMirror baz = reflect(new Baz()).type;
   ClassMirror hOfBaz = reflect(new H<Baz>()).type;
-  VariableMirror field = foo.declarations[#field];
-  MethodMirror getter = foo.declarations[#bar];
-  MethodMirror setter = foo.declarations[const Symbol('bar=')];
-  MethodMirror m = foo.declarations[#m];
-  MethodMirror n = foo.declarations[#n];
-  MethodMirror o = foo.declarations[#o];
-  MethodMirror p = foo.declarations[#p];
+  VariableMirror field = foo.declarations[#field] as VariableMirror;
+  MethodMirror getter = foo.declarations[#bar] as MethodMirror;
+  MethodMirror setter = foo.declarations[const Symbol('bar=')] as MethodMirror;
+  MethodMirror m = foo.declarations[#m] as MethodMirror;
+  MethodMirror n = foo.declarations[#n] as MethodMirror;
+  MethodMirror o = foo.declarations[#o] as MethodMirror;
+  MethodMirror p = foo.declarations[#p] as MethodMirror;
 
   Expect.equals(foo, field.owner);
   Expect.equals(foo, getter.owner);
@@ -57,15 +57,15 @@
 void testOriginalDeclaration() {
   ClassMirror foo = reflectClass(Foo);
 
-  VariableMirror field = foo.declarations[#field];
-  MethodMirror getter = foo.declarations[#bar];
-  MethodMirror setter = foo.declarations[const Symbol('bar=')];
-  MethodMirror m = foo.declarations[#m];
-  MethodMirror n = foo.declarations[#n];
-  MethodMirror o = foo.declarations[#o];
-  MethodMirror p = foo.declarations[#p];
-  TypeVariableMirror w = foo.typeVariables[0];
-  TypeVariableMirror v = foo.typeVariables[1];
+  VariableMirror field = foo.declarations[#field] as VariableMirror;
+  MethodMirror getter = foo.declarations[#bar] as MethodMirror;
+  MethodMirror setter = foo.declarations[const Symbol('bar=')] as MethodMirror;
+  MethodMirror m = foo.declarations[#m] as MethodMirror;
+  MethodMirror n = foo.declarations[#n] as MethodMirror;
+  MethodMirror o = foo.declarations[#o] as MethodMirror;
+  MethodMirror p = foo.declarations[#p] as MethodMirror;
+  TypeVariableMirror w = foo.typeVariables[0] as TypeVariableMirror;
+  TypeVariableMirror v = foo.typeVariables[1] as TypeVariableMirror;
 
   Expect.equals(foo, field.owner);
   Expect.equals(foo, getter.owner);
diff --git a/tests/lib_2/mirrors/generics_double_substitution_test.dart b/tests/lib_2/mirrors/generics_double_substitution_test.dart
index ae0666e..a44fb3a 100644
--- a/tests/lib_2/mirrors/generics_double_substitution_test.dart
+++ b/tests/lib_2/mirrors/generics_double_substitution_test.dart
@@ -14,7 +14,7 @@
 
 class C<T> extends B<A<T>> {
   A<T> field;
-  A<T> returnType() {}
+  A<T> returnType() => new A<T>();
   parameterType(A<T> param) {}
 }
 
@@ -22,15 +22,15 @@
   ClassMirror cOfString = reflect(new C<String>()).type;
   ClassMirror aOfString = reflect(new A<String>()).type;
 
-  VariableMirror field = cOfString.declarations[#field];
+  VariableMirror field = cOfString.declarations[#field] as VariableMirror;
   Expect.equals(aOfString, field.type);
 
-  MethodMirror returnType = cOfString.declarations[#returnType];
+  MethodMirror returnType = cOfString.declarations[#returnType] as MethodMirror;
   Expect.equals(aOfString, returnType.returnType);
 
-  MethodMirror parameterType = cOfString.declarations[#parameterType];
+  MethodMirror parameterType = cOfString.declarations[#parameterType] as MethodMirror;
   Expect.equals(aOfString, parameterType.parameters.single.type);
 
-  ClassMirror typeArgOfSuperclass = cOfString.superclass.typeArguments.single;
+  ClassMirror typeArgOfSuperclass = cOfString.superclass.typeArguments.single as ClassMirror;
   Expect.equals(aOfString, typeArgOfSuperclass); //# 01: ok
 }
diff --git a/tests/lib_2/mirrors/generics_dynamic_test.dart b/tests/lib_2/mirrors/generics_dynamic_test.dart
index fa8e2d9..40c82d6 100644
--- a/tests/lib_2/mirrors/generics_dynamic_test.dart
+++ b/tests/lib_2/mirrors/generics_dynamic_test.dart
@@ -28,8 +28,8 @@
   TypeMirror cTypeArgument = cNestedInstance.typeArguments.first;
   TypeMirror superA = bDecl.superclass;
   TypeMirror superC = bDecl.superinterfaces.single;
-  MethodMirror m = bDecl.declarations[#m];
-  VariableMirror field = bDecl.declarations[#field];
+  MethodMirror m = bDecl.declarations[#m] as MethodMirror;
+  VariableMirror field = bDecl.declarations[#field] as VariableMirror;
   TypeMirror returnTypeA = m.returnType;
   TypeMirror parameterTypeA = m.parameters.first.type;
   TypeMirror fieldTypeA = field.type;
diff --git a/tests/lib_2/mirrors/generics_substitution_test.dart b/tests/lib_2/mirrors/generics_substitution_test.dart
index de13f2e..b078c1a 100644
--- a/tests/lib_2/mirrors/generics_substitution_test.dart
+++ b/tests/lib_2/mirrors/generics_substitution_test.dart
@@ -13,7 +13,7 @@
 }
 
 class Generic<T> extends SuperGeneric<T, int> {
-  T t() {}
+  T t() => throw "does-not-return"; //
 }
 
 main() {
diff --git a/tests/lib_2/mirrors/get_field_cache_test.dart b/tests/lib_2/mirrors/get_field_cache_test.dart
index 4c71dbc..60c57f5 100644
--- a/tests/lib_2/mirrors/get_field_cache_test.dart
+++ b/tests/lib_2/mirrors/get_field_cache_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@MirrorsUsed(targets: const ["A", "B"])
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/get_field_static_test.dart b/tests/lib_2/mirrors/get_field_static_test.dart
index 4914cb9..60edc92 100644
--- a/tests/lib_2/mirrors/get_field_static_test.dart
+++ b/tests/lib_2/mirrors/get_field_static_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@MirrorsUsed(targets: "A")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/get_field_test.dart b/tests/lib_2/mirrors/get_field_test.dart
index c733ea0..d2a2d1c 100644
--- a/tests/lib_2/mirrors/get_field_test.dart
+++ b/tests/lib_2/mirrors/get_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@MirrorsUsed(targets: "A")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/globalized_closures2_test.dart b/tests/lib_2/mirrors/globalized_closures2_test.dart
index 5581ff2..d4927c9 100644
--- a/tests/lib_2/mirrors/globalized_closures2_test.dart
+++ b/tests/lib_2/mirrors/globalized_closures2_test.dart
@@ -33,6 +33,5 @@
       collectedParents.add(MirrorSystem.getName(c.superclass.simpleName));
     }
   }
-  ;
   Expect.isTrue(collectedParents.isEmpty); //  //# 00: ok
 }
diff --git a/tests/lib_2/mirrors/globalized_closures_test.dart b/tests/lib_2/mirrors/globalized_closures_test.dart
index 9928f7e..93b0bf0 100644
--- a/tests/lib_2/mirrors/globalized_closures_test.dart
+++ b/tests/lib_2/mirrors/globalized_closures_test.dart
@@ -32,6 +32,5 @@
       collectedParents.add(MirrorSystem.getName(c.superclass.simpleName));
     }
   }
-  ;
   Expect.listEquals(["Object"], collectedParents); //  //# 00: ok
 }
diff --git a/tests/lib_2/mirrors/hot_get_field_test.dart b/tests/lib_2/mirrors/hot_get_field_test.dart
index 77ea508..65cf281 100644
--- a/tests/lib_2/mirrors/hot_get_field_test.dart
+++ b/tests/lib_2/mirrors/hot_get_field_test.dart
@@ -38,7 +38,8 @@
 testPrivateWrongLibrary() {
   var c = new C();
   var im = reflect(c);
-  var selector = MirrorSystem.getSymbol('_field', reflectClass(Mirror).owner);
+  var selector = MirrorSystem.getSymbol(
+      '_field', reflectClass(Mirror).owner as LibraryMirror);
 
   for (int i = 0; i < (2 * optimizationThreshold); i++) {
     Expect.throwsNoSuchMethodError(() => im.getField(selector));
diff --git a/tests/lib_2/mirrors/hot_set_field_test.dart b/tests/lib_2/mirrors/hot_set_field_test.dart
index 7202b95..cd084d3 100644
--- a/tests/lib_2/mirrors/hot_set_field_test.dart
+++ b/tests/lib_2/mirrors/hot_set_field_test.dart
@@ -37,7 +37,8 @@
 testPrivateWrongLibrary() {
   var c = new C();
   var im = reflect(c);
-  var selector = MirrorSystem.getSymbol('_field', reflectClass(Mirror).owner);
+  var selector = MirrorSystem.getSymbol(
+      '_field', reflectClass(Mirror).owner as LibraryMirror);
 
   for (int i = 0; i < (2 * optimizationThreshold); i++) {
     Expect.throwsNoSuchMethodError(() => im.setField(selector, i));
diff --git a/tests/lib_2/mirrors/inherited_metadata_test.dart b/tests/lib_2/mirrors/inherited_metadata_test.dart
index db7b7de..87a2b42 100644
--- a/tests/lib_2/mirrors/inherited_metadata_test.dart
+++ b/tests/lib_2/mirrors/inherited_metadata_test.dart
@@ -4,14 +4,13 @@
 
 library test.mirrors;
 
-@MirrorsUsed(targets: "test.mirrors")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
 
 class RemoteClass {
   final String name;
-  const RemoteClass([this.name]);
+  const RemoteClass([this.name = "default"]);
 }
 
 class A {}
diff --git a/tests/lib_2/mirrors/initializing_formals_test.dart b/tests/lib_2/mirrors/initializing_formals_test.dart
index 9f4f2f8..8cc4af1 100644
--- a/tests/lib_2/mirrors/initializing_formals_test.dart
+++ b/tests/lib_2/mirrors/initializing_formals_test.dart
@@ -4,19 +4,18 @@
 
 library test.initializing_formals;
 
-@MirrorsUsed(targets: "test.initializing_formals")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
 class Class<T> {
-  num numField;
-  bool boolField;
-  String stringField;
+  num numField = 0;
+  bool boolField = false;
+  String stringField = "";
   T tField;
   dynamic _privateField;
 
   Class.nongeneric(this.numField);
-  Class.named({this.boolField});
+  Class.named({this.boolField = false});
   Class.optPos([this.stringField = 'default']);
   Class.generic(this.tField);
   Class.private(this._privateField);
@@ -36,7 +35,7 @@
   MethodMirror mm;
   ParameterMirror pm;
 
-  mm = reflectClass(Class).declarations[#Class.nongeneric];
+  mm = reflectClass(Class).declarations[#Class.nongeneric] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#numField, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
@@ -48,19 +47,20 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Class).declarations[#Class.named];
+  mm = reflectClass(Class).declarations[#Class.named] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#boolField, pm.simpleName);
   Expect.equals(reflectClass(bool), pm.type);
   Expect.isTrue(pm.isNamed); // //# 01: ok
   Expect.isFalse(pm.isFinal); // //# 01: ok
   Expect.isTrue(pm.isOptional); // //# 01: ok
-  Expect.isFalse(pm.hasDefaultValue); // //# 01: ok
+  Expect.isTrue(pm.hasDefaultValue); // //# 01: ok
+  Expect.equals(false, pm.defaultValue.reflectee); // //# 01: ok
   Expect.isFalse(pm.isPrivate);
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Class).declarations[#Class.optPos];
+  mm = reflectClass(Class).declarations[#Class.optPos] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#stringField, pm.simpleName);
   Expect.equals(reflectClass(String), pm.type);
@@ -73,7 +73,7 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Class).declarations[#Class.generic];
+  mm = reflectClass(Class).declarations[#Class.generic] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#tField, pm.simpleName);
   Expect.equals(reflectClass(Class).typeVariables.single, pm.type);
@@ -85,7 +85,7 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Class).declarations[#Class.private];
+  mm = reflectClass(Class).declarations[#Class.private] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#_privateField, pm.simpleName); // //# 03: ok
   Expect.equals(currentMirrorSystem().dynamicType, pm.type);
@@ -97,7 +97,7 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Class).declarations[#Class.explicitType];
+  mm = reflectClass(Class).declarations[#Class.explicitType] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#numField, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
@@ -109,7 +109,7 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Class).declarations[#Class.withVar];
+  mm = reflectClass(Class).declarations[#Class.withVar] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#numField, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
@@ -121,7 +121,7 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Class).declarations[#Class.withSubtype];
+  mm = reflectClass(Class).declarations[#Class.withSubtype] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#numField, pm.simpleName);
   Expect.equals(reflectClass(int), pm.type);
@@ -133,7 +133,7 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Constant).declarations[#Constant];
+  mm = reflectClass(Constant).declarations[#Constant] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#value, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
@@ -145,7 +145,7 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  mm = reflectClass(Constant).declarations[#Constant.marked];
+  mm = reflectClass(Constant).declarations[#Constant.marked] as MethodMirror;
   pm = mm.parameters.single;
   Expect.equals(#value, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
diff --git a/tests/lib_2/mirrors/instance_creation_in_function_annotation_test.dart b/tests/lib_2/mirrors/instance_creation_in_function_annotation_test.dart
index 804cb97..bfdd69c 100644
--- a/tests/lib_2/mirrors/instance_creation_in_function_annotation_test.dart
+++ b/tests/lib_2/mirrors/instance_creation_in_function_annotation_test.dart
@@ -22,7 +22,7 @@
 f() {}
 
 main() {
-  ClosureMirror closureMirror = reflect(f);
+  ClosureMirror closureMirror = reflect(f) as ClosureMirror;
   List<InstanceMirror> metadata = closureMirror.function.metadata;
   Expect.equals(1, metadata.length);
   Expect.equals(metadata[0].reflectee.c.s, 'foo');
diff --git a/tests/lib_2/mirrors/invocation_cache_test.dart b/tests/lib_2/mirrors/invocation_cache_test.dart
index 0d9624a..f8ec29c 100644
--- a/tests/lib_2/mirrors/invocation_cache_test.dart
+++ b/tests/lib_2/mirrors/invocation_cache_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@MirrorsUsed(targets: const ["A"])
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/invocation_fuzz_test.dart b/tests/lib_2/mirrors/invocation_fuzz_test.dart
index 575890b..61124a8 100644
--- a/tests/lib_2/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib_2/mirrors/invocation_fuzz_test.dart
@@ -51,8 +51,8 @@
 }
 
 class Task {
-  var name;
-  var action;
+  dynamic name;
+  dynamic action;
 }
 
 var queue = new List<Task>();
diff --git a/tests/lib_2/mirrors/invoke_call_through_getter_previously_accessed_test.dart b/tests/lib_2/mirrors/invoke_call_through_getter_previously_accessed_test.dart
index abddf59..f1bbc5b 100644
--- a/tests/lib_2/mirrors/invoke_call_through_getter_previously_accessed_test.dart
+++ b/tests/lib_2/mirrors/invoke_call_through_getter_previously_accessed_test.dart
@@ -104,7 +104,7 @@
 }
 
 testLibraryReflective() {
-  LibraryMirror lm = reflectClass(D).owner;
+  LibraryMirror lm = reflectClass(D).owner as LibraryMirror;
 
   Expect.equals('1 5 6', lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
   Expect.equals('7, 8', lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
diff --git a/tests/lib_2/mirrors/invoke_call_through_getter_test.dart b/tests/lib_2/mirrors/invoke_call_through_getter_test.dart
index e77c81e..57ff6dd 100644
--- a/tests/lib_2/mirrors/invoke_call_through_getter_test.dart
+++ b/tests/lib_2/mirrors/invoke_call_through_getter_test.dart
@@ -104,7 +104,7 @@
 }
 
 testLibraryReflective() {
-  LibraryMirror lm = reflectClass(D).owner;
+  LibraryMirror lm = reflectClass(D).owner as LibraryMirror;
 
   Expect.equals('1 5 6', lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
   Expect.equals('7, 8', lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
diff --git a/tests/lib_2/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart b/tests/lib_2/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
index 07801c8..2504ea6 100644
--- a/tests/lib_2/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
+++ b/tests/lib_2/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
@@ -108,7 +108,7 @@
 }
 
 testLibraryReflective() {
-  LibraryMirror lm = reflectClass(D).owner;
+  LibraryMirror lm = reflectClass(D).owner as LibraryMirror;
 
   Expect.equals('1 5 6', lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
   Expect.equals('7, 8', lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
diff --git a/tests/lib_2/mirrors/invoke_call_through_implicit_getter_test.dart b/tests/lib_2/mirrors/invoke_call_through_implicit_getter_test.dart
index 7594272..fd0b481 100644
--- a/tests/lib_2/mirrors/invoke_call_through_implicit_getter_test.dart
+++ b/tests/lib_2/mirrors/invoke_call_through_implicit_getter_test.dart
@@ -107,7 +107,7 @@
 }
 
 testLibraryReflective() {
-  LibraryMirror lm = reflectClass(D).owner;
+  LibraryMirror lm = reflectClass(D).owner as LibraryMirror;
 
   Expect.equals('1 5 6', lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
   Expect.equals('7, 8', lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
diff --git a/tests/lib_2/mirrors/invoke_closurization_test.dart b/tests/lib_2/mirrors/invoke_closurization_test.dart
index 598ca5a..aa07913 100644
--- a/tests/lib_2/mirrors/invoke_closurization_test.dart
+++ b/tests/lib_2/mirrors/invoke_closurization_test.dart
@@ -29,7 +29,7 @@
   Expect.isTrue(result.reflectee is Function, "Should be closure");
   Expect.equals("A-B-C", result.reflectee('A', 'B', 'C'));
 
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
   result = lm.getField(#libraryFunction);
   Expect.isTrue(result.reflectee is Function, "Should be closure");
   Expect.equals("A:B:C", result.reflectee('A', 'B', 'C'));
diff --git a/tests/lib_2/mirrors/invoke_named_test.dart b/tests/lib_2/mirrors/invoke_named_test.dart
index 1cc4806..04d547b 100644
--- a/tests/lib_2/mirrors/invoke_named_test.dart
+++ b/tests/lib_2/mirrors/invoke_named_test.dart
@@ -200,7 +200,7 @@
   ClosureMirror cm;
   InstanceMirror result;
 
-  cm = reflect(a);
+  cm = reflect(a) as ClosureMirror;
   result = cm.apply(['X']);
   Expect.equals('X-B-null', result.reflectee);
   result = cm.apply(['X'], {const Symbol('b'): 'Y'});
@@ -215,7 +215,7 @@
       () => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
       'Unmatched named argument');
 
-  cm = reflect(b);
+  cm = reflect(b) as ClosureMirror;
   result = cm.apply([]);
   Expect.equals('A-null-null', result.reflectee);
   result = cm.apply([], {const Symbol('a'): 'X'});
@@ -229,7 +229,7 @@
       () => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
       'Unmatched named argument');
 
-  cm = reflect(c);
+  cm = reflect(c) as ClosureMirror;
   result = cm.apply(['X']);
   Expect.equals('X-null-C', result.reflectee);
   result = cm.apply(['X', 'Y']);
@@ -244,7 +244,7 @@
       () => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
       'Unmatched named argument');
 
-  cm = reflect(d);
+  cm = reflect(d) as ClosureMirror;
   result = cm.apply([]);
   Expect.equals('null-B-C', result.reflectee);
   result = cm.apply(['X']);
@@ -259,7 +259,7 @@
       () => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
       'Unmatched named argument');
 
-  cm = reflect(e);
+  cm = reflect(e) as ClosureMirror;
   result = cm.apply(['X', 'Y', 'Z']);
   Expect.equals('X-Y-Z', result.reflectee);
   Expect.throwsNoSuchMethodError(
@@ -279,7 +279,7 @@
   if (isDart2js) return;
 
   testSyncInvoke(reflectClass(D)); // ClassMirror
-  LibraryMirror lib = reflectClass(D).owner;
+  LibraryMirror lib = reflectClass(D).owner as LibraryMirror;
   testSyncInvoke(lib); // LibraryMirror
 
   testSyncNewInstance();
diff --git a/tests/lib_2/mirrors/invoke_natives_malicious_test.dart b/tests/lib_2/mirrors/invoke_natives_malicious_test.dart
index 1b15187..43ccb5d 100644
--- a/tests/lib_2/mirrors/invoke_natives_malicious_test.dart
+++ b/tests/lib_2/mirrors/invoke_natives_malicious_test.dart
@@ -14,7 +14,7 @@
 }
 
 main() {
-  LibraryMirror dartcore = reflectClass(Object).owner;
+  LibraryMirror dartcore = reflectClass(Object).owner as LibraryMirror;
 
   test('List_copyFromObjectArray', () {
     var receiver = new List(3);
diff --git a/tests/lib_2/mirrors/invoke_private_test.dart b/tests/lib_2/mirrors/invoke_private_test.dart
index 6f820f4..753dd9e 100644
--- a/tests/lib_2/mirrors/invoke_private_test.dart
+++ b/tests/lib_2/mirrors/invoke_private_test.dart
@@ -67,7 +67,7 @@
   Expect.equals('my value', result.reflectee._field);
 
   // LibraryMirror.
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
   result = lm.invoke(#_libraryFunction, [':', ')']);
   Expect.equals(':)', result.reflectee);
 
diff --git a/tests/lib_2/mirrors/invoke_private_wrong_library_test.dart b/tests/lib_2/mirrors/invoke_private_wrong_library_test.dart
index 334c84e..f0ded32 100644
--- a/tests/lib_2/mirrors/invoke_private_wrong_library_test.dart
+++ b/tests/lib_2/mirrors/invoke_private_wrong_library_test.dart
@@ -30,7 +30,7 @@
   Expect.throwsNoSuchMethodError(() => cm.setField(#_staticField, 'sbar'));
   Expect.throwsNoSuchMethodError(() => cm.newInstance(#_named, ['my value']));
 
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
   Expect.throwsNoSuchMethodError(
       () => lm.invoke(#_libraryFunction, [':', ')']));
   Expect.throwsNoSuchMethodError(() => lm.getField(#_libraryGetter));
diff --git a/tests/lib_2/mirrors/invoke_test.dart b/tests/lib_2/mirrors/invoke_test.dart
index a8be6e5..fd5215f 100644
--- a/tests/lib_2/mirrors/invoke_test.dart
+++ b/tests/lib_2/mirrors/invoke_test.dart
@@ -110,7 +110,7 @@
       () => cm.newInstance(const Symbol('named'), []), 'Wrong arity');
 
   // LibraryMirror invoke
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
   result = lm.invoke(const Symbol('libraryFunction'), [':', ')']);
   Expect.equals(':)', result.reflectee);
   Expect.throwsNoSuchMethodError(
diff --git a/tests/lib_2/mirrors/invoke_throws_test.dart b/tests/lib_2/mirrors/invoke_throws_test.dart
index a94a00b..59f5b2f 100644
--- a/tests/lib_2/mirrors/invoke_throws_test.dart
+++ b/tests/lib_2/mirrors/invoke_throws_test.dart
@@ -80,7 +80,7 @@
   Expect.throws(() => cm.newInstance(#faktory, []), isMyException);
   Expect.throws(() => cm.newInstance(#redirectingFactory, []), isMyException);
 
-  LibraryMirror lm = reflectClass(Class).owner;
+  LibraryMirror lm = reflectClass(Class).owner as LibraryMirror;
   Expect.throws(() => lm.getField(#libraryGetter), isMyException);
   Expect.throws(() => lm.setField(#librarySetter, ['arg']), isMyException);
   Expect.throws(() => lm.invoke(#libraryFunction, []), isMyException);
diff --git a/tests/lib_2/mirrors/libraries_test.dart b/tests/lib_2/mirrors/libraries_test.dart
index f754c19..4356656 100644
--- a/tests/lib_2/mirrors/libraries_test.dart
+++ b/tests/lib_2/mirrors/libraries_test.dart
@@ -27,7 +27,7 @@
     Expect.equals("/dart2js-stripped-uri", uri.path);
   }
 
-  ClassMirror cls = mirrorsLibrary.declarations[#LibraryMirror];
+  ClassMirror cls = mirrorsLibrary.declarations[#LibraryMirror] as ClassMirror;
   Expect.isNotNull(cls, 'cls is null');
 
   Expect.equals(#dart.mirrors.LibraryMirror, cls.qualifiedName);
diff --git a/tests/lib_2/mirrors/library_metatarget_test.dart b/tests/lib_2/mirrors/library_metatarget_test.dart
index 1f7c24b..6800bab 100644
--- a/tests/lib_2/mirrors/library_metatarget_test.dart
+++ b/tests/lib_2/mirrors/library_metatarget_test.dart
@@ -9,7 +9,6 @@
 import 'library_metatarget_test_lib.dart';
 import 'library_metatarget_test_annotations_lib.dart';
 
-@MirrorsUsed(metaTargets: const [Reflectable])
 import 'dart:mirrors';
 
 void main() {
diff --git a/tests/lib_2/mirrors/library_uri_io_test.dart b/tests/lib_2/mirrors/library_uri_io_test.dart
index e072a83..8400843 100644
--- a/tests/lib_2/mirrors/library_uri_io_test.dart
+++ b/tests/lib_2/mirrors/library_uri_io_test.dart
@@ -16,7 +16,7 @@
 testLibraryUri(var value, Uri expectedUri) {
   var valueMirror = reflect(value);
   ClassMirror valueClass = valueMirror.type;
-  LibraryMirror valueLibrary = valueClass.owner;
+  LibraryMirror valueLibrary = valueClass.owner as LibraryMirror;
   expect(valueLibrary.uri, equals(expectedUri));
 }
 
diff --git a/tests/lib_2/mirrors/library_uri_package_test.dart b/tests/lib_2/mirrors/library_uri_package_test.dart
index a8be56d..0116005 100644
--- a/tests/lib_2/mirrors/library_uri_package_test.dart
+++ b/tests/lib_2/mirrors/library_uri_package_test.dart
@@ -13,7 +13,7 @@
 testLibraryUri(var value, Uri expectedUri) {
   var valueMirror = reflect(value);
   ClassMirror valueClass = valueMirror.type;
-  LibraryMirror valueLibrary = valueClass.owner;
+  LibraryMirror valueLibrary = valueClass.owner as LibraryMirror;
   Uri uri = valueLibrary.uri;
   if (uri.scheme != "https" ||
       uri.host != "dartlang.org" ||
diff --git a/tests/lib_2/mirrors/local_isolate_test.dart b/tests/lib_2/mirrors/local_isolate_test.dart
index 27ca35a..e619812 100644
--- a/tests/lib_2/mirrors/local_isolate_test.dart
+++ b/tests/lib_2/mirrors/local_isolate_test.dart
@@ -13,7 +13,7 @@
 class Foo {}
 
 void main() {
-  LibraryMirror rootLibrary = reflectClass(Foo).owner;
+  LibraryMirror rootLibrary = reflectClass(Foo).owner as LibraryMirror;
   IsolateMirror isolate = currentMirrorSystem().isolate;
   Expect.isTrue(isolate.debugName is String);
   Expect.isTrue(isolate.isCurrent);
diff --git a/tests/lib_2/mirrors/metadata_class_mirror_test.dart b/tests/lib_2/mirrors/metadata_class_mirror_test.dart
index 9391f1e..9dab024 100644
--- a/tests/lib_2/mirrors/metadata_class_mirror_test.dart
+++ b/tests/lib_2/mirrors/metadata_class_mirror_test.dart
@@ -6,7 +6,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 
 class A {
@@ -17,7 +16,7 @@
 const A anA = const A();
 
 main() {
-  ClassMirror typeMirror = reflectType(A);
+  ClassMirror typeMirror = reflectType(A) as ClassMirror;
   var decs = typeMirror.declarations;
   print(decs.length);
 }
diff --git a/tests/lib_2/mirrors/metadata_const_map_test.dart b/tests/lib_2/mirrors/metadata_const_map_test.dart
index 9239d68..dcf8376 100644
--- a/tests/lib_2/mirrors/metadata_const_map_test.dart
+++ b/tests/lib_2/mirrors/metadata_const_map_test.dart
@@ -7,7 +7,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: 'lib')
 import 'dart:mirrors';
 
 class C {
diff --git a/tests/lib_2/mirrors/metadata_constructed_constant_test.dart b/tests/lib_2/mirrors/metadata_constructed_constant_test.dart
index 7d0bf48..16746a0 100644
--- a/tests/lib_2/mirrors/metadata_constructed_constant_test.dart
+++ b/tests/lib_2/mirrors/metadata_constructed_constant_test.dart
@@ -5,7 +5,6 @@
 
 library test.metadata_constructed_constant_test;
 
-@MirrorsUsed(targets: "test.metadata_constructed_constant_test")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
@@ -22,6 +21,7 @@
 }
 
 main() {
-  var value = reflectClass(Foo).declarations[#m].metadata.single.reflectee;
+  var m = reflectClass(Foo).declarations[#m] as MethodMirror;
+  var value = m.metadata.single.reflectee;
   Expect.stringEquals('ConstructedConstant($StateError)', '$value');
 }
diff --git a/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart b/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart
index 3b1bb24..bc459e9 100644
--- a/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart
+++ b/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart
@@ -7,7 +7,6 @@
 
 library test.metadata_constructor_arguments;
 
-@MirrorsUsed(targets: "test.metadata_constructor_arguments")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart b/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart
index c89d2a8..d2edccc 100644
--- a/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart
+++ b/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart
@@ -7,7 +7,6 @@
 
 library test.metadata_nested_constructor_call;
 
-@MirrorsUsed(targets: "test.metadata_nested_constructor_call")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/metadata_scope_test.dart b/tests/lib_2/mirrors/metadata_scope_test.dart
index 40a207e..521dee6 100644
--- a/tests/lib_2/mirrors/metadata_scope_test.dart
+++ b/tests/lib_2/mirrors/metadata_scope_test.dart
@@ -4,7 +4,6 @@
 
 library test.metadata_scope;
 
-@MirrorsUsed(targets: "test.metadata_scope")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/metadata_symbol_literal_test.dart b/tests/lib_2/mirrors/metadata_symbol_literal_test.dart
index e632d68..129d4cd 100644
--- a/tests/lib_2/mirrors/metadata_symbol_literal_test.dart
+++ b/tests/lib_2/mirrors/metadata_symbol_literal_test.dart
@@ -16,6 +16,7 @@
 }
 
 main() {
-  final metadata = reflectClass(U).declarations[#field].metadata;
+  final field = reflectClass(U).declarations[#field] as VariableMirror;
+  final metadata = field.metadata;
   Expect.identical((metadata.first.reflectee as T).symbol, const Symbol('x'));
 }
diff --git a/tests/lib_2/mirrors/metadata_test.dart b/tests/lib_2/mirrors/metadata_test.dart
index 2fe04fa..d574bc1 100644
--- a/tests/lib_2/mirrors/metadata_test.dart
+++ b/tests/lib_2/mirrors/metadata_test.dart
@@ -61,17 +61,17 @@
   ClassMirror myClassMirror = reflectClass(MyClass);
   checkMetadata(myClassMirror, [symbol, string]);
   LibraryMirror lib = mirrors.findLibrary(#test.metadata_test);
-  MethodMirror function = lib.declarations[#main];
+  MethodMirror function = lib.declarations[#main] as MethodMirror;
   checkMetadata(function, [symbol, string, symbol]);
-  MethodMirror method = myClassMirror.declarations[#myMethod];
+  MethodMirror method = myClassMirror.declarations[#myMethod] as MethodMirror;
   checkMetadata(method, [string, symbol, string]);
-  method = myClassMirror.declarations[#myOtherMethod];
+  method = myClassMirror.declarations[#myOtherMethod] as MethodMirror;
   checkMetadata(method, []);
 
-  VariableMirror xMirror = myClassMirror.declarations[#x];
+  VariableMirror xMirror = myClassMirror.declarations[#x] as VariableMirror;
   checkMetadata(xMirror, [hest, hest, symbol]);
 
-  VariableMirror yMirror = myClassMirror.declarations[#y];
+  VariableMirror yMirror = myClassMirror.declarations[#y] as VariableMirror;
   checkMetadata(yMirror, []);
 
   // TODO(ahe): Test local functions.
diff --git a/tests/lib_2/mirrors/metadata_type_literal_test.dart b/tests/lib_2/mirrors/metadata_type_literal_test.dart
index a40023a..4d567a6 100644
--- a/tests/lib_2/mirrors/metadata_type_literal_test.dart
+++ b/tests/lib_2/mirrors/metadata_type_literal_test.dart
@@ -16,7 +16,7 @@
 class Annotated {}
 
 main(List<String> args) {
-  ClassMirror mirror = reflectType(Annotated);
+  ClassMirror mirror = reflectType(Annotated) as ClassMirror;
   Expect.equals("ClassMirror on 'Annotated'", mirror.toString());
 
   var bindings = mirror.metadata[0].reflectee.bindings;
diff --git a/tests/lib_2/mirrors/method_mirror_location_test.dart b/tests/lib_2/mirrors/method_mirror_location_test.dart
index 16c0c0fd..426d3f2 100644
--- a/tests/lib_2/mirrors/method_mirror_location_test.dart
+++ b/tests/lib_2/mirrors/method_mirror_location_test.dart
@@ -19,11 +19,11 @@
     methodMirror = mirror as MethodMirror;
   }
   Expect.isTrue(methodMirror is MethodMirror);
-  Uri uri = methodMirror.location.sourceUri;
-  Expect.isTrue(
-      uri.toString().endsWith(uriSuffix), "Expected suffix $uriSuffix in $uri");
-  Expect.equals(line, methodMirror.location.line, "line");
-  Expect.equals(column, methodMirror.location.column, "column");
+  final location = methodMirror.location;
+  final uri = location.sourceUri;
+  Expect.isTrue(uri.toString().endsWith(uriSuffix), "Expected suffix $uriSuffix in $uri");
+  Expect.equals(line, location.line, "line");
+  Expect.equals(column, location.column, "column");
 }
 
 class ClassInMainFile {
diff --git a/tests/lib_2/mirrors/method_mirror_name_test.dart b/tests/lib_2/mirrors/method_mirror_name_test.dart
index 1f6b948..c428da7 100644
--- a/tests/lib_2/mirrors/method_mirror_name_test.dart
+++ b/tests/lib_2/mirrors/method_mirror_name_test.dart
@@ -4,7 +4,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/mirrors/method_mirror_properties_test.dart b/tests/lib_2/mirrors/method_mirror_properties_test.dart
index ece78ed..d2262f1 100644
--- a/tests/lib_2/mirrors/method_mirror_properties_test.dart
+++ b/tests/lib_2/mirrors/method_mirror_properties_test.dart
@@ -4,7 +4,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/mirrors/method_mirror_returntype_test.dart b/tests/lib_2/mirrors/method_mirror_returntype_test.dart
index 195c4bf..83b5f89 100644
--- a/tests/lib_2/mirrors/method_mirror_returntype_test.dart
+++ b/tests/lib_2/mirrors/method_mirror_returntype_test.dart
@@ -4,7 +4,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
@@ -42,7 +41,7 @@
   Expect.equals(const Symbol("void"), mm.returnType.simpleName);
 
   ClassMirror cm = reflectClass(C);
-  mm = cm.declarations[#getE];
+  mm = cm.declarations[#getE] as MethodMirror;
   Expect.equals(true, mm.returnType is TypeMirror);
   // The spec for this is ambiguous and needs to be updated before it is clear
   // what has to be returned.
diff --git a/tests/lib_2/mirrors/method_mirror_source_test.dart b/tests/lib_2/mirrors/method_mirror_source_test.dart
index c648ee0..dbfbf5c 100644
--- a/tests/lib_2/mirrors/method_mirror_source_test.dart
+++ b/tests/lib_2/mirrors/method_mirror_source_test.dart
@@ -59,7 +59,7 @@
 
 main() {
   // Top-level members
-  LibraryMirror lib = reflectClass(C).owner;
+  LibraryMirror lib = reflectClass(C).owner as LibraryMirror;
   expectSource(lib.declarations[#foo1],
       "foo1() {}");
   expectSource(lib.declarations[#x],
@@ -102,7 +102,7 @@
   expectSource(reflect(a), "() {}");
 
   // Function at first line.
-  LibraryMirror otherLib = reflectClass(SomethingInOther).owner;
+  LibraryMirror otherLib = reflectClass(SomethingInOther).owner as LibraryMirror;
   expectSource(otherLib.declarations[#main],
 """main() {
   print("Blah");
diff --git a/tests/lib_2/mirrors/mirror_in_static_init_test.dart b/tests/lib_2/mirrors/mirror_in_static_init_test.dart
index 4eac18e..4de3ef6 100644
--- a/tests/lib_2/mirrors/mirror_in_static_init_test.dart
+++ b/tests/lib_2/mirrors/mirror_in_static_init_test.dart
@@ -8,7 +8,6 @@
 
 library mirror_in_static_init_test;
 
-@MirrorsUsed(targets: "mirror_in_static_init_test")
 import 'dart:mirrors';
 
 // This class is only loaded during initialization of `staticField`.
diff --git a/tests/lib_2/mirrors/mirrors_nsm_mismatch_test.dart b/tests/lib_2/mirrors/mirrors_nsm_mismatch_test.dart
index 6f2f188..2a3637b 100644
--- a/tests/lib_2/mirrors/mirrors_nsm_mismatch_test.dart
+++ b/tests/lib_2/mirrors/mirrors_nsm_mismatch_test.dart
@@ -4,7 +4,6 @@
 
 library test.mirrors_nsm_mismatch;
 
-@MirrorsUsed(targets: "test.mirrors_nsm_mismatch")
 import 'dart:mirrors';
 import 'mirrors_nsm_test.dart';
 
diff --git a/tests/lib_2/mirrors/mirrors_nsm_test.dart b/tests/lib_2/mirrors/mirrors_nsm_test.dart
index 7ff3a2e..d7a7729 100644
--- a/tests/lib_2/mirrors/mirrors_nsm_test.dart
+++ b/tests/lib_2/mirrors/mirrors_nsm_test.dart
@@ -4,7 +4,6 @@
 
 library MirrorsTest;
 
-@MirrorsUsed(targets: "MirrorsTest")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/mirrors_reader.dart b/tests/lib_2/mirrors/mirrors_reader.dart
index 9981466..b8a5faa 100644
--- a/tests/lib_2/mirrors/mirrors_reader.dart
+++ b/tests/lib_2/mirrors/mirrors_reader.dart
@@ -88,7 +88,7 @@
 
   /// Evaluates the function [f]. Subclasses can override this to handle
   /// specific exceptions.
-  evaluate(f()) => f();
+  dynamic evaluate(dynamic f) => f();
 
   visit(var receiver, String tag, var value) {
     if (value is Function) {
diff --git a/tests/lib_2/mirrors/mirrors_resolve_fields_test.dart b/tests/lib_2/mirrors/mirrors_resolve_fields_test.dart
index 3725aa2..b914dda 100644
--- a/tests/lib_2/mirrors/mirrors_resolve_fields_test.dart
+++ b/tests/lib_2/mirrors/mirrors_resolve_fields_test.dart
@@ -9,7 +9,6 @@
 
 import "package:expect/expect.dart";
 
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 
 class A {
diff --git a/tests/lib_2/mirrors/mirrors_test.dart b/tests/lib_2/mirrors/mirrors_test.dart
index 378074f..1d8a204 100644
--- a/tests/lib_2/mirrors/mirrors_test.dart
+++ b/tests/lib_2/mirrors/mirrors_test.dart
@@ -197,7 +197,7 @@
 testLibraryUri(var value, bool check(Uri uri)) {
   var valueMirror = reflect(value);
   ClassMirror valueClass = valueMirror.type;
-  LibraryMirror valueLibrary = valueClass.owner;
+  LibraryMirror valueLibrary = valueClass.owner as LibraryMirror;
   Uri uri = valueLibrary.uri;
   if (uri.scheme != "https" ||
       uri.host != "dartlang.org" ||
diff --git a/tests/lib_2/mirrors/mirrors_used_generic_types_test.dart b/tests/lib_2/mirrors/mirrors_used_generic_types_test.dart
deleted file mode 100644
index 5962214..0000000
--- a/tests/lib_2/mirrors/mirrors_used_generic_types_test.dart
+++ /dev/null
@@ -1,28 +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.
-
-library Test;
-
-@MirrorsUsed(targets: const ["Test"])
-import 'dart:mirrors';
-import 'dart:async';
-
-import 'package:expect/expect.dart';
-
-class A {
-  // Because of the `mirrors-used` annotation, the types `List` and `Future`
-  // are not reflectable.
-  // However, we still need to be able to create a Mirror for them, when we
-  // create a mirror for `foo`. In particular, it must be able to create a
-  // mirror, even though there are generic types.
-  List<int> foo(Future<int> x) {
-    return null;
-  }
-}
-
-void main() {
-  var m = reflect(new A()).type.instanceMembers[#foo];
-  Expect.equals(#List, m.returnType.simpleName);
-  Expect.equals(#Future, m.parameters[0].type.simpleName);
-}
diff --git a/tests/lib_2/mirrors/mirrors_used_get_name2_test.dart b/tests/lib_2/mirrors/mirrors_used_get_name2_test.dart
deleted file mode 100644
index 521783d..0000000
--- a/tests/lib_2/mirrors/mirrors_used_get_name2_test.dart
+++ /dev/null
@@ -1,35 +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.
-
-// Test to make sure that the names of classes that are marked with meta
-// annotations of MirrorsUsed are preserved.
-// In the test the class B is not instantiated, but we still want its names
-// ("foo") to be preserved.
-
-@MirrorsUsed(metaTargets: "Meta")
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-class A {
-  noSuchMethod(invocationMirror) {
-    return MirrorSystem.getName(invocationMirror.memberName);
-  }
-}
-
-class B {
-  @Meta()
-  foo() => 499;
-}
-
-class Meta {
-  const Meta();
-}
-
-void main() {
-  dynamic a = new A();
-  if (new DateTime.now().year == 1984) {
-    a = A;
-  }
-  Expect.equals("foo", a.foo());
-}
diff --git a/tests/lib_2/mirrors/mirrors_used_get_name_test.dart b/tests/lib_2/mirrors/mirrors_used_get_name_test.dart
deleted file mode 100644
index cd9051b..0000000
--- a/tests/lib_2/mirrors/mirrors_used_get_name_test.dart
+++ /dev/null
@@ -1,30 +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.
-
-// Test to make sure that the names of classes that are marked with mirrors-used
-// are preserved.
-// In the test the class B is not instantiated, but we still want its names (the
-// "foo") to be preserved.
-
-@MirrorsUsed(targets: "B")
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-class A {
-  noSuchMethod(invocationMirror) {
-    return MirrorSystem.getName(invocationMirror.memberName);
-  }
-}
-
-class B {
-  foo() => 499;
-}
-
-void main() {
-  dynamic a = new A();
-  if (new DateTime.now().year == 1984) {
-    a = A;
-  }
-  Expect.equals("foo", a.foo());
-}
diff --git a/tests/lib_2/mirrors/mirrors_used_inheritance_test.dart b/tests/lib_2/mirrors/mirrors_used_inheritance_test.dart
deleted file mode 100644
index e373a79..0000000
--- a/tests/lib_2/mirrors/mirrors_used_inheritance_test.dart
+++ /dev/null
@@ -1,78 +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.
-
-// Test to make sure that all members of reflectable classes are reflectable,
-// including ones inherited from super classes and the overriding members
-// of subclasses.
-
-@MirrorsUsed(metaTargets: "Meta")
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-class Meta {
-  const Meta();
-}
-
-class Super {
-  var inheritedField = 1;
-  var overriddenField = 1;
-
-  inheritedMethod(x) => x;
-  overriddenMethod(x) => x;
-}
-
-@Meta()
-class Reflected extends Super {
-  var overriddenField = 2;
-  var subclassedField = 2;
-
-  overriddenMethod(x) => 2 * x;
-  subclassedMethod(x) => 2 * x;
-}
-
-class Subclass extends Reflected {
-  var subclassedField = 4;
-  var subclassField = 4;
-
-  subclassedMethod(x) => 4 * x;
-  subclassMethod(x) => 4 * x;
-}
-
-tryCall(object, symbol, value, expected) {
-  var mirror = reflect(object);
-  var result = mirror.invoke(symbol, [value]).reflectee;
-  Expect.equals(result, expected);
-}
-
-tryField(object, symbol, expected) {
-  var mirror = reflect(object);
-  var result = mirror.getField(symbol).reflectee;
-  Expect.equals(result, expected);
-}
-
-main() {
-  var objects = [new Reflected(), new Subclass()];
-
-  // Make sure the subclass methods are alive.
-  Subclass sub = objects[1];
-  sub.subclassField = 9;
-  print(sub.subclassMethod(9));
-
-  var index = 1;
-  if (new DateTime.now().year == 1984) {
-    index = 0;
-  }
-
-  // Reflect an instance of [Subclass], which should only expose the interface
-  // of [Reflected].
-  var subclass = objects[index];
-  tryCall(subclass, #inheritedMethod, 11, 11);
-  tryCall(subclass, #overriddenMethod, 11, 22);
-  tryCall(subclass, #subclassedMethod, 11, 44);
-  tryField(subclass, #inheritedField, 1);
-  tryField(subclass, #overriddenField, 2);
-  tryField(subclass, #subclassedField, 4);
-  Expect.throws(() => reflect(subclass).invoke(#subclassMethod, [11]));
-  Expect.throws(() => reflect(subclass).getField(#subclassField));
-}
diff --git a/tests/lib_2/mirrors/mirrors_used_merge_test.dart b/tests/lib_2/mirrors/mirrors_used_merge_test.dart
deleted file mode 100644
index 534c5e7..0000000
--- a/tests/lib_2/mirrors/mirrors_used_merge_test.dart
+++ /dev/null
@@ -1,15 +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.
-
-/// Test that two MirrorsUsed annotations can be merged with out crashing
-/// dart2js.
-
-@MirrorsUsed(symbols: const ['foo'])
-@MirrorsUsed(symbols: const ['bar'])
-import 'dart:mirrors';
-
-main() {
-  // Do nothing, just make sure that merging the annotations doesn't crash
-  // dart2js.
-}
diff --git a/tests/lib_2/mirrors/mirrors_used_typedef_declaration_test.dart b/tests/lib_2/mirrors/mirrors_used_typedef_declaration_test.dart
deleted file mode 100644
index 8768131..0000000
--- a/tests/lib_2/mirrors/mirrors_used_typedef_declaration_test.dart
+++ /dev/null
@@ -1,29 +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.
-
-library test;
-
-import 'package:expect/expect.dart';
-
-@MirrorsUsed(targets: "Foo")
-import 'dart:mirrors';
-
-typedef int Foo(String x);
-typedef int Bar();
-
-main() {
-  LibraryMirror thisLibrary = currentMirrorSystem().findLibrary(#test);
-
-  Mirror fooMirror = thisLibrary.declarations[#Foo];
-
-  Expect.isTrue(fooMirror != null, 'Foo not found.');
-  Expect.isTrue(thisLibrary.declarations[#Foo] is TypedefMirror,
-      'TypedefMirror expected, found $fooMirror');
-
-  // The following code does not currently work on the VM, because it does not
-  // support MirrorsUsed (see dartbug.com/16048).
-  Mirror barMirror = thisLibrary.declarations[#Bar]; //             //# 01: ok
-  Expect.isTrue(barMirror == null, //                               //# 01: continued
-                'Bar should not be emitted due to MirrorsUsed.'); //# 01: continued
-}
diff --git a/tests/lib_2/mirrors/mixin_application_test.dart b/tests/lib_2/mirrors/mixin_application_test.dart
index d69257e..2f61647 100644
--- a/tests/lib_2/mirrors/mixin_application_test.dart
+++ b/tests/lib_2/mirrors/mixin_application_test.dart
@@ -17,12 +17,12 @@
 import 'stringify.dart';
 
 class Mixin {
-  int i;
+  int i = 0;
   m() {}
 }
 
 class Mixin2 {
-  int i2;
+  int i2 = 0;
   m2() {}
 }
 
@@ -66,7 +66,9 @@
 
 checkClass(Type type, List<String> expectedSuperclasses) {
   int i = 0;
-  for (var cls = reflectClass(type); cls != null; cls = cls.superclass) {
+  for (ClassMirror cls = reflectClass(type);
+      cls != null;
+      cls = cls.superclass) {
     expect(expectedSuperclasses[i++], cls);
   }
   Expect.equals(i, expectedSuperclasses.length, '$type');
diff --git a/tests/lib_2/mirrors/native_class_test.dart b/tests/lib_2/mirrors/native_class_test.dart
deleted file mode 100644
index b6171d0..0000000
--- a/tests/lib_2/mirrors/native_class_test.dart
+++ /dev/null
@@ -1,19 +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.
-
-library test.native_class_test;
-
-import 'dart:html';
-
-@MirrorsUsed(targets: 'dart.dom.html.Element')
-import 'dart:mirrors';
-
-import 'stringify.dart';
-
-main() {
-  expect('s(dart.dom.html.Element)', reflectClass(Element).qualifiedName);
-  expect(
-      's(dart.dom.html.Node)', reflectClass(Element).superclass.qualifiedName);
-  window.postMessage('unittest-suite-success', '*');
-}
diff --git a/tests/lib_2/mirrors/new_instance_optional_arguments_test.dart b/tests/lib_2/mirrors/new_instance_optional_arguments_test.dart
index 1c08bbe..3d50f04 100644
--- a/tests/lib_2/mirrors/new_instance_optional_arguments_test.dart
+++ b/tests/lib_2/mirrors/new_instance_optional_arguments_test.dart
@@ -4,7 +4,6 @@
 
 library mirror_test;
 
-@MirrorsUsed(targets: "mirror_test")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/new_instance_with_type_arguments_test.dart b/tests/lib_2/mirrors/new_instance_with_type_arguments_test.dart
index 5d227de..cf0ee6d 100644
--- a/tests/lib_2/mirrors/new_instance_with_type_arguments_test.dart
+++ b/tests/lib_2/mirrors/new_instance_with_type_arguments_test.dart
@@ -23,11 +23,11 @@
   ClassMirror cmB = reflectClass(B);
   ClassMirror cmC = reflectClass(C);
 
-  var a_int = new A<int>();
-  var a_dynamic = new A();
-  var b = new B();
-  var c_string = new C<String>();
-  var c_dynamic = new C();
+  dynamic a_int = new A<int>();
+  dynamic a_dynamic = new A();
+  dynamic b = new B();
+  dynamic c_string = new C<String>();
+  dynamic c_dynamic = new C();
 
   Expect.equals(int, a_int.t);
   Expect.equals(dynamic, a_dynamic.t);
@@ -38,10 +38,11 @@
   Expect.equals(String, c_string.s);
   Expect.equals(dynamic, c_dynamic.s);
 
-  var reflective_a_int = cmB.superclass.newInstance(Symbol.empty, []).reflectee;
-  var reflective_a_dynamic = cmA.newInstance(Symbol.empty, []).reflectee;
-  var reflective_b = cmB.newInstance(Symbol.empty, []).reflectee;
-  var reflective_c_dynamic = cmC.newInstance(Symbol.empty, []).reflectee;
+  dynamic reflective_a_int =
+      cmB.superclass.newInstance(Symbol.empty, []).reflectee;
+  dynamic reflective_a_dynamic = cmA.newInstance(Symbol.empty, []).reflectee;
+  dynamic reflective_b = cmB.newInstance(Symbol.empty, []).reflectee;
+  dynamic reflective_c_dynamic = cmC.newInstance(Symbol.empty, []).reflectee;
 
   Expect.equals(int, reflective_a_int.t);
   Expect.equals(dynamic, reflective_a_dynamic.t);
diff --git a/tests/lib_2/mirrors/null_test.dart b/tests/lib_2/mirrors/null_test.dart
index de6b459..f0e154e 100644
--- a/tests/lib_2/mirrors/null_test.dart
+++ b/tests/lib_2/mirrors/null_test.dart
@@ -64,7 +64,7 @@
   try {
     if (new DateTime.now().millisecondsSinceEpoch == 42) x = 42;
     throw [x];
-  } on dynamic catch (e) {
+  } catch (e) {
     return e[0];
   }
   return 42;
diff --git a/tests/lib_2/mirrors/operator_test.dart b/tests/lib_2/mirrors/operator_test.dart
index b8ddfec..a7fafbc 100644
--- a/tests/lib_2/mirrors/operator_test.dart
+++ b/tests/lib_2/mirrors/operator_test.dart
@@ -42,16 +42,19 @@
   var operators = new Map<Symbol, MethodMirror>();
   var operatorParameters = new Map<Symbol, List>();
   var returnTypes = new Map<Symbol, Mirror>();
-  for (MethodMirror method in cls.declarations.values
-      .where((d) => d is MethodMirror && !d.isConstructor)) {
-    Expect.isTrue(method.isRegularMethod);
-    Expect.isTrue(method.isOperator);
-    Expect.isFalse(method.isGetter);
-    Expect.isFalse(method.isSetter);
-    Expect.isFalse(method.isAbstract);
-    operators[method.simpleName] = method;
-    operatorParameters[method.simpleName] = method.parameters;
-    returnTypes[method.simpleName] = method.returnType;
+  for (var method in cls.declarations.values) {
+    if (method is MethodMirror) {
+      if (!method.isConstructor) {
+        Expect.isTrue(method.isRegularMethod);
+        Expect.isTrue(method.isOperator);
+        Expect.isFalse(method.isGetter);
+        Expect.isFalse(method.isSetter);
+        Expect.isFalse(method.isAbstract);
+        operators[method.simpleName] = method;
+        operatorParameters[method.simpleName] = method.parameters;
+        returnTypes[method.simpleName] = method.returnType;
+      }
+    }
   }
   expect(OPERATORS, operators);
   expect(PARAMETERS, operatorParameters);
diff --git a/tests/lib_2/mirrors/optional_parameters_test.dart b/tests/lib_2/mirrors/optional_parameters_test.dart
index bee39f4..10515dd 100644
--- a/tests/lib_2/mirrors/optional_parameters_test.dart
+++ b/tests/lib_2/mirrors/optional_parameters_test.dart
@@ -8,7 +8,6 @@
 
 library optional_parameter_test;
 
-@MirrorsUsed(targets: 'optional_parameter_test')
 import "dart:mirrors";
 import 'package:expect/expect.dart';
 
@@ -17,7 +16,7 @@
 }
 
 class B {
-  foo([int x]) => x + 1;
+  foo([int x = -1]) => x + 1;
 }
 
 main() {
diff --git a/tests/lib_2/mirrors/other_declarations_location_test.dart b/tests/lib_2/mirrors/other_declarations_location_test.dart
index 7d194aa..cbd0b9d 100644
--- a/tests/lib_2/mirrors/other_declarations_location_test.dart
+++ b/tests/lib_2/mirrors/other_declarations_location_test.dart
@@ -25,11 +25,12 @@
 // any number of absolute paths.
 expectLocation(
     DeclarationMirror mirror, String uriSuffix, int line, int column) {
-  Uri uri = mirror.location.sourceUri;
+  SourceLocation location = mirror.location;
+  Uri uri = location.sourceUri;
   Expect.isTrue(
       uri.toString().endsWith(uriSuffix), "Expected suffix $uriSuffix in $uri");
-  Expect.equals(line, mirror.location.line, "line");
-  Expect.equals(column, mirror.location.column, "column");
+  Expect.equals(line, location.line, "line");
+  Expect.equals(column, location.column, "column");
 }
 
 main() {
diff --git a/tests/lib_2/mirrors/parameter_abstract_test.dart b/tests/lib_2/mirrors/parameter_abstract_test.dart
index 252d9e5..cf2bd25 100644
--- a/tests/lib_2/mirrors/parameter_abstract_test.dart
+++ b/tests/lib_2/mirrors/parameter_abstract_test.dart
@@ -18,7 +18,7 @@
 main() {
   ClassMirror cm = reflectClass(C);
 
-  MethodMirror foo1 = cm.declarations[#foo1];
+  MethodMirror foo1 = cm.declarations[#foo1] as MethodMirror;
   expect('Method(s(foo1) in s(C), abstract)', foo1);
   expect(
       'Parameter(s(x) in s(foo1), optional, named, type = Class(s(int) in s(dart.core), top-level))',
diff --git a/tests/lib_2/mirrors/parameter_annotation_mirror_test.dart b/tests/lib_2/mirrors/parameter_annotation_mirror_test.dart
index 817d741..ff4aaa6 100644
--- a/tests/lib_2/mirrors/parameter_annotation_mirror_test.dart
+++ b/tests/lib_2/mirrors/parameter_annotation_mirror_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@MirrorsUsed(targets: "Foo")
 import "dart:mirrors";
 
 import 'package:expect/expect.dart';
@@ -30,7 +29,7 @@
 
 expectAnnotations(
     Type type, Symbol method, int parameterIndex, List<String> expectedValues) {
-  MethodMirror mirror = reflectClass(type).declarations[method];
+  MethodMirror mirror = reflectClass(type).declarations[method] as MethodMirror;
   ParameterMirror parameter = mirror.parameters[parameterIndex];
   List<InstanceMirror> annotations = parameter.metadata;
   Expect.equals(annotations.length, expectedValues.length,
diff --git a/tests/lib_2/mirrors/parameter_is_const_test.dart b/tests/lib_2/mirrors/parameter_is_const_test.dart
index f8953ca..c2739e5 100644
--- a/tests/lib_2/mirrors/parameter_is_const_test.dart
+++ b/tests/lib_2/mirrors/parameter_is_const_test.dart
@@ -15,6 +15,6 @@
 }
 
 main() {
-  MethodMirror mm = reflectClass(Class).declarations[#foo];
+  MethodMirror mm = reflectClass(Class).declarations[#foo] as MethodMirror;
   Expect.isFalse(mm.parameters.single.isConst);
 }
diff --git a/tests/lib_2/mirrors/parameter_metadata_test.dart b/tests/lib_2/mirrors/parameter_metadata_test.dart
index 4337836..f875983 100644
--- a/tests/lib_2/mirrors/parameter_metadata_test.dart
+++ b/tests/lib_2/mirrors/parameter_metadata_test.dart
@@ -34,30 +34,30 @@
   ClassMirror cm = reflectClass(B);
   MethodMirror mm;
 
-  mm = cm.declarations[#B.foo];
+  mm = cm.declarations[#B.foo] as MethodMirror;
   checkMetadata(mm.parameters[0], []);
 
-  mm = cm.declarations[#B.bar];
+  mm = cm.declarations[#B.bar] as MethodMirror;
   checkMetadata(mm.parameters[0], [m3, m2]);
   checkMetadata(mm.parameters[1], []);
 
-  mm = cm.declarations[#baz];
+  mm = cm.declarations[#baz] as MethodMirror;
   checkMetadata(mm.parameters[0], [m1]);
   checkMetadata(mm.parameters[1], [m2]);
   checkMetadata(mm.parameters[2], [m3]);
 
-  mm = cm.declarations[#qux];
+  mm = cm.declarations[#qux] as MethodMirror;
   checkMetadata(mm.parameters[0], []);
   checkMetadata(mm.parameters[1], [m3, m2, m1]);
 
-  mm = cm.declarations[#quux];
+  mm = cm.declarations[#quux] as MethodMirror;
   checkMetadata(mm.parameters[0], []);
   checkMetadata(mm.parameters[1], []);
 
-  mm = cm.declarations[#corge];
+  mm = cm.declarations[#corge] as MethodMirror;
   checkMetadata(mm.parameters[0], [m1]);
   checkMetadata(mm.parameters[1], [m2]);
 
-  mm = cm.declarations[const Symbol('x=')];
+  mm = cm.declarations[const Symbol('x=')] as MethodMirror;
   checkMetadata(mm.parameters[0], [m2]);
 }
diff --git a/tests/lib_2/mirrors/parameter_optional_order_test.dart b/tests/lib_2/mirrors/parameter_optional_order_test.dart
index 74badd9..a2fa3d4 100644
--- a/tests/lib_2/mirrors/parameter_optional_order_test.dart
+++ b/tests/lib_2/mirrors/parameter_optional_order_test.dart
@@ -24,7 +24,7 @@
 testPositional() {
   ClassMirror cm = reflectClass(C);
 
-  MethodMirror positional1 = cm.declarations[#positional1];
+  MethodMirror positional1 = cm.declarations[#positional1] as MethodMirror;
   expect('Method(s(positional1) in s(C))', positional1);
   expect(
       'Parameter(s(x) in s(positional1), optional, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
@@ -36,7 +36,7 @@
       'Parameter(s(z) in s(positional1), optional, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
       positional1.parameters[5]);
 
-  MethodMirror positional2 = cm.declarations[#positional2];
+  MethodMirror positional2 = cm.declarations[#positional2] as MethodMirror;
   expect('Method(s(positional2) in s(C))', positional2);
   expect(
       'Parameter(s(y) in s(positional2), optional, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
@@ -48,7 +48,7 @@
       'Parameter(s(x) in s(positional2), optional, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
       positional2.parameters[5]);
 
-  MethodMirror positional3 = cm.declarations[#positional3];
+  MethodMirror positional3 = cm.declarations[#positional3] as MethodMirror;
   expect('Method(s(positional3) in s(C))', positional3);
   expect(
       'Parameter(s(z) in s(positional3), optional, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
@@ -64,7 +64,7 @@
 testNamed() {
   ClassMirror cm = reflectClass(C);
 
-  MethodMirror named1 = cm.declarations[#named1];
+  MethodMirror named1 = cm.declarations[#named1] as MethodMirror;
   expect('Method(s(named1) in s(C))', named1);
   expect(
       'Parameter(s(x) in s(named1), optional, named, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
@@ -76,7 +76,7 @@
       'Parameter(s(z) in s(named1), optional, named, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
       named1.parameters[5]);
 
-  MethodMirror named2 = cm.declarations[#named2];
+  MethodMirror named2 = cm.declarations[#named2] as MethodMirror;
   expect('Method(s(named2) in s(C))', named2);
   expect(
       'Parameter(s(y) in s(named2), optional, named, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
@@ -88,7 +88,7 @@
       'Parameter(s(x) in s(named2), optional, named, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
       named2.parameters[5]);
 
-  MethodMirror named3 = cm.declarations[#named3];
+  MethodMirror named3 = cm.declarations[#named3] as MethodMirror;
   expect('Method(s(named3) in s(C))', named3);
   expect(
       'Parameter(s(z) in s(named3), optional, named, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
diff --git a/tests/lib_2/mirrors/parameter_test.dart b/tests/lib_2/mirrors/parameter_test.dart
index 41bb01d..d096711 100644
--- a/tests/lib_2/mirrors/parameter_test.dart
+++ b/tests/lib_2/mirrors/parameter_test.dart
@@ -11,8 +11,6 @@
 /** Test of [ParameterMirror]. */
 library test.parameter_test;
 
-@MirrorsUsed(
-    targets: const ['test.parameter_test', 'dart.core.int'], override: '*')
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
@@ -35,8 +33,8 @@
     _x = value;
   }
 
-  grault([int x]) {}
-  garply({int y}) {}
+  grault([int x = 0]) {}
+  garply({int y = 0}) {}
   waldo(int z) {}
 }
 
@@ -64,13 +62,13 @@
   ];
   Expect.setEquals(constructorKeys, constructors.keys);
 
-  MethodMirror unnamedConstructor = constructors[#B];
+  MethodMirror unnamedConstructor = constructors[#B] as MethodMirror;
   expect('Method(s(B) in s(B), constructor)', unnamedConstructor);
   expect('[]', unnamedConstructor.parameters);
   expect('Class(s(B) in s(test.parameter_test), top-level)',
       unnamedConstructor.returnType);
 
-  MethodMirror fooConstructor = constructors[#B.foo];
+  MethodMirror fooConstructor = constructors[#B.foo] as MethodMirror;
   expect('Method(s(B.foo) in s(B), constructor)', fooConstructor);
   expect(
       '[Parameter(s(x) in s(B.foo),'
@@ -79,7 +77,7 @@
   expect('Class(s(B) in s(test.parameter_test), top-level)',
       fooConstructor.returnType);
 
-  MethodMirror barConstructor = constructors[#B.bar];
+  MethodMirror barConstructor = constructors[#B.bar] as MethodMirror;
   expect('Method(s(B.bar) in s(B), constructor)', barConstructor);
   expect(
       '[Parameter(s(z) in s(B.bar),'
@@ -93,7 +91,7 @@
   // dart2js stops testing here.
   return; // //# 01: ok
 
-  MethodMirror bazConstructor = constructors[#B.baz];
+  MethodMirror bazConstructor = constructors[#B.baz] as MethodMirror;
   expect('Method(s(B.baz) in s(B), constructor)', bazConstructor);
   expect(
       '[Parameter(s(x) in s(B.baz), final,'
@@ -106,7 +104,7 @@
   expect('Class(s(B) in s(test.parameter_test), top-level)',
       bazConstructor.returnType);
 
-  MethodMirror quxConstructor = constructors[#B.qux];
+  MethodMirror quxConstructor = constructors[#B.qux] as MethodMirror;
   expect('Method(s(B.qux) in s(B), constructor)', quxConstructor);
   expect(
       '[Parameter(s(x) in s(B.qux),'
@@ -118,7 +116,7 @@
   expect('Class(s(B) in s(test.parameter_test), top-level)',
       quxConstructor.returnType);
 
-  MethodMirror quuxConstructor = constructors[#B.quux];
+  MethodMirror quuxConstructor = constructors[#B.quux] as MethodMirror;
   expect('Method(s(B.quux) in s(B), constructor)', quuxConstructor);
   expect(
       '[Parameter(s(x) in s(B.quux),'
@@ -130,7 +128,7 @@
   expect('Class(s(B) in s(test.parameter_test), top-level)',
       quuxConstructor.returnType);
 
-  MethodMirror corgeConstructor = constructors[#B.corge];
+  MethodMirror corgeConstructor = constructors[#B.corge] as MethodMirror;
   expect('Method(s(B.corge) in s(B), constructor)', corgeConstructor);
   expect(
       '[Parameter(s(x) in s(B.corge), optional, named,'
@@ -143,34 +141,34 @@
   expect('Class(s(B) in s(test.parameter_test), top-level)',
       corgeConstructor.returnType);
 
-  MethodMirror xGetter = cm.declarations[#x];
+  MethodMirror xGetter = cm.declarations[#x] as MethodMirror;
   expect('Method(s(x) in s(B), getter)', xGetter);
   expect('[]', xGetter.parameters);
 
-  MethodMirror xSetter = cm.declarations[const Symbol('x=')];
+  MethodMirror xSetter = cm.declarations[const Symbol('x=')] as MethodMirror;
   expect('Method(s(x=) in s(B), setter)', xSetter);
   expect(
       '[Parameter(s(value) in s(x=), final,'
       ' type = Type(s(dynamic), top-level))]',
       xSetter.parameters);
 
-  MethodMirror grault = cm.declarations[#grault];
+  MethodMirror grault = cm.declarations[#grault] as MethodMirror;
   expect('Method(s(grault) in s(B))', grault);
   expect(
-      '[Parameter(s(x) in s(grault), optional,'
+      '[Parameter(s(x) in s(grault), optional, value = Instance(value = 0),'
       ' type = Class(s(int) in s(dart.core), top-level))]',
       grault.parameters);
-  expect('Instance(value = <null>)', grault.parameters[0].defaultValue);
+  expect('Instance(value = 0)', grault.parameters[0].defaultValue);
 
-  MethodMirror garply = cm.declarations[#garply];
+  MethodMirror garply = cm.declarations[#garply] as MethodMirror;
   expect('Method(s(garply) in s(B))', garply);
   expect(
-      '[Parameter(s(y) in s(garply), optional, named,'
+      '[Parameter(s(y) in s(garply), optional, named, value = Instance(value = 0),'
       ' type = Class(s(int) in s(dart.core), top-level))]',
       garply.parameters);
-  expect('Instance(value = <null>)', garply.parameters[0].defaultValue);
+  expect('Instance(value = 0)', garply.parameters[0].defaultValue);
 
-  MethodMirror waldo = cm.declarations[#waldo];
+  MethodMirror waldo = cm.declarations[#waldo] as MethodMirror;
   expect('Method(s(waldo) in s(B))', waldo);
   expect(
       '[Parameter(s(z) in s(waldo),'
@@ -180,7 +178,7 @@
 
   cm = reflectClass(C);
 
-  MethodMirror fooInC = cm.declarations[#foo];
+  MethodMirror fooInC = cm.declarations[#foo] as MethodMirror;
   expect('Method(s(foo) in s(C))', fooInC);
   expect(
       '[Parameter(s(a) in s(foo),'
@@ -190,7 +188,7 @@
       ' upperBound = Class(s(int) in s(dart.core), top-level)))]',
       fooInC.parameters);
 
-  MethodMirror barInC = cm.declarations[#bar];
+  MethodMirror barInC = cm.declarations[#bar] as MethodMirror;
   expect('Method(s(bar) in s(C))', barInC);
   expect(
       '[Parameter(s(a) in s(bar),'
diff --git a/tests/lib_2/mirrors/private_symbol_mangling_test.dart b/tests/lib_2/mirrors/private_symbol_mangling_test.dart
index ebb9371..826d06c 100644
--- a/tests/lib_2/mirrors/private_symbol_mangling_test.dart
+++ b/tests/lib_2/mirrors/private_symbol_mangling_test.dart
@@ -4,7 +4,6 @@
 
 library main;
 
-//@MirrorsUsed(targets: const ['C1', 'C2', '_privateGlobalField', '_privateGlobalMethod'])
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 import 'private_symbol_mangling_lib.dart';
diff --git a/tests/lib_2/mirrors/private_symbol_test.dart b/tests/lib_2/mirrors/private_symbol_test.dart
index 22f030f..b6e74af 100644
--- a/tests/lib_2/mirrors/private_symbol_test.dart
+++ b/tests/lib_2/mirrors/private_symbol_test.dart
@@ -69,37 +69,37 @@
   Expect.equals(#_C, cm.simpleName);
   Expect.equals('_C', MirrorSystem.getName(cm.simpleName));
 
-  MethodMirror mm = cm.declarations[#g];
+  MethodMirror mm = cm.declarations[#g] as MethodMirror;
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isGetter);
   Expect.equals(#g, mm.simpleName);
   Expect.equals('g', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.declarations[const Symbol('s=')];
+  mm = cm.declarations[const Symbol('s=')] as MethodMirror;
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isSetter);
   Expect.equals(const Symbol('s='), mm.simpleName);
   Expect.equals('s=', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.declarations[#m];
+  mm = cm.declarations[#m] as MethodMirror;
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isRegularMethod);
   Expect.equals(#m, mm.simpleName);
   Expect.equals('m', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.declarations[#_g];
+  mm = cm.declarations[#_g] as MethodMirror;
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isGetter);
   Expect.equals(#_g, mm.simpleName);
   Expect.equals('_g', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.declarations[MirrorSystem.getSymbol('_s=', libtest)];
+  mm = cm.declarations[MirrorSystem.getSymbol('_s=', libtest)] as MethodMirror;
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isSetter);
   Expect.equals(MirrorSystem.getSymbol('_s=', libtest), mm.simpleName);
   Expect.equals('_s=', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.declarations[#_m];
+  mm = cm.declarations[#_m] as MethodMirror;
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isRegularMethod);
   Expect.equals(#_m, mm.simpleName);
@@ -110,7 +110,7 @@
   Expect.equals(#_T, tvm.simpleName);
   Expect.equals('_T', MirrorSystem.getName(tvm.simpleName));
 
-  TypedefMirror tdm = reflectType(_F);
+  TypedefMirror tdm = reflectType(_F) as TypedefMirror;
   Expect.equals(#_F, tdm.simpleName);
   Expect.equals('_F', MirrorSystem.getName(tdm.simpleName));
 
diff --git a/tests/lib_2/mirrors/proxy_type_test.dart b/tests/lib_2/mirrors/proxy_type_test.dart
index 4ba0f16..986ded7 100644
--- a/tests/lib_2/mirrors/proxy_type_test.dart
+++ b/tests/lib_2/mirrors/proxy_type_test.dart
@@ -10,7 +10,7 @@
 // This test is much longer that is strictly necessary to test
 // InstanceMirror.type in the face of a reflectee overriding runtimeType, but
 // shows a case where one might have legimate reason to override runtimeType.
-// See section 2.2 in Mark Miller's Robust Composition: Towards a Unfied
+// See section 2.2 in Mark Miller's Robust Composition: Towards a Unified
 // Approach to Access Control and Concurrency Control.
 
 class Alice {
diff --git a/tests/lib_2/mirrors/redirecting_factory_different_type_test.dart b/tests/lib_2/mirrors/redirecting_factory_different_type_test.dart
index 3c5b8ba..cb23a9b 100644
--- a/tests/lib_2/mirrors/redirecting_factory_different_type_test.dart
+++ b/tests/lib_2/mirrors/redirecting_factory_different_type_test.dart
@@ -4,7 +4,6 @@
 
 library mirror_test;
 
-@MirrorsUsed(targets: "mirror_test")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/reflect_runtime_type_test.dart b/tests/lib_2/mirrors/reflect_runtime_type_test.dart
index 59cc65e..a5e96b6 100644
--- a/tests/lib_2/mirrors/reflect_runtime_type_test.dart
+++ b/tests/lib_2/mirrors/reflect_runtime_type_test.dart
@@ -8,7 +8,7 @@
 import "dart:mirrors";
 
 class Foo {
-  int a;
+  int a = 0;
 }
 
 main() {
diff --git a/tests/lib_2/mirrors/reflect_two_classes_test.dart b/tests/lib_2/mirrors/reflect_two_classes_test.dart
index 2abf1a5..65f103b 100644
--- a/tests/lib_2/mirrors/reflect_two_classes_test.dart
+++ b/tests/lib_2/mirrors/reflect_two_classes_test.dart
@@ -6,10 +6,6 @@
 
 library index;
 
-@MirrorsUsed(
-    targets: const [Bar, Foo],
-    symbols: const ['bar', 'getBar', 'foo', 'getFoo'],
-    override: '*')
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/reflect_uninstantiated_class_test.dart b/tests/lib_2/mirrors/reflect_uninstantiated_class_test.dart
index f644ea8..bfbdadb 100644
--- a/tests/lib_2/mirrors/reflect_uninstantiated_class_test.dart
+++ b/tests/lib_2/mirrors/reflect_uninstantiated_class_test.dart
@@ -7,7 +7,7 @@
 import "dart:mirrors";
 
 class Foo {
-  int a;
+  int a = 0;
 }
 
 main() {
diff --git a/tests/lib_2/mirrors/reflected_type_function_type_test.dart b/tests/lib_2/mirrors/reflected_type_function_type_test.dart
index bf57c47..53132a3 100644
--- a/tests/lib_2/mirrors/reflected_type_function_type_test.dart
+++ b/tests/lib_2/mirrors/reflected_type_function_type_test.dart
@@ -13,7 +13,8 @@
 bool somePredicate(num n) => n < 0;
 
 main() {
-  FunctionTypeMirror numToBool1 = reflect(somePredicate).type;
+  FunctionTypeMirror numToBool1 =
+      reflect(somePredicate).type as FunctionTypeMirror;
   FunctionTypeMirror numToBool2 =
       (reflectType(Predicate) as TypedefMirror).referent;
 
diff --git a/tests/lib_2/mirrors/reflected_type_generics_test.dart b/tests/lib_2/mirrors/reflected_type_generics_test.dart
index 7557e8f..4e84300 100644
--- a/tests/lib_2/mirrors/reflected_type_generics_test.dart
+++ b/tests/lib_2/mirrors/reflected_type_generics_test.dart
@@ -4,7 +4,6 @@
 
 library test.reflected_type_generics_test;
 
-@MirrorsUsed(targets: "test.reflected_type_generics_test")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/reflected_type_typedefs_test.dart b/tests/lib_2/mirrors/reflected_type_typedefs_test.dart
index 7f8aa99..03673d7 100644
--- a/tests/lib_2/mirrors/reflected_type_typedefs_test.dart
+++ b/tests/lib_2/mirrors/reflected_type_typedefs_test.dart
@@ -13,12 +13,12 @@
 typedef S GenericTransform<S>(S s);
 
 main() {
-  TypedefMirror nonGenericPredicate = reflectType(NonGenericPredicate);
-  TypedefMirror predicateOfDynamic = reflectType(GenericPredicate);
-  TypedefMirror transformOfDynamic = reflectType(GenericTransform);
+  final nonGenericPredicate = reflectType(NonGenericPredicate) as TypedefMirror;
+  final predicateOfDynamic = reflectType(GenericPredicate) as TypedefMirror;
+  final transformOfDynamic = reflectType(GenericTransform) as TypedefMirror;
 
-  TypedefMirror predicateDecl = predicateOfDynamic.originalDeclaration;
-  TypedefMirror transformDecl = transformOfDynamic.originalDeclaration;
+  final predicateDecl = predicateOfDynamic.originalDeclaration as TypedefMirror;
+  final transformDecl = transformOfDynamic.originalDeclaration as TypedefMirror;
 
   expectReflectedType(nonGenericPredicate, NonGenericPredicate);
   expectReflectedType(predicateOfDynamic, GenericPredicate);
diff --git a/tests/lib_2/mirrors/reflectively_instantiate_uninstantiated_class_test.dart b/tests/lib_2/mirrors/reflectively_instantiate_uninstantiated_class_test.dart
index 6282bda..63cbb99 100644
--- a/tests/lib_2/mirrors/reflectively_instantiate_uninstantiated_class_test.dart
+++ b/tests/lib_2/mirrors/reflectively_instantiate_uninstantiated_class_test.dart
@@ -8,7 +8,7 @@
 import "dart:mirrors";
 
 class Foo {
-  int a;
+  int a = 0;
 }
 
 main() {
diff --git a/tests/lib_2/mirrors/regress_14304_test.dart b/tests/lib_2/mirrors/regress_14304_test.dart
index b138d03..293fcea 100644
--- a/tests/lib_2/mirrors/regress_14304_test.dart
+++ b/tests/lib_2/mirrors/regress_14304_test.dart
@@ -14,7 +14,7 @@
 main() {
   ClassMirror a = reflectClass(A);
   TypeVariableMirror t = a.typeVariables[0];
-  MethodMirror m = a.declarations[#m];
+  MethodMirror m = a.declarations[#m] as MethodMirror;
 
   Expect.equals(t, m.returnType);
 }
diff --git a/tests/lib_2/mirrors/regress_26187_test.dart b/tests/lib_2/mirrors/regress_26187_test.dart
index 8a1cc6a..6c381c7 100644
--- a/tests/lib_2/mirrors/regress_26187_test.dart
+++ b/tests/lib_2/mirrors/regress_26187_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@MirrorsUsed(targets: const ["A", "B", "f", "g"])
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/regress_33259_test.dart b/tests/lib_2/mirrors/regress_33259_test.dart
index 5244a33..af2b4eb 100644
--- a/tests/lib_2/mirrors/regress_33259_test.dart
+++ b/tests/lib_2/mirrors/regress_33259_test.dart
@@ -8,13 +8,13 @@
 import 'package:expect/expect.dart';
 
 void main() {
-  Expect.isTrue(
-      reflectClass(Thing).declarations[#foo].metadata[0].reflectee is Sub);
+  final foo = reflectClass(Thing).declarations[#foo] as VariableMirror;
+  Expect.isTrue(foo.metadata[0].reflectee is Sub);
 }
 
 class Thing {
   @Sub()
-  String foo;
+  String foo = "initialized";
 }
 
 class Base<T> {
diff --git a/tests/lib_2/mirrors/regress_34982_test.dart b/tests/lib_2/mirrors/regress_34982_test.dart
index 184eb17..f86df29 100644
--- a/tests/lib_2/mirrors/regress_34982_test.dart
+++ b/tests/lib_2/mirrors/regress_34982_test.dart
@@ -15,12 +15,13 @@
 }
 
 void main() {
-  MethodMirror method1 = reflectClass(B).declarations[#c];
+  MethodMirror method1 = reflectClass(B).declarations[#c] as MethodMirror;
   Expect.isTrue(method1.isSynthetic);
 
-  MethodMirror method2 = reflectClass(B).declarations[#noSuchMethod];
+  MethodMirror method2 =
+      reflectClass(B).declarations[#noSuchMethod] as MethodMirror;
   Expect.isFalse(method2.isSynthetic);
 
-  MethodMirror method3 = reflectClass(A).declarations[#c];
+  MethodMirror method3 = reflectClass(A).declarations[#c] as MethodMirror;
   Expect.isFalse(method3.isSynthetic);
 }
diff --git a/tests/lib_2/mirrors/relation_assignable_test.dart b/tests/lib_2/mirrors/relation_assignable_test.dart
index e7843d5..da4c13d 100644
--- a/tests/lib_2/mirrors/relation_assignable_test.dart
+++ b/tests/lib_2/mirrors/relation_assignable_test.dart
@@ -4,7 +4,6 @@
 
 library test.relation_assignable;
 
-@MirrorsUsed(targets: "test.relation_assignable")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
@@ -34,11 +33,11 @@
   LibraryMirror thisLibrary = mirrors.findLibrary(#test.relation_assignable);
 
   // Classes.
-  TypeMirror Super = thisLibrary.declarations[#Superclass];
-  TypeMirror Sub1 = thisLibrary.declarations[#Subclass1];
-  TypeMirror Sub2 = thisLibrary.declarations[#Subclass2];
-  TypeMirror Obj = coreLibrary.declarations[#Object];
-  TypeMirror Nul = coreLibrary.declarations[#Null];
+  TypeMirror Super = thisLibrary.declarations[#Superclass] as TypeMirror;
+  TypeMirror Sub1 = thisLibrary.declarations[#Subclass1] as TypeMirror;
+  TypeMirror Sub2 = thisLibrary.declarations[#Subclass2] as TypeMirror;
+  TypeMirror Obj = coreLibrary.declarations[#Object] as TypeMirror;
+  TypeMirror Nul = coreLibrary.declarations[#Null] as TypeMirror;
 
   Expect.isTrue(Obj.isAssignableTo(Obj));
   Expect.isTrue(Super.isAssignableTo(Super));
@@ -70,10 +69,13 @@
   Expect.isTrue(Super.isAssignableTo(Nul));
 
   // Function typedef - argument type.
-  TypeMirror Func = coreLibrary.declarations[#Function];
-  TypedefMirror NumPred = thisLibrary.declarations[#NumberPredicate];
-  TypedefMirror IntPred = thisLibrary.declarations[#IntegerPredicate];
-  TypedefMirror DubPred = thisLibrary.declarations[#DoublePredicate];
+  TypeMirror Func = coreLibrary.declarations[#Function] as TypeMirror;
+  TypedefMirror NumPred =
+      thisLibrary.declarations[#NumberPredicate] as TypedefMirror;
+  TypedefMirror IntPred =
+      thisLibrary.declarations[#IntegerPredicate] as TypedefMirror;
+  TypedefMirror DubPred =
+      thisLibrary.declarations[#DoublePredicate] as TypedefMirror;
 
   Expect.isTrue(Func.isAssignableTo(Func));
   Expect.isTrue(NumPred.isAssignableTo(NumPred));
@@ -102,9 +104,12 @@
   Expect.isTrue(Obj.isAssignableTo(DubPred));
 
   // Function typedef - return type.
-  TypedefMirror NumGen = thisLibrary.declarations[#NumberGenerator];
-  TypedefMirror IntGen = thisLibrary.declarations[#IntegerGenerator];
-  TypedefMirror DubGen = thisLibrary.declarations[#DoubleGenerator];
+  TypedefMirror NumGen =
+      thisLibrary.declarations[#NumberGenerator] as TypedefMirror;
+  TypedefMirror IntGen =
+      thisLibrary.declarations[#IntegerGenerator] as TypedefMirror;
+  TypedefMirror DubGen =
+      thisLibrary.declarations[#DoubleGenerator] as TypedefMirror;
 
   Expect.isTrue(NumGen.isAssignableTo(NumGen));
   Expect.isTrue(IntGen.isAssignableTo(IntGen));
@@ -227,7 +232,7 @@
   Expect.isFalse(TFromC.isAssignableTo(TFromA));
   Expect.isFalse(TFromC.isAssignableTo(TFromB));
 
-  TypeMirror Num = coreLibrary.declarations[#num];
+  TypeMirror Num = coreLibrary.declarations[#num] as TypeMirror;
   Expect.isTrue(TFromC.isAssignableTo(Num));
   Expect.isTrue(Num.isAssignableTo(TFromC));
 
diff --git a/tests/lib_2/mirrors/relation_subclass_test.dart b/tests/lib_2/mirrors/relation_subclass_test.dart
index 7be25c2..7e83931 100644
--- a/tests/lib_2/mirrors/relation_subclass_test.dart
+++ b/tests/lib_2/mirrors/relation_subclass_test.dart
@@ -26,11 +26,11 @@
   LibraryMirror coreLibrary = mirrors.findLibrary(#dart.core);
   LibraryMirror thisLibrary = mirrors.findLibrary(#test.relation_subclass);
 
-  ClassMirror Super = thisLibrary.declarations[#Superclass];
-  ClassMirror Sub1 = thisLibrary.declarations[#Subclass1];
-  ClassMirror Sub2 = thisLibrary.declarations[#Subclass2];
-  ClassMirror Obj = coreLibrary.declarations[#Object];
-  ClassMirror Nul = coreLibrary.declarations[#Null];
+  ClassMirror Super = thisLibrary.declarations[#Superclass] as ClassMirror;
+  ClassMirror Sub1 = thisLibrary.declarations[#Subclass1] as ClassMirror;
+  ClassMirror Sub2 = thisLibrary.declarations[#Subclass2] as ClassMirror;
+  ClassMirror Obj = coreLibrary.declarations[#Object] as ClassMirror;
+  ClassMirror Nul = coreLibrary.declarations[#Null] as ClassMirror;
 
   Expect.isTrue(Obj.isSubclassOf(Obj));
   Expect.isTrue(Super.isSubclassOf(Super));
@@ -61,7 +61,7 @@
   Expect.isFalse(Nul.isSubclassOf(Super));
   Expect.isFalse(Super.isSubclassOf(Nul));
 
-  ClassMirror Func = coreLibrary.declarations[#Function];
+  ClassMirror Func = coreLibrary.declarations[#Function] as ClassMirror;
   Expect.isTrue(Func.isSubclassOf(Obj));
   Expect.isFalse(Obj.isSubclassOf(Func));
 
diff --git a/tests/lib_2/mirrors/relation_subtype_test.dart b/tests/lib_2/mirrors/relation_subtype_test.dart
index 79160f2..a9d165a 100644
--- a/tests/lib_2/mirrors/relation_subtype_test.dart
+++ b/tests/lib_2/mirrors/relation_subtype_test.dart
@@ -4,7 +4,6 @@
 
 library test.relation_subtype;
 
-@MirrorsUsed(targets: "test.relation_subtype")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
@@ -34,11 +33,11 @@
   LibraryMirror thisLibrary = mirrors.findLibrary(#test.relation_subtype);
 
   // Classes.
-  TypeMirror Super = thisLibrary.declarations[#Superclass];
-  TypeMirror Sub1 = thisLibrary.declarations[#Subclass1];
-  TypeMirror Sub2 = thisLibrary.declarations[#Subclass2];
-  TypeMirror Obj = coreLibrary.declarations[#Object];
-  TypeMirror Nul = coreLibrary.declarations[#Null];
+  final Super = thisLibrary.declarations[#Superclass] as ClassMirror;
+  final Sub1 = thisLibrary.declarations[#Subclass1] as ClassMirror;
+  final Sub2 = thisLibrary.declarations[#Subclass2] as ClassMirror;
+  final Obj = coreLibrary.declarations[#Object] as ClassMirror;
+  final Nul = coreLibrary.declarations[#Null] as ClassMirror;
 
   Expect.isTrue(Obj.isSubtypeOf(Obj));
   Expect.isTrue(Super.isSubtypeOf(Super));
@@ -70,10 +69,13 @@
   Expect.isFalse(Super.isSubtypeOf(Nul));
 
   // Function typedef - argument type.
-  TypeMirror Func = coreLibrary.declarations[#Function];
-  TypedefMirror NumPred = thisLibrary.declarations[#NumberPredicate];
-  TypedefMirror IntPred = thisLibrary.declarations[#IntegerPredicate];
-  TypedefMirror DubPred = thisLibrary.declarations[#DoublePredicate];
+  TypeMirror Func = coreLibrary.declarations[#Function] as TypeMirror;
+  TypedefMirror NumPred =
+      thisLibrary.declarations[#NumberPredicate] as TypedefMirror;
+  TypedefMirror IntPred =
+      thisLibrary.declarations[#IntegerPredicate] as TypedefMirror;
+  TypedefMirror DubPred =
+      thisLibrary.declarations[#DoublePredicate] as TypedefMirror;
 
   Expect.isTrue(Func.isSubtypeOf(Func));
   Expect.isTrue(NumPred.isSubtypeOf(NumPred));
@@ -98,9 +100,12 @@
   Expect.isTrue(DubPred.isSubtypeOf(Obj));
 
   // Function typedef - return type.
-  TypedefMirror NumGen = thisLibrary.declarations[#NumberGenerator];
-  TypedefMirror IntGen = thisLibrary.declarations[#IntegerGenerator];
-  TypedefMirror DubGen = thisLibrary.declarations[#DoubleGenerator];
+  TypedefMirror NumGen =
+      thisLibrary.declarations[#NumberGenerator] as TypedefMirror;
+  TypedefMirror IntGen =
+      thisLibrary.declarations[#IntegerGenerator] as TypedefMirror;
+  TypedefMirror DubGen =
+      thisLibrary.declarations[#DoubleGenerator] as TypedefMirror;
 
   Expect.isTrue(NumGen.isSubtypeOf(NumGen));
   Expect.isTrue(IntGen.isSubtypeOf(IntGen));
@@ -211,7 +216,7 @@
   Expect.isFalse(TFromC.isSubtypeOf(TFromA));
   Expect.isFalse(TFromC.isSubtypeOf(TFromB));
 
-  TypeMirror Num = coreLibrary.declarations[#num];
+  TypeMirror Num = coreLibrary.declarations[#num] as TypeMirror;
   Expect.isTrue(TFromC.isSubtypeOf(Num));
   Expect.isFalse(Num.isSubtypeOf(TFromC));
 
diff --git a/tests/lib_2/mirrors/repeated_private_anon_mixin_app1.dart b/tests/lib_2/mirrors/repeated_private_anon_mixin_app1.dart
index 7519844..377cd51 100644
--- a/tests/lib_2/mirrors/repeated_private_anon_mixin_app1.dart
+++ b/tests/lib_2/mirrors/repeated_private_anon_mixin_app1.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library lib;
+library lib1;
 
 class _S {}
 
diff --git a/tests/lib_2/mirrors/repeated_private_anon_mixin_app2.dart b/tests/lib_2/mirrors/repeated_private_anon_mixin_app2.dart
index 7519844..36f9d8c 100644
--- a/tests/lib_2/mirrors/repeated_private_anon_mixin_app2.dart
+++ b/tests/lib_2/mirrors/repeated_private_anon_mixin_app2.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library lib;
+library lib2;
 
 class _S {}
 
diff --git a/tests/lib_2/mirrors/repeated_private_anon_mixin_app_test.dart b/tests/lib_2/mirrors/repeated_private_anon_mixin_app_test.dart
index 49146ac..7a7a5ad 100644
--- a/tests/lib_2/mirrors/repeated_private_anon_mixin_app_test.dart
+++ b/tests/lib_2/mirrors/repeated_private_anon_mixin_app_test.dart
@@ -6,7 +6,6 @@
 
 // Regression test for symbol mangling.
 
-@MirrorsUsed(targets: "test.repeated_private_anon_mixin_app")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/return_type_test.dart b/tests/lib_2/mirrors/return_type_test.dart
index e7e3c5e..65115bd 100644
--- a/tests/lib_2/mirrors/return_type_test.dart
+++ b/tests/lib_2/mirrors/return_type_test.dart
@@ -5,7 +5,6 @@
 /// Test of [MethodMirror.returnType].
 library test.return_type_test;
 
-@MirrorsUsed(targets: 'test.return_type_test', override: '*')
 import 'dart:mirrors';
 
 import 'stringify.dart';
diff --git a/tests/lib_2/mirrors/runtime_type_test.dart b/tests/lib_2/mirrors/runtime_type_test.dart
index fd446d3..82c88b6 100644
--- a/tests/lib_2/mirrors/runtime_type_test.dart
+++ b/tests/lib_2/mirrors/runtime_type_test.dart
@@ -4,7 +4,6 @@
 
 library test.runtime_type_test;
 
-@MirrorsUsed(targets: 'test.runtime_type_test', override: '*')
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/set_field_with_final_inheritance_test.dart b/tests/lib_2/mirrors/set_field_with_final_inheritance_test.dart
index 51e6d8f..4281227 100644
--- a/tests/lib_2/mirrors/set_field_with_final_inheritance_test.dart
+++ b/tests/lib_2/mirrors/set_field_with_final_inheritance_test.dart
@@ -4,7 +4,6 @@
 
 library test.set_field_with_final_inheritance;
 
-@MirrorsUsed(targets: "test.set_field_with_final_inheritance")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/set_field_with_final_test.dart b/tests/lib_2/mirrors/set_field_with_final_test.dart
index d41b08a..d2515fd 100644
--- a/tests/lib_2/mirrors/set_field_with_final_test.dart
+++ b/tests/lib_2/mirrors/set_field_with_final_test.dart
@@ -4,7 +4,6 @@
 
 library test.set_field_with_final;
 
-@MirrorsUsed(targets: "test.set_field_with_final")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
@@ -27,7 +26,7 @@
   Expect.throwsNoSuchMethodError(() => cm.setField(#staticFinal, 9));
   Expect.throwsNoSuchMethodError(() => cm.setField(#staticGetter, 10));
 
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
   Expect.throwsNoSuchMethodError(() => lm.setField(#toplevelFinal, 11));
   Expect.throwsNoSuchMethodError(() => lm.setField(#toplevelGetter, 12));
 }
diff --git a/tests/lib_2/mirrors/spawn_function_root_library_test.dart b/tests/lib_2/mirrors/spawn_function_root_library_test.dart
index 5f06c62..f2d7f6c 100644
--- a/tests/lib_2/mirrors/spawn_function_root_library_test.dart
+++ b/tests/lib_2/mirrors/spawn_function_root_library_test.dart
@@ -4,7 +4,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 import 'dart:isolate';
 import 'package:expect/expect.dart';
@@ -16,13 +15,13 @@
 }
 
 main() {
-  RawReceivePort port;
-  port = new RawReceivePort((String childRootUri) {
+  final port = new RawReceivePort();
+  port.handler = (String childRootUri) {
     LibraryMirror root = currentMirrorSystem().isolate.rootLibrary;
     Expect.isNotNull(root);
     Expect.equals(root.uri.toString(), childRootUri);
     port.close();
-  });
+  };
 
   Isolate.spawn(child, port.sendPort);
 }
diff --git a/tests/lib_2/mirrors/static_const_field_test.dart b/tests/lib_2/mirrors/static_const_field_test.dart
index f6fd959..cf8c283 100644
--- a/tests/lib_2/mirrors/static_const_field_test.dart
+++ b/tests/lib_2/mirrors/static_const_field_test.dart
@@ -5,7 +5,6 @@
 // Test that static const fields are accessible by reflection.
 // Regression test for http://dartbug.com/23811.
 
-@MirrorsUsed(targets: const [A])
 import "dart:mirrors";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/mirrors/static_members_easier_test.dart b/tests/lib_2/mirrors/static_members_easier_test.dart
index 448564c..b050a3c 100644
--- a/tests/lib_2/mirrors/static_members_easier_test.dart
+++ b/tests/lib_2/mirrors/static_members_easier_test.dart
@@ -4,7 +4,6 @@
 
 library test.static_members;
 
-@MirrorsUsed(targets: "test.static_members")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
@@ -17,7 +16,7 @@
 
 main() {
   ClassMirror cm = reflectClass(declarations_model.Class);
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
 
   Expect.setEquals([
     #staticVariable,
diff --git a/tests/lib_2/mirrors/static_members_test.dart b/tests/lib_2/mirrors/static_members_test.dart
index 290d8f3..f84bc53 100644
--- a/tests/lib_2/mirrors/static_members_test.dart
+++ b/tests/lib_2/mirrors/static_members_test.dart
@@ -4,7 +4,6 @@
 
 library test.static_members;
 
-@MirrorsUsed(targets: "test.static_members")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
@@ -17,7 +16,7 @@
 
 main() {
   ClassMirror cm = reflectClass(declarations_model.Class);
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
 
   Expect.setEquals([
     #staticVariable,
diff --git a/tests/lib_2/mirrors/static_metatarget_test.dart b/tests/lib_2/mirrors/static_metatarget_test.dart
index 57b5c13..8024db8 100644
--- a/tests/lib_2/mirrors/static_metatarget_test.dart
+++ b/tests/lib_2/mirrors/static_metatarget_test.dart
@@ -5,7 +5,6 @@
 // Regression test for the combined use of metatargets and static fields with
 // annotations.
 
-@MirrorsUsed(metaTargets: const [Reflectable])
 import 'dart:mirrors';
 
 class A {
diff --git a/tests/lib_2/mirrors/static_test.dart b/tests/lib_2/mirrors/static_test.dart
index 30bc0ad..6a2e4fe 100644
--- a/tests/lib_2/mirrors/static_test.dart
+++ b/tests/lib_2/mirrors/static_test.dart
@@ -6,7 +6,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 
 import 'stringify.dart';
diff --git a/tests/lib_2/mirrors/stringify.dart b/tests/lib_2/mirrors/stringify.dart
index 6ff5c3f..954067c 100644
--- a/tests/lib_2/mirrors/stringify.dart
+++ b/tests/lib_2/mirrors/stringify.dart
@@ -9,11 +9,11 @@
 
 import 'package:expect/expect.dart';
 
-name(DeclarationMirror mirror) {
+String name(DeclarationMirror mirror) {
   return (mirror == null) ? '<null>' : stringify(mirror.simpleName);
 }
 
-stringifyMap(Map map) {
+String stringifyMap(Map map) {
   var buffer = new StringBuffer();
   bool first = true;
   var names = map.keys.map((s) => MirrorSystem.getName(s)).toList()..sort();
@@ -27,7 +27,7 @@
   return '{$buffer}';
 }
 
-stringifyIterable(Iterable list) {
+String stringifyIterable(Iterable list) {
   var buffer = new StringBuffer();
   bool first = true;
   for (String value in list.map(stringify)) {
@@ -38,7 +38,7 @@
   return '[$buffer]';
 }
 
-stringifyInstance(InstanceMirror instance) {
+String stringifyInstance(InstanceMirror instance) {
   var buffer = new StringBuffer();
   if (instance.hasReflectee) {
     buffer.write('value = ${stringify(instance.reflectee)}');
@@ -46,9 +46,9 @@
   return 'Instance(${buffer})';
 }
 
-stringifySymbol(Symbol symbol) => 's(${MirrorSystem.getName(symbol)})';
+String stringifySymbol(Symbol symbol) => 's(${MirrorSystem.getName(symbol)})';
 
-writeDeclarationOn(DeclarationMirror mirror, StringBuffer buffer) {
+void writeDeclarationOn(DeclarationMirror mirror, StringBuffer buffer) {
   buffer.write(stringify(mirror.simpleName));
   if (mirror.owner != null) {
     buffer.write(' in ');
@@ -58,19 +58,19 @@
   if (mirror.isTopLevel) buffer.write(', top-level');
 }
 
-writeVariableOn(VariableMirror variable, StringBuffer buffer) {
+void writeVariableOn(VariableMirror variable, StringBuffer buffer) {
   writeDeclarationOn(variable, buffer);
   if (variable.isStatic) buffer.write(', static');
   if (variable.isFinal) buffer.write(', final');
 }
 
-stringifyVariable(VariableMirror variable) {
+String stringifyVariable(VariableMirror variable) {
   var buffer = new StringBuffer();
   writeVariableOn(variable, buffer);
   return 'Variable($buffer)';
 }
 
-stringifyParameter(ParameterMirror parameter) {
+String stringifyParameter(ParameterMirror parameter) {
   var buffer = new StringBuffer();
   writeVariableOn(parameter, buffer);
   if (parameter.isOptional) buffer.write(', optional');
@@ -84,26 +84,26 @@
   return 'Parameter($buffer)';
 }
 
-stringifyTypeVariable(TypeVariableMirror typeVariable) {
+String stringifyTypeVariable(TypeVariableMirror typeVariable) {
   var buffer = new StringBuffer();
   writeDeclarationOn(typeVariable, buffer);
   buffer.write(', upperBound = ${stringify(typeVariable.upperBound)}');
   return 'TypeVariable($buffer)';
 }
 
-stringifyType(TypeMirror type) {
+String stringifyType(TypeMirror type) {
   var buffer = new StringBuffer();
   writeDeclarationOn(type, buffer);
   return 'Type($buffer)';
 }
 
-stringifyClass(ClassMirror cls) {
+String stringifyClass(ClassMirror cls) {
   var buffer = new StringBuffer();
   writeDeclarationOn(cls, buffer);
   return 'Class($buffer)';
 }
 
-stringifyMethod(MethodMirror method) {
+String stringifyMethod(MethodMirror method) {
   var buffer = new StringBuffer();
   writeDeclarationOn(method, buffer);
   if (method.isAbstract) buffer.write(', abstract');
@@ -115,7 +115,7 @@
   return 'Method($buffer)';
 }
 
-stringifyDependencies(LibraryMirror l) {
+String stringifyDependencies(LibraryMirror l) {
   n(s) => s is Symbol ? MirrorSystem.getName(s) : s;
   int compareDep(a, b) {
     if (a.targetLibrary == b.targetLibrary) {
@@ -159,6 +159,7 @@
 }
 
 String stringify(value) {
+  if (value == null) return '<null>';
   if (value is Map) return stringifyMap(value);
   if (value is Iterable) return stringifyIterable(value);
   if (value is InstanceMirror) return stringifyInstance(value);
@@ -171,11 +172,10 @@
   if (value is ClassMirror) return stringifyClass(value);
   if (value is TypeVariableMirror) return stringifyTypeVariable(value);
   if (value is TypeMirror) return stringifyType(value);
-  if (value == null) return '<null>';
   throw 'Unexpected value: $value';
 }
 
-expect(expected, actual, [String reason = ""]) {
+void expect(expected, actual, [String reason = ""]) {
   Expect.stringEquals(expected, stringify(actual), reason);
 }
 
@@ -183,7 +183,8 @@
   return MirrorSystem.getName(a).compareTo(MirrorSystem.getName(b));
 }
 
-simpleNames(Iterable<Mirror> i) =>
+Iterable<Symbol> simpleNames(Iterable<Mirror> i) =>
     i.map((e) => (e as DeclarationMirror).simpleName);
 
-sort(Iterable<Symbol> symbols) => symbols.toList()..sort(compareSymbols);
+List<Symbol> sort(Iterable<Symbol> symbols) =>
+    symbols.toList()..sort(compareSymbols);
diff --git a/tests/lib_2/mirrors/superclass_test.dart b/tests/lib_2/mirrors/superclass_test.dart
index 5581b6a..ad571be 100644
--- a/tests/lib_2/mirrors/superclass_test.dart
+++ b/tests/lib_2/mirrors/superclass_test.dart
@@ -4,7 +4,6 @@
 
 library test.superclass;
 
-@MirrorsUsed(targets: "test.superclass")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
diff --git a/tests/lib_2/mirrors/symbol_validation_test.dart b/tests/lib_2/mirrors/symbol_validation_test.dart
index 5b3b2e3..11a7d94 100644
--- a/tests/lib_2/mirrors/symbol_validation_test.dart
+++ b/tests/lib_2/mirrors/symbol_validation_test.dart
@@ -4,7 +4,6 @@
 
 library symbol_validation_test;
 
-@MirrorsUsed(targets: "symbol_validation_test")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
@@ -23,8 +22,8 @@
 }
 
 validPrivateSymbol(String string) {
-  ClosureMirror closure = reflect(main);
-  LibraryMirror library = closure.function.owner;
+  ClosureMirror closure = reflect(main) as ClosureMirror;
+  LibraryMirror library = closure.function.owner as LibraryMirror;
   Expect.equals(
       string,
       MirrorSystem.getName(MirrorSystem.getSymbol(string, library)),
diff --git a/tests/lib_2/mirrors/syntax_error_test.dart b/tests/lib_2/mirrors/syntax_error_test.dart
index 686e06e..227e791 100644
--- a/tests/lib_2/mirrors/syntax_error_test.dart
+++ b/tests/lib_2/mirrors/syntax_error_test.dart
@@ -7,7 +7,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 
 class MD {
diff --git a/tests/lib_2/mirrors/synthetic_accessor_properties_test.dart b/tests/lib_2/mirrors/synthetic_accessor_properties_test.dart
index ff6abf3..9d1d6e3 100644
--- a/tests/lib_2/mirrors/synthetic_accessor_properties_test.dart
+++ b/tests/lib_2/mirrors/synthetic_accessor_properties_test.dart
@@ -4,35 +4,34 @@
 
 library test.synthetic_accessor_properties;
 
-@MirrorsUsed(targets: "test.synthetic_accessor_properties")
 import 'dart:mirrors';
 import 'package:expect/expect.dart';
 
 import 'stringify.dart';
 
 class C {
-  String instanceField;
+  String instanceField = "1";
   final num finalInstanceField = 2;
 
-  static bool staticField;
+  static bool staticField = false;
   static final int finalStaticField = 4;
 }
 
-String topLevelField;
+String topLevelField = "5";
 final double finalTopLevelField = 6.0;
 
 main() {
   ClassMirror cm = reflectClass(C);
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
   MethodMirror mm;
   ParameterMirror pm;
 
-  mm = cm.instanceMembers[#instanceField];
+  mm = cm.instanceMembers[#instanceField] as MethodMirror;
   expect('Method(s(instanceField) in s(C), synthetic, getter)', mm);
   Expect.equals(reflectClass(String), mm.returnType);
   Expect.listEquals([], mm.parameters);
 
-  mm = cm.instanceMembers[const Symbol('instanceField=')];
+  mm = cm.instanceMembers[const Symbol('instanceField=')] as MethodMirror;
   expect('Method(s(instanceField=) in s(C), synthetic, setter)', mm);
   Expect.equals(reflectClass(String), mm.returnType);
   pm = mm.parameters.single;
@@ -41,20 +40,20 @@
       ' type = Class(s(String) in s(dart.core), top-level))',
       pm);
 
-  mm = cm.instanceMembers[#finalInstanceField];
+  mm = cm.instanceMembers[#finalInstanceField] as MethodMirror;
   expect('Method(s(finalInstanceField) in s(C), synthetic, getter)', mm);
   Expect.equals(reflectClass(num), mm.returnType);
   Expect.listEquals([], mm.parameters);
 
-  mm = cm.instanceMembers[const Symbol('finalInstanceField=')];
+  mm = cm.instanceMembers[const Symbol('finalInstanceField=')] as MethodMirror;
   Expect.isNull(mm);
 
-  mm = cm.staticMembers[#staticField];
+  mm = cm.staticMembers[#staticField] as MethodMirror;
   expect('Method(s(staticField) in s(C), synthetic, static, getter)', mm);
   Expect.equals(reflectClass(bool), mm.returnType);
   Expect.listEquals([], mm.parameters);
 
-  mm = cm.staticMembers[const Symbol('staticField=')];
+  mm = cm.staticMembers[const Symbol('staticField=')] as MethodMirror;
   expect('Method(s(staticField=) in s(C), synthetic, static, setter)', mm);
   Expect.equals(reflectClass(bool), mm.returnType);
   pm = mm.parameters.single;
@@ -63,11 +62,11 @@
       ' type = Class(s(bool) in s(dart.core), top-level))',
       pm);
 
-  mm = cm.staticMembers[#finalStaticField];
+  mm = cm.staticMembers[#finalStaticField] as MethodMirror;
   expect('Method(s(finalStaticField) in s(C), synthetic, static, getter)', mm);
   Expect.equals(reflectClass(int), mm.returnType);
   Expect.listEquals([], mm.parameters);
 
-  mm = cm.staticMembers[const Symbol('finalStaticField=')];
+  mm = cm.staticMembers[const Symbol('finalStaticField=')] as MethodMirror;
   Expect.isNull(mm);
 }
diff --git a/tests/lib_2/mirrors/to_string_test.dart b/tests/lib_2/mirrors/to_string_test.dart
index 7e08288..23a0499 100644
--- a/tests/lib_2/mirrors/to_string_test.dart
+++ b/tests/lib_2/mirrors/to_string_test.dart
@@ -4,7 +4,6 @@
 
 library test.to_string_test;
 
-@MirrorsUsed(targets: "test.to_string_test")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/top_level_accessors_test.dart b/tests/lib_2/mirrors/top_level_accessors_test.dart
index 27e0d3e..269153e 100644
--- a/tests/lib_2/mirrors/top_level_accessors_test.dart
+++ b/tests/lib_2/mirrors/top_level_accessors_test.dart
@@ -4,7 +4,6 @@
 
 library test.top_level_accessors_test;
 
-@MirrorsUsed(targets: "test.top_level_accessors_test")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart b/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart
index ba18900..e915944 100644
--- a/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart
+++ b/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart
@@ -4,7 +4,6 @@
 
 library test.type_argument_is_type_variable;
 
-@MirrorsUsed(targets: "test.type_argument_is_type_variable")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/type_mirror_for_type_test.dart b/tests/lib_2/mirrors/type_mirror_for_type_test.dart
index 9219ef6..92e101f 100644
--- a/tests/lib_2/mirrors/type_mirror_for_type_test.dart
+++ b/tests/lib_2/mirrors/type_mirror_for_type_test.dart
@@ -8,7 +8,6 @@
 
 import 'package:expect/expect.dart';
 
-@MirrorsUsed(targets: 'test.type_mirror_for_type')
 import 'dart:mirrors';
 
 class C<T> {}
diff --git a/tests/lib_2/mirrors/type_variable_is_static_test.dart b/tests/lib_2/mirrors/type_variable_is_static_test.dart
index 05a4fd9..ff7bfa5 100644
--- a/tests/lib_2/mirrors/type_variable_is_static_test.dart
+++ b/tests/lib_2/mirrors/type_variable_is_static_test.dart
@@ -4,7 +4,6 @@
 
 library test.type_variable_owner;
 
-@MirrorsUsed(targets: "test.type_variable_owner")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/mirrors/type_variable_owner_test.dart b/tests/lib_2/mirrors/type_variable_owner_test.dart
index a647eab..8dec681 100644
--- a/tests/lib_2/mirrors/type_variable_owner_test.dart
+++ b/tests/lib_2/mirrors/type_variable_owner_test.dart
@@ -7,7 +7,6 @@
 
 library test.type_variable_owner;
 
-@MirrorsUsed(targets: "test.type_variable_owner")
 import "dart:mirrors";
 
 import "package:expect/expect.dart";
@@ -40,10 +39,10 @@
   LibraryMirror thisLibrary =
       currentMirrorSystem().findLibrary(#test.type_variable_owner);
 
-  TypedefMirror predicateOfDynamic = reflectType(Predicate);
+  TypedefMirror predicateOfDynamic = reflectType(Predicate) as TypedefMirror;
   TypedefMirror predicateOfList =
-      (thisLibrary.declarations[#somePredicateOfList] as VariableMirror).type;
-  TypedefMirror predicateDecl = predicateOfList.originalDeclaration;
+      (thisLibrary.declarations[#somePredicateOfList] as VariableMirror).type as TypedefMirror;
+  TypedefMirror predicateDecl = predicateOfList.originalDeclaration as TypedefMirror;
 
   Expect.equals(predicateDecl, predicateOfDynamic.typeVariables[0].owner);
   Expect.equals(predicateDecl, predicateOfList.typeVariables[0].owner);
diff --git a/tests/lib_2/mirrors/typearguments_mirror_test.dart b/tests/lib_2/mirrors/typearguments_mirror_test.dart
index 951704c..a5474d5 100644
--- a/tests/lib_2/mirrors/typearguments_mirror_test.dart
+++ b/tests/lib_2/mirrors/typearguments_mirror_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:expect/expect.dart';
 import 'stringify.dart';
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 
 class Foo<T> {}
diff --git a/tests/lib_2/mirrors/typedef_deferred_library_test.dart b/tests/lib_2/mirrors/typedef_deferred_library_test.dart
index 7dd6c2e..1363188 100644
--- a/tests/lib_2/mirrors/typedef_deferred_library_test.dart
+++ b/tests/lib_2/mirrors/typedef_deferred_library_test.dart
@@ -4,7 +4,6 @@
 
 library foo;
 
-@MirrorsUsed(targets: const ["foo", "bar"])
 import 'dart:mirrors';
 import 'typedef_library.dart' deferred as def;
 
diff --git a/tests/lib_2/mirrors/typedef_in_signature_test.dart b/tests/lib_2/mirrors/typedef_in_signature_test.dart
index a561e1e..8695750 100644
--- a/tests/lib_2/mirrors/typedef_in_signature_test.dart
+++ b/tests/lib_2/mirrors/typedef_in_signature_test.dart
@@ -4,7 +4,6 @@
 
 library test.typedef_in_signature_test;
 
-@MirrorsUsed(targets: 'test.typedef_in_signature_test')
 import 'dart:mirrors';
 
 import "package:expect/expect.dart";
@@ -13,11 +12,9 @@
 typedef String foo2();
 typedef foo foo3(foo2 x);
 
-foo2 bar(foo x) {
-  return null;
-}
+foo2 bar(foo x) => throw "does-not-return"; //
 
-foo3 gee(int x, foo3 tt) => null;
+foo3 gee(int x, foo3 tt) => throw "does-not-return"; //
 
 main() {
   var lm = currentMirrorSystem().findLibrary(#test.typedef_in_signature_test);
diff --git a/tests/lib_2/mirrors/typedef_library_test.dart b/tests/lib_2/mirrors/typedef_library_test.dart
index 6549797..b768783 100644
--- a/tests/lib_2/mirrors/typedef_library_test.dart
+++ b/tests/lib_2/mirrors/typedef_library_test.dart
@@ -4,7 +4,6 @@
 
 library foo;
 
-@MirrorsUsed(targets: const ["foo", "bar"])
 import 'dart:mirrors';
 import 'typedef_library.dart';
 
diff --git a/tests/lib_2/mirrors/typedef_metadata_test.dart b/tests/lib_2/mirrors/typedef_metadata_test.dart
index e7bf317..7b5e098 100644
--- a/tests/lib_2/mirrors/typedef_metadata_test.dart
+++ b/tests/lib_2/mirrors/typedef_metadata_test.dart
@@ -6,7 +6,6 @@
 @symbol
 library test.typedef_metadata_test;
 
-@MirrorsUsed(targets: "test.typedef_metadata_test")
 import 'dart:mirrors';
 
 import 'metadata_test.dart';
diff --git a/tests/lib_2/mirrors/typedef_reflected_type_test.dart b/tests/lib_2/mirrors/typedef_reflected_type_test.dart
index 65b6922..7b017f5 100644
--- a/tests/lib_2/mirrors/typedef_reflected_type_test.dart
+++ b/tests/lib_2/mirrors/typedef_reflected_type_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:expect/expect.dart';
 
-@MirrorsUsed(targets: "test")
 import 'dart:mirrors';
 
 typedef int Foo<T>(String x);
diff --git a/tests/lib_2/mirrors/typedef_test.dart b/tests/lib_2/mirrors/typedef_test.dart
index e367786..b7a152f 100644
--- a/tests/lib_2/mirrors/typedef_test.dart
+++ b/tests/lib_2/mirrors/typedef_test.dart
@@ -8,7 +8,6 @@
 
 library test.typedef_test;
 
-@MirrorsUsed(targets: 'test.typedef_test')
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/typevariable_mirror_metadata_test.dart b/tests/lib_2/mirrors/typevariable_mirror_metadata_test.dart
index 1502ecb..7d2f69a 100644
--- a/tests/lib_2/mirrors/typevariable_mirror_metadata_test.dart
+++ b/tests/lib_2/mirrors/typevariable_mirror_metadata_test.dart
@@ -4,7 +4,6 @@
 
 library test.typevariable_metadata_test;
 
-@MirrorsUsed(targets: "test.typevariable_metadata_test")
 import "dart:mirrors";
 
 import "metadata_test.dart";
diff --git a/tests/lib_2/mirrors/unmangled_type_test.dart b/tests/lib_2/mirrors/unmangled_type_test.dart
index ef7d9fb..b9fa763 100644
--- a/tests/lib_2/mirrors/unmangled_type_test.dart
+++ b/tests/lib_2/mirrors/unmangled_type_test.dart
@@ -4,7 +4,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/mirrors/unnamed_library_test.dart b/tests/lib_2/mirrors/unnamed_library_test.dart
index b967689..5e6160d 100644
--- a/tests/lib_2/mirrors/unnamed_library_test.dart
+++ b/tests/lib_2/mirrors/unnamed_library_test.dart
@@ -12,7 +12,7 @@
 
 main() {
   ClassMirror cm = reflectClass(Class);
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
 
   Expect.equals('Class', MirrorSystem.getName(cm.simpleName));
   Expect.equals('.Class', MirrorSystem.getName(cm.qualifiedName));
diff --git a/tests/lib_2/mirrors/unnamed_mixin_application_test.dart b/tests/lib_2/mirrors/unnamed_mixin_application_test.dart
index 926f739..d884495 100644
--- a/tests/lib_2/mirrors/unnamed_mixin_application_test.dart
+++ b/tests/lib_2/mirrors/unnamed_mixin_application_test.dart
@@ -7,7 +7,6 @@
 
 library lib;
 
-@MirrorsUsed(targets: "lib")
 import 'dart:mirrors';
 
 class S {
diff --git a/tests/lib_2/mirrors/unused_mirrors2_test.dart b/tests/lib_2/mirrors/unused_mirrors2_test.dart
deleted file mode 100644
index 8215464..0000000
--- a/tests/lib_2/mirrors/unused_mirrors2_test.dart
+++ /dev/null
@@ -1,24 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-library lib;
-
-@MirrorsUsed(targets: const ["lib"])
-import 'dart:mirrors';
-
-Bar foo = new Bar();
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors3_test.dart b/tests/lib_2/mirrors/unused_mirrors3_test.dart
deleted file mode 100644
index 4770bea..0000000
--- a/tests/lib_2/mirrors/unused_mirrors3_test.dart
+++ /dev/null
@@ -1,26 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-library lib;
-
-@MirrorsUsed(targets: const ["C"])
-import 'dart:mirrors';
-
-class C {
-  static Bar foo = new Bar();
-}
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors4_test.dart b/tests/lib_2/mirrors/unused_mirrors4_test.dart
deleted file mode 100644
index 936b5ef..0000000
--- a/tests/lib_2/mirrors/unused_mirrors4_test.dart
+++ /dev/null
@@ -1,22 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-@MirrorsUsed(targets: const ["foo"])
-import 'dart:mirrors';
-
-Bar get foo => new Bar();
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors5_test.dart b/tests/lib_2/mirrors/unused_mirrors5_test.dart
deleted file mode 100644
index 2c05029..0000000
--- a/tests/lib_2/mirrors/unused_mirrors5_test.dart
+++ /dev/null
@@ -1,24 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-library lib;
-
-@MirrorsUsed(targets: const ["lib"])
-import 'dart:mirrors';
-
-Bar get foo => new Bar();
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors6_test.dart b/tests/lib_2/mirrors/unused_mirrors6_test.dart
deleted file mode 100644
index 36d14d5..0000000
--- a/tests/lib_2/mirrors/unused_mirrors6_test.dart
+++ /dev/null
@@ -1,26 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-library lib;
-
-@MirrorsUsed(targets: const ["C"])
-import 'dart:mirrors';
-
-class C {
-  static Bar get foo => new Bar();
-}
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors7_test.dart b/tests/lib_2/mirrors/unused_mirrors7_test.dart
deleted file mode 100644
index 5d34940..0000000
--- a/tests/lib_2/mirrors/unused_mirrors7_test.dart
+++ /dev/null
@@ -1,22 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-@MirrorsUsed(targets: const ["NON_EXISTING_STATIC"])
-import 'dart:mirrors';
-
-Bar foo = new Bar();
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors8_test.dart b/tests/lib_2/mirrors/unused_mirrors8_test.dart
deleted file mode 100644
index 68a6f02..0000000
--- a/tests/lib_2/mirrors/unused_mirrors8_test.dart
+++ /dev/null
@@ -1,26 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-library lib;
-
-@MirrorsUsed(targets: const ["lib"])
-import 'dart:mirrors';
-
-class C {
-  static Bar foo = new Bar();
-}
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors9_test.dart b/tests/lib_2/mirrors/unused_mirrors9_test.dart
deleted file mode 100644
index b1166cb..0000000
--- a/tests/lib_2/mirrors/unused_mirrors9_test.dart
+++ /dev/null
@@ -1,26 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-library lib;
-
-@MirrorsUsed(targets: const ["C.foo"])
-import 'dart:mirrors';
-
-class C {
-  static Bar foo = new Bar();
-}
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors_test.dart b/tests/lib_2/mirrors/unused_mirrors_test.dart
deleted file mode 100644
index a8f9f14..0000000
--- a/tests/lib_2/mirrors/unused_mirrors_test.dart
+++ /dev/null
@@ -1,22 +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.
-
-// Tests that MirrorsUsed without usage of the static field does not crash
-// dart2js.
-
-@MirrorsUsed(targets: const ["foo"])
-import 'dart:mirrors';
-
-Bar foo = new Bar();
-
-typedef int FunctionTypeDef();
-
-class Bar {
-  final FunctionTypeDef gee;
-  Bar() : gee = (() => 499);
-}
-
-main() {
-  // Don't do anything.
-}
diff --git a/tests/lib_2/mirrors/unused_mirrors_used_test.dart b/tests/lib_2/mirrors/unused_mirrors_used_test.dart
deleted file mode 100644
index 0fe1e37..0000000
--- a/tests/lib_2/mirrors/unused_mirrors_used_test.dart
+++ /dev/null
@@ -1,17 +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.
-
-// Regression test.
-// The MirrorsUsed annotation made dart2js to mark List as needed for reflection
-// but tree-shaking wasn't turned off (since there is no actual mirror use)
-// which led to a broken output.
-
-@MirrorsUsed(targets: "List")
-import 'dart:mirrors';
-
-void main() {
-  var l = new List<int>();
-  var f = l.retainWhere;
-  f((x) => true);
-}
diff --git a/tests/lib_2/mirrors/variable_is_const_test.dart b/tests/lib_2/mirrors/variable_is_const_test.dart
index 1a35233..de3b0cb 100644
--- a/tests/lib_2/mirrors/variable_is_const_test.dart
+++ b/tests/lib_2/mirrors/variable_is_const_test.dart
@@ -4,7 +4,6 @@
 
 library test.variable_is_const;
 
-@MirrorsUsed(targets: "test.variable_is_const")
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
@@ -30,7 +29,7 @@
   Expect.isTrue(isConst(cm, #staticConst));
   Expect.isFalse(isConst(cm, #staticNonConst));
 
-  LibraryMirror lm = cm.owner;
+  LibraryMirror lm = cm.owner as LibraryMirror;
   Expect.isTrue(isConst(lm, #topLevelConst));
   Expect.isFalse(isConst(lm, #topLevelNonConst));
 }
diff --git a/third_party/node-source-map-support/LICENSE.md b/third_party/node-source-map-support/LICENSE.md
new file mode 100644
index 0000000..6247ca9
--- /dev/null
+++ b/third_party/node-source-map-support/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Evan Wallace
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/node-source-map-support/README.google b/third_party/node-source-map-support/README.google
new file mode 100644
index 0000000..e3b18fa
--- /dev/null
+++ b/third_party/node-source-map-support/README.google
@@ -0,0 +1,13 @@
+Name: Node / Browser Source Map support for Stack Traces
+Short Name: node-source-map-support
+URL: https://github.com/requirejs/requirejs
+Version: 0.5.16
+Date: October 29, 2019
+License: MIT
+
+Description: 
+
+This directory contains a utility to map JavaScript stack traces
+back to Dart automatically.  It is used for internal testing.
+
+
diff --git a/third_party/node-source-map-support/README.md b/third_party/node-source-map-support/README.md
new file mode 100644
index 0000000..40228b7
--- /dev/null
+++ b/third_party/node-source-map-support/README.md
@@ -0,0 +1,284 @@
+# Source Map Support
+[![Build Status](https://travis-ci.org/evanw/node-source-map-support.svg?branch=master)](https://travis-ci.org/evanw/node-source-map-support)
+
+This module provides source map support for stack traces in node via the [V8 stack trace API](https://github.com/v8/v8/wiki/Stack-Trace-API). It uses the [source-map](https://github.com/mozilla/source-map) module to replace the paths and line numbers of source-mapped files with their original paths and line numbers. The output mimics node's stack trace format with the goal of making every compile-to-JS language more of a first-class citizen. Source maps are completely general (not specific to any one language) so you can use source maps with multiple compile-to-JS languages in the same node process.
+
+## Installation and Usage
+
+#### Node support
+
+```
+$ npm install source-map-support
+```
+
+Source maps can be generated using libraries such as [source-map-index-generator](https://github.com/twolfson/source-map-index-generator). Once you have a valid source map, place a source mapping comment somewhere in the file (usually done automatically or with an option by your transpiler):
+
+```
+//# sourceMappingURL=path/to/source.map
+```
+
+If multiple sourceMappingURL comments exist in one file, the last sourceMappingURL comment will be
+respected (e.g. if a file mentions the comment in code, or went through multiple transpilers).
+The path should either be absolute or relative to the compiled file.
+
+From here you have two options.
+
+##### CLI Usage
+
+```bash
+node -r source-map-support/register compiled.js
+```
+
+##### Programmatic Usage
+
+Put the following line at the top of the compiled file.
+
+```js
+require('source-map-support').install();
+```
+
+It is also possible to install the source map support directly by
+requiring the `register` module which can be handy with ES6:
+
+```js
+import 'source-map-support/register'
+
+// Instead of:
+import sourceMapSupport from 'source-map-support'
+sourceMapSupport.install()
+```
+Note: if you're using babel-register, it includes source-map-support already.
+
+It is also very useful with Mocha:
+
+```
+$ mocha --require source-map-support/register tests/
+```
+
+#### Browser support
+
+This library also works in Chrome. While the DevTools console already supports source maps, the V8 engine doesn't and `Error.prototype.stack` will be incorrect without this library. Everything will just work if you deploy your source files using [browserify](http://browserify.org/). Just make sure to pass the `--debug` flag to the browserify command so your source maps are included in the bundled code.
+
+This library also works if you use another build process or just include the source files directly. In this case, include the file `browser-source-map-support.js` in your page and call `sourceMapSupport.install()`. It contains the whole library already bundled for the browser using browserify.
+
+```html
+<script src="browser-source-map-support.js"></script>
+<script>sourceMapSupport.install();</script>
+```
+
+This library also works if you use AMD (Asynchronous Module Definition), which is used in tools like [RequireJS](http://requirejs.org/). Just list `browser-source-map-support` as a dependency:
+
+```html
+<script>
+  define(['browser-source-map-support'], function(sourceMapSupport) {
+    sourceMapSupport.install();
+  });
+</script>
+```
+
+## Options
+
+This module installs two things: a change to the `stack` property on `Error` objects and a handler for uncaught exceptions that mimics node's default exception handler (the handler can be seen in the demos below). You may want to disable the handler if you have your own uncaught exception handler. This can be done by passing an argument to the installer:
+
+```js
+require('source-map-support').install({
+  handleUncaughtExceptions: false
+});
+```
+
+This module loads source maps from the filesystem by default. You can provide alternate loading behavior through a callback as shown below. For example, [Meteor](https://github.com/meteor) keeps all source maps cached in memory to avoid disk access.
+
+```js
+require('source-map-support').install({
+  retrieveSourceMap: function(source) {
+    if (source === 'compiled.js') {
+      return {
+        url: 'original.js',
+        map: fs.readFileSync('compiled.js.map', 'utf8')
+      };
+    }
+    return null;
+  }
+});
+```
+
+The module will by default assume a browser environment if XMLHttpRequest and window are defined. If either of these do not exist it will instead assume a node environment.
+In some rare cases, e.g. when running a browser emulation and where both variables are also set, you can explictly specify the environment to be either 'browser' or 'node'.
+
+```js
+require('source-map-support').install({
+  environment: 'node'
+});
+```
+
+To support files with inline source maps, the `hookRequire` options can be specified, which will monitor all source files for inline source maps.
+
+
+```js
+require('source-map-support').install({
+  hookRequire: true
+});
+```
+
+This monkey patches the `require` module loading chain, so is not enabled by default and is not recommended for any sort of production usage.
+
+## Demos
+
+#### Basic Demo
+
+original.js:
+
+```js
+throw new Error('test'); // This is the original code
+```
+
+compiled.js:
+
+```js
+require('source-map-support').install();
+
+throw new Error('test'); // This is the compiled code
+// The next line defines the sourceMapping.
+//# sourceMappingURL=compiled.js.map
+```
+
+compiled.js.map:
+
+```json
+{
+  "version": 3,
+  "file": "compiled.js",
+  "sources": ["original.js"],
+  "names": [],
+  "mappings": ";;AAAA,MAAM,IAAI"
+}
+```
+
+Run compiled.js using node (notice how the stack trace uses original.js instead of compiled.js):
+
+```
+$ node compiled.js
+
+original.js:1
+throw new Error('test'); // This is the original code
+      ^
+Error: test
+    at Object.<anonymous> (original.js:1:7)
+    at Module._compile (module.js:456:26)
+    at Object.Module._extensions..js (module.js:474:10)
+    at Module.load (module.js:356:32)
+    at Function.Module._load (module.js:312:12)
+    at Function.Module.runMain (module.js:497:10)
+    at startup (node.js:119:16)
+    at node.js:901:3
+```
+
+#### TypeScript Demo
+
+demo.ts:
+
+```typescript
+declare function require(name: string);
+require('source-map-support').install();
+class Foo {
+  constructor() { this.bar(); }
+  bar() { throw new Error('this is a demo'); }
+}
+new Foo();
+```
+
+Compile and run the file using the TypeScript compiler from the terminal:
+
+```
+$ npm install source-map-support typescript
+$ node_modules/typescript/bin/tsc -sourcemap demo.ts
+$ node demo.js
+
+demo.ts:5
+  bar() { throw new Error('this is a demo'); }
+                ^
+Error: this is a demo
+    at Foo.bar (demo.ts:5:17)
+    at new Foo (demo.ts:4:24)
+    at Object.<anonymous> (demo.ts:7:1)
+    at Module._compile (module.js:456:26)
+    at Object.Module._extensions..js (module.js:474:10)
+    at Module.load (module.js:356:32)
+    at Function.Module._load (module.js:312:12)
+    at Function.Module.runMain (module.js:497:10)
+    at startup (node.js:119:16)
+    at node.js:901:3
+```
+
+There is also the option to use `-r source-map-support/register` with typescript, without the need add the `require('source-map-support').install()` in the code base:
+
+```
+$ npm install source-map-support typescript
+$ node_modules/typescript/bin/tsc  -sourcemap demo.ts
+$ node -r source-map-support/register demo.js
+
+demo.ts:5
+  bar() { throw new Error('this is a demo'); }
+                ^
+Error: this is a demo
+    at Foo.bar (demo.ts:5:17)
+    at new Foo (demo.ts:4:24)
+    at Object.<anonymous> (demo.ts:7:1)
+    at Module._compile (module.js:456:26)
+    at Object.Module._extensions..js (module.js:474:10)
+    at Module.load (module.js:356:32)
+    at Function.Module._load (module.js:312:12)
+    at Function.Module.runMain (module.js:497:10)
+    at startup (node.js:119:16)
+    at node.js:901:3
+```
+
+#### CoffeeScript Demo
+
+demo.coffee:
+
+```coffee
+require('source-map-support').install()
+foo = ->
+  bar = -> throw new Error 'this is a demo'
+  bar()
+foo()
+```
+
+Compile and run the file using the CoffeeScript compiler from the terminal:
+
+```sh
+$ npm install source-map-support coffeescript
+$ node_modules/.bin/coffee --map --compile demo.coffee
+$ node demo.js
+
+demo.coffee:3
+  bar = -> throw new Error 'this is a demo'
+                     ^
+Error: this is a demo
+    at bar (demo.coffee:3:22)
+    at foo (demo.coffee:4:3)
+    at Object.<anonymous> (demo.coffee:5:1)
+    at Object.<anonymous> (demo.coffee:1:1)
+    at Module._compile (module.js:456:26)
+    at Object.Module._extensions..js (module.js:474:10)
+    at Module.load (module.js:356:32)
+    at Function.Module._load (module.js:312:12)
+    at Function.Module.runMain (module.js:497:10)
+    at startup (node.js:119:16)
+```
+
+## Tests
+
+This repo contains both automated tests for node and manual tests for the browser. The automated tests can be run using mocha (type `mocha` in the root directory). To run the manual tests:
+
+* Build the tests using `build.js`
+* Launch the HTTP server (`npm run serve-tests`) and visit
+  * http://127.0.0.1:1336/amd-test
+  * http://127.0.0.1:1336/browser-test
+  * http://127.0.0.1:1336/browserify-test - **Currently not working** due to a bug with browserify (see [pull request #66](https://github.com/evanw/node-source-map-support/pull/66) for details).
+* For `header-test`, run `server.js` inside that directory and visit http://127.0.0.1:1337/
+
+## License
+
+This code is available under the [MIT license](http://opensource.org/licenses/MIT).
diff --git a/third_party/node-source-map-support/browser-source-map-support.js b/third_party/node-source-map-support/browser-source-map-support.js
new file mode 100644
index 0000000..58be5d7
--- /dev/null
+++ b/third_party/node-source-map-support/browser-source-map-support.js
@@ -0,0 +1,113 @@
+/*
+ * Support for source maps in V8 stack traces
+ * https://github.com/evanw/node-source-map-support
+ */
+/*
+ The buffer module from node.js, for the browser.
+
+ @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ license  MIT
+*/
+(this.define||function(G,J){this.sourceMapSupport=J()})("browser-source-map-support",function(G){(function b(p,u,m){function e(d,a){if(!u[d]){if(!p[d]){var l="function"==typeof require&&require;if(!a&&l)return l(d,!0);if(g)return g(d,!0);throw Error("Cannot find module '"+d+"'");}l=u[d]={exports:{}};p[d][0].call(l.exports,function(a){var b=p[d][1][a];return e(b?b:a)},l,l.exports,b,p,u,m)}return u[d].exports}for(var g="function"==typeof require&&require,h=0;h<m.length;h++)e(m[h]);return e})({1:[function(p,
+u,m){G=p("./source-map-support")},{"./source-map-support":21}],2:[function(p,u,m){(function(b){function e(b){b=b.charCodeAt(0);if(43===b)return 62;if(47===b)return 63;if(48>b)return-1;if(58>b)return b-48+52;if(91>b)return b-65;if(123>b)return b-97+26}var g="undefined"!==typeof Uint8Array?Uint8Array:Array;b.toByteArray=function(b){function d(a){r[w++]=a}if(0<b.length%4)throw Error("Invalid string. Length must be a multiple of 4");var a=b.length;var l="="===b.charAt(a-2)?2:"="===b.charAt(a-1)?1:0;var r=
+new g(3*b.length/4-l);var q=0<l?b.length-4:b.length;var w=0;for(a=0;a<q;a+=4){var h=e(b.charAt(a))<<18|e(b.charAt(a+1))<<12|e(b.charAt(a+2))<<6|e(b.charAt(a+3));d((h&16711680)>>16);d((h&65280)>>8);d(h&255)}2===l?(h=e(b.charAt(a))<<2|e(b.charAt(a+1))>>4,d(h&255)):1===l&&(h=e(b.charAt(a))<<10|e(b.charAt(a+1))<<4|e(b.charAt(a+2))>>2,d(h>>8&255),d(h&255));return r};b.fromByteArray=function(b){var d=b.length%3,a="",l;var e=0;for(l=b.length-d;e<l;e+=3){var g=(b[e]<<16)+(b[e+1]<<8)+b[e+2];g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>
+18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g&63);a+=g}switch(d){case 1:g=b[b.length-1];a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>2);a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g<<4&63);a+="==";break;case 2:g=(b[b.length-2]<<8)+
+b[b.length-1],a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>10),a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>4&63),a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g<<2&63),a+="="}return a}})("undefined"===typeof m?this.base64js={}:m)},{}],3:[function(p,u,m){},{}],4:[function(p,u,m){(function(b){var e=Object.prototype.toString,g="function"===typeof b.alloc&&"function"===typeof b.allocUnsafe&&"function"===
+typeof b.from;u.exports=function(h,d,a){if("number"===typeof h)throw new TypeError('"value" argument must not be a number');if("ArrayBuffer"===e.call(h).slice(8,-1)){d>>>=0;var l=h.byteLength-d;if(0>l)throw new RangeError("'offset' is out of bounds");if(void 0===a)a=l;else if(a>>>=0,a>l)throw new RangeError("'length' is out of bounds");return g?b.from(h.slice(d,d+a)):new b(new Uint8Array(h.slice(d,d+a)))}if("string"===typeof h){a=d;if("string"!==typeof a||""===a)a="utf8";if(!b.isEncoding(a))throw new TypeError('"encoding" must be a valid string encoding');
+return g?b.from(h,a):new b(h,a)}return g?b.from(h):new b(h)}}).call(this,p("buffer").Buffer)},{buffer:5}],5:[function(p,u,m){function b(f,n,a){if(!(this instanceof b))return new b(f,n,a);var c=typeof f;if("number"===c)var d=0<f?f>>>0:0;else if("string"===c){if("base64"===n)for(f=(f.trim?f.trim():f.replace(/^\s+|\s+$/g,"")).replace(H,"");0!==f.length%4;)f+="=";d=b.byteLength(f,n)}else if("object"===c&&null!==f)"Buffer"===f.type&&F(f.data)&&(f=f.data),d=0<+f.length?Math.floor(+f.length):0;else throw new TypeError("must start with number, buffer, array or string");
+if(this.length>D)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+D.toString(16)+" bytes");if(b.TYPED_ARRAY_SUPPORT)var k=b._augment(new Uint8Array(d));else k=this,k.length=d,k._isBuffer=!0;if(b.TYPED_ARRAY_SUPPORT&&"number"===typeof f.byteLength)k._set(f);else{var C=f;if(F(C)||b.isBuffer(C)||C&&"object"===typeof C&&"number"===typeof C.length)if(b.isBuffer(f))for(n=0;n<d;n++)k[n]=f.readUInt8(n);else for(n=0;n<d;n++)k[n]=(f[n]%256+256)%256;else if("string"===c)k.write(f,
+0,n);else if("number"===c&&!b.TYPED_ARRAY_SUPPORT&&!a)for(n=0;n<d;n++)k[n]=0}return k}function e(f,n,b){var a="";for(b=Math.min(f.length,b);n<b;n++)a+=String.fromCharCode(f[n]);return a}function g(f,n,b){if(0!==f%1||0>f)throw new RangeError("offset is not uint");if(f+n>b)throw new RangeError("Trying to access beyond buffer length");}function h(f,n,a,c,d,k){if(!b.isBuffer(f))throw new TypeError("buffer must be a Buffer instance");if(n>d||n<k)throw new TypeError("value is out of bounds");if(a+c>f.length)throw new TypeError("index out of range");
+}function d(f,n,b,a){0>n&&(n=65535+n+1);for(var c=0,d=Math.min(f.length-b,2);c<d;c++)f[b+c]=(n&255<<8*(a?c:1-c))>>>8*(a?c:1-c)}function a(f,n,b,a){0>n&&(n=4294967295+n+1);for(var c=0,d=Math.min(f.length-b,4);c<d;c++)f[b+c]=n>>>8*(a?c:3-c)&255}function l(f,n,b,a,c,d){if(n>c||n<d)throw new TypeError("value is out of bounds");if(b+a>f.length)throw new TypeError("index out of range");}function r(f,n,b,a,c){c||l(f,n,b,4,3.4028234663852886E38,-3.4028234663852886E38);z.write(f,n,b,a,23,4);return b+4}function q(f,
+n,b,a,c){c||l(f,n,b,8,1.7976931348623157E308,-1.7976931348623157E308);z.write(f,n,b,a,52,8);return b+8}function w(f){for(var n=[],b=0;b<f.length;b++){var a=f.charCodeAt(b);if(127>=a)n.push(a);else{var c=b;55296<=a&&57343>=a&&b++;a=encodeURIComponent(f.slice(c,b+1)).substr(1).split("%");for(c=0;c<a.length;c++)n.push(parseInt(a[c],16))}}return n}function v(f){for(var b=[],a=0;a<f.length;a++)b.push(f.charCodeAt(a)&255);return b}function c(f,b,a,c,d){d&&(c-=c%d);for(d=0;d<c&&!(d+a>=b.length||d>=f.length);d++)b[d+
+a]=f[d];return d}function k(f){try{return decodeURIComponent(f)}catch(n){return String.fromCharCode(65533)}}var x=p("base64-js"),z=p("ieee754"),F=p("is-array");m.Buffer=b;m.SlowBuffer=b;m.INSPECT_MAX_BYTES=50;b.poolSize=8192;var D=1073741823;b.TYPED_ARRAY_SUPPORT=function(){try{var f=new ArrayBuffer(0),b=new Uint8Array(f);b.foo=function(){return 42};return 42===b.foo()&&"function"===typeof b.subarray&&0===(new Uint8Array(1)).subarray(1,1).byteLength}catch(C){return!1}}();b.isBuffer=function(f){return!(null==
+f||!f._isBuffer)};b.compare=function(f,a){if(!b.isBuffer(f)||!b.isBuffer(a))throw new TypeError("Arguments must be Buffers");for(var c=f.length,n=a.length,d=0,k=Math.min(c,n);d<k&&f[d]===a[d];d++);d!==k&&(c=f[d],n=a[d]);return c<n?-1:n<c?1:0};b.isEncoding=function(f){switch(String(f).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0;default:return!1}};b.concat=function(f,a){if(!F(f))throw new TypeError("Usage: Buffer.concat(list[, length])");
+if(0===f.length)return new b(0);if(1===f.length)return f[0];var c;if(void 0===a)for(c=a=0;c<f.length;c++)a+=f[c].length;var n=new b(a),d=0;for(c=0;c<f.length;c++){var k=f[c];k.copy(n,d);d+=k.length}return n};b.byteLength=function(f,a){f+="";switch(a||"utf8"){case "ascii":case "binary":case "raw":var b=f.length;break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=2*f.length;break;case "hex":b=f.length>>>1;break;case "utf8":case "utf-8":b=w(f).length;break;case "base64":b=x.toByteArray(f).length;
+break;default:b=f.length}return b};b.prototype.length=void 0;b.prototype.parent=void 0;b.prototype.toString=function(f,b,a){var c=!1;b>>>=0;a=void 0===a||Infinity===a?this.length:a>>>0;f||(f="utf8");0>b&&(b=0);a>this.length&&(a=this.length);if(a<=b)return"";for(;;)switch(f){case "hex":f=b;b=a;a=this.length;if(!f||0>f)f=0;if(!b||0>b||b>a)b=a;c="";for(a=f;a<b;a++)f=c,c=this[a],c=16>c?"0"+c.toString(16):c.toString(16),c=f+c;return c;case "utf8":case "utf-8":c=f="";for(a=Math.min(this.length,a);b<a;b++)127>=
+this[b]?(f+=k(c)+String.fromCharCode(this[b]),c=""):c+="%"+this[b].toString(16);return f+k(c);case "ascii":return e(this,b,a);case "binary":return e(this,b,a);case "base64":return b=0===b&&a===this.length?x.fromByteArray(this):x.fromByteArray(this.slice(b,a)),b;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=this.slice(b,a);a="";for(f=0;f<b.length;f+=2)a+=String.fromCharCode(b[f]+256*b[f+1]);return a;default:if(c)throw new TypeError("Unknown encoding: "+f);f=(f+"").toLowerCase();c=!0}};
+b.prototype.equals=function(f){if(!b.isBuffer(f))throw new TypeError("Argument must be a Buffer");return 0===b.compare(this,f)};b.prototype.inspect=function(){var f="",b=m.INSPECT_MAX_BYTES;0<this.length&&(f=this.toString("hex",0,b).match(/.{2}/g).join(" "),this.length>b&&(f+=" ... "));return"<Buffer "+f+">"};b.prototype.compare=function(f){if(!b.isBuffer(f))throw new TypeError("Argument must be a Buffer");return b.compare(this,f)};b.prototype.get=function(f){console.log(".get() is deprecated. Access using array indexes instead.");
+return this.readUInt8(f)};b.prototype.set=function(f,b){console.log(".set() is deprecated. Access using array indexes instead.");return this.writeUInt8(f,b)};b.prototype.write=function(f,b,a,d){if(isFinite(b))isFinite(a)||(d=a,a=void 0);else{var n=d;d=b;b=a;a=n}b=Number(b)||0;n=this.length-b;a?(a=Number(a),a>n&&(a=n)):a=n;d=String(d||"utf8").toLowerCase();switch(d){case "hex":b=Number(b)||0;d=this.length-b;a?(a=Number(a),a>d&&(a=d)):a=d;d=f.length;if(0!==d%2)throw Error("Invalid hex string");a>d/
+2&&(a=d/2);for(d=0;d<a;d++){n=parseInt(f.substr(2*d,2),16);if(isNaN(n))throw Error("Invalid hex string");this[b+d]=n}f=d;break;case "utf8":case "utf-8":f=c(w(f),this,b,a);break;case "ascii":f=c(v(f),this,b,a);break;case "binary":f=c(v(f),this,b,a);break;case "base64":f=c(x.toByteArray(f),this,b,a);break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":n=[];for(var k=0;k<f.length;k++){var l=f.charCodeAt(k);d=l>>8;l%=256;n.push(l);n.push(d)}f=c(n,this,b,a,2);break;default:throw new TypeError("Unknown encoding: "+
+d);}return f};b.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};b.prototype.slice=function(f,a){var c=this.length;f=~~f;a=void 0===a?c:~~a;0>f?(f+=c,0>f&&(f=0)):f>c&&(f=c);0>a?(a+=c,0>a&&(a=0)):a>c&&(a=c);a<f&&(a=f);if(b.TYPED_ARRAY_SUPPORT)return b._augment(this.subarray(f,a));c=a-f;for(var d=new b(c,void 0,!0),n=0;n<c;n++)d[n]=this[n+f];return d};b.prototype.readUInt8=function(f,a){a||g(f,1,this.length);return this[f]};b.prototype.readUInt16LE=
+function(f,a){a||g(f,2,this.length);return this[f]|this[f+1]<<8};b.prototype.readUInt16BE=function(f,a){a||g(f,2,this.length);return this[f]<<8|this[f+1]};b.prototype.readUInt32LE=function(f,a){a||g(f,4,this.length);return(this[f]|this[f+1]<<8|this[f+2]<<16)+16777216*this[f+3]};b.prototype.readUInt32BE=function(f,a){a||g(f,4,this.length);return 16777216*this[f]+(this[f+1]<<16|this[f+2]<<8|this[f+3])};b.prototype.readInt8=function(f,a){a||g(f,1,this.length);return this[f]&128?-1*(255-this[f]+1):this[f]};
+b.prototype.readInt16LE=function(f,a){a||g(f,2,this.length);var b=this[f]|this[f+1]<<8;return b&32768?b|4294901760:b};b.prototype.readInt16BE=function(f,a){a||g(f,2,this.length);var b=this[f+1]|this[f]<<8;return b&32768?b|4294901760:b};b.prototype.readInt32LE=function(f,a){a||g(f,4,this.length);return this[f]|this[f+1]<<8|this[f+2]<<16|this[f+3]<<24};b.prototype.readInt32BE=function(a,b){b||g(a,4,this.length);return this[a]<<24|this[a+1]<<16|this[a+2]<<8|this[a+3]};b.prototype.readFloatLE=function(a,
+b){b||g(a,4,this.length);return z.read(this,a,!0,23,4)};b.prototype.readFloatBE=function(a,b){b||g(a,4,this.length);return z.read(this,a,!1,23,4)};b.prototype.readDoubleLE=function(a,b){b||g(a,8,this.length);return z.read(this,a,!0,52,8)};b.prototype.readDoubleBE=function(a,b){b||g(a,8,this.length);return z.read(this,a,!1,52,8)};b.prototype.writeUInt8=function(a,c,d){a=+a;c>>>=0;d||h(this,a,c,1,255,0);b.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));this[c]=a;return c+1};b.prototype.writeUInt16LE=function(a,
+c,k){a=+a;c>>>=0;k||h(this,a,c,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[c]=a,this[c+1]=a>>>8):d(this,a,c,!0);return c+2};b.prototype.writeUInt16BE=function(a,c,k){a=+a;c>>>=0;k||h(this,a,c,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[c]=a>>>8,this[c+1]=a):d(this,a,c,!1);return c+2};b.prototype.writeUInt32LE=function(f,c,d){f=+f;c>>>=0;d||h(this,f,c,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[c+3]=f>>>24,this[c+2]=f>>>16,this[c+1]=f>>>8,this[c]=f):a(this,f,c,!0);return c+4};b.prototype.writeUInt32BE=function(f,
+c,d){f=+f;c>>>=0;d||h(this,f,c,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[c]=f>>>24,this[c+1]=f>>>16,this[c+2]=f>>>8,this[c+3]=f):a(this,f,c,!1);return c+4};b.prototype.writeInt8=function(a,c,d){a=+a;c>>>=0;d||h(this,a,c,1,127,-128);b.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));0>a&&(a=255+a+1);this[c]=a;return c+1};b.prototype.writeInt16LE=function(a,c,k){a=+a;c>>>=0;k||h(this,a,c,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[c]=a,this[c+1]=a>>>8):d(this,a,c,!0);return c+2};b.prototype.writeInt16BE=function(a,
+c,k){a=+a;c>>>=0;k||h(this,a,c,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[c]=a>>>8,this[c+1]=a):d(this,a,c,!1);return c+2};b.prototype.writeInt32LE=function(c,d,k){c=+c;d>>>=0;k||h(this,c,d,4,2147483647,-2147483648);b.TYPED_ARRAY_SUPPORT?(this[d]=c,this[d+1]=c>>>8,this[d+2]=c>>>16,this[d+3]=c>>>24):a(this,c,d,!0);return d+4};b.prototype.writeInt32BE=function(c,d,k){c=+c;d>>>=0;k||h(this,c,d,4,2147483647,-2147483648);0>c&&(c=4294967295+c+1);b.TYPED_ARRAY_SUPPORT?(this[d]=c>>>24,this[d+1]=c>>>16,this[d+
+2]=c>>>8,this[d+3]=c):a(this,c,d,!1);return d+4};b.prototype.writeFloatLE=function(a,c,b){return r(this,a,c,!0,b)};b.prototype.writeFloatBE=function(a,c,b){return r(this,a,c,!1,b)};b.prototype.writeDoubleLE=function(a,c,b){return q(this,a,c,!0,b)};b.prototype.writeDoubleBE=function(a,c,b){return q(this,a,c,!1,b)};b.prototype.copy=function(a,c,d,k){d||(d=0);k||0===k||(k=this.length);c||(c=0);if(k!==d&&0!==a.length&&0!==this.length){if(k<d)throw new TypeError("sourceEnd < sourceStart");if(0>c||c>=a.length)throw new TypeError("targetStart out of bounds");
+if(0>d||d>=this.length)throw new TypeError("sourceStart out of bounds");if(0>k||k>this.length)throw new TypeError("sourceEnd out of bounds");k>this.length&&(k=this.length);a.length-c<k-d&&(k=a.length-c+d);k-=d;if(1E3>k||!b.TYPED_ARRAY_SUPPORT)for(var f=0;f<k;f++)a[f+c]=this[f+d];else a._set(this.subarray(d,d+k),c)}};b.prototype.fill=function(a,c,b){a||(a=0);c||(c=0);b||(b=this.length);if(b<c)throw new TypeError("end < start");if(b!==c&&0!==this.length){if(0>c||c>=this.length)throw new TypeError("start out of bounds");
+if(0>b||b>this.length)throw new TypeError("end out of bounds");if("number"===typeof a)for(;c<b;c++)this[c]=a;else{a=w(a.toString());for(var d=a.length;c<b;c++)this[c]=a[c%d]}return this}};b.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(b.TYPED_ARRAY_SUPPORT)return(new b(this)).buffer;for(var a=new Uint8Array(this.length),c=0,d=a.length;c<d;c+=1)a[c]=this[c];return a.buffer}throw new TypeError("Buffer.toArrayBuffer not supported in this browser");};var t=b.prototype;b._augment=
+function(a){a.constructor=b;a._isBuffer=!0;a._get=a.get;a._set=a.set;a.get=t.get;a.set=t.set;a.write=t.write;a.toString=t.toString;a.toLocaleString=t.toString;a.toJSON=t.toJSON;a.equals=t.equals;a.compare=t.compare;a.copy=t.copy;a.slice=t.slice;a.readUInt8=t.readUInt8;a.readUInt16LE=t.readUInt16LE;a.readUInt16BE=t.readUInt16BE;a.readUInt32LE=t.readUInt32LE;a.readUInt32BE=t.readUInt32BE;a.readInt8=t.readInt8;a.readInt16LE=t.readInt16LE;a.readInt16BE=t.readInt16BE;a.readInt32LE=t.readInt32LE;a.readInt32BE=
+t.readInt32BE;a.readFloatLE=t.readFloatLE;a.readFloatBE=t.readFloatBE;a.readDoubleLE=t.readDoubleLE;a.readDoubleBE=t.readDoubleBE;a.writeUInt8=t.writeUInt8;a.writeUInt16LE=t.writeUInt16LE;a.writeUInt16BE=t.writeUInt16BE;a.writeUInt32LE=t.writeUInt32LE;a.writeUInt32BE=t.writeUInt32BE;a.writeInt8=t.writeInt8;a.writeInt16LE=t.writeInt16LE;a.writeInt16BE=t.writeInt16BE;a.writeInt32LE=t.writeInt32LE;a.writeInt32BE=t.writeInt32BE;a.writeFloatLE=t.writeFloatLE;a.writeFloatBE=t.writeFloatBE;a.writeDoubleLE=
+t.writeDoubleLE;a.writeDoubleBE=t.writeDoubleBE;a.fill=t.fill;a.inspect=t.inspect;a.toArrayBuffer=t.toArrayBuffer;return a};var H=/[^+\/0-9A-z]/g},{"base64-js":2,ieee754:6,"is-array":7}],6:[function(p,u,m){m.read=function(b,e,g,h,d){var a=8*d-h-1;var l=(1<<a)-1,r=l>>1,q=-7;d=g?d-1:0;var w=g?-1:1,v=b[e+d];d+=w;g=v&(1<<-q)-1;v>>=-q;for(q+=a;0<q;g=256*g+b[e+d],d+=w,q-=8);a=g&(1<<-q)-1;g>>=-q;for(q+=h;0<q;a=256*a+b[e+d],d+=w,q-=8);if(0===g)g=1-r;else{if(g===l)return a?NaN:Infinity*(v?-1:1);a+=Math.pow(2,
+h);g-=r}return(v?-1:1)*a*Math.pow(2,g-h)};m.write=function(b,e,g,h,d,a){var l,r=8*a-d-1,q=(1<<r)-1,w=q>>1,v=23===d?Math.pow(2,-24)-Math.pow(2,-77):0;a=h?0:a-1;var c=h?1:-1,k=0>e||0===e&&0>1/e?1:0;e=Math.abs(e);isNaN(e)||Infinity===e?(e=isNaN(e)?1:0,h=q):(h=Math.floor(Math.log(e)/Math.LN2),1>e*(l=Math.pow(2,-h))&&(h--,l*=2),e=1<=h+w?e+v/l:e+v*Math.pow(2,1-w),2<=e*l&&(h++,l/=2),h+w>=q?(e=0,h=q):1<=h+w?(e=(e*l-1)*Math.pow(2,d),h+=w):(e=e*Math.pow(2,w-1)*Math.pow(2,d),h=0));for(;8<=d;b[g+a]=e&255,a+=
+c,e/=256,d-=8);h=h<<d|e;for(r+=d;0<r;b[g+a]=h&255,a+=c,h/=256,r-=8);b[g+a-c]|=128*k}},{}],7:[function(p,u,m){var b=Object.prototype.toString;u.exports=Array.isArray||function(e){return!!e&&"[object Array]"==b.call(e)}},{}],8:[function(p,u,m){(function(b){function e(a,b){for(var d=0,l=a.length-1;0<=l;l--){var w=a[l];"."===w?a.splice(l,1):".."===w?(a.splice(l,1),d++):d&&(a.splice(l,1),d--)}if(b)for(;d--;d)a.unshift("..");return a}function g(a,b){if(a.filter)return a.filter(b);for(var d=[],l=0;l<a.length;l++)b(a[l],
+l,a)&&d.push(a[l]);return d}var h=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;m.resolve=function(){for(var a="",d=!1,h=arguments.length-1;-1<=h&&!d;h--){var q=0<=h?arguments[h]:b.cwd();if("string"!==typeof q)throw new TypeError("Arguments to path.resolve must be strings");q&&(a=q+"/"+a,d="/"===q.charAt(0))}a=e(g(a.split("/"),function(a){return!!a}),!d).join("/");return(d?"/":"")+a||"."};m.normalize=function(a){var b=m.isAbsolute(a),h="/"===d(a,-1);(a=e(g(a.split("/"),function(a){return!!a}),
+!b).join("/"))||b||(a=".");a&&h&&(a+="/");return(b?"/":"")+a};m.isAbsolute=function(a){return"/"===a.charAt(0)};m.join=function(){var a=Array.prototype.slice.call(arguments,0);return m.normalize(g(a,function(a,b){if("string"!==typeof a)throw new TypeError("Arguments to path.join must be strings");return a}).join("/"))};m.relative=function(a,b){function d(a){for(var c=0;c<a.length&&""===a[c];c++);for(var b=a.length-1;0<=b&&""===a[b];b--);return c>b?[]:a.slice(c,b-c+1)}a=m.resolve(a).substr(1);b=m.resolve(b).substr(1);
+for(var l=d(a.split("/")),w=d(b.split("/")),e=Math.min(l.length,w.length),c=e,k=0;k<e;k++)if(l[k]!==w[k]){c=k;break}e=[];for(k=c;k<l.length;k++)e.push("..");e=e.concat(w.slice(c));return e.join("/")};m.sep="/";m.delimiter=":";m.dirname=function(a){var b=h.exec(a).slice(1);a=b[0];b=b[1];if(!a&&!b)return".";b&&(b=b.substr(0,b.length-1));return a+b};m.basename=function(a,b){var d=h.exec(a).slice(1)[2];b&&d.substr(-1*b.length)===b&&(d=d.substr(0,d.length-b.length));return d};m.extname=function(a){return h.exec(a).slice(1)[3]};
+var d="b"==="ab".substr(-1)?function(a,b,d){return a.substr(b,d)}:function(a,b,d){0>b&&(b=a.length+b);return a.substr(b,d)}}).call(this,p("g5I+bs"))},{"g5I+bs":9}],9:[function(p,u,m){function b(){}p=u.exports={};p.nextTick=function(){if("undefined"!==typeof window&&window.setImmediate)return function(b){return window.setImmediate(b)};if("undefined"!==typeof window&&window.postMessage&&window.addEventListener){var b=[];window.addEventListener("message",function(e){var g=e.source;g!==window&&null!==
+g||"process-tick"!==e.data||(e.stopPropagation(),0<b.length&&b.shift()())},!0);return function(e){b.push(e);window.postMessage("process-tick","*")}}return function(b){setTimeout(b,0)}}();p.title="browser";p.browser=!0;p.env={};p.argv=[];p.on=b;p.addListener=b;p.once=b;p.off=b;p.removeListener=b;p.removeAllListeners=b;p.emit=b;p.binding=function(b){throw Error("process.binding is not supported");};p.cwd=function(){return"/"};p.chdir=function(b){throw Error("process.chdir is not supported");}},{}],
+10:[function(p,u,m){function b(){this._array=[];this._set=h?new Map:Object.create(null)}var e=p("./util"),g=Object.prototype.hasOwnProperty,h="undefined"!==typeof Map;b.fromArray=function(d,a){for(var e=new b,g=0,h=d.length;g<h;g++)e.add(d[g],a);return e};b.prototype.size=function(){return h?this._set.size:Object.getOwnPropertyNames(this._set).length};b.prototype.add=function(b,a){var d=h?b:e.toSetString(b),r=h?this.has(b):g.call(this._set,d),q=this._array.length;r&&!a||this._array.push(b);r||(h?
+this._set.set(b,q):this._set[d]=q)};b.prototype.has=function(b){if(h)return this._set.has(b);b=e.toSetString(b);return g.call(this._set,b)};b.prototype.indexOf=function(b){if(h){var a=this._set.get(b);if(0<=a)return a}else if(a=e.toSetString(b),g.call(this._set,a))return this._set[a];throw Error('"'+b+'" is not in the set.');};b.prototype.at=function(b){if(0<=b&&b<this._array.length)return this._array[b];throw Error("No element indexed by "+b);};b.prototype.toArray=function(){return this._array.slice()};
+m.ArraySet=b},{"./util":19}],11:[function(p,u,m){var b=p("./base64");m.encode=function(e){var g="",h=0>e?(-e<<1)+1:e<<1;do e=h&31,h>>>=5,0<h&&(e|=32),g+=b.encode(e);while(0<h);return g};m.decode=function(e,g,h){var d=e.length,a=0,l=0;do{if(g>=d)throw Error("Expected more digits in base 64 VLQ value.");var r=b.decode(e.charCodeAt(g++));if(-1===r)throw Error("Invalid base64 digit: "+e.charAt(g-1));var q=!!(r&32);r&=31;a+=r<<l;l+=5}while(q);e=a>>1;h.value=1===(a&1)?-e:e;h.rest=g}},{"./base64":12}],12:[function(p,
+u,m){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");m.encode=function(e){if(0<=e&&e<b.length)return b[e];throw new TypeError("Must be between 0 and 63: "+e);};m.decode=function(b){return 65<=b&&90>=b?b-65:97<=b&&122>=b?b-97+26:48<=b&&57>=b?b-48+52:43==b?62:47==b?63:-1}},{}],13:[function(p,u,m){function b(e,g,h,d,a,l){var r=Math.floor((g-e)/2)+e,q=a(h,d[r],!0);return 0===q?r:0<q?1<g-r?b(r,g,h,d,a,l):l==m.LEAST_UPPER_BOUND?g<d.length?g:-1:r:1<r-e?b(e,r,h,d,a,l):l==
+m.LEAST_UPPER_BOUND?r:0>e?-1:e}m.GREATEST_LOWER_BOUND=1;m.LEAST_UPPER_BOUND=2;m.search=function(e,g,h,d){if(0===g.length)return-1;e=b(-1,g.length,e,g,h,d||m.GREATEST_LOWER_BOUND);if(0>e)return-1;for(;0<=e-1&&0===h(g[e],g[e-1],!0);)--e;return e}},{}],14:[function(p,u,m){function b(){this._array=[];this._sorted=!0;this._last={generatedLine:-1,generatedColumn:0}}var e=p("./util");b.prototype.unsortedForEach=function(b,e){this._array.forEach(b,e)};b.prototype.add=function(b){var g=this._last,d=g.generatedLine,
+a=b.generatedLine,l=g.generatedColumn,r=b.generatedColumn;a>d||a==d&&r>=l||0>=e.compareByGeneratedPositionsInflated(g,b)?this._last=b:this._sorted=!1;this._array.push(b)};b.prototype.toArray=function(){this._sorted||(this._array.sort(e.compareByGeneratedPositionsInflated),this._sorted=!0);return this._array};m.MappingList=b},{"./util":19}],15:[function(p,u,m){function b(b,e,d){var a=b[e];b[e]=b[d];b[d]=a}function e(g,h,d,a){if(d<a){var l=d-1;b(g,Math.round(d+Math.random()*(a-d)),a);for(var r=g[a],
+q=d;q<a;q++)0>=h(g[q],r)&&(l+=1,b(g,l,q));b(g,l+1,q);l+=1;e(g,h,d,l-1);e(g,h,l+1,a)}}m.quickSort=function(b,h){e(b,h,0,b.length-1)}},{}],16:[function(p,u,m){function b(a,b){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));return null!=c.sections?new h(c,b):new e(c,b)}function e(a,b){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));var k=d.getArg(c,"version"),e=d.getArg(c,"sources"),w=d.getArg(c,"names",[]),g=d.getArg(c,"sourceRoot",null),h=d.getArg(c,"sourcesContent",null),q=d.getArg(c,
+"mappings");c=d.getArg(c,"file",null);if(k!=this._version)throw Error("Unsupported version: "+k);g&&(g=d.normalize(g));e=e.map(String).map(d.normalize).map(function(a){return g&&d.isAbsolute(g)&&d.isAbsolute(a)?d.relative(g,a):a});this._names=l.fromArray(w.map(String),!0);this._sources=l.fromArray(e,!0);this.sourceRoot=g;this.sourcesContent=h;this._mappings=q;this._sourceMapURL=b;this.file=c}function g(){this.generatedColumn=this.generatedLine=0;this.name=this.originalColumn=this.originalLine=this.source=
+null}function h(a,e){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));var k=d.getArg(c,"version");c=d.getArg(c,"sections");if(k!=this._version)throw Error("Unsupported version: "+k);this._sources=new l;this._names=new l;var w={line:-1,column:0};this._sections=c.map(function(a){if(a.url)throw Error("Support for url field in sections not implemented.");var c=d.getArg(a,"offset"),k=d.getArg(c,"line"),g=d.getArg(c,"column");if(k<w.line||k===w.line&&g<w.column)throw Error("Section offsets must be ordered and non-overlapping.");
+w=c;return{generatedOffset:{generatedLine:k+1,generatedColumn:g+1},consumer:new b(d.getArg(a,"map"),e)}})}var d=p("./util"),a=p("./binary-search"),l=p("./array-set").ArraySet,r=p("./base64-vlq"),q=p("./quick-sort").quickSort;b.fromSourceMap=function(a){return e.fromSourceMap(a)};b.prototype._version=3;b.prototype.__generatedMappings=null;Object.defineProperty(b.prototype,"_generatedMappings",{configurable:!0,enumerable:!0,get:function(){this.__generatedMappings||this._parseMappings(this._mappings,
+this.sourceRoot);return this.__generatedMappings}});b.prototype.__originalMappings=null;Object.defineProperty(b.prototype,"_originalMappings",{configurable:!0,enumerable:!0,get:function(){this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot);return this.__originalMappings}});b.prototype._charIsMappingSeparator=function(a,b){var c=a.charAt(b);return";"===c||","===c};b.prototype._parseMappings=function(a,b){throw Error("Subclasses must implement _parseMappings");};b.GENERATED_ORDER=
+1;b.ORIGINAL_ORDER=2;b.GREATEST_LOWER_BOUND=1;b.LEAST_UPPER_BOUND=2;b.prototype.eachMapping=function(a,e,c){e=e||null;switch(c||b.GENERATED_ORDER){case b.GENERATED_ORDER:c=this._generatedMappings;break;case b.ORIGINAL_ORDER:c=this._originalMappings;break;default:throw Error("Unknown order of iteration.");}var k=this.sourceRoot;c.map(function(a){var b=null===a.source?null:this._sources.at(a.source);b=d.computeSourceURL(k,b,this._sourceMapURL);return{source:b,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,
+originalLine:a.originalLine,originalColumn:a.originalColumn,name:null===a.name?null:this._names.at(a.name)}},this).forEach(a,e)};b.prototype.allGeneratedPositionsFor=function(b){var e=d.getArg(b,"line"),c={source:d.getArg(b,"source"),originalLine:e,originalColumn:d.getArg(b,"column",0)};null!=this.sourceRoot&&(c.source=d.relative(this.sourceRoot,c.source));if(!this._sources.has(c.source))return[];c.source=this._sources.indexOf(c.source);var k=[];c=this._findMapping(c,this._originalMappings,"originalLine",
+"originalColumn",d.compareByOriginalPositions,a.LEAST_UPPER_BOUND);if(0<=c){var g=this._originalMappings[c];if(void 0===b.column)for(e=g.originalLine;g&&g.originalLine===e;)k.push({line:d.getArg(g,"generatedLine",null),column:d.getArg(g,"generatedColumn",null),lastColumn:d.getArg(g,"lastGeneratedColumn",null)}),g=this._originalMappings[++c];else for(b=g.originalColumn;g&&g.originalLine===e&&g.originalColumn==b;)k.push({line:d.getArg(g,"generatedLine",null),column:d.getArg(g,"generatedColumn",null),
+lastColumn:d.getArg(g,"lastGeneratedColumn",null)}),g=this._originalMappings[++c]}return k};m.SourceMapConsumer=b;e.prototype=Object.create(b.prototype);e.prototype.consumer=b;e.fromSourceMap=function(a,b){var c=Object.create(e.prototype),k=c._names=l.fromArray(a._names.toArray(),!0),w=c._sources=l.fromArray(a._sources.toArray(),!0);c.sourceRoot=a._sourceRoot;c.sourcesContent=a._generateSourcesContent(c._sources.toArray(),c.sourceRoot);c.file=a._file;c._sourceMapURL=b;for(var h=a._mappings.toArray().slice(),
+r=c.__generatedMappings=[],m=c.__originalMappings=[],v=0,p=h.length;v<p;v++){var f=h[v],n=new g;n.generatedLine=f.generatedLine;n.generatedColumn=f.generatedColumn;f.source&&(n.source=w.indexOf(f.source),n.originalLine=f.originalLine,n.originalColumn=f.originalColumn,f.name&&(n.name=k.indexOf(f.name)),m.push(n));r.push(n)}q(c.__originalMappings,d.compareByOriginalPositions);return c};e.prototype._version=3;Object.defineProperty(e.prototype,"sources",{get:function(){return this._sources.toArray().map(function(a){return d.computeSourceURL(this.sourceRoot,
+a,this._sourceMapURL)},this)}});e.prototype._parseMappings=function(a,b){for(var c=1,k=0,e=0,l=0,w=0,h=0,m=a.length,v=0,f={},n={},p=[],u=[],y,B,A,E,I;v<m;)if(";"===a.charAt(v))c++,v++,k=0;else if(","===a.charAt(v))v++;else{y=new g;y.generatedLine=c;for(E=v;E<m&&!this._charIsMappingSeparator(a,E);E++);B=a.slice(v,E);if(A=f[B])v+=B.length;else{for(A=[];v<E;)r.decode(a,v,n),I=n.value,v=n.rest,A.push(I);if(2===A.length)throw Error("Found a source, but no line and column");if(3===A.length)throw Error("Found a source and line, but no column");
+f[B]=A}y.generatedColumn=k+A[0];k=y.generatedColumn;1<A.length&&(y.source=w+A[1],w+=A[1],y.originalLine=e+A[2],e=y.originalLine,y.originalLine+=1,y.originalColumn=l+A[3],l=y.originalColumn,4<A.length&&(y.name=h+A[4],h+=A[4]));u.push(y);"number"===typeof y.originalLine&&p.push(y)}q(u,d.compareByGeneratedPositionsDeflated);this.__generatedMappings=u;q(p,d.compareByOriginalPositions);this.__originalMappings=p};e.prototype._findMapping=function(b,d,c,k,e,g){if(0>=b[c])throw new TypeError("Line must be greater than or equal to 1, got "+
+b[c]);if(0>b[k])throw new TypeError("Column must be greater than or equal to 0, got "+b[k]);return a.search(b,d,e,g)};e.prototype.computeColumnSpans=function(){for(var a=0;a<this._generatedMappings.length;++a){var b=this._generatedMappings[a];if(a+1<this._generatedMappings.length){var c=this._generatedMappings[a+1];if(b.generatedLine===c.generatedLine){b.lastGeneratedColumn=c.generatedColumn-1;continue}}b.lastGeneratedColumn=Infinity}};e.prototype.originalPositionFor=function(a){var e={generatedLine:d.getArg(a,
+"line"),generatedColumn:d.getArg(a,"column")};a=this._findMapping(e,this._generatedMappings,"generatedLine","generatedColumn",d.compareByGeneratedPositionsDeflated,d.getArg(a,"bias",b.GREATEST_LOWER_BOUND));if(0<=a&&(a=this._generatedMappings[a],a.generatedLine===e.generatedLine)){e=d.getArg(a,"source",null);null!==e&&(e=this._sources.at(e),e=d.computeSourceURL(this.sourceRoot,e,this._sourceMapURL));var c=d.getArg(a,"name",null);null!==c&&(c=this._names.at(c));return{source:e,line:d.getArg(a,"originalLine",
+null),column:d.getArg(a,"originalColumn",null),name:c}}return{source:null,line:null,column:null,name:null}};e.prototype.hasContentsOfAllSources=function(){return this.sourcesContent?this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(a){return null==a}):!1};e.prototype.sourceContentFor=function(a,b){if(!this.sourcesContent)return null;var c=a;null!=this.sourceRoot&&(c=d.relative(this.sourceRoot,c));if(this._sources.has(c))return this.sourcesContent[this._sources.indexOf(c)];
+var k=this.sources,e;for(e=0;e<k.length;++e)if(k[e]==a)return this.sourcesContent[e];var g;if(null!=this.sourceRoot&&(g=d.urlParse(this.sourceRoot))){k=c.replace(/^file:\/\//,"");if("file"==g.scheme&&this._sources.has(k))return this.sourcesContent[this._sources.indexOf(k)];if((!g.path||"/"==g.path)&&this._sources.has("/"+c))return this.sourcesContent[this._sources.indexOf("/"+c)]}if(b)return null;throw Error('"'+c+'" is not in the SourceMap.');};e.prototype.generatedPositionFor=function(a){var e=
+d.getArg(a,"source");null!=this.sourceRoot&&(e=d.relative(this.sourceRoot,e));if(!this._sources.has(e))return{line:null,column:null,lastColumn:null};e=this._sources.indexOf(e);e={source:e,originalLine:d.getArg(a,"line"),originalColumn:d.getArg(a,"column")};a=this._findMapping(e,this._originalMappings,"originalLine","originalColumn",d.compareByOriginalPositions,d.getArg(a,"bias",b.GREATEST_LOWER_BOUND));return 0<=a&&(a=this._originalMappings[a],a.source===e.source)?{line:d.getArg(a,"generatedLine",
+null),column:d.getArg(a,"generatedColumn",null),lastColumn:d.getArg(a,"lastGeneratedColumn",null)}:{line:null,column:null,lastColumn:null}};m.BasicSourceMapConsumer=e;h.prototype=Object.create(b.prototype);h.prototype.constructor=b;h.prototype._version=3;Object.defineProperty(h.prototype,"sources",{get:function(){for(var a=[],b=0;b<this._sections.length;b++)for(var c=0;c<this._sections[b].consumer.sources.length;c++)a.push(this._sections[b].consumer.sources[c]);return a}});h.prototype.originalPositionFor=
+function(b){var e={generatedLine:d.getArg(b,"line"),generatedColumn:d.getArg(b,"column")},c=a.search(e,this._sections,function(a,b){var c=a.generatedLine-b.generatedOffset.generatedLine;return c?c:a.generatedColumn-b.generatedOffset.generatedColumn});return(c=this._sections[c])?c.consumer.originalPositionFor({line:e.generatedLine-(c.generatedOffset.generatedLine-1),column:e.generatedColumn-(c.generatedOffset.generatedLine===e.generatedLine?c.generatedOffset.generatedColumn-1:0),bias:b.bias}):{source:null,
+line:null,column:null,name:null}};h.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(a){return a.consumer.hasContentsOfAllSources()})};h.prototype.sourceContentFor=function(a,b){for(var c=0;c<this._sections.length;c++){var d=this._sections[c].consumer.sourceContentFor(a,!0);if(d)return d}if(b)return null;throw Error('"'+a+'" is not in the SourceMap.');};h.prototype.generatedPositionFor=function(a){for(var b=0;b<this._sections.length;b++){var c=this._sections[b];if(-1!==
+c.consumer.sources.indexOf(d.getArg(a,"source"))){var k=c.consumer.generatedPositionFor(a);if(k)return{line:k.line+(c.generatedOffset.generatedLine-1),column:k.column+(c.generatedOffset.generatedLine===k.line?c.generatedOffset.generatedColumn-1:0)}}}return{line:null,column:null}};h.prototype._parseMappings=function(a,b){this.__generatedMappings=[];this.__originalMappings=[];for(var c=0;c<this._sections.length;c++)for(var k=this._sections[c],e=k.consumer._generatedMappings,g=0;g<e.length;g++){var l=
+e[g],h=k.consumer._sources.at(l.source);h=d.computeSourceURL(k.consumer.sourceRoot,h,this._sourceMapURL);this._sources.add(h);h=this._sources.indexOf(h);var r=null;l.name&&(r=k.consumer._names.at(l.name),this._names.add(r),r=this._names.indexOf(r));l={source:h,generatedLine:l.generatedLine+(k.generatedOffset.generatedLine-1),generatedColumn:l.generatedColumn+(k.generatedOffset.generatedLine===l.generatedLine?k.generatedOffset.generatedColumn-1:0),originalLine:l.originalLine,originalColumn:l.originalColumn,
+name:r};this.__generatedMappings.push(l);"number"===typeof l.originalLine&&this.__originalMappings.push(l)}q(this.__generatedMappings,d.compareByGeneratedPositionsDeflated);q(this.__originalMappings,d.compareByOriginalPositions)};m.IndexedSourceMapConsumer=h},{"./array-set":10,"./base64-vlq":11,"./binary-search":13,"./quick-sort":15,"./util":19}],17:[function(p,u,m){function b(a){a||(a={});this._file=g.getArg(a,"file",null);this._sourceRoot=g.getArg(a,"sourceRoot",null);this._skipValidation=g.getArg(a,
+"skipValidation",!1);this._sources=new h;this._names=new h;this._mappings=new d;this._sourcesContents=null}var e=p("./base64-vlq"),g=p("./util"),h=p("./array-set").ArraySet,d=p("./mapping-list").MappingList;b.prototype._version=3;b.fromSourceMap=function(a){var d=a.sourceRoot,e=new b({file:a.file,sourceRoot:d});a.eachMapping(function(a){var b={generated:{line:a.generatedLine,column:a.generatedColumn}};null!=a.source&&(b.source=a.source,null!=d&&(b.source=g.relative(d,b.source)),b.original={line:a.originalLine,
+column:a.originalColumn},null!=a.name&&(b.name=a.name));e.addMapping(b)});a.sources.forEach(function(b){var l=b;null!==d&&(l=g.relative(d,b));e._sources.has(l)||e._sources.add(l);l=a.sourceContentFor(b);null!=l&&e.setSourceContent(b,l)});return e};b.prototype.addMapping=function(a){var b=g.getArg(a,"generated"),d=g.getArg(a,"original",null),e=g.getArg(a,"source",null);a=g.getArg(a,"name",null);this._skipValidation||this._validateMapping(b,d,e,a);null!=e&&(e=String(e),this._sources.has(e)||this._sources.add(e));
+null!=a&&(a=String(a),this._names.has(a)||this._names.add(a));this._mappings.add({generatedLine:b.line,generatedColumn:b.column,originalLine:null!=d&&d.line,originalColumn:null!=d&&d.column,source:e,name:a})};b.prototype.setSourceContent=function(a,b){var d=a;null!=this._sourceRoot&&(d=g.relative(this._sourceRoot,d));null!=b?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[g.toSetString(d)]=b):this._sourcesContents&&(delete this._sourcesContents[g.toSetString(d)],
+0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};b.prototype.applySourceMap=function(a,b,d){var e=b;if(null==b){if(null==a.file)throw Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');e=a.file}var l=this._sourceRoot;null!=l&&(e=g.relative(l,e));var m=new h,c=new h;this._mappings.unsortedForEach(function(b){if(b.source===e&&null!=b.originalLine){var k=a.originalPositionFor({line:b.originalLine,
+column:b.originalColumn});null!=k.source&&(b.source=k.source,null!=d&&(b.source=g.join(d,b.source)),null!=l&&(b.source=g.relative(l,b.source)),b.originalLine=k.line,b.originalColumn=k.column,null!=k.name&&(b.name=k.name))}k=b.source;null==k||m.has(k)||m.add(k);b=b.name;null==b||c.has(b)||c.add(b)},this);this._sources=m;this._names=c;a.sources.forEach(function(b){var c=a.sourceContentFor(b);null!=c&&(null!=d&&(b=g.join(d,b)),null!=l&&(b=g.relative(l,b)),this.setSourceContent(b,c))},this)};b.prototype._validateMapping=
+function(a,b,d,e){if(b&&"number"!==typeof b.line&&"number"!==typeof b.column)throw Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if(!(a&&"line"in a&&"column"in a&&0<a.line&&0<=a.column&&!b&&!d&&!e||a&&"line"in a&&"column"in a&&b&&"line"in b&&"column"in b&&0<a.line&&0<=a.column&&0<b.line&&0<=b.column&&
+d))throw Error("Invalid mapping: "+JSON.stringify({generated:a,source:d,original:b,name:e}));};b.prototype._serializeMappings=function(){for(var a=0,b=1,d=0,h=0,m=0,p=0,c="",k,x,z,F=this._mappings.toArray(),D=0,t=F.length;D<t;D++){x=F[D];k="";if(x.generatedLine!==b)for(a=0;x.generatedLine!==b;)k+=";",b++;else if(0<D){if(!g.compareByGeneratedPositionsInflated(x,F[D-1]))continue;k+=","}k+=e.encode(x.generatedColumn-a);a=x.generatedColumn;null!=x.source&&(z=this._sources.indexOf(x.source),k+=e.encode(z-
+p),p=z,k+=e.encode(x.originalLine-1-h),h=x.originalLine-1,k+=e.encode(x.originalColumn-d),d=x.originalColumn,null!=x.name&&(x=this._names.indexOf(x.name),k+=e.encode(x-m),m=x));c+=k}return c};b.prototype._generateSourcesContent=function(a,b){return a.map(function(a){if(!this._sourcesContents)return null;null!=b&&(a=g.relative(b,a));a=g.toSetString(a);return Object.prototype.hasOwnProperty.call(this._sourcesContents,a)?this._sourcesContents[a]:null},this)};b.prototype.toJSON=function(){var a={version:this._version,
+sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};null!=this._file&&(a.file=this._file);null!=this._sourceRoot&&(a.sourceRoot=this._sourceRoot);this._sourcesContents&&(a.sourcesContent=this._generateSourcesContent(a.sources,a.sourceRoot));return a};b.prototype.toString=function(){return JSON.stringify(this.toJSON())};m.SourceMapGenerator=b},{"./array-set":10,"./base64-vlq":11,"./mapping-list":14,"./util":19}],18:[function(p,u,m){function b(b,a,e,g,h){this.children=
+[];this.sourceContents={};this.line=null==b?null:b;this.column=null==a?null:a;this.source=null==e?null:e;this.name=null==h?null:h;this.$$$isSourceNode$$$=!0;null!=g&&this.add(g)}var e=p("./source-map-generator").SourceMapGenerator,g=p("./util"),h=/(\r?\n)/;b.fromStringWithSourceMap=function(d,a,e){function l(a,c){if(null===a||void 0===a.source)m.add(c);else{var d=e?g.join(e,a.source):a.source;m.add(new b(a.originalLine,a.originalColumn,d,c,a.name))}}var m=new b,p=d.split(h),v=0,c=function(){var a=
+v<p.length?p[v++]:void 0,b=(v<p.length?p[v++]:void 0)||"";return a+b},k=1,x=0,z=null;a.eachMapping(function(a){if(null!==z)if(k<a.generatedLine)l(z,c()),k++,x=0;else{var b=p[v]||"",d=b.substr(0,a.generatedColumn-x);p[v]=b.substr(a.generatedColumn-x);x=a.generatedColumn;l(z,d);z=a;return}for(;k<a.generatedLine;)m.add(c()),k++;x<a.generatedColumn&&(b=p[v]||"",m.add(b.substr(0,a.generatedColumn)),p[v]=b.substr(a.generatedColumn),x=a.generatedColumn);z=a},this);v<p.length&&(z&&l(z,c()),m.add(p.splice(v).join("")));
+a.sources.forEach(function(b){var c=a.sourceContentFor(b);null!=c&&(null!=e&&(b=g.join(e,b)),m.setSourceContent(b,c))});return m};b.prototype.add=function(b){if(Array.isArray(b))b.forEach(function(a){this.add(a)},this);else if(b.$$$isSourceNode$$$||"string"===typeof b)b&&this.children.push(b);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+b);return this};b.prototype.prepend=function(b){if(Array.isArray(b))for(var a=b.length-1;0<=a;a--)this.prepend(b[a]);
+else if(b.$$$isSourceNode$$$||"string"===typeof b)this.children.unshift(b);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+b);return this};b.prototype.walk=function(b){for(var a,d=0,e=this.children.length;d<e;d++)a=this.children[d],a.$$$isSourceNode$$$?a.walk(b):""!==a&&b(a,{source:this.source,line:this.line,column:this.column,name:this.name})};b.prototype.join=function(b){var a,d=this.children.length;if(0<d){var e=[];for(a=0;a<d-1;a++)e.push(this.children[a]),
+e.push(b);e.push(this.children[a]);this.children=e}return this};b.prototype.replaceRight=function(b,a){var d=this.children[this.children.length-1];d.$$$isSourceNode$$$?d.replaceRight(b,a):"string"===typeof d?this.children[this.children.length-1]=d.replace(b,a):this.children.push("".replace(b,a));return this};b.prototype.setSourceContent=function(b,a){this.sourceContents[g.toSetString(b)]=a};b.prototype.walkSourceContents=function(b){for(var a=0,d=this.children.length;a<d;a++)this.children[a].$$$isSourceNode$$$&&
+this.children[a].walkSourceContents(b);var e=Object.keys(this.sourceContents);a=0;for(d=e.length;a<d;a++)b(g.fromSetString(e[a]),this.sourceContents[e[a]])};b.prototype.toString=function(){var b="";this.walk(function(a){b+=a});return b};b.prototype.toStringWithSourceMap=function(b){var a="",d=1,g=0,h=new e(b),m=!1,p=null,c=null,k=null,x=null;this.walk(function(b,e){a+=b;null!==e.source&&null!==e.line&&null!==e.column?(p===e.source&&c===e.line&&k===e.column&&x===e.name||h.addMapping({source:e.source,
+original:{line:e.line,column:e.column},generated:{line:d,column:g},name:e.name}),p=e.source,c=e.line,k=e.column,x=e.name,m=!0):m&&(h.addMapping({generated:{line:d,column:g}}),p=null,m=!1);for(var l=0,z=b.length;l<z;l++)10===b.charCodeAt(l)?(d++,g=0,l+1===z?(p=null,m=!1):m&&h.addMapping({source:e.source,original:{line:e.line,column:e.column},generated:{line:d,column:g},name:e.name})):g++});this.walkSourceContents(function(a,b){h.setSourceContent(a,b)});return{code:a,map:h}};m.SourceNode=b},{"./source-map-generator":17,
+"./util":19}],19:[function(p,u,m){function b(a){return(a=a.match(w))?{scheme:a[1],auth:a[2],host:a[3],port:a[4],path:a[5]}:null}function e(a){var b="";a.scheme&&(b+=a.scheme+":");b+="//";a.auth&&(b+=a.auth+"@");a.host&&(b+=a.host);a.port&&(b+=":"+a.port);a.path&&(b+=a.path);return b}function g(a){var c=a,d=b(a);if(d){if(!d.path)return a;c=d.path}a=m.isAbsolute(c);c=c.split(/\/+/);for(var g,h=0,l=c.length-1;0<=l;l--)g=c[l],"."===g?c.splice(l,1):".."===g?h++:0<h&&(""===g?(c.splice(l+1,h),h=0):(c.splice(l,
+2),h--));c=c.join("/");""===c&&(c=a?"/":".");return d?(d.path=c,e(d)):c}function h(a,d){""===a&&(a=".");""===d&&(d=".");var c=b(d),k=b(a);k&&(a=k.path||"/");if(c&&!c.scheme)return k&&(c.scheme=k.scheme),e(c);if(c||d.match(v))return d;if(k&&!k.host&&!k.path)return k.host=d,e(k);c="/"===d.charAt(0)?d:g(a.replace(/\/+$/,"")+"/"+d);return k?(k.path=c,e(k)):c}function d(a){return a}function a(a){return r(a)?"$"+a:a}function l(a){return r(a)?a.slice(1):a}function r(a){if(!a)return!1;var b=a.length;if(9>
+b||95!==a.charCodeAt(b-1)||95!==a.charCodeAt(b-2)||111!==a.charCodeAt(b-3)||116!==a.charCodeAt(b-4)||111!==a.charCodeAt(b-5)||114!==a.charCodeAt(b-6)||112!==a.charCodeAt(b-7)||95!==a.charCodeAt(b-8)||95!==a.charCodeAt(b-9))return!1;for(b-=10;0<=b;b--)if(36!==a.charCodeAt(b))return!1;return!0}function q(a,b){return a===b?0:null===a?1:null===b?-1:a>b?1:-1}m.getArg=function(a,b,d){if(b in a)return a[b];if(3===arguments.length)return d;throw Error('"'+b+'" is a required argument.');};var w=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,
+v=/^data:.+,.+$/;m.urlParse=b;m.urlGenerate=e;m.normalize=g;m.join=h;m.isAbsolute=function(a){return"/"===a.charAt(0)||w.test(a)};m.relative=function(a,b){""===a&&(a=".");a=a.replace(/\/$/,"");for(var c=0;0!==b.indexOf(a+"/");){var d=a.lastIndexOf("/");if(0>d)return b;a=a.slice(0,d);if(a.match(/^([^\/]+:\/)?\/*$/))return b;++c}return Array(c+1).join("../")+b.substr(a.length+1)};p=!("__proto__"in Object.create(null));m.toSetString=p?d:a;m.fromSetString=p?d:l;m.compareByOriginalPositions=function(a,
+b,d){var c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;if(0!==c||d)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c)return c;c=a.generatedLine-b.generatedLine;return 0!==c?c:q(a.name,b.name)};m.compareByGeneratedPositionsDeflated=function(a,b,d){var c=a.generatedLine-b.generatedLine;if(0!==c)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c||d)return c;c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-
+b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;return 0!==c?c:q(a.name,b.name)};m.compareByGeneratedPositionsInflated=function(a,b){var c=a.generatedLine-b.generatedLine;if(0!==c)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c)return c;c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;return 0!==c?c:q(a.name,b.name)};m.parseSourceMapInput=function(a){return JSON.parse(a.replace(/^\)]}'[^\n]*\n/,
+""))};m.computeSourceURL=function(a,d,l){d=d||"";a&&("/"!==a[a.length-1]&&"/"!==d[0]&&(a+="/"),d=a+d);if(l){a=b(l);if(!a)throw Error("sourceMapURL could not be parsed");a.path&&(l=a.path.lastIndexOf("/"),0<=l&&(a.path=a.path.substring(0,l+1)));d=h(e(a),d)}return g(d)}},{}],20:[function(p,u,m){m.SourceMapGenerator=p("./lib/source-map-generator").SourceMapGenerator;m.SourceMapConsumer=p("./lib/source-map-consumer").SourceMapConsumer;m.SourceNode=p("./lib/source-node").SourceNode},{"./lib/source-map-consumer":16,
+"./lib/source-map-generator":17,"./lib/source-node":18}],21:[function(p,u,m){(function(b){function e(){return"browser"===f?!0:"node"===f?!1:"undefined"!==typeof window&&"function"===typeof XMLHttpRequest&&!(window.require&&window.module&&window.process&&"renderer"===window.process.type)}function g(a){return function(b){for(var c=0;c<a.length;c++){var d=a[c](b);if(d)return d}return null}}function h(a,b){if(!a)return b;var c=x.dirname(a),d=/^\w+:\/\/[^\/]*/.exec(c);d=d?d[0]:"";var e=c.slice(d.length);
+return d&&/^\/\w:/.test(e)?(d+="/",d+x.resolve(c.slice(d.length),b).replace(/\\/g,"/")):d+x.resolve(c.slice(d.length),b)}function d(a){var b=C[a.source];if(!b){var c=E(a.source);c?(b=C[a.source]={url:c.url,map:new k(c.map)},b.map.sourcesContent&&b.map.sources.forEach(function(a,c){var d=b.map.sourcesContent[c];if(d){var e=h(b.url,a);n[e]=d}})):b=C[a.source]={url:null,map:null}}return b&&b.map&&"function"===typeof b.map.originalPositionFor&&(c=b.map.originalPositionFor(a),null!==c.source)?(c.source=
+h(b.url,c.source),c):a}function a(b){var c=/^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(b);return c?(b=d({source:c[2],line:+c[3],column:c[4]-1}),"eval at "+c[1]+" ("+b.source+":"+b.line+":"+(b.column+1)+")"):(c=/^eval at ([^(]+) \((.+)\)$/.exec(b))?"eval at "+c[1]+" ("+a(c[2])+")":b}function l(){var a="";if(this.isNative())a="native";else{var b=this.getScriptNameOrSourceURL();!b&&this.isEval()&&(a=this.getEvalOrigin(),a+=", ");a=b?a+b:a+"<anonymous>";b=this.getLineNumber();null!=b&&(a+=":"+b,(b=
+this.getColumnNumber())&&(a+=":"+b))}b="";var c=this.getFunctionName(),d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?b+="new "+(c||"<anonymous>"):c?b+=c:(b+=a,d=!1);else{e=this.getTypeName();"[object Object]"===e&&(e="null");var f=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(b+=e+"."),b+=c,f&&c.indexOf("."+f)!=c.length-f.length-1&&(b+=" [as "+f+"]")):b+=e+"."+(f||"<anonymous>")}d&&(b+=" ("+a+")");return b}function r(a){var b={};Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(function(c){b[c]=
+/^(?:is|get)/.test(c)?function(){return a[c].call(a)}:a[c]});b.toString=l;return b}function q(c,f){void 0===f&&(f={nextPosition:null,curPosition:null});if(c.isNative())return f.curPosition=null,c;var g=c.getFileName()||c.getScriptNameOrSourceURL();if(g){var h=c.getLineNumber(),k=c.getColumnNumber()-1,l=/^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/.test(b.version)?0:62;1===h&&k>l&&!e()&&!c.isEval()&&(k-=l);var m=d({source:g,line:h,column:k});f.curPosition=m;c=r(c);var p=
+c.getFunctionName;c.getFunctionName=function(){return null==f.nextPosition?p():f.nextPosition.name||p()};c.getFileName=function(){return m.source};c.getLineNumber=function(){return m.line};c.getColumnNumber=function(){return m.column+1};c.getScriptNameOrSourceURL=function(){return m.source};return c}var n=c.isEval()&&c.getEvalOrigin();n&&(n=a(n),c=r(c),c.getEvalOrigin=function(){return n});return c}function w(a,b){H&&(n={},C={});for(var c=(a.name||"Error")+": "+(a.message||""),d={nextPosition:null,
+curPosition:null},e=[],f=b.length-1;0<=f;f--)e.push("\n    at "+q(b[f],d)),d.nextPosition=d.curPosition;d.curPosition=d.nextPosition=null;return c+e.reverse().join("")}function v(a){var b=/\n    at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2];b=+b[3];var d=n[a];if(!d&&u&&u.existsSync(a))try{d=u.readFileSync(a,"utf8")}catch(N){d=""}if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function c(){var a=b.emit;b.emit=function(c){if("uncaughtException"===
+c){var d=arguments[1]&&arguments[1].stack,e=0<this.listeners(c).length;if(d&&!e){d=arguments[1];e=v(d);b.stderr._handle&&b.stderr._handle.setBlocking&&b.stderr._handle.setBlocking(!0);e&&(console.error(),console.error(e));console.error(d.stack);b.exit(1);return}}return a.apply(this,arguments)}}var k=p("source-map").SourceMapConsumer,x=p("path");try{var u=p("fs");u.existsSync&&u.readFileSync||(u=null)}catch(M){}var F=p("buffer-from"),D=!1,t=!1,H=!1,f="auto",n={},C={},G=/^data:application\/json[^,]+base64,/,
+y=[],B=[],A=g(y);y.push(function(a){a=a.trim();/^file:/.test(a)&&(a=a.replace(/file:\/\/\/(\w:)?/,function(a,b){return b?"":"/"}));if(a in n)return n[a];var b="";try{if(u)u.existsSync(a)&&(b=u.readFileSync(a,"utf8"));else{var c=new XMLHttpRequest;c.open("GET",a,!1);c.send(null);4===c.readyState&&200===c.status&&(b=c.responseText)}}catch(K){}return n[a]=b});var E=g(B);B.push(function(a){a:{if(e())try{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);var c=b.getResponseHeader("SourceMap")||b.getResponseHeader("X-SourceMap");
+if(c){var d=c;break a}}catch(O){}d=A(a);b=/(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/mg;for(var f;c=b.exec(d);)f=c;d=f?f[1]:null}if(!d)return null;G.test(d)?(f=d.slice(d.indexOf(",")+1),f=F(f,"base64").toString(),d=a):(d=h(a,d),f=A(d));return f?{url:d,map:f}:null});var I=y.slice(0),L=B.slice(0);m.wrapCallSite=q;m.getErrorSource=v;m.mapSourcePosition=d;m.retrieveSourceMap=E;m.install=function(a){a=a||{};if(a.environment&&(f=
+a.environment,-1===["node","browser","auto"].indexOf(f)))throw Error("environment "+f+" was unknown. Available options are {auto, browser, node}");a.retrieveFile&&(a.overrideRetrieveFile&&(y.length=0),y.unshift(a.retrieveFile));a.retrieveSourceMap&&(a.overrideRetrieveSourceMap&&(B.length=0),B.unshift(a.retrieveSourceMap));if(a.hookRequire&&!e()){try{var d=p("module")}catch(K){}var g=d.prototype._compile;g.__sourceMapSupport||(d.prototype._compile=function(a,b){n[b]=a;C[b]=void 0;return g.call(this,
+a,b)},d.prototype._compile.__sourceMapSupport=!0)}H||(H="emptyCacheBetweenOperations"in a?a.emptyCacheBetweenOperations:!1);D||(D=!0,Error.prepareStackTrace=w);!t&&("handleUncaughtExceptions"in a?a.handleUncaughtExceptions:1)&&"object"===typeof b&&null!==b&&"function"===typeof b.on&&(t=!0,c())};m.resetRetrieveHandlers=function(){y.length=0;B.length=0;y=I.slice(0);B=L.slice(0);E=g(B);A=g(y)}}).call(this,p("g5I+bs"))},{"buffer-from":4,fs:3,"g5I+bs":9,module:3,path:8,"source-map":20}]},{},[1]);return G});
diff --git a/third_party/node-source-map-support/source-map-support.js b/third_party/node-source-map-support/source-map-support.js
new file mode 100644
index 0000000..1561cee
--- /dev/null
+++ b/third_party/node-source-map-support/source-map-support.js
@@ -0,0 +1,587 @@
+var SourceMapConsumer = require('source-map').SourceMapConsumer;
+var path = require('path');
+
+var fs;
+try {
+  fs = require('fs');
+  if (!fs.existsSync || !fs.readFileSync) {
+    // fs doesn't have all methods we need
+    fs = null;
+  }
+} catch (err) {
+  /* nop */
+}
+
+var bufferFrom = require('buffer-from');
+
+// Only install once if called multiple times
+var errorFormatterInstalled = false;
+var uncaughtShimInstalled = false;
+
+// If true, the caches are reset before a stack trace formatting operation
+var emptyCacheBetweenOperations = false;
+
+// Supports {browser, node, auto}
+var environment = "auto";
+
+// Maps a file path to a string containing the file contents
+var fileContentsCache = {};
+
+// Maps a file path to a source map for that file
+var sourceMapCache = {};
+
+// Regex for detecting source maps
+var reSourceMap = /^data:application\/json[^,]+base64,/;
+
+// Priority list of retrieve handlers
+var retrieveFileHandlers = [];
+var retrieveMapHandlers = [];
+
+function isInBrowser() {
+  if (environment === "browser")
+    return true;
+  if (environment === "node")
+    return false;
+  return ((typeof window !== 'undefined') && (typeof XMLHttpRequest === 'function') && !(window.require && window.module && window.process && window.process.type === "renderer"));
+}
+
+function hasGlobalProcessEventEmitter() {
+  return ((typeof process === 'object') && (process !== null) && (typeof process.on === 'function'));
+}
+
+function handlerExec(list) {
+  return function(arg) {
+    for (var i = 0; i < list.length; i++) {
+      var ret = list[i](arg);
+      if (ret) {
+        return ret;
+      }
+    }
+    return null;
+  };
+}
+
+var retrieveFile = handlerExec(retrieveFileHandlers);
+
+retrieveFileHandlers.push(function(path) {
+  // Trim the path to make sure there is no extra whitespace.
+  path = path.trim();
+  if (/^file:/.test(path)) {
+    // existsSync/readFileSync can't handle file protocol, but once stripped, it works
+    path = path.replace(/file:\/\/\/(\w:)?/, function(protocol, drive) {
+      return drive ?
+        '' : // file:///C:/dir/file -> C:/dir/file
+        '/'; // file:///root-dir/file -> /root-dir/file
+    });
+  }
+  if (path in fileContentsCache) {
+    return fileContentsCache[path];
+  }
+
+  var contents = '';
+  try {
+    if (!fs) {
+      // Use SJAX if we are in the browser
+      var xhr = new XMLHttpRequest();
+      xhr.open('GET', path, /** async */ false);
+      xhr.send(null);
+      if (xhr.readyState === 4 && xhr.status === 200) {
+        contents = xhr.responseText;
+      }
+    } else if (fs.existsSync(path)) {
+      // Otherwise, use the filesystem
+      contents = fs.readFileSync(path, 'utf8');
+    }
+  } catch (er) {
+    /* ignore any errors */
+  }
+
+  return fileContentsCache[path] = contents;
+});
+
+// Support URLs relative to a directory, but be careful about a protocol prefix
+// in case we are in the browser (i.e. directories may start with "http://" or "file:///")
+function supportRelativeURL(file, url) {
+  if (!file) return url;
+  var dir = path.dirname(file);
+  var match = /^\w+:\/\/[^\/]*/.exec(dir);
+  var protocol = match ? match[0] : '';
+  var startPath = dir.slice(protocol.length);
+  if (protocol && /^\/\w\:/.test(startPath)) {
+    // handle file:///C:/ paths
+    protocol += '/';
+    return protocol + path.resolve(dir.slice(protocol.length), url).replace(/\\/g, '/');
+  }
+  return protocol + path.resolve(dir.slice(protocol.length), url);
+}
+
+function retrieveSourceMapURL(source) {
+  var fileData;
+
+  if (isInBrowser()) {
+     try {
+       var xhr = new XMLHttpRequest();
+       xhr.open('GET', source, false);
+       xhr.send(null);
+       fileData = xhr.readyState === 4 ? xhr.responseText : null;
+
+       // Support providing a sourceMappingURL via the SourceMap header
+       var sourceMapHeader = xhr.getResponseHeader("SourceMap") ||
+                             xhr.getResponseHeader("X-SourceMap");
+       if (sourceMapHeader) {
+         return sourceMapHeader;
+       }
+     } catch (e) {
+     }
+  }
+
+  // Get the URL of the source map
+  fileData = retrieveFile(source);
+  var re = /(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/mg;
+  // Keep executing the search to find the *last* sourceMappingURL to avoid
+  // picking up sourceMappingURLs from comments, strings, etc.
+  var lastMatch, match;
+  while (match = re.exec(fileData)) lastMatch = match;
+  if (!lastMatch) return null;
+  return lastMatch[1];
+};
+
+// Can be overridden by the retrieveSourceMap option to install. Takes a
+// generated source filename; returns a {map, optional url} object, or null if
+// there is no source map.  The map field may be either a string or the parsed
+// JSON object (ie, it must be a valid argument to the SourceMapConsumer
+// constructor).
+var retrieveSourceMap = handlerExec(retrieveMapHandlers);
+retrieveMapHandlers.push(function(source) {
+  var sourceMappingURL = retrieveSourceMapURL(source);
+  if (!sourceMappingURL) return null;
+
+  // Read the contents of the source map
+  var sourceMapData;
+  if (reSourceMap.test(sourceMappingURL)) {
+    // Support source map URL as a data url
+    var rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(',') + 1);
+    sourceMapData = bufferFrom(rawData, "base64").toString();
+    sourceMappingURL = source;
+  } else {
+    // Support source map URLs relative to the source URL
+    sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
+    sourceMapData = retrieveFile(sourceMappingURL);
+  }
+
+  if (!sourceMapData) {
+    return null;
+  }
+
+  return {
+    url: sourceMappingURL,
+    map: sourceMapData
+  };
+});
+
+function mapSourcePosition(position) {
+  var sourceMap = sourceMapCache[position.source];
+  if (!sourceMap) {
+    // Call the (overrideable) retrieveSourceMap function to get the source map.
+    var urlAndMap = retrieveSourceMap(position.source);
+    if (urlAndMap) {
+      sourceMap = sourceMapCache[position.source] = {
+        url: urlAndMap.url,
+        map: new SourceMapConsumer(urlAndMap.map)
+      };
+
+      // Load all sources stored inline with the source map into the file cache
+      // to pretend like they are already loaded. They may not exist on disk.
+      if (sourceMap.map.sourcesContent) {
+        sourceMap.map.sources.forEach(function(source, i) {
+          var contents = sourceMap.map.sourcesContent[i];
+          if (contents) {
+            var url = supportRelativeURL(sourceMap.url, source);
+            fileContentsCache[url] = contents;
+          }
+        });
+      }
+    } else {
+      sourceMap = sourceMapCache[position.source] = {
+        url: null,
+        map: null
+      };
+    }
+  }
+
+  // Resolve the source URL relative to the URL of the source map
+  if (sourceMap && sourceMap.map && typeof sourceMap.map.originalPositionFor === 'function') {
+    var originalPosition = sourceMap.map.originalPositionFor(position);
+
+    // Only return the original position if a matching line was found. If no
+    // matching line is found then we return position instead, which will cause
+    // the stack trace to print the path and line for the compiled file. It is
+    // better to give a precise location in the compiled file than a vague
+    // location in the original file.
+    if (originalPosition.source !== null) {
+      originalPosition.source = supportRelativeURL(
+        sourceMap.url, originalPosition.source);
+      return originalPosition;
+    }
+  }
+
+  return position;
+}
+
+// Parses code generated by FormatEvalOrigin(), a function inside V8:
+// https://code.google.com/p/v8/source/browse/trunk/src/messages.js
+function mapEvalOrigin(origin) {
+  // Most eval() calls are in this format
+  var match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
+  if (match) {
+    var position = mapSourcePosition({
+      source: match[2],
+      line: +match[3],
+      column: match[4] - 1
+    });
+    return 'eval at ' + match[1] + ' (' + position.source + ':' +
+      position.line + ':' + (position.column + 1) + ')';
+  }
+
+  // Parse nested eval() calls using recursion
+  match = /^eval at ([^(]+) \((.+)\)$/.exec(origin);
+  if (match) {
+    return 'eval at ' + match[1] + ' (' + mapEvalOrigin(match[2]) + ')';
+  }
+
+  // Make sure we still return useful information if we didn't find anything
+  return origin;
+}
+
+// This is copied almost verbatim from the V8 source code at
+// https://code.google.com/p/v8/source/browse/trunk/src/messages.js. The
+// implementation of wrapCallSite() used to just forward to the actual source
+// code of CallSite.prototype.toString but unfortunately a new release of V8
+// did something to the prototype chain and broke the shim. The only fix I
+// could find was copy/paste.
+function CallSiteToString() {
+  var fileName;
+  var fileLocation = "";
+  if (this.isNative()) {
+    fileLocation = "native";
+  } else {
+    fileName = this.getScriptNameOrSourceURL();
+    if (!fileName && this.isEval()) {
+      fileLocation = this.getEvalOrigin();
+      fileLocation += ", ";  // Expecting source position to follow.
+    }
+
+    if (fileName) {
+      fileLocation += fileName;
+    } else {
+      // Source code does not originate from a file and is not native, but we
+      // can still get the source position inside the source string, e.g. in
+      // an eval string.
+      fileLocation += "<anonymous>";
+    }
+    var lineNumber = this.getLineNumber();
+    if (lineNumber != null) {
+      fileLocation += ":" + lineNumber;
+      var columnNumber = this.getColumnNumber();
+      if (columnNumber) {
+        fileLocation += ":" + columnNumber;
+      }
+    }
+  }
+
+  var line = "";
+  var functionName = this.getFunctionName();
+  var addSuffix = true;
+  var isConstructor = this.isConstructor();
+  var isMethodCall = !(this.isToplevel() || isConstructor);
+  if (isMethodCall) {
+    var typeName = this.getTypeName();
+    // Fixes shim to be backward compatable with Node v0 to v4
+    if (typeName === "[object Object]") {
+      typeName = "null";
+    }
+    var methodName = this.getMethodName();
+    if (functionName) {
+      if (typeName && functionName.indexOf(typeName) != 0) {
+        line += typeName + ".";
+      }
+      line += functionName;
+      if (methodName && functionName.indexOf("." + methodName) != functionName.length - methodName.length - 1) {
+        line += " [as " + methodName + "]";
+      }
+    } else {
+      line += typeName + "." + (methodName || "<anonymous>");
+    }
+  } else if (isConstructor) {
+    line += "new " + (functionName || "<anonymous>");
+  } else if (functionName) {
+    line += functionName;
+  } else {
+    line += fileLocation;
+    addSuffix = false;
+  }
+  if (addSuffix) {
+    line += " (" + fileLocation + ")";
+  }
+  return line;
+}
+
+function cloneCallSite(frame) {
+  var object = {};
+  Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach(function(name) {
+    object[name] = /^(?:is|get)/.test(name) ? function() { return frame[name].call(frame); } : frame[name];
+  });
+  object.toString = CallSiteToString;
+  return object;
+}
+
+function wrapCallSite(frame, state) {
+  // provides interface backward compatibility
+  if (state === undefined) {
+    state = { nextPosition: null, curPosition: null }
+  }
+  if(frame.isNative()) {
+    state.curPosition = null;
+    return frame;
+  }
+
+  // Most call sites will return the source file from getFileName(), but code
+  // passed to eval() ending in "//# sourceURL=..." will return the source file
+  // from getScriptNameOrSourceURL() instead
+  var source = frame.getFileName() || frame.getScriptNameOrSourceURL();
+  if (source) {
+    var line = frame.getLineNumber();
+    var column = frame.getColumnNumber() - 1;
+
+    // Fix position in Node where some (internal) code is prepended.
+    // See https://github.com/evanw/node-source-map-support/issues/36
+    // Header removed in node at ^10.16 || >=11.11.0
+    // v11 is not an LTS candidate, we can just test the one version with it.
+    // Test node versions for: 10.16-19, 10.20+, 12-19, 20-99, 100+, or 11.11
+    var noHeader = /^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/;
+    var headerLength = noHeader.test(process.version) ? 0 : 62;
+    if (line === 1 && column > headerLength && !isInBrowser() && !frame.isEval()) {
+      column -= headerLength;
+    }
+
+    var position = mapSourcePosition({
+      source: source,
+      line: line,
+      column: column
+    });
+    state.curPosition = position;
+    frame = cloneCallSite(frame);
+    var originalFunctionName = frame.getFunctionName;
+    frame.getFunctionName = function() {
+      if (state.nextPosition == null) {
+        return originalFunctionName();
+      }
+      return state.nextPosition.name || originalFunctionName();
+    };
+    frame.getFileName = function() { return position.source; };
+    frame.getLineNumber = function() { return position.line; };
+    frame.getColumnNumber = function() { return position.column + 1; };
+    frame.getScriptNameOrSourceURL = function() { return position.source; };
+    return frame;
+  }
+
+  // Code called using eval() needs special handling
+  var origin = frame.isEval() && frame.getEvalOrigin();
+  if (origin) {
+    origin = mapEvalOrigin(origin);
+    frame = cloneCallSite(frame);
+    frame.getEvalOrigin = function() { return origin; };
+    return frame;
+  }
+
+  // If we get here then we were unable to change the source position
+  return frame;
+}
+
+// This function is part of the V8 stack trace API, for more info see:
+// https://v8.dev/docs/stack-trace-api
+function prepareStackTrace(error, stack) {
+  if (emptyCacheBetweenOperations) {
+    fileContentsCache = {};
+    sourceMapCache = {};
+  }
+
+  var name = error.name || 'Error';
+  var message = error.message || '';
+  var errorString = name + ": " + message;
+
+  var state = { nextPosition: null, curPosition: null };
+  var processedStack = [];
+  for (var i = stack.length - 1; i >= 0; i--) {
+    processedStack.push('\n    at ' + wrapCallSite(stack[i], state));
+    state.nextPosition = state.curPosition;
+  }
+  state.curPosition = state.nextPosition = null;
+  return errorString + processedStack.reverse().join('');
+}
+
+// Generate position and snippet of original source with pointer
+function getErrorSource(error) {
+  var match = /\n    at [^(]+ \((.*):(\d+):(\d+)\)/.exec(error.stack);
+  if (match) {
+    var source = match[1];
+    var line = +match[2];
+    var column = +match[3];
+
+    // Support the inline sourceContents inside the source map
+    var contents = fileContentsCache[source];
+
+    // Support files on disk
+    if (!contents && fs && fs.existsSync(source)) {
+      try {
+        contents = fs.readFileSync(source, 'utf8');
+      } catch (er) {
+        contents = '';
+      }
+    }
+
+    // Format the line from the original source code like node does
+    if (contents) {
+      var code = contents.split(/(?:\r\n|\r|\n)/)[line - 1];
+      if (code) {
+        return source + ':' + line + '\n' + code + '\n' +
+          new Array(column).join(' ') + '^';
+      }
+    }
+  }
+  return null;
+}
+
+function printErrorAndExit (error) {
+  var source = getErrorSource(error);
+
+  // Ensure error is printed synchronously and not truncated
+  if (process.stderr._handle && process.stderr._handle.setBlocking) {
+    process.stderr._handle.setBlocking(true);
+  }
+
+  if (source) {
+    console.error();
+    console.error(source);
+  }
+
+  console.error(error.stack);
+  process.exit(1);
+}
+
+function shimEmitUncaughtException () {
+  var origEmit = process.emit;
+
+  process.emit = function (type) {
+    if (type === 'uncaughtException') {
+      var hasStack = (arguments[1] && arguments[1].stack);
+      var hasListeners = (this.listeners(type).length > 0);
+
+      if (hasStack && !hasListeners) {
+        return printErrorAndExit(arguments[1]);
+      }
+    }
+
+    return origEmit.apply(this, arguments);
+  };
+}
+
+var originalRetrieveFileHandlers = retrieveFileHandlers.slice(0);
+var originalRetrieveMapHandlers = retrieveMapHandlers.slice(0);
+
+exports.wrapCallSite = wrapCallSite;
+exports.getErrorSource = getErrorSource;
+exports.mapSourcePosition = mapSourcePosition;
+exports.retrieveSourceMap = retrieveSourceMap;
+
+exports.install = function(options) {
+  options = options || {};
+
+  if (options.environment) {
+    environment = options.environment;
+    if (["node", "browser", "auto"].indexOf(environment) === -1) {
+      throw new Error("environment " + environment + " was unknown. Available options are {auto, browser, node}")
+    }
+  }
+
+  // Allow sources to be found by methods other than reading the files
+  // directly from disk.
+  if (options.retrieveFile) {
+    if (options.overrideRetrieveFile) {
+      retrieveFileHandlers.length = 0;
+    }
+
+    retrieveFileHandlers.unshift(options.retrieveFile);
+  }
+
+  // Allow source maps to be found by methods other than reading the files
+  // directly from disk.
+  if (options.retrieveSourceMap) {
+    if (options.overrideRetrieveSourceMap) {
+      retrieveMapHandlers.length = 0;
+    }
+
+    retrieveMapHandlers.unshift(options.retrieveSourceMap);
+  }
+
+  // Support runtime transpilers that include inline source maps
+  if (options.hookRequire && !isInBrowser()) {
+    var Module;
+    try {
+      Module = require('module');
+    } catch (err) {
+      // NOP: Loading in catch block to convert webpack error to warning.
+    }
+    var $compile = Module.prototype._compile;
+
+    if (!$compile.__sourceMapSupport) {
+      Module.prototype._compile = function(content, filename) {
+        fileContentsCache[filename] = content;
+        sourceMapCache[filename] = undefined;
+        return $compile.call(this, content, filename);
+      };
+
+      Module.prototype._compile.__sourceMapSupport = true;
+    }
+  }
+
+  // Configure options
+  if (!emptyCacheBetweenOperations) {
+    emptyCacheBetweenOperations = 'emptyCacheBetweenOperations' in options ?
+      options.emptyCacheBetweenOperations : false;
+  }
+
+  // Install the error reformatter
+  if (!errorFormatterInstalled) {
+    errorFormatterInstalled = true;
+    Error.prepareStackTrace = prepareStackTrace;
+  }
+
+  if (!uncaughtShimInstalled) {
+    var installHandler = 'handleUncaughtExceptions' in options ?
+      options.handleUncaughtExceptions : true;
+
+    // Provide the option to not install the uncaught exception handler. This is
+    // to support other uncaught exception handlers (in test frameworks, for
+    // example). If this handler is not installed and there are no other uncaught
+    // exception handlers, uncaught exceptions will be caught by node's built-in
+    // exception handler and the process will still be terminated. However, the
+    // generated JavaScript code will be shown above the stack trace instead of
+    // the original source code.
+    if (installHandler && hasGlobalProcessEventEmitter()) {
+      uncaughtShimInstalled = true;
+      shimEmitUncaughtException();
+    }
+  }
+};
+
+exports.resetRetrieveHandlers = function() {
+  retrieveFileHandlers.length = 0;
+  retrieveMapHandlers.length = 0;
+
+  retrieveFileHandlers = originalRetrieveFileHandlers.slice(0);
+  retrieveMapHandlers = originalRetrieveMapHandlers.slice(0);
+
+  retrieveSourceMap = handlerExec(retrieveMapHandlers);
+  retrieveFile = handlerExec(retrieveFileHandlers);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 572a620..eeb5240 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 8
 PATCH 0
-PRERELEASE 4
+PRERELEASE 5
 PRERELEASE_PATCH 0
 ABI_VERSION 27
 OLDEST_SUPPORTED_ABI_VERSION 27
diff --git a/tools/bots/post_results_to_pubsub.dart b/tools/bots/post_results_to_pubsub.dart
index d7db757..d864765 100644
--- a/tools/bots/post_results_to_pubsub.dart
+++ b/tools/bots/post_results_to_pubsub.dart
@@ -2,7 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Post results from Dart continuous integration testers to Cloud Pub/Sub.
+// Post results from Dart tryjobs and CI builders to Cloud Pub/Sub.
+//
+// Reads a results.json input file, sends only the changed results from
+// that file to the Pub/Sub channel 'results' in the 'dart-ci' project.
+// Multiple messages are sent if there are more than 100 changed results,
+// so the cloud function only needs to process 100 records within its time
+// limit of 60s. Because of this, we never approach the limit of 10 MB
+// base64-encoded data bytes per message.
+//
+// The function also scans results.json to find the configurations tested
+// by this builder, and writes them and a results feed URL filtered to
+// those configuration groups to a json file, used later in the recipe.
 
 import 'dart:convert';
 import 'dart:io';
@@ -13,7 +24,7 @@
 void usage(ArgParser parser) {
   print('''
 Usage: post_results_to_pubsub.dart [OPTIONS]
-Posts Dart CI results as messages to Google cloud pubsub
+Posts Dart CI results as messages to Google Cloud Pub/Sub
 
 The options are as follows:
 
@@ -21,12 +32,7 @@
   exit(1);
 }
 
-// Pubsub messages must be < 10MB long.  Because the JSON we send is
-// Base64 encoded, and we add a final record after checking the size,
-// the limit must be less than 3/4 of 10MB.
-// Because we have some Firestore scalability issues when thousands of new
-// tests are added, we currently use less than half of the maximum size.
-const messageLengthLimit = 3000000;
+const resultsPerMessage = 100;
 const postUrl =
     'https://pubsub.googleapis.com/v1/projects/dart-ci/topics/results:publish';
 
@@ -50,39 +56,77 @@
   final lines = await File(options['result_file']).readAsLines();
   final token = await File(options['auth_token']).readAsString();
   final buildbucketID = options['id'];
-  // Construct pubsub messages.
-  var line = 0;
-  var numMessages = 0;
-  while (line < lines.length) {
-    final message = StringBuffer();
-    message.write('[');
-    message.write(lines[line++]);
-    var messageLines = 1;
-    while (message.length < messageLengthLimit && line < lines.length) {
-      message.write(',\n');
-      message.write(lines[line++]);
-      messageLines++;
-    }
-    message.write(']');
-    numMessages++;
+  if (lines.isEmpty) {
+    print('No results in input file');
+    return;
+  }
+  // Record the configurations appearing in these results.
+  final configurationRegexp = RegExp('"configuration":"([^"]*)"');
+  final configurationsSet = {
+    for (final result in lines) configurationRegexp.firstMatch(result)?.group(1)
+  };
+  if (configurationsSet.contains(null)) {
+    print("Error: result without a configuration");
+    configurationsSet.remove(null);
+  }
+  final configurations = configurationsSet.toList()..sort();
+  final configurationGroups = {
+    for (final configuration in configurations) configuration.split('-').first
+  };
+  // Construct a link to the results feed that includes a filter showing
+  // unapproved failures for those configuration groups.
+  String fragment = [
+    'showLatestFailures=true',
+    'showUnapprovedOnly=true',
+    if (configurationGroups.isNotEmpty)
+      'configurationGroups=${configurationGroups.join(',')}'
+  ].join('&');
+  final resultsFeedUrl = 'https://dart-ci.firebaseapp.com/#$fragment';
+  // Save them to a file.
+  await File('builder_tested_configurations')
+      .writeAsString(JsonEncoder.withIndent('  ').convert({
+    'configurations': configurations,
+    'results_feed_link': resultsFeedUrl,
+  }));
+
+  final changedPattern = '"changed":true';
+  List<String> changedResults =
+      lines.where((change) => change.contains(changedPattern)).toList();
+  // We need to send at least one result, to save build metadata to Firestore.
+  // Send an unchanged result - the cloud function filters these out.
+  if (changedResults.isEmpty) changedResults = lines.sublist(0, 1);
+
+  final chunks = <List<String>>[];
+  final chunkLength = resultsPerMessage;
+  var position = 0;
+  final lastFullChunkStart = changedResults.length - resultsPerMessage;
+  while (position <= lastFullChunkStart) {
+    chunks.add(changedResults.sublist(position, position += resultsPerMessage));
+  }
+  if (position < changedResults.length)
+    chunks.add(changedResults.sublist(position));
+
+  // Send pubsub messages.
+  for (final chunk in chunks) {
+    final message = '[\n${chunk.join(",\n")}\n]';
+    final base64data = base64Encode(utf8.encode(message.toString()));
     final attributes = {
-      if (line == lines.length) 'num_chunks': numMessages.toString(),
+      if (chunk == chunks.last) 'num_chunks': chunks.length.toString(),
       if (buildbucketID != null) 'buildbucket_id': buildbucketID
     };
-    var base64data = base64Encode(utf8.encode(message.toString()));
-    var messageObject = {
+    final jsonMessage = jsonEncode({
       'messages': [
         {'attributes': attributes, 'data': base64data}
       ]
-    };
-    var jsonMessage = jsonEncode(messageObject);
-    var headers = {'Authorization': 'Bearer $token'};
-    var response =
+    });
+    final headers = {'Authorization': 'Bearer $token'};
+    final response =
         await client.post(postUrl, headers: headers, body: jsonMessage);
-    print('Sent pubsub message containing ${messageLines} results');
+
+    print('Sent pubsub message containing ${chunk.length} results');
     print('Status ${response.statusCode}');
     print('Response: ${response.body}');
   }
-  print('Number of Pub/Sub messages sent: $numMessages');
+  print('Number of Pub/Sub messages sent: ${chunks.length}');
   client.close();
 }
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 1d2a195..97fcce5 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -48,6 +48,7 @@
       "tests/ffi/",
       "third_party/babel/babel.min.js",
       "third_party/d8/",
+      "third_party/node-source-map-support/",
       "third_party/observatory_pub_packages/packages/web_components/",
       "third_party/pkg/",
       "third_party/pkg_tested/",
@@ -89,6 +90,7 @@
       "tests/ffi/",
       "third_party/babel/babel.min.js",
       "third_party/d8/",
+      "third_party/node-source-map-support/",
       "third_party/observatory_pub_packages/packages/web_components/",
       "third_party/pkg/",
       "third_party/pkg_tested/",
@@ -129,6 +131,7 @@
       "tests/standalone_2/",
       "tests/ffi/",
       "third_party/d8/",
+      "third_party/node-source-map-support/",
       "third_party/pkg/",
       "third_party/pkg_tested/",
       "third_party/requirejs/",
@@ -209,6 +212,7 @@
       "tests/standalone_2/",
       "tests/ffi/",
       "third_party/d8/",
+      "third_party/node-source-map-support/",
       "third_party/pkg/",
       "third_party/pkg_tested/",
       "third_party/requirejs/",
@@ -2404,6 +2408,11 @@
           "arguments": ["--fatal-warnings", "pkg/compiler"]
         },
         {
+          "name": "analyze pkg/dartdev",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": ["--fatal-warnings", "pkg/dartdev"]
+        },
+        {
           "name": "analyze pkg/dart2js_tools",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": ["--fatal-warnings", "pkg/dart2js_tools"]
diff --git a/utils/kernel-service/BUILD.gn b/utils/kernel-service/BUILD.gn
index 4e21d0d..e25fb85 100644
--- a/utils/kernel-service/BUILD.gn
+++ b/utils/kernel-service/BUILD.gn
@@ -6,6 +6,7 @@
 import("../../runtime/runtime_args.gni")
 import("../../sdk_args.gni")
 import("../application_snapshot.gni")
+import("../create_timestamp.gni")
 
 group("kernel-service") {
   if (create_kernel_service_snapshot) {
@@ -47,9 +48,21 @@
   ]
 }
 
+create_timestamp_file("frontend_server_files_stamp") {
+  path = rebase_path("../../pkg/frontend_server/lib")
+  output = "$target_gen_dir/frontend_server_files.stamp"
+}
+
+create_timestamp_file("ddc_files_stamp") {
+  path = rebase_path("../../pkg/dev_compiler/lib")
+  output = "$target_gen_dir/ddc_files.stamp"
+}
+
 application_snapshot("frontend_server") {
   main_dart = "../../pkg/frontend_server/bin/frontend_server_starter.dart"
   deps = [
+    ":ddc_files_stamp",
+    ":frontend_server_files_stamp",
     "../../runtime/vm:kernel_platform_files($host_toolchain)",
   ]
   sdk_root = rebase_path("$root_out_dir")