diff --git a/CHANGELOG.md b/CHANGELOG.md
index c1377e8..dbc15dc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,12 @@
 
 ### Core libraries
 
+#### `dart:async`
+
+* The uncaught error handlers of `Zone`s are now run in the parent zone
+  of the zone where they were declared. This prevents a throwing handler
+  from causing an infinite loop by repeatedly triggering itself.
+
 #### `dart:core`
 
 *   The native `DateTime` class now better handles local time around
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index f75600c..b1cb812 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -4386,6 +4386,15 @@
     tip: r"""Try removing the 'const' modifier.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeFunctionAsTypeParameter = messageFunctionAsTypeParameter;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageFunctionAsTypeParameter = const MessageCode(
+    "FunctionAsTypeParameter",
+    message:
+        r"""'Function' is a built-in identifier, could not used as a type identifier.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFunctionTypeDefaultValue = messageFunctionTypeDefaultValue;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4407,6 +4416,30 @@
     tip: r"""Try replacing the keyword with a return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(String name)> templateFunctionUsedAsDec = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""'Function' is a built-in identifier, could not used as a #name name.""",
+    withArguments: _withArgumentsFunctionUsedAsDec);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeFunctionUsedAsDec =
+    const Code<Message Function(String name)>(
+  "FunctionUsedAsDec",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsFunctionUsedAsDec(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeFunctionUsedAsDec,
+      message:
+          """'Function' is a built-in identifier, could not used as a ${name} name.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeGeneratorReturnsValue = messageGeneratorReturnsValue;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 221f315..b167dc0 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,10 +1,10 @@
 name: _fe_analyzer_shared
-version: 20.0.0
+version: 21.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
 environment:
-  sdk: '>=2.12.0-0 <3.0.0'
+  sdk: '>=2.12.0 <3.0.0'
 dependencies:
   meta: ^1.0.2
 dev_dependencies:
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/type_parameter.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/type_parameter.dart
index c818df6..5b091df 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/type_parameter.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/type_parameter.dart
@@ -12,7 +12,7 @@
   void promoteNullable(T? t) {
     T? s;
     if (t is int) {
-      s = /*analyzer.T? & int*/ /*cfe.T & int*/ t;
+      s = /*T & int*/ t;
     }
   }
 
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
index 3421716..d7c28eb 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
@@ -446,7 +446,7 @@
   int? bad;
 }
 
-test(C33 c) {
+explicitExtensionInvocation(C33 c) {
   if (c.bad == null) return;
   E33(c.
           /*notPromoted(propertyNotPromoted(target: member:C33.bad, type: int?))*/ bad)
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 046c9c0..03f9e6a 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -38,7 +38,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('isAnalyzing');
       try {
@@ -105,7 +105,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -197,7 +197,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('file');
       try {
@@ -313,7 +313,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('libId');
       try {
@@ -492,7 +492,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('port');
       try {
@@ -590,7 +590,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -782,7 +782,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -973,7 +973,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('name');
       try {
@@ -1090,7 +1090,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('element');
       try {
@@ -1218,7 +1218,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('packageName');
       try {
@@ -1328,7 +1328,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -1419,7 +1419,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -1504,7 +1504,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -1602,7 +1602,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('insertTextFormat');
       try {
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 48503cb..b88f7cc 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -54,7 +54,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('annotationId');
       try {
@@ -165,7 +165,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('label');
       try {
@@ -263,7 +263,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('applied');
       try {
@@ -358,7 +358,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -425,7 +425,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('from');
       try {
@@ -545,7 +545,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('item');
       try {
@@ -701,7 +701,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('name');
       try {
@@ -873,7 +873,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -940,7 +940,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('to');
       try {
@@ -1060,7 +1060,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('item');
       try {
@@ -1175,7 +1175,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -1300,7 +1300,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -1393,7 +1393,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('id');
       try {
@@ -1480,7 +1480,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('label');
       try {
@@ -1617,7 +1617,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workspace');
       try {
@@ -1777,7 +1777,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -1919,7 +1919,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('regularExpressions');
       try {
@@ -2021,7 +2021,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -2231,7 +2231,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('applyEdit');
       try {
@@ -2529,7 +2529,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('title');
       try {
@@ -2748,7 +2748,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -2889,7 +2889,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -2965,7 +2965,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('codeActionKind');
       try {
@@ -3037,7 +3037,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('properties');
       try {
@@ -3129,7 +3129,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('diagnostics');
       try {
@@ -3214,7 +3214,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('reason');
       try {
@@ -3381,7 +3381,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('codeActionKinds');
       try {
@@ -3515,7 +3515,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -3686,7 +3686,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -3793,7 +3793,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('href');
       try {
@@ -3880,7 +3880,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -3961,7 +3961,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -4030,7 +4030,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('resolveProvider');
       try {
@@ -4134,7 +4134,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -4247,7 +4247,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -4347,7 +4347,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('refreshSupport');
       try {
@@ -4424,7 +4424,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('red');
       try {
@@ -4551,7 +4551,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -4662,7 +4662,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('label');
       try {
@@ -4802,7 +4802,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -4944,7 +4944,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('title');
       try {
@@ -5079,7 +5079,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -5286,7 +5286,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('snippetSupport');
       try {
@@ -5463,7 +5463,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -5531,7 +5531,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -5605,7 +5605,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('properties');
       try {
@@ -5679,7 +5679,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -5760,7 +5760,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('triggerKind');
       try {
@@ -6071,7 +6071,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('label');
       try {
@@ -6420,7 +6420,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('isIncomplete');
       try {
@@ -6563,7 +6563,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('triggerCharacters');
       try {
@@ -6719,7 +6719,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('context');
       try {
@@ -6906,7 +6906,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -7074,7 +7074,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('scopeUri');
       try {
@@ -7142,7 +7142,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('items');
       try {
@@ -7243,7 +7243,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -7361,7 +7361,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('overwrite');
       try {
@@ -7435,7 +7435,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('files');
       try {
@@ -7516,7 +7516,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -7590,7 +7590,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -7693,7 +7693,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -7830,7 +7830,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -7931,7 +7931,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -8005,7 +8005,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -8107,7 +8107,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -8229,7 +8229,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -8339,7 +8339,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -8457,7 +8457,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('recursive');
       try {
@@ -8532,7 +8532,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('files');
       try {
@@ -8692,7 +8692,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -8868,7 +8868,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('location');
       try {
@@ -9023,7 +9023,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -9083,7 +9083,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       return true;
     } else {
@@ -9167,7 +9167,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -9275,7 +9275,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -9338,7 +9338,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('changes');
       try {
@@ -9413,7 +9413,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('watchers');
       try {
@@ -9484,7 +9484,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('event');
       try {
@@ -9549,7 +9549,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -9614,7 +9614,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -9687,7 +9687,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -9766,7 +9766,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -9828,7 +9828,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -9920,7 +9920,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -10039,7 +10039,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -10156,7 +10156,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('language');
       try {
@@ -10240,7 +10240,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -10304,7 +10304,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -10384,7 +10384,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -10499,7 +10499,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -10590,7 +10590,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -10670,7 +10670,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -10766,7 +10766,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -10869,7 +10869,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -10997,7 +10997,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -11107,7 +11107,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -11210,7 +11210,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -11291,7 +11291,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('resolveProvider');
       try {
@@ -11396,7 +11396,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -11513,7 +11513,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -11608,7 +11608,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -11685,7 +11685,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('firstTriggerCharacter');
       try {
@@ -11791,7 +11791,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('ch');
       try {
@@ -11945,7 +11945,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -12051,7 +12051,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -12117,7 +12117,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -12208,7 +12208,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -12342,7 +12342,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -12498,7 +12498,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('name');
       try {
@@ -12726,7 +12726,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -12850,7 +12850,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -12918,7 +12918,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -13001,7 +13001,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('label');
       try {
@@ -13105,7 +13105,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -13224,7 +13224,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -13370,7 +13370,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -13438,7 +13438,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('commands');
       try {
@@ -13541,7 +13541,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('command');
       try {
@@ -13645,7 +13645,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('commands');
       try {
@@ -13805,7 +13805,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -13871,7 +13871,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -13941,7 +13941,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -14033,7 +14033,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('scheme');
       try {
@@ -14141,7 +14141,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('glob');
       try {
@@ -14266,7 +14266,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('ignoreCase');
       try {
@@ -14329,7 +14329,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('filters');
       try {
@@ -14405,7 +14405,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('oldUri');
       try {
@@ -14507,7 +14507,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('globPattern');
       try {
@@ -14631,7 +14631,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('startLine');
       try {
@@ -14777,7 +14777,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -14894,7 +14894,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -14986,7 +14986,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -15105,7 +15105,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -15234,7 +15234,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('tabSize');
       try {
@@ -15367,7 +15367,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('contents');
       try {
@@ -15459,7 +15459,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -15537,7 +15537,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -15617,7 +15617,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -15725,7 +15725,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -15818,7 +15818,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -15892,7 +15892,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -15995,7 +15995,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -16133,7 +16133,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -16332,7 +16332,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('processId');
       try {
@@ -16513,7 +16513,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('name');
       try {
@@ -16598,7 +16598,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('capabilities');
       try {
@@ -16683,7 +16683,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('name');
       try {
@@ -16752,7 +16752,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       return true;
     } else {
@@ -16812,7 +16812,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('newText');
       try {
@@ -16999,7 +16999,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -17063,7 +17063,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -17144,7 +17144,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -17270,7 +17270,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -17374,7 +17374,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('ranges');
       try {
@@ -17454,7 +17454,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -17571,7 +17571,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('originSelectionRange');
       try {
@@ -17691,7 +17691,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('type');
       try {
@@ -17781,7 +17781,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('message');
       try {
@@ -17864,7 +17864,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('parser');
       try {
@@ -17965,7 +17965,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -18091,7 +18091,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('jsonrpc');
       try {
@@ -18155,7 +18155,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('title');
       try {
@@ -18549,7 +18549,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('scheme');
       try {
@@ -18669,7 +18669,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -18763,7 +18763,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -18865,7 +18865,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -18986,7 +18986,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -19077,7 +19077,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('method');
       try {
@@ -19180,7 +19180,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('version');
       try {
@@ -19287,7 +19287,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('label');
       try {
@@ -19442,7 +19442,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('partialResultToken');
       try {
@@ -19511,7 +19511,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('line');
       try {
@@ -19598,7 +19598,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -19718,7 +19718,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('token');
       try {
@@ -19836,7 +19836,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('relatedInformation');
       try {
@@ -19949,7 +19949,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -20038,7 +20038,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -20141,7 +20141,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('start');
       try {
@@ -20225,7 +20225,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -20312,7 +20312,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -20370,7 +20370,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('includeDeclaration');
       try {
@@ -20438,7 +20438,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -20546,7 +20546,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('context');
       try {
@@ -20687,7 +20687,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -20780,7 +20780,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('id');
       try {
@@ -20869,7 +20869,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('registrations');
       try {
@@ -20949,7 +20949,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('engine');
       try {
@@ -21071,7 +21071,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -21209,7 +21209,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -21346,7 +21346,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('overwrite');
       try {
@@ -21421,7 +21421,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('files');
       try {
@@ -21500,7 +21500,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('prepareProvider');
       try {
@@ -21603,7 +21603,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('newName');
       try {
@@ -21740,7 +21740,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -21854,7 +21854,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('id');
       try {
@@ -22009,7 +22009,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('code');
       try {
@@ -22131,7 +22131,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('id');
       try {
@@ -22227,7 +22227,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('includeText');
       try {
@@ -22292,7 +22292,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -22374,7 +22374,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -22436,7 +22436,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -22538,7 +22538,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -22679,7 +22679,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -22836,12 +22836,12 @@
   SemanticTokens({this.resultId, required this.data});
   static SemanticTokens fromJson(Map<String, dynamic> json) {
     final resultId = json['resultId'];
-    final data = json['data']?.map((item) => item)?.cast<num>()?.toList();
+    final data = json['data']?.map((item) => item)?.cast<int>()?.toList();
     return SemanticTokens(resultId: resultId, data: data);
   }
 
   /// The actual tokens.
-  final List<num> data;
+  final List<int> data;
 
   /// An optional result id. If provided and clients support delta updating the
   /// client will include the result id in the next semantic token request. A
@@ -22858,7 +22858,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('resultId');
       try {
@@ -22880,8 +22880,8 @@
           return false;
         }
         if (!((obj['data'] is List &&
-            (obj['data'].every((item) => item is num))))) {
-          reporter.reportError('must be of type List<num>');
+            (obj['data'].every((item) => item is int))))) {
+          reporter.reportError('must be of type List<int>');
           return false;
         }
       } finally {
@@ -22898,7 +22898,7 @@
   bool operator ==(Object other) {
     if (other is SemanticTokens && other.runtimeType == SemanticTokens) {
       return resultId == other.resultId &&
-          listEqual(data, other.data, (num a, num b) => a == b) &&
+          listEqual(data, other.data, (int a, int b) => a == b) &&
           true;
     }
     return false;
@@ -23002,7 +23002,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -23175,7 +23175,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('delta');
       try {
@@ -23229,7 +23229,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       return true;
     } else {
@@ -23309,7 +23309,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -23393,7 +23393,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('resultId');
       try {
@@ -23515,7 +23515,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -23629,7 +23629,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('edits');
       try {
@@ -23712,7 +23712,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('start');
       try {
@@ -23819,7 +23819,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('tokenTypes');
       try {
@@ -23952,7 +23952,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('legend');
       try {
@@ -24060,7 +24060,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('delta');
       try {
@@ -24111,7 +24111,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       return true;
     } else {
@@ -24192,7 +24192,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -24284,7 +24284,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('data');
       try {
@@ -24391,7 +24391,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -24573,7 +24573,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -24720,7 +24720,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('refreshSupport');
       try {
@@ -25328,7 +25328,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocumentSync');
       try {
@@ -25863,7 +25863,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('didCreate');
       try {
@@ -26011,7 +26011,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workspaceFolders');
       try {
@@ -26088,7 +26088,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('value');
       try {
@@ -26157,7 +26157,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('support');
       try {
@@ -26257,7 +26257,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -26359,7 +26359,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('success');
       try {
@@ -26429,7 +26429,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('type');
       try {
@@ -26521,7 +26521,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('messageActionItem');
       try {
@@ -26590,7 +26590,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('additionalPropertiesSupport');
       try {
@@ -26668,7 +26668,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('type');
       try {
@@ -26805,7 +26805,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('signatures');
       try {
@@ -26929,7 +26929,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -27022,7 +27022,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('labelOffsetSupport');
       try {
@@ -27118,7 +27118,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentationFormat');
       try {
@@ -27250,7 +27250,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('triggerKind');
       try {
@@ -27393,7 +27393,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('triggerCharacters');
       try {
@@ -27520,7 +27520,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('context');
       try {
@@ -27676,7 +27676,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -27865,7 +27865,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('label');
       try {
@@ -28004,7 +28004,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('id');
       try {
@@ -28122,7 +28122,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('name');
       try {
@@ -28353,7 +28353,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('syncKind');
       try {
@@ -28738,7 +28738,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('synchronization');
       try {
@@ -29152,7 +29152,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -29249,7 +29249,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('text');
       try {
@@ -29334,7 +29334,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -29438,7 +29438,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -29524,7 +29524,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -29698,7 +29698,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -29874,7 +29874,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -29989,7 +29989,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('includeText');
       try {
@@ -30102,7 +30102,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -30285,7 +30285,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('openClose');
       try {
@@ -30403,7 +30403,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('range');
       try {
@@ -30523,7 +30523,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -30597,7 +30597,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -30700,7 +30700,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -30838,7 +30838,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentSelector');
       try {
@@ -30971,7 +30971,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('id');
       try {
@@ -31059,7 +31059,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('unregisterations');
       try {
@@ -31138,7 +31138,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('version');
       try {
@@ -31259,7 +31259,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('textDocument');
       try {
@@ -31396,7 +31396,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -31519,7 +31519,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('token');
       try {
@@ -31589,7 +31589,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('token');
       try {
@@ -31665,7 +31665,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -31816,7 +31816,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -31975,7 +31975,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneToken');
       try {
@@ -32076,7 +32076,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('kind');
       try {
@@ -32241,7 +32241,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('changes');
       try {
@@ -32407,7 +32407,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('documentChanges');
       try {
@@ -32527,7 +32527,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('groupsOnLabel');
       try {
@@ -32592,7 +32592,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('uri');
       try {
@@ -32687,7 +32687,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('added');
       try {
@@ -32802,7 +32802,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('supported');
       try {
@@ -32904,7 +32904,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('dynamicRegistration');
       try {
@@ -33003,7 +33003,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -33071,7 +33071,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('valueSet');
       try {
@@ -33146,7 +33146,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
@@ -33238,7 +33238,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('query');
       try {
@@ -33335,7 +33335,7 @@
     return __result;
   }
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
       reporter.push('workDoneProgress');
       try {
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
index 9ee8f63..9d6fe11 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
@@ -266,9 +266,9 @@
 /// A helper to allow handlers to declare both a JSON validation function and
 /// parse function.
 class LspJsonHandler<T> {
-  final bool Function(Map<String, Object>, LspJsonReporter reporter)
+  final bool Function(Map<String, Object?>?, LspJsonReporter reporter)
       validateParams;
-  final T Function(Map<String, Object>) convertParams;
+  final T Function(Map<String, Object?>) convertParams;
 
   const LspJsonHandler(this.validateParams, this.convertParams);
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 796e555..09a9fbe 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -74,7 +74,7 @@
   final DartSdkManager sdkManager;
 
   /// The [SearchEngine] for this server.
-  late SearchEngine searchEngine;
+  late final SearchEngine searchEngine;
 
   late ByteStore byteStore;
 
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 2468770..4c5becb 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -72,9 +72,6 @@
 /// Instances of the class [EditDomainHandler] implement a [RequestHandler]
 /// that handles requests in the edit domain.
 class EditDomainHandler extends AbstractRequestHandler {
-  /// The [SearchEngine] for this server.
-  SearchEngine? searchEngine;
-
   /// The workspace for rename refactorings.
   RefactoringWorkspace? refactoringWorkspace;
 
@@ -84,9 +81,8 @@
   /// Initialize a newly created handler to handle requests for the given
   /// [server].
   EditDomainHandler(AnalysisServer server) : super(server) {
-    var search = searchEngine = server.searchEngine;
     refactoringWorkspace =
-        RefactoringWorkspace(server.driverMap.values, search);
+        RefactoringWorkspace(server.driverMap.values, server.searchEngine);
     _newRefactoringManager();
   }
 
@@ -815,10 +811,6 @@
   }
 
   Response _getAvailableRefactorings(Request request) {
-    if (searchEngine == null) {
-      var result = EditGetAvailableRefactoringsResult([]);
-      return result.toResponse(request.id);
-    }
     _getAvailableRefactoringsImpl(request);
     return Response.DELAYED_RESPONSE;
   }
@@ -836,7 +828,7 @@
     // add refactoring kinds
     var kinds = <RefactoringKind>[];
     // Check nodes.
-    final searchEngine = this.searchEngine;
+    final searchEngine = server.searchEngine;
     {
       var resolvedUnit = await server.getResolvedUnit(file);
       if (resolvedUnit != null) {
@@ -845,19 +837,15 @@
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE);
         }
-        if (searchEngine != null) {
-          // Try EXTRACT_METHOD.
-          if (ExtractMethodRefactoring(
-                  searchEngine, resolvedUnit, offset, length)
-              .isAvailable()) {
-            kinds.add(RefactoringKind.EXTRACT_METHOD);
-          }
-          // Try EXTRACT_WIDGETS.
-          if (ExtractWidgetRefactoring(
-                  searchEngine, resolvedUnit, offset, length)
-              .isAvailable()) {
-            kinds.add(RefactoringKind.EXTRACT_WIDGET);
-          }
+        // Try EXTRACT_METHOD.
+        if (ExtractMethodRefactoring(searchEngine, resolvedUnit, offset, length)
+            .isAvailable()) {
+          kinds.add(RefactoringKind.EXTRACT_METHOD);
+        }
+        // Try EXTRACT_WIDGETS.
+        if (ExtractWidgetRefactoring(searchEngine, resolvedUnit, offset, length)
+            .isAvailable()) {
+          kinds.add(RefactoringKind.EXTRACT_WIDGET);
         }
       }
     }
@@ -869,7 +857,7 @@
         var element = server.getElementOfNode(node);
         if (element != null) {
           // try CONVERT_METHOD_TO_GETTER
-          if (element is ExecutableElement && searchEngine != null) {
+          if (element is ExecutableElement) {
             Refactoring refactoring = ConvertMethodToGetterRefactoring(
                 searchEngine, resolvedUnit.session, element);
             var status = await refactoring.checkInitialConditions();
diff --git a/pkg/analysis_server/lib/src/lsp/client_configuration.dart b/pkg/analysis_server/lib/src/lsp/client_configuration.dart
index 26ad2d0..332330f 100644
--- a/pkg/analysis_server/lib/src/lsp/client_configuration.dart
+++ b/pkg/analysis_server/lib/src/lsp/client_configuration.dart
@@ -22,7 +22,7 @@
 
   bool get completeFunctionCalls => _settings['completeFunctionCalls'] ?? false;
   bool get enableSdkFormatter => _settings['enableSdkFormatter'] ?? true;
-  int get lineLength => _settings['lineLength'];
+  int? get lineLength => _settings['lineLength'];
 
   /// A preview flag for enabling commit characters for completions.
   ///
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
index fff5d0c..99357b7 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
@@ -45,10 +45,10 @@
 
     String kind = arguments[0];
     String path = arguments[1];
-    int docVersion = arguments[2];
+    int? docVersion = arguments[2];
     int offset = arguments[3];
     int length = arguments[4];
-    Map<String, dynamic> options = arguments[5];
+    Map<String, dynamic>? options = arguments[5];
 
     final result = await requireResolvedUnit(path);
     return result.mapResult((result) async {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
index c74cdb2..5bbfefc 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
@@ -178,8 +178,8 @@
   /// If multiple actions have the same position, one will arbitrarily be chosen.
   List<CodeAction> _dedupeActions(Iterable<CodeAction> actions, Position pos) {
     final groups = groupBy(actions, (CodeAction action) => action.title);
-    return groups.keys.map((title) {
-      final actions = groups[title]!;
+    return groups.entries.map((entry) {
+      final actions = entry.value;
 
       // If there's only one in the group, just return it.
       if (actions.length == 1) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index 751fdca..634324a 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -150,8 +150,8 @@
 
           final key =
               _createImportedSymbolKey(elementName, declaringLibraryUri);
-          alreadyImportedSymbols.putIfAbsent(key, () => <String>{});
-          alreadyImportedSymbols[key]!
+          alreadyImportedSymbols
+              .putIfAbsent(key, () => <String>{})
               .add('${importedLibrary.librarySource.uri}');
         }
       }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
index a5850a5..ca28963 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
@@ -9,7 +9,7 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
-class ExitMessageHandler extends MessageHandler<void, void> {
+class ExitMessageHandler extends MessageHandler<Null, Null> {
   final bool clientDidCallShutdown;
 
   ExitMessageHandler(
@@ -21,10 +21,10 @@
   Method get handlesMessage => Method.exit;
 
   @override
-  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
+  LspJsonHandler<Null> get jsonHandler => NullJsonHandler;
 
   @override
-  Future<ErrorOr<void>> handle(void _, CancellationToken token) async {
+  Future<ErrorOr<Null>> handle(Null _, CancellationToken token) async {
     // Set a flag that the server shutdown is being controlled here to ensure
     // that the normal code that shuts down the server when the channel closes
     // does not fire.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
index dbcefeb..6e82230 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
@@ -9,7 +9,7 @@
 
 /// A [MessageHandler] that rejects specific tpyes of messages with a given
 /// error code/message.
-class RejectMessageHandler extends MessageHandler<Object?, void> {
+class RejectMessageHandler extends MessageHandler<Object?, Null> {
   @override
   final Method handlesMessage;
   final ErrorCodes errorCode;
@@ -19,10 +19,10 @@
       : super(server);
 
   @override
-  LspJsonHandler<Object?> get jsonHandler => NullJsonHandler;
+  LspJsonHandler<Null> get jsonHandler => NullJsonHandler;
 
   @override
-  ErrorOr<void> handle(void _, CancellationToken token) {
+  ErrorOr<Null> handle(Object? _, CancellationToken token) {
     return error(errorCode, errorMessage, null);
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
index b226c29..df1ff6c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
@@ -8,16 +8,16 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
-class ShutdownMessageHandler extends MessageHandler<void, void> {
+class ShutdownMessageHandler extends MessageHandler<Null, Null> {
   ShutdownMessageHandler(LspAnalysisServer server) : super(server);
   @override
   Method get handlesMessage => Method.shutdown;
 
   @override
-  LspJsonHandler<void> get jsonHandler => NullJsonHandler;
+  LspJsonHandler<Null> get jsonHandler => NullJsonHandler;
 
   @override
-  ErrorOr<void> handle(void _, CancellationToken token) {
+  ErrorOr<Null> handle(void _, CancellationToken token) {
     // Move to the Shutting Down state so we won't process any more
     // requests and the Exit notification will know it was a clean shutdown.
     server.messageHandler = ShuttingDownStateMessageHandler(server);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index 6e31bf2..89db7cc 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -144,7 +144,9 @@
       );
     }
 
-    final params = jsonHandler.convertParams(message.params);
+    final params = message.params != null
+        ? jsonHandler.convertParams(message.params)
+        : null as P;
     return handle(params, token);
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/notification_manager.dart b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
index dc45460..6afaeec 100644
--- a/pkg/analysis_server/lib/src/lsp/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
@@ -30,7 +30,8 @@
       String filePath, List<protocol.AnalysisError> errors) {
     final diagnostics = errors
         .map((error) => pluginToDiagnostic(
-              // We should never errors for a file we can't get a LineInfo for
+              // We should never return errors for a file we can't get a
+              // LineInfo for
               (path) => server.getLineInfo(path)!,
               error,
               supportedTags: server.clientCapabilities?.diagnosticTags,
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
index f2e88e1..170ff22 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
@@ -109,42 +109,60 @@
   /// Splits overlapping/nested tokens into descrete ranges for the "top-most"
   /// token.
   ///
-  /// Tokens must be pre-sorted by offset, with tokens having the same offset sorted
-  /// with the longest first.
+  /// Tokens must be pre-sorted by offset, with tokens having the same offset
+  /// sorted with the longest first.
   Iterable<SemanticTokenInfo> splitOverlappingTokens(
       Iterable<SemanticTokenInfo> sortedTokens) sync* {
     if (sortedTokens.isEmpty) {
       return;
     }
 
-    final firstToken = sortedTokens.first;
-    final stack = ListQueue<SemanticTokenInfo>()..add(firstToken);
-    var pos = firstToken.offset;
+    final stack = ListQueue<SemanticTokenInfo>();
 
-    for (final current in sortedTokens.skip(1)) {
-      final last = stack.last;
-      final newPos = current.offset;
-      if (newPos - pos > 0) {
-        // The previous region ends at either its original end or
-        // the position of this next region, whichever is shorter.
-        final end = math.min(last.offset + last.length, newPos);
-        final length = end - pos;
-        yield SemanticTokenInfo(pos, length, last.type, last.modifiers);
-        pos = newPos;
+    /// Yields tokens for anything on the stack from between [fromOffset]
+    /// and [toOffset].
+    Iterable<SemanticTokenInfo> processStack(
+        int fromOffset, int toOffset) sync* {
+      // Process each item on the stack to figure out if we need to send
+      // a token for it, and pop it off the stack if we've passed the end of it.
+      while (stack.isNotEmpty) {
+        final last = stack.last;
+        final lastEnd = last.offset + last.length;
+        final end = math.min(lastEnd, toOffset);
+        final length = end - fromOffset;
+        if (length > 0) {
+          yield SemanticTokenInfo(
+              fromOffset, length, last.type, last.modifiers);
+          fromOffset = end;
+        }
+
+        // If this token is completely done with, remove it and continue
+        // through the stack. Otherwise, if this token remains then we're done
+        // for now.
+        if (lastEnd <= toOffset) {
+          stack.removeLast();
+        } else {
+          return;
+        }
       }
+    }
 
+    var lastPos = sortedTokens.first.offset;
+    for (final current in sortedTokens) {
+      // Before processing each token, process the stack as there may be tokens
+      // on it that need filling in the gap up until this point.
+      yield* processStack(lastPos, current.offset);
+
+      // Add this token to the stack but don't process it, it will be done by
+      // the next iteration processing the stack since we don't know where this
+      // one should end until we see the start of the next one.
       stack.addLast(current);
+      lastPos = current.offset;
     }
 
     // Process any remaining stack after the last region.
-    while (stack.isNotEmpty) {
-      final last = stack.removeLast();
-      final newPos = last.offset + last.length;
-      final length = newPos - pos;
-      if (length > 0) {
-        yield SemanticTokenInfo(pos, length, last.type, last.modifiers);
-        pos = newPos;
-      }
+    if (stack.isNotEmpty) {
+      yield* processStack(lastPos, stack.first.offset + stack.first.length);
     }
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/source_edits.dart b/pkg/analysis_server/lib/src/lsp/source_edits.dart
index cb8fe6f..39c3cf2 100644
--- a/pkg/analysis_server/lib/src/lsp/source_edits.dart
+++ b/pkg/analysis_server/lib/src/lsp/source_edits.dart
@@ -79,7 +79,7 @@
 
 ErrorOr<List<TextEdit>?> generateEditsForFormatting(
   ParsedUnitResult result,
-  int lineLength, {
+  int? lineLength, {
   Range? range,
 }) {
   final unformattedSource = result.content;
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index 0ee46f1..0ae754c 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -18,23 +18,15 @@
   /// The analysis server that is using this handler to process requests.
   final AnalysisServer server;
 
-  /// The [SearchEngine] for this server.
-  final SearchEngine? searchEngine;
-
   /// The next search response id.
   int _nextSearchId = 0;
 
   /// Initialize a newly created handler to handle requests for the given
   /// [server].
-  SearchDomainHandler(this.server) : searchEngine = server.searchEngine;
+  SearchDomainHandler(this.server);
 
   Future<void> findElementReferences(protocol.Request request) async {
-    final searchEngine = this.searchEngine;
-    if (searchEngine == null) {
-      server.sendResponse(
-          Response.unsupportedFeature(request.id, 'Search has been disabled.'));
-      return;
-    }
+    final searchEngine = server.searchEngine;
     var params =
         protocol.SearchFindElementReferencesParams.fromRequest(request);
     var file = params.file;
@@ -66,12 +58,7 @@
   }
 
   Future findMemberDeclarations(protocol.Request request) async {
-    final searchEngine = this.searchEngine;
-    if (searchEngine == null) {
-      server.sendResponse(
-          Response.unsupportedFeature(request.id, 'Search has been disabled.'));
-      return;
-    }
+    final searchEngine = server.searchEngine;
     var params =
         protocol.SearchFindMemberDeclarationsParams.fromRequest(request);
     await server.onAnalysisComplete;
@@ -85,12 +72,7 @@
   }
 
   Future findMemberReferences(protocol.Request request) async {
-    final searchEngine = this.searchEngine;
-    if (searchEngine == null) {
-      server.sendResponse(
-          Response.unsupportedFeature(request.id, 'Search has been disabled.'));
-      return;
-    }
+    final searchEngine = server.searchEngine;
     var params = protocol.SearchFindMemberReferencesParams.fromRequest(request);
     await server.onAnalysisComplete;
     // respond
@@ -103,12 +85,7 @@
   }
 
   Future findTopLevelDeclarations(protocol.Request request) async {
-    final searchEngine = this.searchEngine;
-    if (searchEngine == null) {
-      server.sendResponse(
-          Response.unsupportedFeature(request.id, 'Search has been disabled.'));
-      return;
-    }
+    final searchEngine = server.searchEngine;
     var params =
         protocol.SearchFindTopLevelDeclarationsParams.fromRequest(request);
     try {
@@ -217,12 +194,7 @@
 
   /// Implement the `search.getTypeHierarchy` request.
   Future getTypeHierarchy(protocol.Request request) async {
-    final searchEngine = this.searchEngine;
-    if (searchEngine == null) {
-      server.sendResponse(
-          Response.unsupportedFeature(request.id, 'Search has been disabled.'));
-      return;
-    }
+    final searchEngine = server.searchEngine;
     var params = protocol.SearchGetTypeHierarchyParams.fromRequest(request);
     var file = params.file;
     // prepare element
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index 3f08723..12fe155 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -7,7 +7,6 @@
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 
 /// A contributor that produces suggestions based on the members of a library
 /// when the completion is in a show or hide combinator of an import or export.
@@ -22,7 +21,7 @@
     // Build the list of suggestions.
     var directive = node.thisOrAncestorOfType<NamespaceDirective>();
     if (directive is NamespaceDirective) {
-      var library = directive.uriElement as LibraryElement?;
+      var library = directive.uriElement;
       if (library != null) {
         var existingNames = _getCombinatorNames(directive);
         for (var element in library.exportNamespace.definedNames.values) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart
index 75a93be..39814eb 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart
@@ -15,6 +15,9 @@
   FixKind get fixKind => DartFixKind.REMOVE_NON_NULL_ASSERTION;
 
   @override
+  FixKind get multiFixKind => DartFixKind.REMOVE_NON_NULL_ASSERTION_MULTI;
+
+  @override
   Future<void> compute(ChangeBuilder builder) async {
     final expression = node;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 98dfce5..041bda6 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -585,6 +585,10 @@
       'dart.fix.remove.nonNullAssertion',
       DartFixKindPriority.DEFAULT,
       "Remove the '!'");
+  static const REMOVE_NON_NULL_ASSERTION_MULTI = FixKind(
+      'dart.fix.remove.nonNullAssertion.multi',
+      DartFixKindPriority.IN_FILE,
+      "Remove '!'s in file");
   static const REMOVE_OPERATOR = FixKind('dart.fix.remove.operator',
       DartFixKindPriority.DEFAULT, 'Remove the operator');
   static const REMOVE_OPERATOR_MULTI = FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 2eeadb5..3b6bbe8 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -381,8 +381,7 @@
     ],
     StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION: [
       FixInfo(
-        // todo (pq): consider adding
-        canBeAppliedToFile: false,
+        canBeAppliedToFile: true,
         canBeBulkApplied: true,
         generators: [
           RemoveNonNullAssertion.newInstance,
@@ -579,7 +578,7 @@
     LintNames.directives_ordering: [
       FixInfo(
         canBeAppliedToFile: false, // Fix will sort all directives.
-        canBeBulkApplied: false,
+        canBeBulkApplied: true,
         generators: [
           OrganizeImports.newInstance,
         ],
diff --git a/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart b/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart
index 815711f..7d7ebbe 100644
--- a/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart
+++ b/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart
@@ -65,7 +65,7 @@
     }
 
     final packagesJson = json['packages'];
-    if (packagesJson is! List<Object>) {
+    if (packagesJson is! List<Object?>) {
       return null;
     }
 
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 79bf48c..678166f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -19,8 +19,8 @@
 /// - OK if the name is valid;
 /// - WARNING if the name is discouraged;
 /// - FATAL if the name is illegal.
-RefactoringStatus validateConstructorName(String? name) {
-  if (name != null && name.isEmpty) {
+RefactoringStatus validateConstructorName(String name) {
+  if (name.isEmpty) {
     return RefactoringStatus();
   }
   return _validateLowerCamelCase(name, 'Constructor', allowBuiltIn: true);
@@ -46,8 +46,8 @@
 /// - OK if the name is valid;
 /// - WARNING if the name is discouraged;
 /// - FATAL if the name is illegal.
-RefactoringStatus validateImportPrefixName(String? name) {
-  if (name != null && name.isEmpty) {
+RefactoringStatus validateImportPrefixName(String name) {
+  if (name.isEmpty) {
     return RefactoringStatus();
   }
   return _validateLowerCamelCase(name, 'Import prefix');
@@ -65,11 +65,7 @@
 /// - OK if the name is valid;
 /// - WARNING if the name is discouraged;
 /// - FATAL if the name is illegal.
-RefactoringStatus validateLibraryName(String? name) {
-  // null
-  if (name == null) {
-    return RefactoringStatus.fatal('Library name must not be null.');
-  }
+RefactoringStatus validateLibraryName(String name) {
   // blank
   if (isBlank(name)) {
     return RefactoringStatus.fatal('Library name must not be blank.');
@@ -180,14 +176,9 @@
 }
 
 /// Validates [identifier], should be lower camel case.
-RefactoringStatus _validateLowerCamelCase(String? identifier, String desc,
+RefactoringStatus _validateLowerCamelCase(String identifier, String desc,
     {bool allowBuiltIn = false}) {
   desc += ' name';
-  // null
-  if (identifier == null) {
-    var message = '$desc must not be null.';
-    return RefactoringStatus.fatal(message);
-  }
   // is not identifier
   var status = _validateIdentifier(
       identifier, desc, 'a lowercase letter or underscore',
@@ -213,13 +204,8 @@
 }
 
 /// Validate the given identifier, which should be upper camel case.
-RefactoringStatus _validateUpperCamelCase(String? identifier, String desc) {
+RefactoringStatus _validateUpperCamelCase(String identifier, String desc) {
   desc += ' name';
-  // null
-  if (identifier == null) {
-    var message = '$desc must not be null.';
-    return RefactoringStatus.fatal(message);
-  }
   // is not identifier
   var status = _validateIdentifier(
       identifier, desc, 'an uppercase letter or underscore');
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index eaf324a..7d1ba63 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -2443,9 +2443,10 @@
         ++expectedFailCount;
         test('$testName (expected failure $expectedFailCount)', () {
           var test = CompletionTestCase();
-          return Future(() => test.runTest(spec, extraFiles)).then((_) {
-            fail('Test passed - expected to fail.');
-          }, onError: (_) {});
+          expect(
+            () => test.runTest(spec, extraFiles),
+            throwsA(anything),
+          );
         });
       } else {
         ++expectedPassCount;
diff --git a/pkg/analysis_server/test/lsp/flutter_outline_test.dart b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
index 60bb110..2059de5 100644
--- a/pkg/analysis_server/test/lsp/flutter_outline_test.dart
+++ b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -48,13 +46,13 @@
 
     expect(outlineBeforeChange, isNotNull);
     expect(outlineBeforeChange.children, hasLength(1));
-    expect(outlineBeforeChange.children[0].children[0].className,
+    expect(outlineBeforeChange.children![0].children![0].className,
         equals('Container'));
 
     expect(outlineAfterChange, isNotNull);
     expect(outlineAfterChange.children, hasLength(1));
     expect(
-        outlineAfterChange.children[0].children[0].className, equals('Icon'));
+        outlineAfterChange.children![0].children![0].className, equals('Icon'));
   }
 
   Future<void> test_initial() async {
@@ -91,7 +89,7 @@
             end: Position(line: 15, character: 0))));
     expect(outline.children, hasLength(1));
 
-    final build = outline.children[0];
+    final build = outline.children![0];
     expect(build.kind, equals('DART_ELEMENT'));
     expect(
         build.range,
@@ -103,19 +101,20 @@
         equals(Range(
             start: Position(line: 3, character: 0),
             end: Position(line: 14, character: 6))));
-    expect(build.dartElement.kind, equals('FUNCTION'));
-    expect(build.dartElement.name, equals('build'));
-    expect(build.dartElement.parameters, equals('(BuildContext context)'));
+    final dartElement = build.dartElement!;
+    expect(dartElement.kind, equals('FUNCTION'));
+    expect(dartElement.name, equals('build'));
+    expect(dartElement.parameters, equals('(BuildContext context)'));
     expect(
-        build.dartElement.range,
+        dartElement.range,
         equals(Range(
             start: Position(line: 3, character: 7),
             end: Position(line: 3, character: 12))));
-    expect(build.dartElement.returnType, equals('Widget'));
+    expect(dartElement.returnType, equals('Widget'));
     expect(build.children, hasLength(1));
 
     final icon =
-        build.children[0].children[0].children[0].children[0].children[0];
+        build.children![0].children![0].children![0].children![0].children![0];
     expect(icon.kind, equals('NEW_INSTANCE'));
     expect(icon.className, 'Icon');
     expect(
@@ -125,10 +124,11 @@
             end: Position(line: 8, character: 50))));
     expect(icon.codeRange, equals(icon.range));
     expect(icon.attributes, hasLength(1));
-    expect(icon.attributes[0].name, equals('icon'));
-    expect(icon.attributes[0].label, equals('Icons.ac_unit'));
+    final attributes = icon.attributes!;
+    expect(attributes[0].name, equals('icon'));
+    expect(attributes[0].label, equals('Icons.ac_unit'));
     expect(
-        icon.attributes[0].valueRange,
+        attributes[0].valueRange,
         equals(Range(
             start: Position(line: 8, character: 36),
             end: Position(line: 8, character: 49))));
diff --git a/pkg/analysis_server/test/lsp/folding_test.dart b/pkg/analysis_server/test/lsp/folding_test.dart
index bea190d..51b2eef 100644
--- a/pkg/analysis_server/test/lsp/folding_test.dart
+++ b/pkg/analysis_server/test/lsp/folding_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -271,7 +269,7 @@
     expect(regions, containsAll(expectedRegions));
   }
 
-  FoldingRange _toFoldingRange(Range range, FoldingRangeKind kind) {
+  FoldingRange _toFoldingRange(Range range, FoldingRangeKind? kind) {
     return FoldingRange(
       startLine: range.start.line,
       startCharacter: range.start.character,
diff --git a/pkg/analysis_server/test/lsp/format_test.dart b/pkg/analysis_server/test/lsp/format_test.dart
index ad5bb9c..f00bc9b 100644
--- a/pkg/analysis_server/test/lsp/format_test.dart
+++ b/pkg/analysis_server/test/lsp/format_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
@@ -22,7 +20,7 @@
 class FormatTest extends AbstractLspAnalysisServerTest {
   Future<List<TextEdit>> expectFormattedContents(
       Uri uri, String original, String expected) async {
-    final formatEdits = await formatDocument(uri.toString());
+    final formatEdits = (await formatDocument(uri.toString()))!;
     final formattedContents = applyTextEdits(original, formatEdits);
     expect(formattedContents, equals(expected));
     return formatEdits;
@@ -31,7 +29,7 @@
   Future<List<TextEdit>> expectRangeFormattedContents(
       Uri uri, String original, String expected) async {
     final formatEdits =
-        await formatRange(uri.toString(), rangeFromMarkers(original));
+        (await formatRange(uri.toString(), rangeFromMarkers(original)))!;
     final formattedContents =
         applyTextEdits(withoutMarkers(original), formatEdits);
     expect(formattedContents, equals(expected));
@@ -96,7 +94,7 @@
       {},
     );
 
-    Registration registration(Method method) =>
+    Registration? registration(Method method) =>
         registrationFor(registrations, method);
 
     // By default, the formatters should have been registered.
@@ -139,7 +137,7 @@
       {},
     );
 
-    Registration registration(Method method) =>
+    Registration? registration(Method method) =>
         registrationFor(registrations, method);
 
     // By default, the formatters should have been registered.
@@ -181,9 +179,8 @@
     await initialize();
     await openFile(mainFileUri, withoutMarkers(contents));
 
-    final formatEdits = await formatOnType(
-        mainFileUri.toString(), positionFromMarker(contents), '}');
-    expect(formatEdits, isNotNull);
+    final formatEdits = (await formatOnType(
+        mainFileUri.toString(), positionFromMarker(contents), '}'))!;
     final formattedContents =
         applyTextEdits(withoutMarkers(contents), formatEdits);
     expect(formattedContents, equals(expected));
diff --git a/pkg/analysis_server/test/lsp/hover_test.dart b/pkg/analysis_server/test/lsp/hover_test.dart
index 0be55c5..77bb9b5 100644
--- a/pkg/analysis_server/test/lsp/hover_test.dart
+++ b/pkg/analysis_server/test/lsp/hover_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
@@ -37,7 +35,7 @@
     await initialAnalysis;
     var hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
     expect(_getStringContents(hover), endsWith('This is shared content.'));
   }
 
@@ -89,7 +87,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
     expect(hover.contents, isNotNull);
     final markup = _getMarkupContents(hover);
     expect(markup.kind, equals(MarkupKind.Markdown));
@@ -108,7 +106,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
     expect(hover.contents, isNotNull);
     final markup = _getMarkupContents(hover);
     expect(markup.kind, equals(MarkupKind.Markdown));
@@ -151,7 +149,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
     expect(hover.contents, isNotNull);
     // Ensure we got PlainText back as the type, even though we're sending the
     // same markdown content.
@@ -172,7 +170,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
   }
 
   Future<void> test_string_noDocComment() async {
@@ -192,7 +190,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
     expect(hover.contents, isNotNull);
     expect(_getStringContents(hover), equals(expectedHoverContent));
   }
@@ -210,12 +208,14 @@
     await initialize();
     await openFile(mainFileUri, withoutMarkers(original));
     var hover = await getHover(mainFileUri, positionFromMarker(original));
-    var contents = _getStringContents(hover);
+    expect(hover, isNotNull);
+    var contents = _getStringContents(hover!);
     expect(contents, contains('Original'));
 
     await replaceFile(222, mainFileUri, withoutMarkers(updated));
     hover = await getHover(mainFileUri, positionFromMarker(updated));
-    contents = _getStringContents(hover);
+    expect(hover, isNotNull);
+    contents = _getStringContents(hover!);
     expect(contents, contains('Updated'));
   }
 
@@ -229,7 +229,7 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
     expect(hover.contents, isNotNull);
     final contents = _getStringContents(hover);
     expect(contents, contains('This is a string.'));
@@ -245,7 +245,7 @@
     await initialize();
     final hover = await getHover(mainFileUri, positionFromMarker(content));
     expect(hover, isNotNull);
-    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover!.range, equals(rangeFromMarkers(content)));
     expect(hover.contents, isNotNull);
     final markup = _getStringContents(hover);
     expect(markup, contains('This is a string.'));
diff --git a/pkg/analysis_server/test/lsp/implementation_test.dart b/pkg/analysis_server/test/lsp/implementation_test.dart
index 63cc7f8..195b46b 100644
--- a/pkg/analysis_server/test/lsp/implementation_test.dart
+++ b/pkg/analysis_server/test/lsp/implementation_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index 93ecc62..fb9fcdf 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
@@ -54,7 +52,7 @@
     final dartOptions = CompletionRegistrationOptions.fromJson(
         dartRegistration.registerOptions);
     expect(dartOptions.documentSelector, hasLength(1));
-    expect(dartOptions.documentSelector[0].language, dartLanguageId);
+    expect(dartOptions.documentSelector![0].language, dartLanguageId);
     expect(dartOptions.triggerCharacters, isNotEmpty);
 
     // Check non-Dart registration.
@@ -63,7 +61,7 @@
         r != dartRegistration);
     final nonDartOptions = CompletionRegistrationOptions.fromJson(
         nonDartRegistration.registerOptions);
-    final otherLanguages = nonDartOptions.documentSelector
+    final otherLanguages = nonDartOptions.documentSelector!
         .map((selector) => selector.language)
         .toList();
     expect(otherLanguages, isNot(contains('dart')));
@@ -91,8 +89,8 @@
     // static registrations for them.
     // https://github.com/dart-lang/sdk/issues/38490
     final initResult = InitializeResult.fromJson(initResponse.result);
-    expect(initResult.serverInfo.name, 'Dart SDK LSP Analysis Server');
-    expect(initResult.serverInfo.version, isNotNull);
+    expect(initResult.serverInfo!.name, 'Dart SDK LSP Analysis Server');
+    expect(initResult.serverInfo!.version, isNotNull);
     expect(initResult.capabilities, isNotNull);
     expect(initResult.capabilities.textDocumentSync, isNull);
 
@@ -113,16 +111,17 @@
     // The hover capability should only specific Dart.
     expect(hover, isNotNull);
     expect(hover.documentSelector, hasLength(1));
-    expect(hover.documentSelector.single.language, equals('dart'));
+    expect(hover.documentSelector!.single.language, equals('dart'));
 
     // didChange should also include pubspec + analysis_options.
     expect(change, isNotNull);
     expect(change.documentSelector, hasLength(greaterThanOrEqualTo(3)));
-    expect(change.documentSelector.any((ds) => ds.language == 'dart'), isTrue);
-    expect(change.documentSelector.any((ds) => ds.pattern == '**/pubspec.yaml'),
+    expect(change.documentSelector!.any((ds) => ds.language == 'dart'), isTrue);
+    expect(
+        change.documentSelector!.any((ds) => ds.pattern == '**/pubspec.yaml'),
         isTrue);
     expect(
-        change.documentSelector
+        change.documentSelector!
             .any((ds) => ds.pattern == '**/analysis_options.yaml'),
         isTrue);
 
@@ -149,7 +148,7 @@
     // When dynamic registration is not supported, we will always statically
     // request text document open/close and incremental updates.
     expect(initResult.capabilities.textDocumentSync, isNotNull);
-    initResult.capabilities.textDocumentSync.map(
+    initResult.capabilities.textDocumentSync!.map(
       (options) {
         expect(options.openClose, isTrue);
         expect(options.change, equals(TextDocumentSyncKind.Incremental));
@@ -169,7 +168,7 @@
     expect(initResult.capabilities.codeActionProvider, isNotNull);
     expect(initResult.capabilities.renameProvider, isNotNull);
     expect(initResult.capabilities.foldingRangeProvider, isNotNull);
-    expect(initResult.capabilities.workspace.fileOperations.willRename,
+    expect(initResult.capabilities.workspace!.fileOperations!.willRename,
         equals(ServerCapabilitiesComputer.fileOperationRegistrationOptions));
     expect(initResult.capabilities.semanticTokensProvider, isNotNull);
 
@@ -226,7 +225,7 @@
     expect(initResult.capabilities.codeActionProvider, isNull);
     expect(initResult.capabilities.renameProvider, isNull);
     expect(initResult.capabilities.foldingRangeProvider, isNull);
-    expect(initResult.capabilities.workspace.fileOperations, isNull);
+    expect(initResult.capabilities.workspace!.fileOperations, isNull);
     expect(initResult.capabilities.semanticTokensProvider, isNull);
 
     // Ensure all expected dynamic registrations.
@@ -465,7 +464,7 @@
     expect(result.capabilities, isNotNull);
     // Check some basic capabilities that are unlikely to change.
     expect(result.capabilities.textDocumentSync, isNotNull);
-    result.capabilities.textDocumentSync.map(
+    result.capabilities.textDocumentSync!.map(
       (options) {
         // We'll always request open/closed notifications and incremental updates.
         expect(options.openClose, isTrue);
@@ -487,7 +486,7 @@
     final response = await sendRequestToServer(request);
     expect(response.id, equals(request.id));
     expect(response.error, isNotNull);
-    expect(response.error.code, equals(ErrorCodes.InvalidParams));
+    expect(response.error!.code, equals(ErrorCodes.InvalidParams));
     expect(response.result, isNull);
   }
 
@@ -497,8 +496,8 @@
     expect(response, isNotNull);
     expect(response.result, isNull);
     expect(response.error, isNotNull);
-    expect(
-        response.error.code, equals(ServerErrorCodes.ServerAlreadyInitialized));
+    expect(response.error!.code,
+        equals(ServerErrorCodes.ServerAlreadyInitialized));
   }
 
   Future<void> test_initialize_rootPath() async {
@@ -643,7 +642,9 @@
 
     // Wait up to 1sec to ensure no error/log notifications were sent back.
     var didTimeout = false;
-    final notificationFromServer = await nextNotification.timeout(
+    final notificationFromServer = await nextNotification
+        .then<NotificationMessage?>((notification) => notification)
+        .timeout(
       const Duration(seconds: 1),
       onTimeout: () {
         didTimeout = true;
@@ -661,6 +662,6 @@
     expect(response.id, equals(request.id));
     expect(response.result, isNull);
     expect(response.error, isNotNull);
-    expect(response.error.code, ErrorCodes.ServerNotInitialized);
+    expect(response.error!.code, ErrorCodes.ServerNotInitialized);
   }
 }
diff --git a/pkg/analysis_server/test/lsp/mapping_test.dart b/pkg/analysis_server/test/lsp/mapping_test.dart
index 6c89580..ce08941 100644
--- a/pkg/analysis_server/test/lsp/mapping_test.dart
+++ b/pkg/analysis_server/test/lsp/mapping_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
 import 'package:analysis_server/src/lsp/mapping.dart' as lsp;
 import 'package:analysis_server/src/protocol_server.dart' as server;
diff --git a/pkg/analysis_server/test/lsp/outline_test.dart b/pkg/analysis_server/test/lsp/outline_test.dart
index 1c04b0c..4310ec9 100644
--- a/pkg/analysis_server/test/lsp/outline_test.dart
+++ b/pkg/analysis_server/test/lsp/outline_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -33,11 +31,11 @@
 
     expect(outlineBeforeChange, isNotNull);
     expect(outlineBeforeChange.children, hasLength(1));
-    expect(outlineBeforeChange.children[0].element.name, equals('A'));
+    expect(outlineBeforeChange.children![0].element.name, equals('A'));
 
     expect(outlineAfterChange, isNotNull);
     expect(outlineAfterChange.children, hasLength(1));
-    expect(outlineAfterChange.children[0].element.name, equals('B'));
+    expect(outlineAfterChange.children![0].element.name, equals('B'));
   }
 
   Future<void> test_extensions() async {
@@ -53,8 +51,8 @@
 
     expect(outline, isNotNull);
     expect(outline.children, hasLength(2));
-    expect(outline.children[0].element.name, equals('StringExtensions'));
-    expect(outline.children[1].element.name, equals('<unnamed extension>'));
+    expect(outline.children![0].element.name, equals('StringExtensions'));
+    expect(outline.children![1].element.name, equals('<unnamed extension>'));
   }
 
   Future<void> test_initial() async {
@@ -88,7 +86,7 @@
     expect(outline.children, hasLength(1));
 
     // class A
-    final classA = outline.children[0];
+    final classA = outline.children![0];
     expect(classA.element.name, equals('A'));
     expect(classA.element.kind, equals('CLASS'));
     expect(
@@ -109,7 +107,7 @@
     expect(classA.children, hasLength(2));
 
     // b()
-    final methodB = classA.children[0];
+    final methodB = classA.children![0];
     expect(methodB.element.name, equals('b'));
     expect(methodB.element.kind, equals('METHOD'));
     expect(
@@ -130,7 +128,7 @@
     expect(methodB.children, hasLength(1));
 
     // c()
-    final methodC = methodB.children[0];
+    final methodC = methodB.children![0];
     expect(methodC.element.name, equals('c'));
     expect(methodC.element.kind, equals('FUNCTION'));
     expect(
@@ -154,7 +152,7 @@
     expect(methodC.children, isNull);
 
     // num get d
-    final fieldD = classA.children[1];
+    final fieldD = classA.children![1];
     expect(fieldD.element.name, equals('d'));
     expect(fieldD.element.kind, equals('GETTER'));
     expect(
diff --git a/pkg/analysis_server/test/lsp/priority_files_test.dart b/pkg/analysis_server/test/lsp/priority_files_test.dart
index 8d5107c..028f903 100644
--- a/pkg/analysis_server/test/lsp/priority_files_test.dart
+++ b/pkg/analysis_server/test/lsp/priority_files_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/pub_package_service_test.dart b/pkg/analysis_server/test/lsp/pub_package_service_test.dart
index f40f50a..b00f285 100644
--- a/pkg/analysis_server/test/lsp/pub_package_service_test.dart
+++ b/pkg/analysis_server/test/lsp/pub_package_service_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/pub/pub_api.dart';
 import 'package:analysis_server/src/services/pub/pub_package_service.dart';
 import 'package:analyzer/instrumentation/service.dart';
@@ -25,12 +23,10 @@
 class PubApiTest {
   static const pubDefaultUrl = 'https://pub.dartlang.org';
 
-  Uri lastCalledUrl;
-  MockHttpClient httpClient;
+  Uri? lastCalledUrl;
+  late MockHttpClient httpClient;
 
-  PubApi api;
-
-  Future<void> check_pubHostedUrl(String envValue, String expectedBase) async {
+  Future<void> check_pubHostedUrl(String? envValue, String expectedBase) async {
     final api =
         PubApi(InstrumentationService.NULL_SERVICE, httpClient, envValue);
     await api.allPackages();
@@ -303,7 +299,7 @@
     await openFile(pubspecFileUri, '');
     await pumpEventQueue();
 
-    final cache = server.pubPackageService.readDiskCache();
+    final cache = server.pubPackageService.readDiskCache()!;
     final packages = cache.packages.values.toList();
 
     expect(packages.map((p) => p.packageName), equals(['one', 'two', 'three']));
diff --git a/pkg/analysis_server/test/lsp/reanalyze_test.dart b/pkg/analysis_server/test/lsp/reanalyze_test.dart
index 150c8a0..69afce8 100644
--- a/pkg/analysis_server/test/lsp/reanalyze_test.dart
+++ b/pkg/analysis_server/test/lsp/reanalyze_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/references_test.dart b/pkg/analysis_server/test/lsp/references_test.dart
index 9af7eef..350de59 100644
--- a/pkg/analysis_server/test/lsp/references_test.dart
+++ b/pkg/analysis_server/test/lsp/references_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/rename_test.dart b/pkg/analysis_server/test/lsp/rename_test.dart
index a65a4ef..0559614 100644
--- a/pkg/analysis_server/test/lsp/rename_test.dart
+++ b/pkg/analysis_server/test/lsp/rename_test.dart
@@ -2,11 +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.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -93,8 +90,8 @@
     expect(response.id, equals(request.id));
     expect(response.result, isNull);
     expect(response.error, isNotNull);
-    expect(response.error.code, ServerErrorCodes.RenameNotValid);
-    expect(response.error.message, contains('is defined in the SDK'));
+    expect(response.error!.code, ServerErrorCodes.RenameNotValid);
+    expect(response.error!.message, contains('is defined in the SDK'));
   }
 
   Future<void> test_prepare_variable() async {
@@ -174,8 +171,9 @@
       action: UserPromptActions.renameAnyway,
     );
 
-    if (response.error != null) {
-      throw response.error;
+    final error = response.error;
+    if (error != null) {
+      throw error;
     }
 
     final result = WorkspaceEdit.fromJson(response.result);
@@ -186,7 +184,7 @@
     };
     applyDocumentChanges(
       contents,
-      result.documentChanges,
+      result.documentChanges!,
     );
     expect(contents[mainFilePath], equals(expectedContent));
   }
@@ -284,12 +282,12 @@
     await openFile(referencedFileUri, withoutMarkers(referencedContent),
         version: referencedVersion);
 
-    final result = await rename(
+    final result = (await rename(
       mainFileUri,
       mainVersion,
       positionFromMarker(mainContent),
       'MyNewClass',
-    );
+    ))!;
 
     // Ensure applying the changes will give us the expected content.
     final contents = {
@@ -302,7 +300,7 @@
     };
     applyDocumentChanges(
       contents,
-      result.documentChanges,
+      result.documentChanges!,
       expectedVersions: documentVersions,
     );
     expect(contents[mainFilePath], equals(expectedMainContent));
@@ -377,8 +375,8 @@
     expect(response.id, equals(request.id));
     expect(response.result, isNull);
     expect(response.error, isNotNull);
-    expect(response.error.code, ServerErrorCodes.RenameNotValid);
-    expect(response.error.message, contains('is defined in the SDK'));
+    expect(response.error!.code, ServerErrorCodes.RenameNotValid);
+    expect(response.error!.message, contains('is defined in the SDK'));
   }
 
   Future<void> test_rename_usingLegacyChangeInterface() async {
@@ -396,18 +394,18 @@
     await initialize();
     await openFile(mainFileUri, withoutMarkers(content), version: 222);
 
-    final result = await rename(
+    final result = (await rename(
       mainFileUri,
       222,
       positionFromMarker(content),
       'MyNewClass',
-    );
+    ))!;
 
     // Ensure applying the changes will give us the expected content.
     final contents = {
       mainFilePath: withoutMarkers(content),
     };
-    applyChanges(contents, result.changes);
+    applyChanges(contents, result.changes!);
     expect(contents[mainFilePath], equals(expectedContent));
   }
 
@@ -444,7 +442,8 @@
         sendRenameVersion: false);
   }
 
-  Future<void> _test_prepare(String content, String expectedPlaceholder) async {
+  Future<void> _test_prepare(
+      String content, String? expectedPlaceholder) async {
     await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
 
@@ -454,7 +453,7 @@
     if (expectedPlaceholder == null) {
       expect(result, isNull);
     } else {
-      expect(result.range, equals(rangeFromMarkers(content)));
+      expect(result!.range, equals(rangeFromMarkers(content)));
       expect(result.placeholder, equals(expectedPlaceholder));
     }
   }
@@ -481,7 +480,7 @@
 
     expect(result.result, isNull);
     expect(result.error, isNotNull);
-    return result.error;
+    return result.error!;
   }
 
   /// Tests a rename that is expected to cause an error, which will trigger
@@ -490,9 +489,9 @@
   Future<ResponseMessage> _test_rename_prompt(
     String content,
     String newName, {
-    @required String expectedMessage,
-    Future<void> Function() beforeResponding,
-    @required String action,
+    required String expectedMessage,
+    Future<void> Function()? beforeResponding,
+    required String action,
     int openFileVersion = 222,
     int renameRequestFileVersion = 222,
   }) async {
@@ -519,9 +518,9 @@
         expect(params.type, equals(MessageType.Warning));
         expect(params.message, equals(expectedMessage));
         expect(params.actions, hasLength(2));
-        expect(params.actions[0],
+        expect(params.actions![0],
             equals(MessageActionItem(title: UserPromptActions.renameAnyway)));
-        expect(params.actions[1],
+        expect(params.actions![1],
             equals(MessageActionItem(title: UserPromptActions.cancel)));
 
         // Allow the test to run some code before we send the response.
@@ -536,8 +535,7 @@
   Future<void> _test_rename_withDocumentChanges(
     String content,
     String newName,
-    String expectedContent, {
-    sendDocumentVersion = true,
+    String? expectedContent, {
     sendRenameVersion = true,
   }) async {
     // The specific number doesn't matter here, it's just a placeholder to confirm
@@ -548,7 +546,7 @@
           withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
     );
     await openFile(mainFileUri, withoutMarkers(content),
-        version: sendDocumentVersion ? documentVersion : null);
+        version: documentVersion);
 
     final result = await rename(
       mainFileUri,
@@ -568,7 +566,7 @@
       };
       applyDocumentChanges(
         contents,
-        result.documentChanges,
+        result!.documentChanges!,
         expectedVersions: documentVersions,
       );
       expect(contents[mainFilePath], equals(expectedContent));
diff --git a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
index b97795e..6fcc641 100644
--- a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
+++ b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/semantic_tokens/legend.dart';
@@ -273,6 +271,51 @@
     expect(decoded, equals(expected));
   }
 
+  Future<void> test_dartdoc() async {
+    final content = '''
+    /// before [aaa] after
+    class MyClass {
+      String aaa;
+    }
+      
+    /// before [bbb] after
+    int double(int bbb) => bbb * 2;
+    ''';
+
+    final expected = [
+      _Token('/// before [', SemanticTokenTypes.comment,
+          [SemanticTokenModifiers.documentation]),
+      _Token('aaa', SemanticTokenTypes.property),
+      _Token('] after', SemanticTokenTypes.comment,
+          [SemanticTokenModifiers.documentation]),
+      _Token('class', SemanticTokenTypes.keyword),
+      _Token('MyClass', SemanticTokenTypes.class_),
+      _Token('String', SemanticTokenTypes.class_),
+      _Token('aaa', SemanticTokenTypes.variable,
+          [SemanticTokenModifiers.declaration]),
+      _Token('/// before [', SemanticTokenTypes.comment,
+          [SemanticTokenModifiers.documentation]),
+      _Token('bbb', SemanticTokenTypes.parameter),
+      _Token('] after', SemanticTokenTypes.comment,
+          [SemanticTokenModifiers.documentation]),
+      _Token('int', SemanticTokenTypes.class_),
+      _Token('double', SemanticTokenTypes.function,
+          [SemanticTokenModifiers.declaration, SemanticTokenModifiers.static]),
+      _Token('int', SemanticTokenTypes.class_),
+      _Token('bbb', SemanticTokenTypes.parameter,
+          [SemanticTokenModifiers.declaration]),
+      _Token('bbb', SemanticTokenTypes.parameter),
+      _Token('2', SemanticTokenTypes.number)
+    ];
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+
+    final tokens = await getSemanticTokens(mainFileUri);
+    final decoded = decodeSemanticTokens(content, tokens);
+    expect(decoded, equals(expected));
+  }
+
   Future<void> test_directives() async {
     final content = '''
     import 'package:flutter/material.dart';
@@ -347,8 +390,8 @@
     }
     ''';
 
-    // Expect toe correct tokens for the valid code before/after but don't
-    // check the the tokens for the invalid code as thre are no concrete
+    // Expect the correct tokens for the valid code before/after but don't
+    // check the the tokens for the invalid code as there are no concrete
     // expectations for them.
     final expected1 = [
       _Token('/// class docs', SemanticTokenTypes.comment,
@@ -837,10 +880,17 @@
       o.type == type &&
       listEqual(
           // Treat nulls the same as empty lists for convenience when comparing.
-          o.modifiers ?? <SemanticTokenModifiers>[],
-          modifiers ?? <SemanticTokenModifiers>[],
+          o.modifiers,
+          modifiers,
           (SemanticTokenModifiers a, SemanticTokenModifiers b) => a == b);
 
+  /// Outputs a text representation of the token in the form of constructor
+  /// args for easy copy/pasting into tests to update expectations.
   @override
-  String toString() => '$content (${[type, ...?modifiers]})';
+  String toString() {
+    final modifiersString = modifiers.isEmpty
+        ? ''
+        : ', [${modifiers.map((m) => 'SemanticTokenModifiers.$m').join(', ')}]';
+    return "('$content', SemanticTokenTypes.$type$modifiersString)";
+  }
 }
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 8091172..986d755 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:async';
 
 import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
@@ -26,7 +24,7 @@
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/src/protocol/protocol_internal.dart' as plugin;
-import 'package:meta/meta.dart';
+import 'package:collection/collection.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart' hide expect;
 import 'package:test/test.dart' as test show expect;
@@ -51,10 +49,10 @@
         ClientCapabilitiesHelperMixin,
         LspAnalysisServerTestMixin,
         ConfigurationFilesMixin {
-  MockLspServerChannel channel;
-  TestPluginManager pluginManager;
-  LspAnalysisServer server;
-  MockHttpClient httpClient;
+  late MockLspServerChannel channel;
+  late TestPluginManager pluginManager;
+  late LspAnalysisServer server;
+  late MockHttpClient httpClient;
 
   /// The number of context builds that had already occurred the last time
   /// resetContextBuildCounter() was called.
@@ -66,11 +64,12 @@
   Stream<Message> get serverToClient => channel.serverToClient;
 
   DiscoveredPluginInfo configureTestPlugin({
-    plugin.ResponseResult respondWith,
-    plugin.Notification notification,
+    plugin.ResponseResult? respondWith,
+    plugin.Notification? notification,
     Duration respondAfter = Duration.zero,
   }) {
-    final info = DiscoveredPluginInfo('a', 'b', 'c', null, null);
+    final info = DiscoveredPluginInfo('a', 'b', 'c', server.notificationManager,
+        server.instrumentationService);
     pluginManager.plugins.add(info);
 
     if (respondWith != null) {
@@ -102,20 +101,21 @@
   Future<T> expectSuccessfulResponseTo<T, R>(
       RequestMessage request, T Function(R) fromJson) async {
     final resp = await sendRequestToServer(request);
-    if (resp.error != null) {
-      throw resp.error;
+    final error = resp.error;
+    if (error != null) {
+      throw error;
     } else {
-      return resp.result == null ? null : fromJson(resp.result);
+      // resp.result should only be null when error != null if T allows null.
+      return resp.result == null ? null as T : fromJson(resp.result);
     }
   }
 
   /// Finds the registration for a given LSP method.
-  Registration registrationFor(
+  Registration? registrationFor(
     List<Registration> registrations,
     Method method,
   ) {
-    return registrations.singleWhere((r) => r.method == method.toJson(),
-        orElse: () => null);
+    return registrations.singleWhereOrNull((r) => r.method == method.toJson());
   }
 
   /// Finds the registration for a given LSP method with Dart in its
@@ -124,13 +124,12 @@
     List<Registration> registrations,
     Method method,
   ) {
-    return registrations.singleWhere(
-        (r) =>
-            r.method == method.toJson() &&
-            TextDocumentRegistrationOptions.fromJson(r.registerOptions)
+    return registrations.singleWhere((r) =>
+        r.method == method.toJson() &&
+        (TextDocumentRegistrationOptions.fromJson(r.registerOptions)
                 .documentSelector
-                .any((selector) => selector.language == dartLanguageId),
-        orElse: () => null);
+                ?.any((selector) => selector.language == dartLanguageId) ??
+            false));
   }
 
   void resetContextBuildCounter() {
@@ -514,8 +513,8 @@
 
   void writePackageConfig(
     String projectFolderPath, {
-    PackageConfigFileBuilder config,
-    String languageVersion,
+    PackageConfigFileBuilder? config,
+    String? languageVersion,
     bool flutter = false,
     bool meta = false,
     bool pedantic = false,
@@ -579,8 +578,11 @@
       Either2<num, String>.t2('client-test');
 
   int _id = 0;
-  String projectFolderPath, mainFilePath, pubspecFilePath, analysisOptionsPath;
-  Uri projectFolderUri, mainFileUri, pubspecFileUri, analysisOptionsUri;
+  late String projectFolderPath,
+      mainFilePath,
+      pubspecFilePath,
+      analysisOptionsPath;
+  late Uri projectFolderUri, mainFileUri, pubspecFileUri, analysisOptionsUri;
   final String simplePubspecContent = 'name: my_project';
   final startOfDocPos = Position(line: 0, character: 0);
   final startOfDocRange = Range(
@@ -590,7 +592,7 @@
   /// The client capabilities sent to the server during initialization.
   ///
   /// null if an initialization request has not yet been sent.
-  ClientCapabilities _clientCapabilities;
+  ClientCapabilities? _clientCapabilities;
 
   final validProgressTokens = <Either2<num, String>>{};
 
@@ -623,7 +625,7 @@
   ) {
     changes.forEach((fileUri, edits) {
       final path = Uri.parse(fileUri).toFilePath();
-      fileContents[path] = applyTextEdits(fileContents[path], edits);
+      fileContents[path] = applyTextEdits(fileContents[path]!, edits);
     });
   }
 
@@ -632,7 +634,7 @@
     Either2<List<TextDocumentEdit>,
             List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>
         documentChanges, {
-    Map<String, int> expectedVersions,
+    Map<String, int>? expectedVersions,
   }) {
     // If we were supplied with expected versions, ensure that all returned
     // edits match the versions.
@@ -680,7 +682,7 @@
         throw 'Recieved edits for $path which was not provided as a file to be edited. '
             'Perhaps a CreateFile change was missing from the edits?';
       }
-      oldFileContent[path] = applyTextDocumentEdit(oldFileContent[path], edit);
+      oldFileContent[path] = applyTextDocumentEdit(oldFileContent[path]!, edit);
     });
   }
 
@@ -774,13 +776,13 @@
     await sendNotificationToServer(notification);
   }
 
-  Future changeWorkspaceFolders({List<Uri> add, List<Uri> remove}) async {
+  Future changeWorkspaceFolders({List<Uri>? add, List<Uri>? remove}) async {
     var notification = makeNotification(
       Method.workspace_didChangeWorkspaceFolders,
       DidChangeWorkspaceFoldersParams(
         event: WorkspaceFoldersChangeEvent(
-          added: add?.map(toWorkspaceFolder)?.toList() ?? const [],
-          removed: remove?.map(toWorkspaceFolder)?.toList() ?? const [],
+          added: add?.map(toWorkspaceFolder).toList() ?? const [],
+          removed: remove?.map(toWorkspaceFolder).toList() ?? const [],
         ),
       ),
     );
@@ -796,17 +798,17 @@
     await sendNotificationToServer(notification);
   }
 
-  Future<Object> executeCodeAction(
+  Future<Object?> executeCodeAction(
       Either2<Command, CodeAction> codeAction) async {
     final command = codeAction.map(
       (command) => command,
-      (codeAction) => codeAction.command,
+      (codeAction) => codeAction.command!,
     );
     return executeCommand(command);
   }
 
-  Future<Object> executeCommand(Command command,
-      {Either2<num, String> workDoneToken}) async {
+  Future<Object?> executeCommand(Command command,
+      {Either2<num, String>? workDoneToken}) async {
     final request = makeRequest(
       Method.workspace_executeCommand,
       ExecuteCommandParams(
@@ -818,7 +820,7 @@
     return expectSuccessfulResponseTo(request, (result) => result);
   }
 
-  void expect(actual, matcher, {String reason}) =>
+  void expect(actual, matcher, {String? reason}) =>
       test.expect(actual, matcher, reason: reason);
 
   void expectDocumentVersion(
@@ -906,7 +908,7 @@
   Future<T> expectSuccessfulResponseTo<T, R>(
       RequestMessage request, T Function(R) fromJson);
 
-  Future<List<TextEdit>> formatDocument(String fileUri) {
+  Future<List<TextEdit>?> formatDocument(String fileUri) {
     final request = makeRequest(
       Method.textDocument_formatting,
       DocumentFormattingParams(
@@ -920,7 +922,7 @@
         request, _fromJsonList(TextEdit.fromJson));
   }
 
-  Future<List<TextEdit>> formatOnType(
+  Future<List<TextEdit>?> formatOnType(
       String fileUri, Position pos, String character) {
     final request = makeRequest(
       Method.textDocument_onTypeFormatting,
@@ -937,7 +939,7 @@
         request, _fromJsonList(TextEdit.fromJson));
   }
 
-  Future<List<TextEdit>> formatRange(String fileUri, Range range) {
+  Future<List<TextEdit>?> formatRange(String fileUri, Range range) {
     final request = makeRequest(
       Method.textDocument_rangeFormatting,
       DocumentRangeFormattingParams(
@@ -954,8 +956,8 @@
 
   Future<List<Either2<Command, CodeAction>>> getCodeActions(
     String fileUri, {
-    Range range,
-    List<CodeActionKind> kinds,
+    Range? range,
+    List<CodeActionKind>? kinds,
   }) {
     final request = makeRequest(
       Method.textDocument_codeAction,
@@ -976,7 +978,7 @@
   }
 
   Future<List<CompletionItem>> getCompletion(Uri uri, Position pos,
-      {CompletionContext context}) {
+      {CompletionContext? context}) {
     final request = makeRequest(
       Method.textDocument_completion,
       CompletionParams(
@@ -1033,7 +1035,8 @@
     return expectSuccessfulResponseTo(request, DartDiagnosticServer.fromJson);
   }
 
-  Future<List<DocumentHighlight>> getDocumentHighlights(Uri uri, Position pos) {
+  Future<List<DocumentHighlight>?> getDocumentHighlights(
+      Uri uri, Position pos) {
     final request = makeRequest(
       Method.textDocument_documentHighlight,
       TextDocumentPositionParams(
@@ -1074,7 +1077,7 @@
         request, _fromJsonList(FoldingRange.fromJson));
   }
 
-  Future<Hover> getHover(Uri uri, Position pos) {
+  Future<Hover?> getHover(Uri uri, Position pos) {
     final request = makeRequest(
       Method.textDocument_hover,
       TextDocumentPositionParams(
@@ -1121,7 +1124,7 @@
     Uri uri,
     Position pos,
     String label, {
-    CompletionContext context,
+    CompletionContext? context,
   }) async {
     final completions = await getCompletion(uri, pos, context: context);
 
@@ -1152,8 +1155,8 @@
     return expectSuccessfulResponseTo(request, SemanticTokens.fromJson);
   }
 
-  Future<SignatureHelp> getSignatureHelp(Uri uri, Position pos,
-      [SignatureHelpContext context]) {
+  Future<SignatureHelp?> getSignatureHelp(Uri uri, Position pos,
+      [SignatureHelpContext? context]) {
     final request = makeRequest(
       Method.textDocument_signatureHelp,
       SignatureHelpParams(
@@ -1211,10 +1214,10 @@
     Method method,
     R Function(Map<String, dynamic>) fromJson,
     Future<T> Function() f, {
-    @required FutureOr<RR> Function(R) handler,
+    required FutureOr<RR> Function(R) handler,
     Duration timeout = const Duration(seconds: 5),
   }) async {
-    Future<T> outboundRequest;
+    late Future<T> outboundRequest;
 
     // Run [f] and wait for the incoming request from the server.
     final incomingRequest = await expectRequest(method, () {
@@ -1245,23 +1248,24 @@
   /// full objects just to change one value (the types are immutable) so must
   /// match the spec exactly and are not verified.
   Future<ResponseMessage> initialize({
-    String rootPath,
-    Uri rootUri,
-    List<Uri> workspaceFolders,
-    TextDocumentClientCapabilities textDocumentCapabilities,
-    ClientCapabilitiesWorkspace workspaceCapabilities,
-    ClientCapabilitiesWindow windowCapabilities,
-    Map<String, Object> experimentalCapabilities,
-    Map<String, Object> initializationOptions,
+    String? rootPath,
+    Uri? rootUri,
+    List<Uri>? workspaceFolders,
+    TextDocumentClientCapabilities? textDocumentCapabilities,
+    ClientCapabilitiesWorkspace? workspaceCapabilities,
+    ClientCapabilitiesWindow? windowCapabilities,
+    Map<String, Object?>? experimentalCapabilities,
+    Map<String, Object?>? initializationOptions,
     bool throwOnFailure = true,
     bool allowEmptyRootUri = false,
   }) async {
-    _clientCapabilities = ClientCapabilities(
+    final clientCapabilities = ClientCapabilities(
       workspace: workspaceCapabilities,
       textDocument: textDocumentCapabilities,
       window: windowCapabilities,
       experimental: experimentalCapabilities,
     );
+    _clientCapabilities = clientCapabilities;
 
     // Handle any standard incoming requests that aren't test-specific, for example
     // accepting requests to create progress tokens.
@@ -1291,32 +1295,33 @@
           rootPath: rootPath,
           rootUri: rootUri?.toString(),
           initializationOptions: initializationOptions,
-          capabilities: _clientCapabilities,
-          workspaceFolders: workspaceFolders?.map(toWorkspaceFolder)?.toList(),
+          capabilities: clientCapabilities,
+          workspaceFolders: workspaceFolders?.map(toWorkspaceFolder).toList(),
         ));
     final response = await sendRequestToServer(request);
     expect(response.id, equals(request.id));
 
-    if (response.error == null) {
+    final error = response.error;
+    if (error == null) {
       final notification =
           makeNotification(Method.initialized, InitializedParams());
       await sendNotificationToServer(notification);
       await pumpEventQueue();
     } else if (throwOnFailure) {
       throw 'Error during initialize request: '
-          '${response.error.code}: ${response.error.message}';
+          '${error.code}: ${error.message}';
     }
 
     return response;
   }
 
-  NotificationMessage makeNotification(Method method, ToJsonable params) {
+  NotificationMessage makeNotification(Method method, ToJsonable? params) {
     return NotificationMessage(
         method: method, params: params, jsonrpc: jsonRpcVersion);
   }
 
   RequestMessage makeRenameRequest(
-      int version, Uri uri, Position pos, String newName) {
+      int? version, Uri uri, Position pos, String newName) {
     final docIdentifier = version != null
         ? VersionedTextDocumentIdentifier(version: version, uri: uri.toString())
         : TextDocumentIdentifier(uri: uri.toString());
@@ -1328,7 +1333,7 @@
     return request;
   }
 
-  RequestMessage makeRequest(Method method, ToJsonable params) {
+  RequestMessage makeRequest(Method method, ToJsonable? params) {
     final id = Either2<num, String>.t1(_id++);
     return RequestMessage(
         id: id, method: method, params: params, jsonrpc: jsonRpcVersion);
@@ -1386,7 +1391,7 @@
     return expectSuccessfulResponseTo(request, WorkspaceEdit.fromJson);
   }
 
-  Future openFile(Uri uri, String content, {num version = 1}) async {
+  Future openFile(Uri uri, String content, {int version = 1}) async {
     var notification = makeNotification(
       Method.textDocument_didOpen,
       DidOpenTextDocumentParams(
@@ -1415,10 +1420,10 @@
 
   Position positionFromOffset(int offset, String contents) {
     final lineInfo = LineInfo.fromContent(withoutMarkers(contents));
-    return toPosition(lineInfo.getLocation(offset));
+    return toPosition(lineInfo.getLocation(offset) as CharacterLocation);
   }
 
-  Future<RangeAndPlaceholder> prepareRename(Uri uri, Position pos) {
+  Future<RangeAndPlaceholder?> prepareRename(Uri uri, Position pos) {
     final request = makeRequest(
       Method.textDocument_prepareRename,
       TextDocumentPositionParams(
@@ -1457,7 +1462,7 @@
   }
 
   /// Returns the range of [searchText] in [content].
-  Range rangeOfString(String content, String searchText) {
+  Range? rangeOfString(String content, String searchText) {
     content = withoutMarkers(content);
     final startOffset = content.indexOf(searchText);
     return startOffset == -1
@@ -1505,9 +1510,9 @@
     return rangesFromMarkersImpl(content).toList();
   }
 
-  Future<WorkspaceEdit> rename(
+  Future<WorkspaceEdit?> rename(
     Uri uri,
-    int version,
+    int? version,
     Position pos,
     String newName,
   ) {
@@ -1573,7 +1578,7 @@
 
   Future<Null> sendShutdown() {
     final request = makeRequest(Method.shutdown, null);
-    return expectSuccessfulResponseTo(request, (result) => result);
+    return expectSuccessfulResponseTo(request, (result) => result as Null);
   }
 
   /// Creates a [TextEdit] using the `insert` range of a [InsertReplaceEdit].
@@ -1619,7 +1624,7 @@
     await serverToClient.firstWhere((message) {
       if (message is NotificationMessage) {
         if (message.method == CustomMethods.analyzerStatus) {
-          if (_clientCapabilities.window?.workDoneProgress == true) {
+          if (_clientCapabilities!.window?.workDoneProgress == true) {
             throw Exception(
                 'Recieved ${CustomMethods.analyzerStatus} notification '
                 'but client supports workDoneProgress');
@@ -1628,7 +1633,7 @@
           final params = AnalyzerStatusParams.fromJson(message.params);
           return params.isAnalyzing == analyzing;
         } else if (message.method == Method.progress) {
-          if (_clientCapabilities.window?.workDoneProgress != true) {
+          if (_clientCapabilities!.window?.workDoneProgress != true) {
             throw Exception(
                 'Recieved ${CustomMethods.analyzerStatus} notification '
                 'but client supports workDoneProgress');
@@ -1660,7 +1665,7 @@
   }
 
   Future<List<ClosingLabel>> waitForClosingLabels(Uri uri) async {
-    PublishClosingLabelsParams closingLabelsParams;
+    late PublishClosingLabelsParams closingLabelsParams;
     await serverToClient.firstWhere((message) {
       if (message is NotificationMessage &&
           message.method == CustomMethods.publishClosingLabels) {
@@ -1674,13 +1679,14 @@
     return closingLabelsParams.labels;
   }
 
-  Future<List<Diagnostic>> waitForDiagnostics(Uri uri) async {
-    PublishDiagnosticsParams diagnosticParams;
-    await serverToClient.firstWhere((message) {
+  Future<List<Diagnostic>?> waitForDiagnostics(Uri uri) async {
+    PublishDiagnosticsParams? diagnosticParams;
+    await serverToClient.map<Message?>((message) => message).firstWhere(
+        (message) {
       if (message is NotificationMessage &&
           message.method == Method.textDocument_publishDiagnostics) {
         diagnosticParams = PublishDiagnosticsParams.fromJson(message.params);
-        return diagnosticParams.uri == uri.toString();
+        return diagnosticParams!.uri == uri.toString();
       }
       return false;
     }, orElse: () => null);
@@ -1688,7 +1694,7 @@
   }
 
   Future<FlutterOutline> waitForFlutterOutline(Uri uri) async {
-    PublishFlutterOutlineParams outlineParams;
+    late PublishFlutterOutlineParams outlineParams;
     await serverToClient.firstWhere((message) {
       if (message is NotificationMessage &&
           message.method == CustomMethods.publishFlutterOutline) {
@@ -1702,7 +1708,7 @@
   }
 
   Future<Outline> waitForOutline(Uri uri) async {
-    PublishOutlineParams outlineParams;
+    late PublishOutlineParams outlineParams;
     await serverToClient.firstWhere((message) {
       if (message is NotificationMessage &&
           message.method == CustomMethods.publishOutline) {
@@ -1748,7 +1754,7 @@
   }
 
   Future<void> _handleWorkDoneProgressCreate(RequestMessage request) async {
-    if (_clientCapabilities.window?.workDoneProgress != true) {
+    if (_clientCapabilities!.window?.workDoneProgress != true) {
       throw Exception('Server sent ${Method.window_workDoneProgress_create} '
           'but client capabilities do not allow');
     }
@@ -1775,9 +1781,10 @@
       T1 Function(R) fromJson1,
       bool Function(R, LspJsonReporter) canParse2,
       T2 Function(R) fromJson2,
-      [LspJsonReporter reporter]) {
+      [LspJsonReporter? reporter]) {
     reporter ??= nullLspJsonReporter;
     return (input) {
+      reporter!;
       if (canParse1(input, reporter)) {
         return Either2<T1, T2>.t1(fromJson1(input));
       }
diff --git a/pkg/analysis_server/test/lsp/server_test.dart b/pkg/analysis_server/test/lsp/server_test.dart
index 07858b3..c5508eb 100644
--- a/pkg/analysis_server/test/lsp/server_test.dart
+++ b/pkg/analysis_server/test/lsp/server_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:test/test.dart';
@@ -79,7 +77,8 @@
 
     // Wait up to 1sec to ensure no error/log notifications were sent back.
     var didTimeout = false;
-    final notificationFromServer = await firstError.timeout(
+    final notificationFromServer =
+        await firstError.then<NotificationMessage?>((error) => error).timeout(
       const Duration(seconds: 1),
       onTimeout: () {
         didTimeout = true;
@@ -97,7 +96,7 @@
     final response = await channel.sendRequestToServer(request);
     expect(response.id, equals(request.id));
     expect(response.error, isNotNull);
-    expect(response.error.code, equals(ErrorCodes.MethodNotFound));
+    expect(response.error!.code, equals(ErrorCodes.MethodNotFound));
     expect(response.result, isNull);
   }
 
@@ -107,7 +106,7 @@
     final response = await channel.sendRequestToServer(request);
     expect(response.id, equals(request.id));
     expect(response.error, isNotNull);
-    expect(response.error.code, equals(ErrorCodes.MethodNotFound));
+    expect(response.error!.code, equals(ErrorCodes.MethodNotFound));
     expect(response.result, isNull);
   }
 }
diff --git a/pkg/analysis_server/test/lsp/signature_help_test.dart b/pkg/analysis_server/test/lsp/signature_help_test.dart
index 13432a9..9a6300f 100644
--- a/pkg/analysis_server/test/lsp/signature_help_test.dart
+++ b/pkg/analysis_server/test/lsp/signature_help_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -23,11 +21,11 @@
     String expectedLabel,
     String expectedDoc,
     List<ParameterInformation> expectedParams, {
-    MarkupKind expectedFormat = MarkupKind.Markdown,
-    SignatureHelpContext context,
+    MarkupKind? expectedFormat = MarkupKind.Markdown,
+    SignatureHelpContext? context,
   }) async {
-    final res = await getSignatureHelp(
-        mainFileUri, positionFromMarker(fileContent), context);
+    final res = (await getSignatureHelp(
+        mainFileUri, positionFromMarker(fileContent), context))!;
 
     // TODO(dantup): Update this when there is clarification on how to handle
     // no valid selected parameter.
@@ -41,7 +39,7 @@
     // Test the format matches the tests expectation.
     // For clients that don't support MarkupContent it'll be a plain string,
     // but otherwise it'll be a MarkupContent of type PlainText or Markdown.
-    final doc = sig.documentation;
+    final doc = sig.documentation!;
     if (expectedFormat == null) {
       // Plain string.
       expect(doc.valueEquals(expectedDoc), isTrue);
diff --git a/pkg/analysis_server/test/lsp/super_test.dart b/pkg/analysis_server/test/lsp/super_test.dart
index 29eec48..b9192d9 100644
--- a/pkg/analysis_server/test/lsp/super_test.dart
+++ b/pkg/analysis_server/test/lsp/super_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/will_rename_files_test.dart b/pkg/analysis_server/test/lsp/will_rename_files_test.dart
index 124671d..9d88945 100644
--- a/pkg/analysis_server/test/lsp/will_rename_files_test.dart
+++ b/pkg/analysis_server/test/lsp/will_rename_files_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:async';
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
@@ -56,7 +54,7 @@
     final contents = {
       mainFilePath: withoutMarkers(mainContent),
     };
-    applyChanges(contents, edit.changes);
+    applyChanges(contents, edit.changes!);
     expect(contents[mainFilePath], equals(expectedMainContent));
   }
 }
diff --git a/pkg/analysis_server/test/lsp/workspace_symbols_test.dart b/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
index 915a8a3..c2715d7 100644
--- a/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
+++ b/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:test/test.dart';
@@ -100,10 +98,11 @@
     );
 
     final response = await sendRequestToServer(request);
-    expect(response.error.code, equals(ErrorCodes.InvalidParams));
+    final error = response.error!;
+    expect(error.code, equals(ErrorCodes.InvalidParams));
     // Ensure the error is useful to the client.
     expect(
-      response.error.message,
+      error.message,
       equals('Invalid params for workspace/symbol:\n'
           'params.query must not be undefined'),
     );
diff --git a/pkg/analysis_server/test/mocks_lsp.dart b/pkg/analysis_server/test/mocks_lsp.dart
index fdb402e..d8eafef 100644
--- a/pkg/analysis_server/test/mocks_lsp.dart
+++ b/pkg/analysis_server/test/mocks_lsp.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:convert';
 
@@ -21,8 +19,6 @@
   final StreamController<lsp.Message> _serverToClient =
       StreamController<lsp.Message>.broadcast();
 
-  String name;
-
   /// Completer that will be signalled when the input stream is closed.
   final Completer _closed = Completer();
 
@@ -78,7 +74,7 @@
 
   @override
   void listen(void Function(lsp.Message message) onMessage,
-      {Function onError, void Function() onDone}) {
+      {Function? onError, void Function()? onDone}) {
     _clientToServer.stream.listen(onMessage, onError: onError, onDone: onDone);
   }
 
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 8441368..50ccb48 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -111,12 +111,6 @@
             '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.');
-  }
-
   void test_validateConstructorName_OK() {
     assertRefactoringStatusOK(validateConstructorName('newName'));
   }
@@ -287,12 +281,6 @@
             '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.');
-  }
-
   void test_validateImportPrefixName_OK() {
     assertRefactoringStatusOK(validateImportPrefixName('newName'));
   }
@@ -433,12 +421,6 @@
             '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.');
-  }
-
   void test_validateLibraryName_OK_oneIdentifier() {
     assertRefactoringStatusOK(validateLibraryName('name'));
   }
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index c134d20..3e5300d 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -194,7 +194,7 @@
 void _writeCanParseMethod(IndentableStringBuffer buffer, Interface interface) {
   buffer
     ..writeIndentedln(
-        'static bool canParse(Object obj, LspJsonReporter reporter) {')
+        'static bool canParse(Object? obj, LspJsonReporter reporter) {')
     ..indent()
     ..writeIndentedln('if (obj is Map<String, dynamic>) {')
     ..indent();
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript.dart b/pkg/analysis_server/tool/lsp_spec/typescript.dart
index 7d36548..f857a6a 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript.dart
@@ -125,6 +125,9 @@
     'ProgressParams': {
       'value': 'object',
     },
+    'SemanticTokens': {
+      'data': 'int[]',
+    },
     'ServerCapabilities': {
       'changeNotifications': 'bool',
     },
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
index 5c9065e..96f7c88 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
@@ -672,7 +672,10 @@
     if (improveTypes) {
       final improvedTypeName = getImprovedType(containerName, fieldName);
       if (improvedTypeName != null) {
-        type = Type.identifier(improvedTypeName);
+        type = improvedTypeName.endsWith('[]')
+            ? ArrayType(Type.identifier(
+                improvedTypeName.substring(0, improvedTypeName.length - 2)))
+            : Type.identifier(improvedTypeName);
       }
     }
     return type;
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 9691934..762ea4b 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,4 +1,5 @@
-## 1.5.0-dev
+## 1.5.0
+* Support for the language version `2.14`.
 * Deprecated `AnalysisSession.getUnitElement()`.
   Use `AnalysisSession.getUnitElement2()` instead.
 * Deprecated `AnalysisSession.getResolvedUnit()`.
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 41b1d1c..4253d6f 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -4293,6 +4293,9 @@
   /// Set the semicolon terminating the directive to the given [token].
   @Deprecated('Clients should not build AST manually')
   set semicolon(Token token);
+
+  @override
+  LibraryElement? get uriElement;
 }
 
 /// The "native" clause in an class declaration.
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index ca7f2f9..6e82d71 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -1506,7 +1506,10 @@
         var declaration = from.element.declaration;
         return TypeParameterTypeImpl(
           element: declaration,
-          nullabilitySuffix: from.nullabilitySuffix,
+          nullabilitySuffix: _promotedTypeParameterTypeNullability(
+            from.nullabilitySuffix,
+            to.nullabilitySuffix,
+          ),
           promotedBound: to,
         );
       }
@@ -1866,6 +1869,35 @@
     recurse(type);
     return result;
   }
+
+  static NullabilitySuffix _promotedTypeParameterTypeNullability(
+    NullabilitySuffix nullabilityOfType,
+    NullabilitySuffix nullabilityOfBound,
+  ) {
+    if (nullabilityOfType == NullabilitySuffix.question &&
+        nullabilityOfBound == NullabilitySuffix.none) {
+      return NullabilitySuffix.none;
+    }
+
+    if (nullabilityOfType == NullabilitySuffix.question &&
+        nullabilityOfBound == NullabilitySuffix.question) {
+      return NullabilitySuffix.question;
+    }
+
+    if (nullabilityOfType == NullabilitySuffix.star &&
+        nullabilityOfBound == NullabilitySuffix.none) {
+      return NullabilitySuffix.star;
+    }
+
+    // Intersection with a non-nullable type always yields a non-nullable type,
+    // as it's the most restrictive kind of types.
+    if (nullabilityOfType == NullabilitySuffix.none ||
+        nullabilityOfBound == NullabilitySuffix.none) {
+      return NullabilitySuffix.none;
+    }
+
+    return NullabilitySuffix.star;
+  }
 }
 
 /// TODO(scheglov) Ask the language team how to deal with it.
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index ae88729..5e98178 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 1.5.0-dev
+version: 1.5.0
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
@@ -7,7 +7,7 @@
   sdk: '>=2.12.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^20.0.0
+  _fe_analyzer_shared: ^21.0.0
   cli_util: ^0.3.0
   collection: ^1.15.0
   convert: ^3.0.0
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 6a50ac8..492236c 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/analysis/features.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';
@@ -472,22 +473,51 @@
       return typeSystem.tryPromoteToType(to, from) as TypeParameterTypeImpl;
     }
 
-    void check(
-      TypeParameterTypeImpl type,
-      TypeParameterElement expectedElement,
-      DartType expectedBound,
-    ) {
-      expect(type.element, expectedElement);
-      expect(type.promotedBound, expectedBound);
+    void check(TypeParameterTypeImpl type, String expected) {
+      expect(type.getDisplayString(withNullability: true), expected);
     }
 
     var T = typeParameter('T');
-    var T0 = typeParameterTypeNone(T);
+    var T_none = typeParameterTypeNone(T);
+    var T_question = typeParameterTypeQuestion(T);
+    var T_star = typeParameterTypeStar(T);
 
-    var T1 = tryPromote(numNone, T0);
-    check(T1, T, numNone);
+    check(tryPromote(numNone, T_none), 'T & num');
+    check(tryPromote(numQuestion, T_none), 'T & num?');
+    check(tryPromote(numStar, T_none), 'T & num*');
+
+    check(tryPromote(numNone, T_question), 'T & num');
+    check(tryPromote(numQuestion, T_question), 'T? & num?');
+    check(tryPromote(numStar, T_question), 'T* & num*');
+
+    check(tryPromote(numNone, T_star), 'T* & num');
+    check(tryPromote(numQuestion, T_star), 'T* & num?');
+    check(tryPromote(numStar, T_star), 'T* & num*');
+  }
+
+  test_typeParameter_twice() {
+    TypeParameterTypeImpl tryPromote(DartType to, TypeParameterTypeImpl from) {
+      return typeSystem.tryPromoteToType(to, from) as TypeParameterTypeImpl;
+    }
+
+    void check(
+      TypeParameterTypeImpl type,
+      TypeParameterElement element,
+      NullabilitySuffix nullability,
+      DartType promotedBound,
+    ) {
+      expect(type.element, element);
+      expect(type.nullabilitySuffix, nullability);
+      expect(type.promotedBound, promotedBound);
+    }
+
+    var T = typeParameter('T');
+    var T_none = typeParameterTypeNone(T);
+
+    var T1 = tryPromote(numNone, T_none);
+    check(T1, T, NullabilitySuffix.none, numNone);
 
     var T2 = tryPromote(intNone, T1);
-    check(T2, T, intNone);
+    check(T2, T, NullabilitySuffix.none, intNone);
   }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index c99d393..786b808 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -92,10 +92,9 @@
 // proto-property of the classes 'prototype' field.
 // Older IEs use `Object.create` and copy over the properties.
 function inherit(cls, sup) {
-  // Note that RTI needs cls.name, but we don't need to set it anymore.
-  if (#legacyJavaScript) {
-    cls.prototype.constructor = cls;
-  }
+  // cls.prototype.constructor carries the cached RTI. We could avoid this by
+  // using ES6 classes, but the side effects of this need to be tested.
+  cls.prototype.constructor = cls;
   cls.prototype[#operatorIsPrefix + cls.name] = cls;
 
   // The superclass is only null for the Dart Object.
@@ -813,8 +812,7 @@
 
       'call0selector': js.quoteName(call0Name),
       'call1selector': js.quoteName(call1Name),
-      'call2selector': js.quoteName(call2Name),
-      'legacyJavaScript': _options.legacyJavaScript
+      'call2selector': js.quoteName(call2Name)
     });
     if (program.hasSoftDeferredClasses) {
       mainCode = js.Block([
@@ -1202,7 +1200,6 @@
         properties
             .add(js.Property(js.string("constructor"), classReference(cls)));
       }
-
       properties.add(js.Property(_namer.operatorIs(cls.element), js.number(1)));
     }
 
diff --git a/pkg/dart_internal/CHANGELOG.md b/pkg/dart_internal/CHANGELOG.md
index 8b39127..c49fe05 100644
--- a/pkg/dart_internal/CHANGELOG.md
+++ b/pkg/dart_internal/CHANGELOG.md
@@ -1,4 +1,8 @@
-## 0.1.12-nullsafety.1
+## 0.2.1
+
+- Support the latest Dart SDK.
+
+## 0.2.0
 
 - Support the latest Dart SDK.
 
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index 3be9909..130631e 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,19 +1,12 @@
 name: dart_internal
-version: 0.2.0
+version: 0.2.1
 repository: https://github.com/dart-lang/sdk/tree/master/pkg/dart_internal
-description: >
+description: >-
   This package is not intended for wide use. It provides a temporary API to
   solve the problem: "Given an object some generic type A, how do I construct an
   instance of generic type B with the same type argument(s)?"
 
-  This is necessary in a few rare places in order to migrate existing code to
-  Dart 2's stronger type system. Eventually, the hope is to have direct
-  language support for solving this problem but we don't have time to get that
-  into 2.0, so this package is provided as a temporary workaround.
-
-  We will very likely remove support for this in a later version of Dart.
-
 environment:
   # Restrict the upper bound so that we can remove support for this in a later
   # version of the SDK without it being a breaking change.
-  sdk: ">=2.12.0-0 <2.13.0"
+  sdk: ">=2.12.0 <2.15.0"
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 0dea2b7..c7e2e8f 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -6,9 +6,9 @@
 import 'dart:io';
 
 import 'package:dart2native/generate.dart';
-import 'package:path/path.dart' as path;
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show Verbosity;
+import 'package:path/path.dart' as path;
 
 import '../core.dart';
 import '../experiments.dart';
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index a01a3b9..cba549e 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -12,11 +12,11 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart' hide MapEntry;
 import 'package:kernel/library_index.dart';
+import 'package:kernel/src/dart_type_equivalence.dart';
 import 'package:kernel/type_algebra.dart';
 import 'package:kernel/type_environment.dart';
-import 'package:kernel/src/dart_type_equivalence.dart';
-import 'package:source_span/source_span.dart' show SourceLocation;
 import 'package:path/path.dart' as p;
+import 'package:source_span/source_span.dart' show SourceLocation;
 
 import '../compiler/js_names.dart' as js_ast;
 import '../compiler/js_utils.dart' as js_ast;
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index 03c94f7..7ac69c9 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -6,19 +6,15 @@
 
 import 'dart:async';
 
-import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
-    show DiagnosticMessage, DiagnosticMessageHandler;
-
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show Code, Message, PlainAndColorizedString;
-
+import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
+    show DiagnosticMessage, DiagnosticMessageHandler;
 import 'package:dev_compiler/dev_compiler.dart';
 import 'package:dev_compiler/src/compiler/js_names.dart' as js_ast;
 import 'package:dev_compiler/src/compiler/module_builder.dart';
 import 'package:dev_compiler/src/js_ast/js_ast.dart' as js_ast;
-
 import 'package:front_end/src/api_unstable/ddc.dart';
-
 import 'package:kernel/ast.dart'
     show
         Block,
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 1f8d5f6..c585aa4 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -8,6 +8,8 @@
 
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show Message, LocatedMessage;
+import 'package:_js_interop_checks/js_interop_checks.dart';
+import 'package:_js_interop_checks/src/transformations/js_util_optimizer.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
@@ -15,8 +17,6 @@
 import 'package:kernel/target/changed_structure_notifier.dart';
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/transformations/track_widget_constructor_locations.dart';
-import 'package:_js_interop_checks/js_interop_checks.dart';
-import 'package:_js_interop_checks/src/transformations/js_util_optimizer.dart';
 
 import 'constants.dart' show DevCompilerConstantsBackend;
 import 'kernel_helpers.dart';
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
index e5fa0e0..8cda5d8 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
@@ -10,14 +10,13 @@
 import 'dart:isolate';
 
 import 'package:build_integration/file_system/multi_root.dart';
+import 'package:dev_compiler/src/kernel/expression_compiler_worker.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart';
 import 'package:path/path.dart' as p;
 import 'package:pedantic/pedantic.dart';
 import 'package:test/test.dart';
 
-import 'package:dev_compiler/src/kernel/expression_compiler_worker.dart';
-
 /// Verbose mode for debugging
 bool get verbose => false;
 
diff --git a/pkg/dev_compiler/test/modular_suite.dart b/pkg/dev_compiler/test/modular_suite.dart
index c93b5cb..fde41a3 100644
--- a/pkg/dev_compiler/test/modular_suite.dart
+++ b/pkg/dev_compiler/test/modular_suite.dart
@@ -11,8 +11,8 @@
 
 import 'package:modular_test/src/io_pipeline.dart';
 import 'package:modular_test/src/pipeline.dart';
-import 'package:modular_test/src/suite.dart';
 import 'package:modular_test/src/runner.dart';
+import 'package:modular_test/src/suite.dart';
 import 'package:package_config/package_config.dart';
 
 String packageConfigJsonPath = '.dart_tool/package_config.json';
diff --git a/pkg/dev_compiler/test/modular_suite_nnbd.dart b/pkg/dev_compiler/test/modular_suite_nnbd.dart
index 29bd656..e00e185 100644
--- a/pkg/dev_compiler/test/modular_suite_nnbd.dart
+++ b/pkg/dev_compiler/test/modular_suite_nnbd.dart
@@ -11,8 +11,8 @@
 
 import 'package:modular_test/src/io_pipeline.dart';
 import 'package:modular_test/src/pipeline.dart';
-import 'package:modular_test/src/suite.dart';
 import 'package:modular_test/src/runner.dart';
+import 'package:modular_test/src/suite.dart';
 import 'package:package_config/package_config.dart';
 
 String packageConfigJsonPath = '.dart_tool/package_config.json';
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 6177a5b..e63b928 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -6,19 +6,19 @@
 
 import 'dart:async';
 import 'dart:io';
-import 'package:front_end/src/api_unstable/ddc.dart' as fe;
-import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/type_environment.dart';
-import 'package:kernel/src/printer.dart';
-import 'package:kernel/target/targets.dart';
-import 'package:test/test.dart';
 
 import 'package:dev_compiler/src/kernel/command.dart';
-import 'package:dev_compiler/src/kernel/nullable_inference.dart';
 import 'package:dev_compiler/src/kernel/js_typerep.dart';
+import 'package:dev_compiler/src/kernel/nullable_inference.dart';
 import 'package:dev_compiler/src/kernel/target.dart';
+import 'package:front_end/src/api_unstable/ddc.dart' as fe;
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/src/printer.dart';
+import 'package:kernel/target/targets.dart';
+import 'package:kernel/type_environment.dart';
+import 'package:test/test.dart';
 
 const AstTextStrategy astTextStrategy = AstTextStrategy(
     includeLibraryNamesInTypes: true,
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 315781f..57ba7b1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -2218,6 +2218,44 @@
       }
     } else if (receiver is NullConstant) {
       return createErrorConstant(node, messageConstEvalNullValue);
+    } else if (receiver is MapConstant && enableConstFunctions) {
+      if (arguments.length == 1) {
+        final Constant other = arguments[0];
+        switch (op) {
+          case '[]':
+            final ConstantMapEntry mapEntry = receiver.entries
+                .firstWhere((entry) => entry.key == other, orElse: () => null);
+            // Null value if key is not in the map.
+            return mapEntry?.value ?? new NullConstant();
+        }
+      }
+    } else if (receiver is InstanceConstant && enableConstFunctions) {
+      if (arguments.length == 1) {
+        final Constant other = arguments[0];
+        if (receiver.classNode.name == '_ImmutableMap') {
+          switch (op) {
+            case '[]':
+              final ListConstant values = receiver.fieldValues.entries
+                  .firstWhere(
+                      (entry) => entry.key.canonicalName.name == '_kvPairs',
+                      orElse: () => null)
+                  .value;
+              assert(values != null);
+
+              // Each i index element in [values] is a key whose value is the
+              // i+1 index element.
+              int keyIndex = values.entries.indexOf(other);
+              if (keyIndex != -1) {
+                int valueIndex = keyIndex + 1;
+                assert(valueIndex != values.entries.length);
+                return values.entries[valueIndex];
+              } else {
+                // Null value if key is not in the map.
+                return new NullConstant();
+              }
+          }
+        }
+      }
     }
 
     return createErrorConstant(
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 26d0e70..1f1cd12 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -1465,6 +1465,48 @@
           new VoidTypeDeclarationBuilder(const VoidType(), this, charOffset));
   }
 
+  void _checkBadFunctionParameter(List<TypeVariableBuilder> typeVariables) {
+    if (typeVariables == null || typeVariables.isEmpty) {
+      return;
+    }
+
+    for (TypeVariableBuilder type in typeVariables) {
+      if (type.name == "Function") {
+        addProblem(messageFunctionAsTypeParameter, type.charOffset,
+          type.name.length, type.fileUri);
+      }
+    }
+  }
+
+  void _checkBadFunctionDeclUse(String className, TypeParameterScopeKind kind,
+      int charOffset) {
+    String decType;
+    switch (kind) {
+      case TypeParameterScopeKind.classDeclaration:
+        decType = "class";
+        break;
+      case TypeParameterScopeKind.mixinDeclaration:
+        decType = "mixin";
+        break;
+      case TypeParameterScopeKind.extensionDeclaration:
+        decType = "extension";
+        break;
+      default:
+        break;
+    }
+    if (className != "Function") {
+      return;
+    }
+    if (decType == "class" && importUri.scheme == "dart") {
+      // Allow declaration of class Function in the sdk.
+      return;
+    }
+    if (decType != null) {
+      addProblem(templateFunctionUsedAsDec.withArguments(decType), charOffset,
+          className?.length, fileUri);
+    }
+  }
+
   /// Add a problem that might not be reported immediately.
   ///
   /// Problems will be issued after source information has been added.
@@ -1574,6 +1616,8 @@
       int nameOffset,
       int endOffset,
       int supertypeOffset) {
+    _checkBadFunctionDeclUse(className, kind, nameOffset);
+    _checkBadFunctionParameter(typeVariables);
     // Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
     TypeParameterScopeBuilder declaration =
         endNestedDeclaration(kind, className)
@@ -1806,6 +1850,9 @@
       int startOffset,
       int nameOffset,
       int endOffset) {
+    _checkBadFunctionDeclUse(
+        extensionName, TypeParameterScopeKind.extensionDeclaration, nameOffset);
+    _checkBadFunctionParameter(typeVariables);
     // Nested declaration began in `OutlineBuilder.beginExtensionDeclaration`.
     TypeParameterScopeBuilder declaration = endNestedDeclaration(
         TypeParameterScopeKind.extensionDeclaration, extensionName)
@@ -1837,7 +1884,6 @@
         nameOffset,
         endOffset,
         referenceFrom);
-
     constructorReferences.clear();
     Map<String, TypeVariableBuilder> typeVariablesByName =
         checkTypeVariables(typeVariables, extensionBuilder);
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index d15884e..23e753f 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -369,9 +369,11 @@
 ForInLoopNotAssignable/statement: Fail
 ForInLoopTypeNotIterablePartNullability/example: Fail # Cannot occur but needed for symmetry with ForInLoopTypeNotIterableNullability
 ForInLoopWithConstVariable/example: Fail
+FunctionAsTypeParameter/analyzerCode: Fail
 FunctionTypeDefaultValue/example: Fail
 FunctionTypedParameterVar/part_wrapped_script1: Fail
 FunctionTypedParameterVar/script1: Fail
+FunctionUsedAsDec/analyzerCode: Fail
 GeneratorReturnsValue/example: Fail
 GetterNotFound/example: Fail
 GetterWithFormals/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index dafcd5f..174bde3 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1797,6 +1797,20 @@
           T.String field;
         }
 
+FunctionUsedAsDec:
+  template: "'Function' is a built-in identifier, could not used as a #name name."
+  script:
+    - class Function {}
+    - extension Function on int {}
+    - mixin Function {}
+
+FunctionAsTypeParameter:
+  template: "'Function' is a built-in identifier, could not used as a type identifier."
+  script:
+    - class C<Function> {}
+    - mixin A<Function> {}
+    - extension A<Function> on List<Function> {}
+
 UnresolvedPrefixInTypeAnnotation:
   template: "'#name.#name2' can't be used as a type because '#name' isn't defined."
   analyzerCode: NOT_A_TYPE
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart b/pkg/front_end/testcases/const_functions/const_functions_map.dart
new file mode 100644
index 0000000..5fbdd6b
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 map usage with const functions.
+
+import "package:expect/expect.dart";
+
+const var1 = fn({'key': 'val'}, 'key');
+
+const var2 = fn({'key': 2}, 'key');
+
+const var3 = fn({'key': 2}, 'invalid');
+
+const map = {'key1': 2, 'key2': 3, 'key3': 4};
+const var4 = fn(map, 'key1');
+const var5 = fn(map, 'key2');
+const var6 = fn(map, 'key3');
+
+Object? fn(Map<Object, Object> map, Object key) {
+  return map[key];
+}
+
+const var7 = fn2();
+int? fn2() {
+  const y = {'key': 2};
+  return y['key'];
+}
+
+void main() {
+  Expect.equals(var1, 'val');
+  Expect.equals(var2, 2);
+  Expect.equals(var3, null);
+  Expect.equals(var4, 2);
+  Expect.equals(var5, 3);
+  Expect.equals(var6, 4);
+  Expect.equals(var7, 2);
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.strong.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.strong.expect
new file mode 100644
index 0000000..1b2b117
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.strong.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::Object? var1 = #C1;
+static const field core::Object? var2 = #C2;
+static const field core::Object? var3 = #C3;
+static const field core::Map<core::String, core::int> map = #C10;
+static const field core::Object? var4 = #C2;
+static const field core::Object? var5 = #C6;
+static const field core::Object? var6 = #C8;
+static const field core::int? var7 = #C2;
+static method fn(core::Map<core::Object, core::Object> map, core::Object key) → core::Object? {
+  return map.{core::Map::[]}(key);
+}
+static method fn2() → core::int? {
+  return (#C13).{core::Map::[]}("key");
+}
+static method main() → void {
+  exp::Expect::equals(#C1, "val");
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C3, null);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C6, 3);
+  exp::Expect::equals(#C8, 4);
+  exp::Expect::equals(#C2, 2);
+}
+
+constants  {
+  #C1 = "val"
+  #C2 = 2
+  #C3 = null
+  #C4 = "key1"
+  #C5 = "key2"
+  #C6 = 3
+  #C7 = "key3"
+  #C8 = 4
+  #C9 = <dynamic>[#C4, #C2, #C5, #C6, #C7, #C8]
+  #C10 = core::_ImmutableMap<core::String, core::int> {_kvPairs:#C9}
+  #C11 = "key"
+  #C12 = <dynamic>[#C11, #C2]
+  #C13 = core::_ImmutableMap<core::String, core::int> {_kvPairs:#C12}
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.strong.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.strong.transformed.expect
new file mode 100644
index 0000000..1b2b117
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::Object? var1 = #C1;
+static const field core::Object? var2 = #C2;
+static const field core::Object? var3 = #C3;
+static const field core::Map<core::String, core::int> map = #C10;
+static const field core::Object? var4 = #C2;
+static const field core::Object? var5 = #C6;
+static const field core::Object? var6 = #C8;
+static const field core::int? var7 = #C2;
+static method fn(core::Map<core::Object, core::Object> map, core::Object key) → core::Object? {
+  return map.{core::Map::[]}(key);
+}
+static method fn2() → core::int? {
+  return (#C13).{core::Map::[]}("key");
+}
+static method main() → void {
+  exp::Expect::equals(#C1, "val");
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C3, null);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C6, 3);
+  exp::Expect::equals(#C8, 4);
+  exp::Expect::equals(#C2, 2);
+}
+
+constants  {
+  #C1 = "val"
+  #C2 = 2
+  #C3 = null
+  #C4 = "key1"
+  #C5 = "key2"
+  #C6 = 3
+  #C7 = "key3"
+  #C8 = 4
+  #C9 = <dynamic>[#C4, #C2, #C5, #C6, #C7, #C8]
+  #C10 = core::_ImmutableMap<core::String, core::int> {_kvPairs:#C9}
+  #C11 = "key"
+  #C12 = <dynamic>[#C11, #C2]
+  #C13 = core::_ImmutableMap<core::String, core::int> {_kvPairs:#C12}
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.textual_outline.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.textual_outline.expect
new file mode 100644
index 0000000..1a8595a
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+import "package:expect/expect.dart";
+
+const var1 = fn({'key': 'val'}, 'key');
+const var2 = fn({'key': 2}, 'key');
+const var3 = fn({'key': 2}, 'invalid');
+const map = {'key1': 2, 'key2': 3, 'key3': 4};
+const var4 = fn(map, 'key1');
+const var5 = fn(map, 'key2');
+const var6 = fn(map, 'key3');
+Object? fn(Map<Object, Object> map, Object key) {}
+const var7 = fn2();
+int? fn2() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4f5d64b
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+import "package:expect/expect.dart";
+
+Object? fn(Map<Object, Object> map, Object key) {}
+const map = {'key1': 2, 'key2': 3, 'key3': 4};
+const var1 = fn({'key': 'val'}, 'key');
+const var2 = fn({'key': 2}, 'key');
+const var3 = fn({'key': 2}, 'invalid');
+const var4 = fn(map, 'key1');
+const var5 = fn(map, 'key2');
+const var6 = fn(map, 'key3');
+const var7 = fn2();
+int? fn2() {}
+void main() {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.expect
new file mode 100644
index 0000000..836d428
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::Object? var1 = #C1;
+static const field core::Object? var2 = #C2;
+static const field core::Object? var3 = #C3;
+static const field core::Map<core::String, core::int> map = #C10;
+static const field core::Object? var4 = #C2;
+static const field core::Object? var5 = #C6;
+static const field core::Object? var6 = #C8;
+static const field core::int? var7 = #C2;
+static method fn(core::Map<core::Object, core::Object> map, core::Object key) → core::Object? {
+  return map.{core::Map::[]}(key);
+}
+static method fn2() → core::int? {
+  return (#C13).{core::Map::[]}("key");
+}
+static method main() → void {
+  exp::Expect::equals(#C1, "val");
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C3, null);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C6, 3);
+  exp::Expect::equals(#C8, 4);
+  exp::Expect::equals(#C2, 2);
+}
+
+constants  {
+  #C1 = "val"
+  #C2 = 2
+  #C3 = null
+  #C4 = "key1"
+  #C5 = "key2"
+  #C6 = 3
+  #C7 = "key3"
+  #C8 = 4
+  #C9 = <dynamic>[#C4, #C2, #C5, #C6, #C7, #C8]
+  #C10 = core::_ImmutableMap<core::String*, core::int*> {_kvPairs:#C9}
+  #C11 = "key"
+  #C12 = <dynamic>[#C11, #C2]
+  #C13 = core::_ImmutableMap<core::String*, core::int*> {_kvPairs:#C12}
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.outline.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.outline.expect
new file mode 100644
index 0000000..87b21de
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.outline.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::Object? var1 = self::fn(const <core::Object, core::Object>{"key": "val"}, "key");
+static const field core::Object? var2 = self::fn(const <core::Object, core::Object>{"key": 2}, "key");
+static const field core::Object? var3 = self::fn(const <core::Object, core::Object>{"key": 2}, "invalid");
+static const field core::Map<core::String, core::int> map = const <core::String, core::int>{"key1": 2, "key2": 3, "key3": 4};
+static const field core::Object? var4 = self::fn(self::map, "key1");
+static const field core::Object? var5 = self::fn(self::map, "key2");
+static const field core::Object? var6 = self::fn(self::map, "key3");
+static const field core::int? var7 = self::fn2();
+static method fn(core::Map<core::Object, core::Object> map, core::Object key) → core::Object?
+  ;
+static method fn2() → core::int?
+  ;
+static method main() → void
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: MapLiteral @ org-dartlang-testcase:///const_functions_map.dart:9:17 -> InstanceConstant(const _ImmutableMap<Object*, Object*>{_ImmutableMap._kvPairs: const <dynamic>["key", "val"]})
+Evaluated: MapLiteral @ org-dartlang-testcase:///const_functions_map.dart:11:17 -> InstanceConstant(const _ImmutableMap<Object*, Object*>{_ImmutableMap._kvPairs: const <dynamic>["key", 2]})
+Evaluated: MapLiteral @ org-dartlang-testcase:///const_functions_map.dart:13:17 -> InstanceConstant(const _ImmutableMap<Object*, Object*>{_ImmutableMap._kvPairs: const <dynamic>["key", 2]})
+Evaluated: MapLiteral @ org-dartlang-testcase:///const_functions_map.dart:15:13 -> InstanceConstant(const _ImmutableMap<String*, int*>{_ImmutableMap._kvPairs: const <dynamic>["key1", 2, "key2", 3, "key3", 4]})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_map.dart:16:17 -> InstanceConstant(const _ImmutableMap<String*, int*>{_ImmutableMap._kvPairs: const <dynamic>["key1", 2, "key2", 3, "key3", 4]})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_map.dart:17:17 -> InstanceConstant(const _ImmutableMap<String*, int*>{_ImmutableMap._kvPairs: const <dynamic>["key1", 2, "key2", 3, "key3", 4]})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_functions_map.dart:18:17 -> InstanceConstant(const _ImmutableMap<String*, int*>{_ImmutableMap._kvPairs: const <dynamic>["key1", 2, "key2", 3, "key3", 4]})
+Extra constant evaluation: evaluated: 14, effectively constant: 7
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.transformed.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.transformed.expect
new file mode 100644
index 0000000..836d428
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::Object? var1 = #C1;
+static const field core::Object? var2 = #C2;
+static const field core::Object? var3 = #C3;
+static const field core::Map<core::String, core::int> map = #C10;
+static const field core::Object? var4 = #C2;
+static const field core::Object? var5 = #C6;
+static const field core::Object? var6 = #C8;
+static const field core::int? var7 = #C2;
+static method fn(core::Map<core::Object, core::Object> map, core::Object key) → core::Object? {
+  return map.{core::Map::[]}(key);
+}
+static method fn2() → core::int? {
+  return (#C13).{core::Map::[]}("key");
+}
+static method main() → void {
+  exp::Expect::equals(#C1, "val");
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C3, null);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C6, 3);
+  exp::Expect::equals(#C8, 4);
+  exp::Expect::equals(#C2, 2);
+}
+
+constants  {
+  #C1 = "val"
+  #C2 = 2
+  #C3 = null
+  #C4 = "key1"
+  #C5 = "key2"
+  #C6 = 3
+  #C7 = "key3"
+  #C8 = 4
+  #C9 = <dynamic>[#C4, #C2, #C5, #C6, #C7, #C8]
+  #C10 = core::_ImmutableMap<core::String*, core::int*> {_kvPairs:#C9}
+  #C11 = "key"
+  #C12 = <dynamic>[#C11, #C2]
+  #C13 = core::_ImmutableMap<core::String*, core::int*> {_kvPairs:#C12}
+}
diff --git a/pkg/front_end/testcases/general/function_bad_use.dart b/pkg/front_end/testcases/general/function_bad_use.dart
new file mode 100644
index 0000000..bc34051
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_bad_use.dart
@@ -0,0 +1,7 @@
+class Function {}
+
+class C<Function> {}
+
+mixin M<Function> implements List<Function> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/function_bad_use.dart.textual_outline.expect b/pkg/front_end/testcases/general/function_bad_use.dart.textual_outline.expect
new file mode 100644
index 0000000..c115bf8
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_bad_use.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+class Function {}
+
+class C<Function> {}
+
+mixin M<Function> implements List<Function> {}
+main() {}
diff --git a/pkg/front_end/testcases/general/function_bad_use.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/function_bad_use.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..675fe74c
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_bad_use.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+class C<Function> {}
+
+class Function {}
+
+main() {}
+mixin M<Function> implements List<Function> {}
diff --git a/pkg/front_end/testcases/general/function_bad_use.dart.weak.expect b/pkg/front_end/testcases/general/function_bad_use.dart.weak.expect
new file mode 100644
index 0000000..044f5c0
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_bad_use.dart.weak.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:1:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {}
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:3:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// class C<Function> {}
+//         ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:5:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// mixin M<Function> implements List<Function> {}
+//         ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Function extends core::Object {
+  synthetic constructor •() → self::Function
+    : super core::Object::•()
+    ;
+}
+class C<Function extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::Function%>
+    : super core::Object::•()
+    ;
+}
+abstract class M<Function extends core::Object? = dynamic> extends core::Object implements core::List<self::M::Function%> /*isMixinDeclaration*/  {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_bad_use.dart.weak.outline.expect b/pkg/front_end/testcases/general/function_bad_use.dart.weak.outline.expect
new file mode 100644
index 0000000..9e4f7cf
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_bad_use.dart.weak.outline.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:1:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {}
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:3:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// class C<Function> {}
+//         ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:5:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// mixin M<Function> implements List<Function> {}
+//         ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Function extends core::Object {
+  synthetic constructor •() → self::Function
+    ;
+}
+class C<Function extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::Function%>
+    ;
+}
+abstract class M<Function extends core::Object? = dynamic> extends core::Object implements core::List<self::M::Function%> /*isMixinDeclaration*/  {
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/function_bad_use.dart.weak.transformed.expect b/pkg/front_end/testcases/general/function_bad_use.dart.weak.transformed.expect
new file mode 100644
index 0000000..044f5c0
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_bad_use.dart.weak.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:1:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {}
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:3:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// class C<Function> {}
+//         ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:5:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// mixin M<Function> implements List<Function> {}
+//         ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Function extends core::Object {
+  synthetic constructor •() → self::Function
+    : super core::Object::•()
+    ;
+}
+class C<Function extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::Function%>
+    : super core::Object::•()
+    ;
+}
+abstract class M<Function extends core::Object? = dynamic> extends core::Object implements core::List<self::M::Function%> /*isMixinDeclaration*/  {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/ignore_function.dart b/pkg/front_end/testcases/general/ignore_function.dart
index 347a8e2..2e61179 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart
+++ b/pkg/front_end/testcases/general/ignore_function.dart
@@ -14,8 +14,9 @@
   operator ==(other) => false;
 }
 
+// CFE Error here: Function is built-in id, could not used as type id.
 class Function {
   core.bool operator ==(core.Object other) => false;
 }
 
-main() {}
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.weak.expect b/pkg/front_end/testcases/general/ignore_function.dart.weak.expect
index c25c94e..004e6cc 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.weak.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.weak.expect
@@ -1,4 +1,11 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:18:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {
+//       ^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.weak.outline.expect b/pkg/front_end/testcases/general/ignore_function.dart.weak.outline.expect
index 0eda64b..7b3df99 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.weak.outline.expect
@@ -1,4 +1,11 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:18:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {
+//       ^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.weak.transformed.expect b/pkg/front_end/testcases/general/ignore_function.dart.weak.transformed.expect
index c25c94e..004e6cc 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.weak.transformed.expect
@@ -1,4 +1,11 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:18:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {
+//       ^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/test_runner/bin/test_runner.dart b/pkg/test_runner/bin/test_runner.dart
index 1c2d26a..654e5f8 100644
--- a/pkg/test_runner/bin/test_runner.dart
+++ b/pkg/test_runner/bin/test_runner.dart
@@ -22,8 +22,8 @@
 ///
 /// The default test directory layout is documented in "test_suite.dart", above
 /// `factory StandardTestSuite.forDirectory`.
-import "package:test_runner/src/options.dart";
 import "package:test_runner/src/build_configurations.dart";
+import "package:test_runner/src/options.dart";
 import "package:test_runner/src/test_configurations.dart";
 
 /// Runs all of the tests specified by the given command line [arguments].
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index 5d8e490..d2807a7a4 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -7,10 +7,10 @@
 // CommandOutput.exitCode in subclasses of CommandOutput.
 import 'dart:io' as io;
 
+import 'package:dart2js_tools/deobfuscate_stack_trace.dart';
 import 'package:status_file/expectation.dart';
 import 'package:test_runner/src/repository.dart';
 import 'package:test_runner/src/static_error.dart';
-import 'package:dart2js_tools/deobfuscate_stack_trace.dart';
 
 import 'browser_controller.dart';
 import 'command.dart';
@@ -1364,7 +1364,7 @@
   /// The test runner only validates the first line of the message, and not the
   /// suggested fixes.
   static final _errorRegexp = RegExp(
-      r"^([^:]+):(\d+):(\d+): (Context|Error|Warning): (.*)$",
+      r"^(?:([^:]+):(\d+):(\d+): )?(Context|Error|Warning): (.*)$",
       multiLine: true);
 
   FastaCommandOutput(
@@ -1398,11 +1398,27 @@
       [List<StaticError> warnings]) {
     StaticError previousError;
     for (var match in regExp.allMatches(stdout)) {
-      var line = int.parse(match.group(2));
-      var column = int.parse(match.group(3));
+      var line = _parseNullableInt(match.group(2));
+      var column = _parseNullableInt(match.group(3));
       var severity = match.group(4);
       var message = match.group(5);
 
+      if (line == null) {
+        // No location information.
+        if (severity == 'Context' && previousError != null) {
+          // We can use the location information from the error message
+          line = previousError.line;
+          column = previousError.column;
+        } else {
+          // No good default location information, so disregard the error.
+          // TODO(45558): we should do something smarter here.
+          continue;
+        }
+      }
+      // Column information should have been present or it should have been
+      // filled in by the code above.
+      assert(column != null);
+
       var error = StaticError(
           severity == "Context" ? ErrorSource.context : errorSource, message,
           line: line, column: column);
@@ -1426,6 +1442,15 @@
     }
   }
 
+  /// Same as `int.parse`, but allows nulls to simply pass through.
+  static int _parseNullableInt(String s) {
+    if (s == null) {
+      // ignore: avoid_returning_null
+      return null;
+    }
+    return int.parse(s);
+  }
+
   /// Reported static errors, parsed from [stderr].
   List<StaticError> get errors {
     if (!_parsedErrors) {
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index 96be311..9fa11de 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -5,12 +5,12 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:test_runner/src/test_configurations.dart';
 import 'package:path/path.dart' as path;
 
 import 'configuration.dart';
 import 'path.dart';
 import 'repository.dart';
+import 'test_configurations.dart';
 import 'utils.dart';
 
 const _defaultTestSelectors = [
diff --git a/pkg/test_runner/test/test_runner_test.dart b/pkg/test_runner/test/test_runner_test.dart
index eea706f..3d9ab93 100644
--- a/pkg/test_runner/test/test_runner_test.dart
+++ b/pkg/test_runner/test/test_runner_test.dart
@@ -10,15 +10,14 @@
 import "dart:io";
 
 import "package:status_file/expectation.dart";
-
 import "package:test_runner/src/command.dart";
 import "package:test_runner/src/configuration.dart";
 import "package:test_runner/src/options.dart";
 import "package:test_runner/src/process_queue.dart";
 import "package:test_runner/src/repository.dart";
 import "package:test_runner/src/test_case.dart";
-import "package:test_runner/src/test_suite.dart";
 import "package:test_runner/src/test_progress.dart" as progress;
+import "package:test_runner/src/test_suite.dart";
 
 final DEFAULT_TIMEOUT = 20;
 final LONG_TIMEOUT = 30;
diff --git a/pkg/vm_service/test/async_scope_test.dart b/pkg/vm_service/test/async_scope_test.dart
index 9451c0a..f72311b 100644
--- a/pkg/vm_service/test/async_scope_test.dart
+++ b/pkg/vm_service/test/async_scope_test.dart
@@ -3,13 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:developer';
-import 'package:vm_service/vm_service.dart';
+
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
-const int LINE_A = 19;
-const int LINE_B = 25;
+const int LINE_A = 20;
+const int LINE_B = 26;
 
 foo() {}
 
diff --git a/pkg/vm_service/test/capture_stdio_test.dart b/pkg/vm_service/test/capture_stdio_test.dart
index 2edf76c..c5037d3 100644
--- a/pkg/vm_service/test/capture_stdio_test.dart
+++ b/pkg/vm_service/test/capture_stdio_test.dart
@@ -6,8 +6,10 @@
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io';
-import 'package:vm_service/vm_service.dart';
+
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/common/service_test_common.dart b/pkg/vm_service/test/common/service_test_common.dart
index 8277753..4f616ab 100644
--- a/pkg/vm_service/test/common/service_test_common.dart
+++ b/pkg/vm_service/test/common/service_test_common.dart
@@ -5,8 +5,9 @@
 library service_test_common;
 
 import 'dart:async';
-import 'package:vm_service/vm_service.dart';
+
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 typedef IsolateTest = Future<void> Function(
     VmService service, IsolateRef isolate);
diff --git a/pkg/vm_service/test/common/test_helper.dart b/pkg/vm_service/test/common/test_helper.dart
index c589177..eee241f 100644
--- a/pkg/vm_service/test/common/test_helper.dart
+++ b/pkg/vm_service/test/common/test_helper.dart
@@ -7,11 +7,14 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io' as io;
+
 import 'package:process/process.dart';
-import 'package:vm_service/vm_service_io.dart';
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+import 'package:vm_service/vm_service_io.dart';
+
 import 'service_test_common.dart';
+
 export 'service_test_common.dart' show IsolateTest, VMTest;
 
 /// The extra arguments to use
diff --git a/pkg/vm_service/test/evaluate_with_scope_test.dart b/pkg/vm_service/test/evaluate_with_scope_test.dart
index a10aeee..0ec973c 100644
--- a/pkg/vm_service/test/evaluate_with_scope_test.dart
+++ b/pkg/vm_service/test/evaluate_with_scope_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
 import 'common/test_helper.dart';
 
 int? thing1;
diff --git a/pkg/vm_service/test/file_service_test.dart b/pkg/vm_service/test/file_service_test.dart
index e8b5713..c4a08d7 100644
--- a/pkg/vm_service/test/file_service_test.dart
+++ b/pkg/vm_service/test/file_service_test.dart
@@ -7,8 +7,8 @@
 import 'dart:developer';
 import 'dart:io' as io;
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/get_allocation_profile_rpc_test.dart b/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
index 3007013..8246732 100644
--- a/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
+++ b/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/get_cpu_samples_rpc_test.dart b/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
index 37973bc..ecc6d25 100644
--- a/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
+++ b/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/get_http_profile_test.dart b/pkg/vm_service/test/get_http_profile_test.dart
index 59219fb..b111440 100644
--- a/pkg/vm_service/test/get_http_profile_test.dart
+++ b/pkg/vm_service/test/get_http_profile_test.dart
@@ -8,8 +8,9 @@
 import 'dart:io';
 import 'dart:math';
 import 'dart:typed_data';
-import 'package:vm_service/vm_service.dart';
+
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/get_stack_test.dart b/pkg/vm_service/test/get_stack_test.dart
index dc7c05d..f1df2ba 100644
--- a/pkg/vm_service/test/get_stack_test.dart
+++ b/pkg/vm_service/test/get_stack_test.dart
@@ -6,8 +6,8 @@
 
 import 'dart:developer';
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
diff --git a/pkg/vm_service/test/get_version_rpc_test.dart b/pkg/vm_service/test/get_version_rpc_test.dart
index 57be153..d8ce3d7 100644
--- a/pkg/vm_service/test/get_version_rpc_test.dart
+++ b/pkg/vm_service/test/get_version_rpc_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/heap_snapshot_graph_test.dart b/pkg/vm_service/test/heap_snapshot_graph_test.dart
index 9a65d32..09592fd 100644
--- a/pkg/vm_service/test/heap_snapshot_graph_test.dart
+++ b/pkg/vm_service/test/heap_snapshot_graph_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/object_graph_identity_hash_test.dart b/pkg/vm_service/test/object_graph_identity_hash_test.dart
index a0e8c7d..9ada6aa 100644
--- a/pkg/vm_service/test/object_graph_identity_hash_test.dart
+++ b/pkg/vm_service/test/object_graph_identity_hash_test.dart
@@ -4,8 +4,9 @@
 
 import 'dart:collection';
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
 import 'common/test_helper.dart';
 
 class Foo {}
diff --git a/pkg/vm_service/test/regress_44588_test.dart b/pkg/vm_service/test/regress_44588_test.dart
index 3f0564f..b9ab0b3 100644
--- a/pkg/vm_service/test/regress_44588_test.dart
+++ b/pkg/vm_service/test/regress_44588_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/regress_44842_test.dart b/pkg/vm_service/test/regress_44842_test.dart
index 8a794b4..f7dc88e 100644
--- a/pkg/vm_service/test/regress_44842_test.dart
+++ b/pkg/vm_service/test/regress_44842_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 const Map<String, dynamic> kNullInstance = {
   'type': '@Instance',
diff --git a/pkg/vm_service/test/rpc_error_test.dart b/pkg/vm_service/test/rpc_error_test.dart
index c9cf1be..87e8776 100644
--- a/pkg/vm_service/test/rpc_error_test.dart
+++ b/pkg/vm_service/test/rpc_error_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/set_breakpoint_state_test.dart b/pkg/vm_service/test/set_breakpoint_state_test.dart
index 7bc96ab..6149418 100644
--- a/pkg/vm_service/test/set_breakpoint_state_test.dart
+++ b/pkg/vm_service/test/set_breakpoint_state_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--verbose_debug
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
diff --git a/pkg/vm_service/test/throws_sentinel_test.dart b/pkg/vm_service/test/throws_sentinel_test.dart
index fd95bbe..b9242b3 100644
--- a/pkg/vm_service/test/throws_sentinel_test.dart
+++ b/pkg/vm_service/test/throws_sentinel_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:vm_service/vm_service.dart';
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/pkg/vm_service/test/verify_http_timeline_test.dart b/pkg/vm_service/test/verify_http_timeline_test.dart
index 033571a..ce9dbde 100644
--- a/pkg/vm_service/test/verify_http_timeline_test.dart
+++ b/pkg/vm_service/test/verify_http_timeline_test.dart
@@ -8,8 +8,9 @@
 import 'dart:io';
 import 'dart:math';
 import 'dart:typed_data';
-import 'package:vm_service/vm_service.dart';
+
 import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'common/test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/regress_45684_test.dart b/runtime/observatory/tests/service/regress_45684_test.dart
new file mode 100644
index 0000000..5a2ea97
--- /dev/null
+++ b/runtime/observatory/tests/service/regress_45684_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--verbose_debug
+
+// Check that a try/finally is not treated as a try/catch:
+// http://dartbug.com/45684.
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE_A = 25;
+
+void tryFinally(Function() code) {
+  // There is a synthetic try/catch inside try/finally but it is not authored
+  // by the user, so debugger should not consider that this try/catch is
+  // going to handle the exception.
+  try {
+    code();
+  } finally {}
+}
+
+syncThrow() {
+  throw 'Hello from syncThrow!'; // Line A.
+}
+
+testMain() {
+  tryFinally(syncThrow);
+}
+
+final tests = <IsolateTest>[
+  hasStoppedWithUnhandledException,
+  stoppedAtLine(LINE_A),
+];
+
+main([args = const <String>[]]) => runIsolateTests(args, tests,
+    testeeConcurrent: testMain, pause_on_unhandled_exceptions: true);
diff --git a/runtime/observatory/tests/service/sdk_break_with_mixin_test.dart b/runtime/observatory/tests/service/sdk_break_with_mixin_test.dart
new file mode 100644
index 0000000..620b530
--- /dev/null
+++ b/runtime/observatory/tests/service/sdk_break_with_mixin_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 mixin_step_test;
+
+import 'dart:collection';
+import 'dart:developer';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+int codeRuns = 0;
+
+code() {
+  if (++codeRuns > 1) {
+    print("Calling debugger!");
+    debugger();
+  }
+  MySet y = new MySet();
+  y.forEach((element) {
+    print(element);
+  });
+}
+
+class MySet extends Object with SetMixin {
+  bool add(value) => throw UnimplementedError();
+  bool contains(Object? element) => false;
+  Iterator get iterator => [].iterator;
+  int get length => 0;
+  lookup(Object? element) => throw UnimplementedError();
+  bool remove(Object? value) => throw UnimplementedError();
+  Set toSet() => throw UnimplementedError();
+}
+
+List<String> stops = [];
+List<String> expected = [
+  "set.dart:142:23 (sdk_break_with_mixin_test.dart:20:5)",
+];
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  markDartColonLibrariesDebuggable,
+  setBreakpointAtUriAndLine(
+      "org-dartlang-sdk:///sdk/lib/collection/set.dart", 142),
+  resumeProgramRecordingStops(stops, true),
+  checkRecordedStops(stops, expected, debugPrint: true),
+];
+
+main(args) {
+  runIsolateTests(args, tests,
+      testeeBefore: code,
+      testeeConcurrent: code,
+      pause_on_start: false,
+      pause_on_exit: true);
+}
+
diff --git a/runtime/observatory_2/tests/service_2/regress_45684_test.dart b/runtime/observatory_2/tests/service_2/regress_45684_test.dart
new file mode 100644
index 0000000..5a2ea97
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/regress_45684_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--verbose_debug
+
+// Check that a try/finally is not treated as a try/catch:
+// http://dartbug.com/45684.
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE_A = 25;
+
+void tryFinally(Function() code) {
+  // There is a synthetic try/catch inside try/finally but it is not authored
+  // by the user, so debugger should not consider that this try/catch is
+  // going to handle the exception.
+  try {
+    code();
+  } finally {}
+}
+
+syncThrow() {
+  throw 'Hello from syncThrow!'; // Line A.
+}
+
+testMain() {
+  tryFinally(syncThrow);
+}
+
+final tests = <IsolateTest>[
+  hasStoppedWithUnhandledException,
+  stoppedAtLine(LINE_A),
+];
+
+main([args = const <String>[]]) => runIsolateTests(args, tests,
+    testeeConcurrent: testMain, pause_on_unhandled_exceptions: true);
diff --git a/runtime/observatory_2/tests/service_2/sdk_break_with_mixin_test.dart b/runtime/observatory_2/tests/service_2/sdk_break_with_mixin_test.dart
new file mode 100644
index 0000000..d7b87ca
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/sdk_break_with_mixin_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 mixin_step_test;
+
+import 'dart:collection';
+import 'dart:developer';
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+int codeRuns = 0;
+
+code() {
+  if (++codeRuns > 1) {
+    print("Calling debugger!");
+    debugger();
+  }
+  MySet y = new MySet();
+  y.forEach((element) {
+    print(element);
+  });
+}
+
+class MySet extends Object with SetMixin {
+  bool add(value) => throw UnimplementedError();
+  bool contains(Object element) => false;
+  Iterator get iterator => [].iterator;
+  int get length => 0;
+  lookup(Object element) => throw UnimplementedError();
+  bool remove(Object value) => throw UnimplementedError();
+  Set toSet() => throw UnimplementedError();
+}
+
+List<String> stops = [];
+List<String> expected = [
+  "set.dart:142:23 (sdk_break_with_mixin_test.dart:21:5)",
+];
+
+var tests = <IsolateTest>[
+  // hasPausedAtStart,
+  hasStoppedAtBreakpoint,
+  markDartColonLibrariesDebuggable,
+  setBreakpointAtUriAndLine(
+      "org-dartlang-sdk:///sdk/lib/collection/set.dart", 142),
+  resumeProgramRecordingStops(stops, true),
+  // runStepIntoThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected, debugPrint: true),
+];
+
+main(args) {
+  runIsolateTests(args, tests,
+      testeeBefore: code,
+      testeeConcurrent: code,
+      pause_on_start: false,
+      pause_on_exit: true);
+}
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index e75d799..4689812 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -690,10 +690,10 @@
     TypeArgumentsPtr type_args = TypeArguments::RawCast(object);
     objects_.Add(type_args);
 
-    s->Push(type_args->untag()->instantiations_);
-    const intptr_t length = Smi::Value(type_args->untag()->length_);
+    s->Push(type_args->untag()->instantiations());
+    const intptr_t length = Smi::Value(type_args->untag()->length());
     for (intptr_t i = 0; i < length; i++) {
-      s->Push(type_args->untag()->types()[i]);
+      s->Push(type_args->untag()->element(i));
     }
   }
 
@@ -706,7 +706,7 @@
       TypeArgumentsPtr type_args = objects_[i];
       s->AssignRef(type_args);
       AutoTraceObject(type_args);
-      const intptr_t length = Smi::Value(type_args->untag()->length_);
+      const intptr_t length = Smi::Value(type_args->untag()->length());
       s->WriteUnsigned(length);
       target_memory_size_ +=
           compiler::target::TypeArguments::InstanceSize(length);
@@ -719,15 +719,16 @@
     for (intptr_t i = 0; i < count; i++) {
       TypeArgumentsPtr type_args = objects_[i];
       AutoTraceObject(type_args);
-      const intptr_t length = Smi::Value(type_args->untag()->length_);
+      const intptr_t length = Smi::Value(type_args->untag()->length());
       s->WriteUnsigned(length);
-      intptr_t hash = Smi::Value(type_args->untag()->hash_);
+      intptr_t hash = Smi::Value(type_args->untag()->hash());
       s->Write<int32_t>(hash);
-      const intptr_t nullability = Smi::Value(type_args->untag()->nullability_);
+      const intptr_t nullability =
+          Smi::Value(type_args->untag()->nullability());
       s->WriteUnsigned(nullability);
-      WriteField(type_args, instantiations_);
+      WriteField(type_args, instantiations());
       for (intptr_t j = 0; j < length; j++) {
-        s->WriteElementRef(type_args->untag()->types()[j], j);
+        s->WriteElementRef(type_args->untag()->element(j), j);
       }
     }
   }
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 68bcae0..accbb47 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -410,6 +410,9 @@
   void CompareWithFieldValue(Register value, FieldAddress address) {
     CompareWithMemoryValue(value, address);
   }
+  void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
+    CompareWithMemoryValue(value, address);
+  }
 
   void CompareWithMemoryValue(Register value, Address address) {
     ldr(TMP, address);
@@ -946,14 +949,21 @@
   // For loading indexed payloads out of tagged objects like Arrays. If the
   // payload objects are word-sized, use TIMES_HALF_WORD_SIZE if the contents of
   // [index] is a Smi, otherwise TIMES_WORD_SIZE if unboxed.
-  void LoadIndexedPayload(Register reg,
+  void LoadIndexedPayload(Register dst,
                           Register base,
                           int32_t payload_start,
                           Register index,
                           ScaleFactor scale,
                           OperandSize type = kFourBytes) {
-    add(reg, base, Operand(index, LSL, scale));
-    LoadFromOffset(reg, reg, payload_start - kHeapObjectTag, type);
+    add(dst, base, Operand(index, LSL, scale));
+    LoadFromOffset(dst, dst, payload_start - kHeapObjectTag, type);
+  }
+  void LoadIndexedCompressed(Register dst,
+                             Register base,
+                             int32_t offset,
+                             Register index) {
+    add(dst, base, Operand(index, LSL, TIMES_COMPRESSED_WORD_SIZE));
+    LoadCompressedFieldFromOffset(dst, dst, offset);
   }
   void LoadFromStack(Register dst, intptr_t depth);
   void StoreToStack(Register src, intptr_t depth);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 9953c0a..949711e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -310,8 +310,9 @@
     switch (cid) {
       case kArrayCid:
       case kImmutableArrayCid:
-      case kTypeArgumentsCid:
         return kEightBytes;
+      case kTypeArgumentsCid:
+        return kObjectBytes;
       case kOneByteStringCid:
       case kExternalOneByteStringCid:
         return kByte;
@@ -576,10 +577,15 @@
   void CompareWithFieldValue(Register value, FieldAddress address) {
     CompareWithMemoryValue(value, address);
   }
+  void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
+    CompareWithMemoryValue(value, address, kObjectBytes);
+  }
 
-  void CompareWithMemoryValue(Register value, Address address) {
-    ldr(TMP, address);
-    cmp(value, Operand(TMP));
+  void CompareWithMemoryValue(Register value,
+                              Address address,
+                              OperandSize sz = kEightBytes) {
+    ldr(TMP, address, sz);
+    cmp(value, Operand(TMP), sz);
   }
 
   void CompareTypeNullabilityWith(Register type, int8_t value) {
@@ -1707,6 +1713,13 @@
     add(dest, base, Operand(index, LSL, scale));
     LoadFromOffset(dest, dest, payload_offset - kHeapObjectTag, sz);
   }
+  void LoadIndexedCompressed(Register dest,
+                             Register base,
+                             int32_t offset,
+                             Register index) {
+    add(dest, base, Operand(index, LSL, TIMES_COMPRESSED_WORD_SIZE));
+    LoadCompressedFieldFromOffset(dest, dest, offset);
+  }
   void LoadSFromOffset(VRegister dest, Register base, int32_t offset);
   void LoadDFromOffset(VRegister dest, Register base, int32_t offset);
   void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset) {
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index a46152c..4cc8cd5 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -624,6 +624,13 @@
                           OperandSize sz = kFourBytes) {
     LoadFromOffset(dst, FieldAddress(base, index, scale, payload_offset), sz);
   }
+  void LoadIndexedCompressed(Register dst,
+                             Register base,
+                             int32_t offset,
+                             Register index) {
+    LoadCompressedField(
+        dst, FieldAddress(base, index, TIMES_COMPRESSED_WORD_SIZE, offset));
+  }
   void LoadFromStack(Register dst, intptr_t depth);
   void StoreToStack(Register src, intptr_t depth);
   void CompareToStack(Register src, intptr_t depth);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 75822c0..7627c588 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -969,6 +969,13 @@
                           OperandSize sz = kEightBytes) {
     LoadFromOffset(dst, FieldAddress(base, index, scale, payload_offset), sz);
   }
+  void LoadIndexedCompressed(Register dst,
+                             Register base,
+                             int32_t offset,
+                             Register index) {
+    LoadCompressed(
+        dst, FieldAddress(base, index, TIMES_COMPRESSED_WORD_SIZE, offset));
+  }
   void StoreFieldToOffset(Register src,
                           Register base,
                           int32_t offset,
@@ -999,6 +1006,9 @@
   }
 
   void CompareWithFieldValue(Register value, FieldAddress address) {
+    cmpq(value, address);
+  }
+  void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
     OBJ(cmp)(value, address);
   }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index e2a8d34..995ce73 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2702,7 +2702,7 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ CompareObject(kTypeArgumentsReg, Object::null_object());
     __ BranchIf(EQUAL, is_instance_lbl);
-    __ LoadFieldFromOffset(
+    __ LoadCompressedFieldFromOffset(
         kScratchReg, kTypeArgumentsReg,
         compiler::target::TypeArguments::type_at_offset(type_param.index()));
     // kScratchReg: Concrete type of type.
@@ -3036,7 +3036,7 @@
     __ BranchIf(EQUAL, done);
     // Put the instantiated type parameter into the scratch register, so its
     // TTS can be called by the caller.
-    __ LoadField(
+    __ LoadCompressedField(
         TypeTestABI::kScratchReg,
         compiler::FieldAddress(kTypeArgumentsReg,
                                compiler::target::TypeArguments::type_at_offset(
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index a0ee87a..1935dac 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1783,7 +1783,11 @@
       ASSERT(representation() == kTagged);
       ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
              (class_id() == kTypeArgumentsCid));
-      __ ldr(result, element_address);
+      if (class_id() == kTypeArgumentsCid) {
+        __ LoadCompressed(result, element_address);
+      } else {
+        __ ldr(result, element_address);
+      }
       break;
   }
 }
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 9eaa60c..e24c972 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1809,7 +1809,11 @@
       ASSERT(representation() == kTagged);
       ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
              (class_id() == kTypeArgumentsCid));
-      __ movq(result, element_address);
+      if (class_id() == kTypeArgumentsCid) {
+        __ LoadCompressed(result, element_address);
+      } else {
+        __ movq(result, element_address);
+      }
       break;
   }
 }
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index 3cb6371..6248192 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -238,8 +238,9 @@
   const intptr_t offset =
       compiler::target::TypeArguments::type_at_offset(index);
   const Slot& slot =
-      Slot(Kind::kTypeArgumentsIndex, IsImmutableBit::encode(true), kDynamicCid,
-           offset, ":argument", /*static_type=*/nullptr, kTagged);
+      Slot(Kind::kTypeArgumentsIndex,
+           IsImmutableBit::encode(true) | IsCompressedBit::encode(true),
+           kDynamicCid, offset, ":argument", /*static_type=*/nullptr, kTagged);
   return SlotCache::Instance(thread).Canonicalize(slot);
 }
 
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 8dec3c8..4465d4b 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -106,7 +106,7 @@
   V(ArgumentsDescriptor, UntaggedArray, count, Smi, FINAL)                     \
   V(ArgumentsDescriptor, UntaggedArray, size, Smi, FINAL)                      \
   V(PointerBase, UntaggedPointerBase, data_field, Dynamic, FINAL)              \
-  V(TypeArguments, UntaggedTypeArguments, length, Smi, FINAL)                  \
+  V(TypeArguments, UntaggedTypeArguments, length, Smi, FINAL_COMPRESSED)       \
   V(TypeParameter, UntaggedTypeParameter, bound, Dynamic, FINAL_COMPRESSED)    \
   V(TypeParameter, UntaggedTypeParameter, name, Dynamic, FINAL_COMPRESSED)     \
   V(UnhandledException, UntaggedUnhandledException, exception, Dynamic,        \
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5d294d8..94867c4 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2556,7 +2556,8 @@
   Fragment loop_body(more);
   loop_body += LoadLocal(info.type_parameters);
   loop_body += LoadLocal(info.vars->current_param_index);
-  loop_body += LoadIndexed(kTypeArgumentsCid);
+  loop_body += LoadIndexed(
+      kTypeArgumentsCid, /*index_scale*/ compiler::target::kCompressedWordSize);
   LocalVariable* current_param = MakeTemporary("current_param");  // Read-only.
 
   // One read-only local variable on stack (param) to drop after joining.
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 0db035c..182ae35 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -473,8 +473,9 @@
   switch (cid) {
     case kArrayCid:
     case kImmutableArrayCid:
-    case kTypeArgumentsCid:
       return kWordSize;
+    case kTypeArgumentsCid:
+      return kCompressedWordSize;
     case kOneByteStringCid:
       return dart::OneByteString::kBytesPerElement;
     case kTwoByteStringCid:
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index de71523..519bf31 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -297,6 +297,12 @@
 static constexpr word kBitsPerWordLog2 = kWordSizeLog2 + kBitsPerByteLog2;
 static constexpr word kBitsPerWord = 1 << kBitsPerWordLog2;
 
+#if !defined(DART_COMPRESSED_POINTERS)
+static constexpr int kCompressedWordSize = kWordSize;
+#else
+static constexpr int kCompressedWordSize = sizeof(uint32_t);
+#endif
+
 using ObjectAlignment = dart::ObjectAlignment<kWordSize, kWordSizeLog2>;
 
 constexpr word kWordMax = (static_cast<uword>(1) << (kBitsPerWord - 1)) - 1;
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 1337ee3..74b682a 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -2221,7 +2221,7 @@
     SubtypeTestCache_kTestEntryLength = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
 static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -2569,10 +2569,10 @@
     43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
-static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
+static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
-    32;
-static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+    20;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
 static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
 static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
@@ -2598,8 +2598,8 @@
 static constexpr dart::compiler::target::word Array_elements_start_offset = 24;
 static constexpr dart::compiler::target::word Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    TypeArguments_elements_start_offset = 40;
-static constexpr dart::compiler::target::word TypeArguments_element_size = 8;
+    TypeArguments_elements_start_offset = 24;
+static constexpr dart::compiler::target::word TypeArguments_element_size = 4;
 static constexpr dart::compiler::target::word ClassTable_elements_start_offset =
     0;
 static constexpr dart::compiler::target::word ClassTable_element_size = 1;
@@ -2694,7 +2694,7 @@
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
@@ -2762,7 +2762,7 @@
     SubtypeTestCache_kTestEntryLength = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
 static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -3110,10 +3110,10 @@
     43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
-static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
+static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
-    32;
-static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+    20;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
 static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
 static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
@@ -3139,8 +3139,8 @@
 static constexpr dart::compiler::target::word Array_elements_start_offset = 24;
 static constexpr dart::compiler::target::word Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    TypeArguments_elements_start_offset = 40;
-static constexpr dart::compiler::target::word TypeArguments_element_size = 8;
+    TypeArguments_elements_start_offset = 24;
+static constexpr dart::compiler::target::word TypeArguments_element_size = 4;
 static constexpr dart::compiler::target::word ClassTable_elements_start_offset =
     0;
 static constexpr dart::compiler::target::word ClassTable_element_size = 1;
@@ -3236,7 +3236,7 @@
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
@@ -5434,7 +5434,7 @@
     SubtypeTestCache_kTestEntryLength = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
 static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -5779,10 +5779,10 @@
     43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
-static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
+static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
-    32;
-static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+    20;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
 static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
 static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
@@ -5808,8 +5808,8 @@
 static constexpr dart::compiler::target::word Array_elements_start_offset = 24;
 static constexpr dart::compiler::target::word Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    TypeArguments_elements_start_offset = 40;
-static constexpr dart::compiler::target::word TypeArguments_element_size = 8;
+    TypeArguments_elements_start_offset = 24;
+static constexpr dart::compiler::target::word TypeArguments_element_size = 4;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
@@ -5901,7 +5901,7 @@
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
@@ -5969,7 +5969,7 @@
     SubtypeTestCache_kTestEntryLength = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
 static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -6314,10 +6314,10 @@
     43;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
-static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
+static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
-    32;
-static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+    20;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
 static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
 static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
@@ -6343,8 +6343,8 @@
 static constexpr dart::compiler::target::word Array_elements_start_offset = 24;
 static constexpr dart::compiler::target::word Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    TypeArguments_elements_start_offset = 40;
-static constexpr dart::compiler::target::word TypeArguments_element_size = 8;
+    TypeArguments_elements_start_offset = 24;
+static constexpr dart::compiler::target::word TypeArguments_element_size = 4;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
@@ -6437,7 +6437,7 @@
     TransferableTypedData_InstanceSize = 8;
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
@@ -8310,7 +8310,7 @@
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
 static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -8690,11 +8690,11 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
-    16;
+    12;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_nullability_offset = 32;
+    AOT_TypeArguments_nullability_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
     28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
@@ -8727,9 +8727,9 @@
     24;
 static constexpr dart::compiler::target::word AOT_Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_elements_start_offset = 40;
+    AOT_TypeArguments_elements_start_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypeArguments_element_size =
-    8;
+    4;
 static constexpr dart::compiler::target::word
     AOT_ClassTable_elements_start_offset = 0;
 static constexpr dart::compiler::target::word AOT_ClassTable_element_size = 1;
@@ -8836,7 +8836,7 @@
     16;
 static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
@@ -8910,7 +8910,7 @@
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
 static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -9290,11 +9290,11 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
-    16;
+    12;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_nullability_offset = 32;
+    AOT_TypeArguments_nullability_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
     28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
@@ -9327,9 +9327,9 @@
     24;
 static constexpr dart::compiler::target::word AOT_Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_elements_start_offset = 40;
+    AOT_TypeArguments_elements_start_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypeArguments_element_size =
-    8;
+    4;
 static constexpr dart::compiler::target::word
     AOT_ClassTable_elements_start_offset = 0;
 static constexpr dart::compiler::target::word AOT_ClassTable_element_size = 1;
@@ -9437,7 +9437,7 @@
     16;
 static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
@@ -11292,7 +11292,7 @@
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
 static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -11668,11 +11668,11 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
-    16;
+    12;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_nullability_offset = 32;
+    AOT_TypeArguments_nullability_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
     28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
@@ -11705,9 +11705,9 @@
     24;
 static constexpr dart::compiler::target::word AOT_Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_elements_start_offset = 40;
+    AOT_TypeArguments_elements_start_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypeArguments_element_size =
-    8;
+    4;
 static constexpr dart::compiler::target::word AOT_Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
@@ -11811,7 +11811,7 @@
     16;
 static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
@@ -11885,7 +11885,7 @@
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
 static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
-    134217727;
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -12261,11 +12261,11 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
-    16;
+    12;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_nullability_offset = 32;
+    AOT_TypeArguments_nullability_offset = 20;
 static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
     28;
 static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
@@ -12298,9 +12298,9 @@
     24;
 static constexpr dart::compiler::target::word AOT_Array_element_size = 8;
 static constexpr dart::compiler::target::word
-    AOT_TypeArguments_elements_start_offset = 40;
+    AOT_TypeArguments_elements_start_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypeArguments_element_size =
-    8;
+    4;
 static constexpr dart::compiler::target::word AOT_Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
@@ -12405,7 +12405,7 @@
     16;
 static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
-    40;
+    24;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index 0058e1a..604aeaa 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -358,7 +358,7 @@
   __ CompareObject(scratch2_reg, Object::null_object());
   // If the arguments are null, then unwrapping gives dynamic, a top type.
   __ BranchIf(EQUAL, &is_top_type, compiler::Assembler::kNearJump);
-  __ LoadField(
+  __ LoadCompressedField(
       scratch1_reg,
       compiler::FieldAddress(
           scratch2_reg, compiler::target::TypeArguments::type_at_offset(0)));
@@ -457,7 +457,7 @@
     // If the arguments are null, then unwrapping gives the dynamic type,
     // which can take null.
     __ BranchIf(EQUAL, &is_assignable);
-    __ LoadField(
+    __ LoadCompressedField(
         kCurrentTypeReg,
         compiler::FieldAddress(
             kScratchReg, compiler::target::TypeArguments::type_at_offset(0)));
@@ -483,9 +483,9 @@
       // Resolve the type parameter to its instantiated type and loop.
       __ LoadFieldFromOffset(kIndexReg, kCurrentTypeReg,
                              target::TypeParameter::index_offset(), kTwoBytes);
-      __ LoadIndexedPayload(kCurrentTypeReg, tav,
-                            target::TypeArguments::types_offset(), kIndexReg,
-                            TIMES_WORD_SIZE);
+      __ LoadIndexedCompressed(kCurrentTypeReg, tav,
+                               target::TypeArguments::types_offset(),
+                               kIndexReg);
       __ Jump(&check_null_assignable);
     };
 
@@ -598,9 +598,9 @@
     // instantiated type's TTS.
     __ LoadFieldFromOffset(TypeTestABI::kScratchReg, TypeTestABI::kDstTypeReg,
                            target::TypeParameter::index_offset(), kTwoBytes);
-    __ LoadIndexedPayload(TypeTestABI::kScratchReg, tav,
-                          target::TypeArguments::types_offset(),
-                          TypeTestABI::kScratchReg, TIMES_WORD_SIZE);
+    __ LoadIndexedCompressed(TypeTestABI::kScratchReg, tav,
+                             target::TypeArguments::types_offset(),
+                             TypeTestABI::kScratchReg);
     __ Jump(FieldAddress(
         TypeTestABI::kScratchReg,
         target::AbstractType::type_test_stub_entry_point_offset()));
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 0d7cacc..c3492c4 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -3459,8 +3459,9 @@
 void StubCodeCompiler::GenerateInstantiateTypeArgumentsStub(
     Assembler* assembler) {
   // Lookup cache before calling runtime.
-  __ LoadFieldFromOffset(R0, InstantiationABI::kUninstantiatedTypeArgumentsReg,
-                         target::TypeArguments::instantiations_offset());
+  __ LoadCompressedFieldFromOffset(
+      R0, InstantiationABI::kUninstantiatedTypeArgumentsReg,
+      target::TypeArguments::instantiations_offset());
   __ AddImmediate(R0, Array::data_offset() - kHeapObjectTag);
   // The instantiations cache is initialized with Object::zero_array() and is
   // therefore guaranteed to contain kNoInstantiator. No length check needed.
@@ -3513,10 +3514,12 @@
   // Return the instantiator type arguments if its nullability is compatible for
   // sharing, otherwise proceed to instantiation cache lookup.
   compiler::Label cache_lookup;
-  __ LoadFieldFromOffset(R0, InstantiationABI::kUninstantiatedTypeArgumentsReg,
-                         target::TypeArguments::nullability_offset());
-  __ LoadFieldFromOffset(R4, InstantiationABI::kInstantiatorTypeArgumentsReg,
-                         target::TypeArguments::nullability_offset());
+  __ LoadCompressedSmi(
+      R0, FieldAddress(InstantiationABI::kUninstantiatedTypeArgumentsReg,
+                       target::TypeArguments::nullability_offset()));
+  __ LoadCompressedSmi(
+      R4, FieldAddress(InstantiationABI::kInstantiatorTypeArgumentsReg,
+                       target::TypeArguments::nullability_offset()));
   __ and_(R4, R4, Operand(R0));
   __ cmp(R4, Operand(R0));
   __ b(&cache_lookup, NE);
@@ -3533,10 +3536,12 @@
   // Return the function type arguments if its nullability is compatible for
   // sharing, otherwise proceed to instantiation cache lookup.
   compiler::Label cache_lookup;
-  __ LoadFieldFromOffset(R0, InstantiationABI::kUninstantiatedTypeArgumentsReg,
-                         target::TypeArguments::nullability_offset());
-  __ LoadFieldFromOffset(R4, InstantiationABI::kFunctionTypeArgumentsReg,
-                         target::TypeArguments::nullability_offset());
+  __ LoadCompressedSmi(
+      R0, FieldAddress(InstantiationABI::kUninstantiatedTypeArgumentsReg,
+                       target::TypeArguments::nullability_offset()));
+  __ LoadCompressedSmi(
+      R4, FieldAddress(InstantiationABI::kFunctionTypeArgumentsReg,
+                       target::TypeArguments::nullability_offset()));
   __ and_(R4, R4, Operand(R0));
   __ cmp(R4, Operand(R0));
   __ b(&cache_lookup, NE);
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 611e083..d6b0a51 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -3388,9 +3388,9 @@
 void StubCodeCompiler::GenerateInstantiateTypeArgumentsStub(
     Assembler* assembler) {
   // Lookup cache before calling runtime.
-  __ movq(RAX, compiler::FieldAddress(
-                   InstantiationABI::kUninstantiatedTypeArgumentsReg,
-                   target::TypeArguments::instantiations_offset()));
+  __ LoadCompressed(RAX, compiler::FieldAddress(
+                             InstantiationABI::kUninstantiatedTypeArgumentsReg,
+                             target::TypeArguments::instantiations_offset()));
   __ leaq(RAX, compiler::FieldAddress(RAX, Array::data_offset()));
 
   // The instantiations cache is initialized with Object::zero_array() and is
@@ -3446,12 +3446,13 @@
   // Return the instantiator type arguments if its nullability is compatible for
   // sharing, otherwise proceed to instantiation cache lookup.
   compiler::Label cache_lookup;
-  __ movq(RAX, compiler::FieldAddress(
-                   InstantiationABI::kUninstantiatedTypeArgumentsReg,
-                   target::TypeArguments::nullability_offset()));
-  __ movq(RDI, compiler::FieldAddress(
-                   InstantiationABI::kInstantiatorTypeArgumentsReg,
-                   target::TypeArguments::nullability_offset()));
+  __ LoadCompressedSmi(
+      RAX,
+      compiler::FieldAddress(InstantiationABI::kUninstantiatedTypeArgumentsReg,
+                             target::TypeArguments::nullability_offset()));
+  __ LoadCompressedSmi(RDI, compiler::FieldAddress(
+                                InstantiationABI::kInstantiatorTypeArgumentsReg,
+                                target::TypeArguments::nullability_offset()));
   __ andq(RDI, RAX);
   __ cmpq(RDI, RAX);
   __ j(NOT_EQUAL, &cache_lookup, compiler::Assembler::kNearJump);
@@ -3468,12 +3469,13 @@
   // Return the function type arguments if its nullability is compatible for
   // sharing, otherwise proceed to instantiation cache lookup.
   compiler::Label cache_lookup;
-  __ movq(RAX, compiler::FieldAddress(
-                   InstantiationABI::kUninstantiatedTypeArgumentsReg,
-                   target::TypeArguments::nullability_offset()));
-  __ movq(RDI,
-          compiler::FieldAddress(InstantiationABI::kFunctionTypeArgumentsReg,
-                                 target::TypeArguments::nullability_offset()));
+  __ LoadCompressedSmi(
+      RAX,
+      compiler::FieldAddress(InstantiationABI::kUninstantiatedTypeArgumentsReg,
+                             target::TypeArguments::nullability_offset()));
+  __ LoadCompressedSmi(
+      RDI, compiler::FieldAddress(InstantiationABI::kFunctionTypeArgumentsReg,
+                                  target::TypeArguments::nullability_offset()));
   __ andq(RDI, RAX);
   __ cmpq(RDI, RAX);
   __ j(NOT_EQUAL, &cache_lookup, compiler::Assembler::kNearJump);
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index be35d85..9bb97a5 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -760,6 +760,11 @@
 #else
 #error "Unexpected word size"
 #endif
+#if !defined(DART_COMPRESSED_POINTERS)
+  TIMES_COMPRESSED_WORD_SIZE = TIMES_WORD_SIZE,
+#else
+#error Cannot compress ARM32
+#endif
 };
 
 // The class Instr enables access to individual fields defined in the ARM
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index cf35be9..0ce8f19 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -1112,6 +1112,11 @@
 #else
 #error "Unexpected word size"
 #endif
+#if !defined(DART_COMPRESSED_POINTERS)
+  TIMES_COMPRESSED_WORD_SIZE = TIMES_WORD_SIZE,
+#else
+  TIMES_COMPRESSED_WORD_SIZE = TIMES_HALF_WORD_SIZE,
+#endif
 };
 
 // The class Instr enables access to individual fields defined in the ARM
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 33096bb..1e95ec1 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -236,6 +236,11 @@
 #else
 #error "Unexpected word size"
 #endif
+#if !defined(DART_COMPRESSED_POINTERS)
+  TIMES_COMPRESSED_WORD_SIZE = TIMES_WORD_SIZE,
+#else
+#error Cannot compress IA32
+#endif
 };
 
 class Instr {
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index ac85998..f2ae0ad 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -318,6 +318,11 @@
 #else
 #error "Unexpected word size"
 #endif
+#if !defined(DART_COMPRESSED_POINTERS)
+  TIMES_COMPRESSED_WORD_SIZE = TIMES_WORD_SIZE,
+#else
+  TIMES_COMPRESSED_WORD_SIZE = TIMES_HALF_WORD_SIZE,
+#endif
 };
 
 #define R(reg) (1 << (reg))
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index cfa5e5e..9fc8ea7 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -57,15 +57,16 @@
 #ifndef PRODUCT
 
 // Create an unresolved breakpoint in given token range and script.
-BreakpointLocation::BreakpointLocation(Debugger* debugger,
-                                       const Script& script,
-                                       TokenPosition token_pos,
-                                       TokenPosition end_token_pos,
-                                       intptr_t requested_line_number,
-                                       intptr_t requested_column_number)
+BreakpointLocation::BreakpointLocation(
+    Debugger* debugger,
+    const GrowableHandlePtrArray<const Script>& scripts,
+    TokenPosition token_pos,
+    TokenPosition end_token_pos,
+    intptr_t requested_line_number,
+    intptr_t requested_column_number)
     : debugger_(debugger),
-      script_(script.ptr()),
-      url_(script.url()),
+      scripts_(MallocGrowableArray<ScriptPtr>(scripts.length())),
+      url_(scripts.At(0).url()),
       line_number_lock_(new SafepointRwLock()),
       line_number_(-1),  // lazily computed
       token_pos_(token_pos),
@@ -75,8 +76,11 @@
       requested_line_number_(requested_line_number),
       requested_column_number_(requested_column_number),
       code_token_pos_(TokenPosition::kNoSource) {
-  ASSERT(!script.IsNull());
+  ASSERT(scripts.length() > 0);
   ASSERT(token_pos_.IsReal());
+  for (intptr_t i = 0; i < scripts.length(); ++i) {
+    scripts_.Add(scripts.At(i).ptr());
+  }
 }
 
 // Create a latent breakpoint at given url and line number.
@@ -85,7 +89,7 @@
                                        intptr_t requested_line_number,
                                        intptr_t requested_column_number)
     : debugger_(debugger),
-      script_(Script::null()),
+      scripts_(MallocGrowableArray<ScriptPtr>(0)),
       url_(url.ptr()),
       line_number_lock_(new SafepointRwLock()),
       line_number_(-1),  // lazily computed
@@ -121,8 +125,13 @@
 
 void BreakpointLocation::SetResolved(const Function& func,
                                      TokenPosition token_pos) {
+#if defined(DEBUG)
+  const Script& func_script = Script::Handle(func.script());
+  const String& func_url = String::Handle(func_script.url());
+  const String& script_url = String::Handle(url_);
+  ASSERT(script_url.Equals(func_url));
+#endif  // defined(DEBUG)
   ASSERT(!IsLatent());
-  ASSERT(func.script() == script_);
   ASSERT(token_pos.IsWithin(func.token_pos(), func.end_token_pos()));
   ASSERT(func.is_debuggable());
   token_pos_ = token_pos;
@@ -167,7 +176,9 @@
 }
 
 void BreakpointLocation::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&script_));
+  for (intptr_t i = 0; i < scripts_.length(); ++i) {
+    visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&scripts_.data()[i]));
+  }
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&url_));
 
   Breakpoint* bpt = conditions_;
@@ -209,8 +220,7 @@
   BufferFormatter f(buffer, sizeof(buffer));
   // Pick the first, all other should have same script/line number.
   BreakpointLocation* breakpoint_location = breakpoint_locations_.At(0);
-  Script& script = Script::Handle(breakpoint_location->script());
-  String& source_url = String::Handle(script.url());
+  String& source_url = String::Handle(breakpoint_location->url());
   intptr_t line_number = breakpoint_location->line_number();
 
   f.Printf("breakpoint at %s:%" Pd, source_url.ToCString(), line_number);
@@ -435,14 +445,16 @@
 // Returns true if the function |func| overlaps the token range
 // [|token_pos|, |end_token_pos|] in |script|.
 static bool FunctionOverlaps(const Function& func,
-                             const Script& script,
+                             const String& script_url,
                              TokenPosition token_pos,
                              TokenPosition end_token_pos) {
   const TokenPosition& func_start = func.token_pos();
   if (token_pos.IsWithin(func_start, func.end_token_pos()) ||
       func_start.IsWithin(token_pos, end_token_pos)) {
     // Check script equality last because it allocates handles as a side effect.
-    return func.script() == script.ptr();
+    Script& func_script = Script::Handle(func.script());
+    String& url = String::Handle(func_script.url());
+    return script_url.Equals(url);
   }
   return false;
 }
@@ -776,8 +788,9 @@
     // Detect circles in the exception handler data.
     num_handlers_checked++;
     ASSERT(num_handlers_checked <= handlers.num_entries());
-    // Only consider user written handlers for async methods.
-    if (!is_async || !handlers.IsGenerated(try_index)) {
+    // Only consider user written handlers and ignore synthesized try/catch in
+    // async methods as well as synthetic try/catch hiding inside try/finally.
+    if (!handlers.IsGenerated(try_index)) {
       handled_types = handlers.GetHandledTypes(try_index);
       const intptr_t num_types = handled_types.Length();
       for (intptr_t k = 0; k < num_types; k++) {
@@ -2587,67 +2600,72 @@
 }
 
 void Debugger::FindCompiledFunctions(
-    const Script& script,
+    const GrowableHandlePtrArray<const Script>& scripts,
     TokenPosition start_pos,
     TokenPosition end_pos,
     GrowableObjectArray* code_function_list) {
   auto thread = Thread::Current();
   auto zone = thread->zone();
-
-  ClosureFunctionsCache::ForAllClosureFunctions([&](const Function& function) {
-    ASSERT(!function.IsNull());
-    if ((function.token_pos() == start_pos) &&
-        (function.end_token_pos() == end_pos) &&
-        (function.script() == script.ptr())) {
-      if (function.is_debuggable() && function.HasCode()) {
-        code_function_list->Add(function);
-      }
-      ASSERT(!function.HasImplicitClosureFunction());
-    }
-    return true;  // Continue iteration.
-  });
-
-  Class& cls = Class::Handle(zone);
-  Function& function = Function::Handle(zone);
-  Array& functions = Array::Handle(zone);
-
-  const ClassTable& class_table = *isolate_->group()->class_table();
-  const intptr_t num_classes = class_table.NumCids();
-  const intptr_t num_tlc_classes = class_table.NumTopLevelCids();
-  for (intptr_t i = 1; i < num_classes + num_tlc_classes; i++) {
-    const classid_t cid =
-        i < num_classes ? i : ClassTable::CidFromTopLevelIndex(i - num_classes);
-    if (class_table.HasValidClassAt(cid)) {
-      cls = class_table.At(cid);
-      // If the class is not finalized, e.g. if it hasn't been parsed
-      // yet entirely, we can ignore it. If it contains a function with
-      // an unresolved breakpoint, we will detect it if and when the
-      // function gets compiled.
-      if (!cls.is_finalized()) {
-        continue;
-      }
-      // Note: we need to check the functions of this class even if
-      // the class is defined in a different 'script'. There could
-      // be mixin functions from the given script in this class.
-      functions = cls.current_functions();
-      if (!functions.IsNull()) {
-        const intptr_t num_functions = functions.Length();
-        for (intptr_t pos = 0; pos < num_functions; pos++) {
-          function ^= functions.At(pos);
+  Script& script = Script::Handle(zone);
+  for (intptr_t i = 0; i < scripts.length(); ++i) {
+    script = scripts.At(i).ptr();
+    ClosureFunctionsCache::ForAllClosureFunctions(
+        [&](const Function& function) {
           ASSERT(!function.IsNull());
-          bool function_added = false;
-          if (function.is_debuggable() && function.HasCode() &&
-              function.token_pos() == start_pos &&
-              function.end_token_pos() == end_pos &&
-              function.script() == script.ptr()) {
-            code_function_list->Add(function);
-            function_added = true;
-          }
-          if (function_added && function.HasImplicitClosureFunction()) {
-            function = function.ImplicitClosureFunction();
+          if ((function.token_pos() == start_pos) &&
+              (function.end_token_pos() == end_pos) &&
+              (function.script() == script.ptr())) {
             if (function.is_debuggable() && function.HasCode()) {
               code_function_list->Add(function);
             }
+            ASSERT(!function.HasImplicitClosureFunction());
+          }
+          return true;  // Continue iteration.
+        });
+
+    Class& cls = Class::Handle(zone);
+    Function& function = Function::Handle(zone);
+    Array& functions = Array::Handle(zone);
+
+    const ClassTable& class_table = *isolate_->group()->class_table();
+    const intptr_t num_classes = class_table.NumCids();
+    const intptr_t num_tlc_classes = class_table.NumTopLevelCids();
+    for (intptr_t i = 1; i < num_classes + num_tlc_classes; i++) {
+      const classid_t cid =
+          i < num_classes ? i
+                          : ClassTable::CidFromTopLevelIndex(i - num_classes);
+      if (class_table.HasValidClassAt(cid)) {
+        cls = class_table.At(cid);
+        // If the class is not finalized, e.g. if it hasn't been parsed
+        // yet entirely, we can ignore it. If it contains a function with
+        // an unresolved breakpoint, we will detect it if and when the
+        // function gets compiled.
+        if (!cls.is_finalized()) {
+          continue;
+        }
+        // Note: we need to check the functions of this class even if
+        // the class is defined in a different 'script'. There could
+        // be mixin functions from the given script in this class.
+        functions = cls.current_functions();
+        if (!functions.IsNull()) {
+          const intptr_t num_functions = functions.Length();
+          for (intptr_t pos = 0; pos < num_functions; pos++) {
+            function ^= functions.At(pos);
+            ASSERT(!function.IsNull());
+            bool function_added = false;
+            if (function.is_debuggable() && function.HasCode() &&
+                function.token_pos() == start_pos &&
+                function.end_token_pos() == end_pos &&
+                function.script() == script.ptr()) {
+              code_function_list->Add(function);
+              function_added = true;
+            }
+            if (function_added && function.HasImplicitClosureFunction()) {
+              function = function.ImplicitClosureFunction();
+              if (function.is_debuggable() && function.HasCode()) {
+                code_function_list->Add(function);
+              }
+            }
           }
         }
       }
@@ -2710,8 +2728,9 @@
       continue;
     }
 
+    const String& script_url = String::Handle(zone, script.url());
     ClosureFunctionsCache::ForAllClosureFunctions([&](const Function& fun) {
-      if (FunctionOverlaps(fun, script, token_pos, last_token_pos)) {
+      if (FunctionOverlaps(fun, script_url, token_pos, last_token_pos)) {
         // Select the inner most closure.
         UpdateBestFit(best_fit, fun);
       }
@@ -2767,7 +2786,8 @@
             // location.
             continue;
           }
-          if (FunctionOverlaps(function, script, token_pos, last_token_pos)) {
+          if (FunctionOverlaps(function, script_url, token_pos,
+                               last_token_pos)) {
             // Closures and inner functions within a class method are not
             // present in the functions of a class. Hence, we can return
             // right away as looking through other functions of a class
@@ -2812,7 +2832,7 @@
 }
 
 BreakpointLocation* Debugger::SetCodeBreakpoints(
-    const Script& script,
+    const GrowableHandlePtrArray<const Script>& scripts,
     TokenPosition token_pos,
     TokenPosition last_token_pos,
     intptr_t requested_line,
@@ -2826,15 +2846,16 @@
   if (!breakpoint_pos.IsReal()) {
     return nullptr;
   }
+  const String& script_url = String::Handle(scripts.At(0).url());
   BreakpointLocation* loc =
-      GetResolvedBreakpointLocation(script, breakpoint_pos);
+      GetResolvedBreakpointLocation(script_url, breakpoint_pos);
   if (loc == nullptr) {
     // Find an existing unresolved breakpoint location.
-    loc = GetBreakpointLocation(script, token_pos, requested_line,
+    loc = GetBreakpointLocation(script_url, token_pos, requested_line,
                                 requested_column);
   }
-  if (loc == NULL) {
-    loc = new BreakpointLocation(this, script, breakpoint_pos, breakpoint_pos,
+  if (loc == nullptr) {
+    loc = new BreakpointLocation(this, scripts, breakpoint_pos, breakpoint_pos,
                                  requested_line, requested_column);
     RegisterBreakpointLocation(loc);
   }
@@ -2856,7 +2877,8 @@
   if (FLAG_verbose_debug) {
     intptr_t line_number = -1;
     intptr_t column_number = -1;
-    script.GetTokenLocation(breakpoint_pos, &line_number, &column_number);
+    scripts.At(0).GetTokenLocation(breakpoint_pos, &line_number,
+                                   &column_number);
     OS::PrintErr("Resolved code breakpoint for function '%s' at line %" Pd
                  " col %" Pd "\n",
                  func.ToFullyQualifiedCString(), line_number, column_number);
@@ -2876,7 +2898,21 @@
                                             intptr_t requested_line,
                                             intptr_t requested_column,
                                             const Function& function) {
+  GrowableHandlePtrArray<const Script> scripts(Thread::Current()->zone(), 1);
+  scripts.Add(script);
+  return SetBreakpoint(scripts, token_pos, last_token_pos, requested_line,
+                       requested_column, function);
+}
+
+BreakpointLocation* Debugger::SetBreakpoint(
+    const GrowableHandlePtrArray<const Script>& scripts,
+    TokenPosition token_pos,
+    TokenPosition last_token_pos,
+    intptr_t requested_line,
+    intptr_t requested_column,
+    const Function& function) {
   Function& func = Function::Handle();
+  const Script& script = scripts.At(0);
   if (function.IsNull()) {
     if (!FindBestFit(script, token_pos, last_token_pos, &func)) {
       return NULL;
@@ -2896,7 +2932,7 @@
     // function we found.
     GrowableObjectArray& code_functions =
         GrowableObjectArray::Handle(GrowableObjectArray::New());
-    FindCompiledFunctions(script, func.token_pos(), func.end_token_pos(),
+    FindCompiledFunctions(scripts, func.token_pos(), func.end_token_pos(),
                           &code_functions);
 
     if (code_functions.Length() > 0) {
@@ -2913,7 +2949,7 @@
       }
       DeoptimizeWorld();
       BreakpointLocation* loc =
-          SetCodeBreakpoints(script, token_pos, last_token_pos, requested_line,
+          SetCodeBreakpoints(scripts, token_pos, last_token_pos, requested_line,
                              requested_column, exact_token_pos, code_functions);
       if (loc != NULL) {
         return loc;
@@ -2939,10 +2975,11 @@
           func.ToFullyQualifiedCString(), line_number, column_number);
     }
   }
+  const String& script_url = String::Handle(script.url());
   BreakpointLocation* loc =
-      GetBreakpointLocation(script, token_pos, -1, requested_column);
+      GetBreakpointLocation(script_url, token_pos, -1, requested_column);
   if (loc == NULL) {
-    loc = new BreakpointLocation(this, script, token_pos, last_token_pos,
+    loc = new BreakpointLocation(this, scripts, token_pos, last_token_pos,
                                  requested_line, requested_column);
     RegisterBreakpointLocation(loc);
   }
@@ -3074,7 +3111,7 @@
     intptr_t column_number) {
   Zone* zone = Thread::Current()->zone();
   Library& lib = Library::Handle(zone);
-  Script& script = Script::Handle(zone);
+  GrowableHandlePtrArray<const Script> scripts(zone, 1);
   const GrowableObjectArray& libs = GrowableObjectArray::Handle(
       isolate_->group()->object_store()->libraries());
   bool is_package = script_url.StartsWith(Symbols::PackageScheme());
@@ -3087,18 +3124,10 @@
     lib.EnsureTopLevelClassIsFinalized();
     script_for_lib = lib.LookupScript(script_url, !is_package);
     if (!script_for_lib.IsNull()) {
-      if (script.IsNull()) {
-        script = script_for_lib.ptr();
-      } else if (script.ptr() != script_for_lib.ptr()) {
-        if (FLAG_verbose_debug) {
-          OS::PrintErr("Multiple scripts match url '%s'\n",
-                       script_url.ToCString());
-        }
-        return NULL;
-      }
+      scripts.Add(script_for_lib);
     }
   }
-  if (script.IsNull()) {
+  if (scripts.length() == 0) {
     // No script found with given url. Create a latent breakpoint which
     // will be set if the url is loaded later.
     BreakpointLocation* latent_bpt =
@@ -3113,7 +3142,9 @@
   }
   TokenPosition first_token_idx = TokenPosition::kNoSource;
   TokenPosition last_token_idx = TokenPosition::kNoSource;
-  script.TokenRangeAtLine(line_number, &first_token_idx, &last_token_idx);
+  // Assume all scripts with the same URL have the same token positions.
+  scripts.At(0).TokenRangeAtLine(line_number, &first_token_idx,
+                                 &last_token_idx);
   if (!first_token_idx.IsReal()) {
     // Script does not contain the given line number.
     if (FLAG_verbose_debug) {
@@ -3133,7 +3164,7 @@
   BreakpointLocation* loc = NULL;
   ASSERT(first_token_idx <= last_token_idx);
   while ((loc == NULL) && (first_token_idx <= last_token_idx)) {
-    loc = SetBreakpoint(script, first_token_idx, last_token_idx, line_number,
+    loc = SetBreakpoint(scripts, first_token_idx, last_token_idx, line_number,
                         column_number, Function::Handle());
     first_token_idx = first_token_idx.Next();
   }
@@ -3174,8 +3205,8 @@
 bool GroupDebugger::EnsureLocationIsInFunction(Zone* zone,
                                                const Function& function,
                                                BreakpointLocation* location) {
-  const Script& script = Script::Handle(zone, location->script());
-  if (!FunctionOverlaps(function, script, location->token_pos(),
+  const String& url = String::Handle(zone, location->url());
+  if (!FunctionOverlaps(function, url, location->token_pos(),
                         location->end_token_pos())) {
     return false;
   }
@@ -3187,6 +3218,7 @@
     // Narrow down the token position range to a single value
     // if requested column number is provided so that inner
     // Closure won't be missed.
+    const Script& script = Script::Handle(location->script());
     token_pos = FindExactTokenPosition(script, token_pos,
                                        location->requested_column_number());
   }
@@ -3730,11 +3762,11 @@
 bool GroupDebugger::HasBreakpoint(Thread* thread, const Function& function) {
   if (RunUnderReadLockIfNeeded(thread, breakpoint_locations_lock(), [&]() {
         // Check if function has any breakpoints.
-        Script& script = Script::Handle(thread->zone());
+        String& url = String::Handle(thread->zone());
         for (intptr_t i = 0; i < breakpoint_locations_.length(); i++) {
           BreakpointLocation* location = breakpoint_locations_.At(i);
-          script = location->script();
-          if (FunctionOverlaps(function, script, location->token_pos(),
+          url = location->url();
+          if (FunctionOverlaps(function, url, location->token_pos(),
                                location->end_token_pos())) {
             return true;
           }
@@ -4134,6 +4166,8 @@
   BreakpointLocation* prev_loc = NULL;
   const GrowableObjectArray& libs =
       GrowableObjectArray::Handle(isolate_group->object_store()->libraries());
+
+  GrowableHandlePtrArray<const Script> scripts(zone, 1);
   while (loc != NULL) {
     url = loc->url();
     bool found_match = false;
@@ -4142,83 +4176,87 @@
       lib ^= libs.At(i);
       script = lib.LookupScript(url, !is_package);
       if (!script.IsNull()) {
-        // Found a script with matching url for this latent breakpoint.
-        // Unlink the latent breakpoint from the list.
-        found_match = true;
-        BreakpointLocation* matched_loc = loc;
-        loc = loc->next();
-        if (prev_loc == NULL) {
-          latent_locations_ = loc;
-        } else {
-          prev_loc->set_next(loc);
-        }
-        // Now find the token range at the requested line and make a
-        // new unresolved source breakpoint.
-        intptr_t line_number = matched_loc->requested_line_number();
-        intptr_t column_number = matched_loc->requested_column_number();
-        ASSERT(line_number >= 0);
-        TokenPosition first_token_pos = TokenPosition::kNoSource;
-        TokenPosition last_token_pos = TokenPosition::kNoSource;
-        script.TokenRangeAtLine(line_number, &first_token_pos, &last_token_pos);
-        if (!first_token_pos.IsDebugPause() || !last_token_pos.IsDebugPause()) {
-          // Script does not contain the given line number or there are no
-          // tokens on the line. Drop the breakpoint silently.
-          Breakpoint* bpt = matched_loc->breakpoints();
-          while (bpt != NULL) {
-            if (FLAG_verbose_debug) {
-              OS::PrintErr("No code found at line %" Pd
-                           ": "
-                           "dropping latent breakpoint %" Pd " in '%s'\n",
-                           line_number, bpt->id(), url.ToCString());
-            }
-            Breakpoint* prev = bpt;
-            bpt = bpt->next();
-            delete prev;
+        scripts.Add(script);
+      }
+    }
+    if (scripts.length() > 0) {
+      // Found a script with matching url for this latent breakpoint.
+      // Unlink the latent breakpoint from the list.
+      found_match = true;
+      BreakpointLocation* matched_loc = loc;
+      loc = loc->next();
+      if (prev_loc == NULL) {
+        latent_locations_ = loc;
+      } else {
+        prev_loc->set_next(loc);
+      }
+      // Now find the token range at the requested line and make a
+      // new unresolved source breakpoint.
+      intptr_t line_number = matched_loc->requested_line_number();
+      intptr_t column_number = matched_loc->requested_column_number();
+      ASSERT(line_number >= 0);
+      TokenPosition first_token_pos = TokenPosition::kNoSource;
+      TokenPosition last_token_pos = TokenPosition::kNoSource;
+      scripts.At(0).TokenRangeAtLine(line_number, &first_token_pos,
+                                     &last_token_pos);
+      if (!first_token_pos.IsDebugPause() || !last_token_pos.IsDebugPause()) {
+        // Script does not contain the given line number or there are no
+        // tokens on the line. Drop the breakpoint silently.
+        Breakpoint* bpt = matched_loc->breakpoints();
+        while (bpt != NULL) {
+          if (FLAG_verbose_debug) {
+            OS::PrintErr("No code found at line %" Pd
+                         ": "
+                         "dropping latent breakpoint %" Pd " in '%s'\n",
+                         line_number, bpt->id(), url.ToCString());
           }
-          delete matched_loc;
-        } else {
-          // We don't expect to already have a breakpoint for this location.
-          // If there is one, assert in debug build but silently drop
-          // the latent breakpoint in release build.
-          BreakpointLocation* existing_loc =
-              GetBreakpointLocation(script, first_token_pos, -1, column_number);
-          ASSERT(existing_loc == NULL);
-          if (existing_loc == NULL) {
-            // Create and register a new source breakpoint for the
-            // latent breakpoint.
-            BreakpointLocation* unresolved_loc = new BreakpointLocation(
-                this, script, first_token_pos, last_token_pos, line_number,
-                column_number);
-            RegisterBreakpointLocation(unresolved_loc);
+          Breakpoint* prev = bpt;
+          bpt = bpt->next();
+          delete prev;
+        }
+        delete matched_loc;
+      } else {
+        // We don't expect to already have a breakpoint for this location.
+        // If there is one, assert in debug build but silently drop
+        // the latent breakpoint in release build.
+        BreakpointLocation* existing_loc =
+            GetBreakpointLocation(url, first_token_pos, -1, column_number);
+        ASSERT(existing_loc == NULL);
+        if (existing_loc == NULL) {
+          // Create and register a new source breakpoint for the
+          // latent breakpoint.
+          BreakpointLocation* unresolved_loc = new BreakpointLocation(
+              this, scripts, first_token_pos, last_token_pos, line_number,
+              column_number);
+          RegisterBreakpointLocation(unresolved_loc);
 
-            // Move breakpoints over.
-            Breakpoint* bpt = matched_loc->breakpoints();
-            unresolved_loc->set_breakpoints(bpt);
-            matched_loc->set_breakpoints(NULL);
-            while (bpt != NULL) {
-              bpt->set_bpt_location(unresolved_loc);
-              if (FLAG_verbose_debug) {
-                OS::PrintErr(
-                    "Converted latent breakpoint "
-                    "%" Pd " in '%s' at line %" Pd " col %" Pd "\n",
-                    bpt->id(), url.ToCString(), line_number, column_number);
-              }
-              bpt = bpt->next();
+          // Move breakpoints over.
+          Breakpoint* bpt = matched_loc->breakpoints();
+          unresolved_loc->set_breakpoints(bpt);
+          matched_loc->set_breakpoints(NULL);
+          while (bpt != NULL) {
+            bpt->set_bpt_location(unresolved_loc);
+            if (FLAG_verbose_debug) {
+              OS::PrintErr(
+                  "Converted latent breakpoint "
+                  "%" Pd " in '%s' at line %" Pd " col %" Pd "\n",
+                  bpt->id(), url.ToCString(), line_number, column_number);
             }
-            group_debugger()->SyncBreakpointLocation(unresolved_loc);
+            bpt = bpt->next();
           }
-          delete matched_loc;
-          // Break out of the iteration over loaded libraries. If the
-          // same url has been loaded into more than one library, we
-          // only set a breakpoint in the first one.
-          // TODO(hausner): There is one possible pitfall here.
-          // If the user sets a latent breakpoint using a partial url that
-          // ends up matching more than one script, the breakpoint might
-          // get set in the wrong script.
-          // It would be better if we could warn the user if multiple
-          // scripts are matching.
-          break;
+          group_debugger()->SyncBreakpointLocation(unresolved_loc);
         }
+        delete matched_loc;
+        // Break out of the iteration over loaded libraries. If the
+        // same url has been loaded into more than one library, we
+        // only set a breakpoint in the first one.
+        // TODO(hausner): There is one possible pitfall here.
+        // If the user sets a latent breakpoint using a partial url that
+        // ends up matching more than one script, the breakpoint might
+        // get set in the wrong script.
+        // It would be better if we could warn the user if multiple
+        // scripts are matching.
+        break;
       }
     }
     if (!found_match) {
@@ -4443,12 +4481,13 @@
 }
 
 BreakpointLocation* Debugger::GetResolvedBreakpointLocation(
-    const Script& script,
+    const String& script_url,
     TokenPosition code_token_pos) {
   BreakpointLocation* loc = breakpoint_locations_;
+  String& loc_url = String::Handle();
   while (loc != nullptr) {
-    if (loc->script_ == script.ptr() &&
-        loc->code_token_pos_ == code_token_pos) {
+    loc_url = loc->url();
+    if (script_url.Equals(loc_url) && loc->code_token_pos_ == code_token_pos) {
       return loc;
     }
     loc = loc->next();
@@ -4457,14 +4496,16 @@
 }
 
 BreakpointLocation* Debugger::GetBreakpointLocation(
-    const Script& script,
+    const String& script_url,
     TokenPosition token_pos,
     intptr_t requested_line,
     intptr_t requested_column,
     TokenPosition code_token_pos) {
   BreakpointLocation* loc = breakpoint_locations_;
+  String& loc_url = String::Handle();
   while (loc != NULL) {
-    if (loc->script_ == script.ptr() &&
+    loc_url = loc->url();
+    if (script_url.Equals(loc_url) &&
         (!token_pos.IsReal() || (loc->token_pos_ == token_pos)) &&
         ((requested_line == -1) ||
          (loc->requested_line_number_ == requested_line)) &&
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 6dd2515..f02e84e 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -138,7 +138,7 @@
  public:
   // Create a new unresolved breakpoint.
   BreakpointLocation(Debugger* debugger,
-                     const Script& script,
+                     const GrowableHandlePtrArray<const Script>& scripts,
                      TokenPosition token_pos,
                      TokenPosition end_token_pos,
                      intptr_t requested_line_number,
@@ -155,7 +155,12 @@
   intptr_t line_number();
   TokenPosition end_token_pos() const { return end_token_pos_; }
 
-  ScriptPtr script() const { return script_; }
+  ScriptPtr script() const {
+    if (scripts_.length() == 0) {
+      return Script::null();
+    }
+    return scripts_.At(0);
+  }
   StringPtr url() const { return url_; }
 
   intptr_t requested_line_number() const { return requested_line_number_; }
@@ -197,7 +202,7 @@
   SafepointRwLock* line_number_lock() { return line_number_lock_.get(); }
 
   Debugger* debugger_;
-  ScriptPtr script_;
+  MallocGrowableArray<ScriptPtr> scripts_;
   StringPtr url_;
   std::unique_ptr<SafepointRwLock> line_number_lock_;
   intptr_t line_number_;  // lazily computed for token_pos_
@@ -271,8 +276,7 @@
     ASSERT(breakpoint_locations_.length() == 0 ||
            (breakpoint_location->token_pos() ==
                 breakpoint_locations_.At(0)->token_pos() &&
-            breakpoint_location->script() ==
-                breakpoint_locations_.At(0)->script()));
+            breakpoint_location->url() == breakpoint_locations_.At(0)->url()));
     breakpoint_locations_.Add(breakpoint_location);
   }
 
@@ -821,29 +825,38 @@
 
   void SendBreakpointEvent(ServiceEvent::EventKind kind, Breakpoint* bpt);
 
-  void FindCompiledFunctions(const Script& script,
-                             TokenPosition start_pos,
-                             TokenPosition end_pos,
-                             GrowableObjectArray* code_function_list);
+  void FindCompiledFunctions(
+      const GrowableHandlePtrArray<const Script>& scripts,
+      TokenPosition start_pos,
+      TokenPosition end_pos,
+      GrowableObjectArray* code_function_list);
   bool FindBestFit(const Script& script,
                    TokenPosition token_pos,
                    TokenPosition last_token_pos,
                    Function* best_fit);
   void DeoptimizeWorld();
   void NotifySingleStepping(bool value) const;
-  BreakpointLocation* SetCodeBreakpoints(const Script& script,
-                                         TokenPosition token_pos,
-                                         TokenPosition last_token_pos,
-                                         intptr_t requested_line,
-                                         intptr_t requested_column,
-                                         TokenPosition exact_token_pos,
-                                         const GrowableObjectArray& functions);
+  BreakpointLocation* SetCodeBreakpoints(
+      const GrowableHandlePtrArray<const Script>& scripts,
+      TokenPosition token_pos,
+      TokenPosition last_token_pos,
+      intptr_t requested_line,
+      intptr_t requested_column,
+      TokenPosition exact_token_pos,
+      const GrowableObjectArray& functions);
   BreakpointLocation* SetBreakpoint(const Script& script,
                                     TokenPosition token_pos,
                                     TokenPosition last_token_pos,
                                     intptr_t requested_line,
                                     intptr_t requested_column,
                                     const Function& function);
+  BreakpointLocation* SetBreakpoint(
+      const GrowableHandlePtrArray<const Script>& scripts,
+      TokenPosition token_pos,
+      TokenPosition last_token_pos,
+      intptr_t requested_line,
+      intptr_t requested_column,
+      const Function& function);
   bool RemoveBreakpointFromTheList(intptr_t bp_id, BreakpointLocation** list);
   Breakpoint* GetBreakpointByIdInTheList(intptr_t id, BreakpointLocation* list);
   BreakpointLocation* GetLatentBreakpoint(const String& url,
@@ -851,10 +864,10 @@
                                           intptr_t column);
   void RegisterBreakpointLocation(BreakpointLocation* bpt);
   BreakpointLocation* GetResolvedBreakpointLocation(
-      const Script& script,
+      const String& script_url,
       TokenPosition code_token_pos);
   BreakpointLocation* GetBreakpointLocation(
-      const Script& script,
+      const String& script_url,
       TokenPosition token_pos,
       intptr_t requested_line,
       intptr_t requested_column,
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index be0584f..3efe11c 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -33,6 +33,12 @@
 const intptr_t kSmiMax32 = (static_cast<intptr_t>(1) << kSmiBits32) - 1;
 const intptr_t kSmiMin32 = -(static_cast<intptr_t>(1) << kSmiBits32);
 
+#if !defined(DART_COMPRESSED_POINTERS)
+const intptr_t kCompressedWordSize = kWordSize;
+#else
+const intptr_t kCompressedWordSize = sizeof(uint32_t);
+#endif
+
 // Number of bytes per BigInt digit.
 const intptr_t kBytesPerBigIntDigit = 4;
 
diff --git a/runtime/vm/heap/become.cc b/runtime/vm/heap/become.cc
index e51678a..1e733b8 100644
--- a/runtime/vm/heap/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -126,9 +126,11 @@
       if (visiting_object_ == nullptr) {
         *p = new_target;
       } else if (visiting_object_->untag()->IsCardRemembered()) {
-        visiting_object_->untag()->StoreArrayPointer(p, new_target, thread_);
+        visiting_object_->untag()->StoreCompressedArrayPointer(p, new_target,
+                                                               thread_);
       } else {
-        visiting_object_->untag()->StorePointer(p, new_target, thread_);
+        visiting_object_->untag()->StoreCompressedPointer(p, new_target,
+                                                          thread_);
       }
     }
   }
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 45a4edd..fb284d0 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1098,6 +1098,7 @@
   toplevel_class.set_is_abstract();
   toplevel_class.set_is_declaration_loaded();
   toplevel_class.set_is_type_finalized();
+  toplevel_class.set_num_type_arguments_unsafe(0);
   library.set_toplevel_class(toplevel_class);
 
   library_helper.ReadUntilExcluding(LibraryHelper::kDependencies);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a00fa04..ac92f8f 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1045,7 +1045,7 @@
   {
     uword address = heap->Allocate(TypeArguments::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kTypeArgumentsCid, TypeArguments::InstanceSize(0),
-                     /*compressed*/ false);
+                     /*compressed*/ true);
     TypeArguments::initializeHandle(
         empty_type_arguments_,
         static_cast<TypeArgumentsPtr>(address + kHeapObjectTag));
@@ -6689,7 +6689,7 @@
   {
     ObjectPtr raw = Object::Allocate(TypeArguments::kClassId,
                                      TypeArguments::InstanceSize(len), space,
-                                     /*compressed*/ false);
+                                     /*compressed*/ true);
     NoSafepointScope no_safepoint;
     result ^= raw;
     // Length must be set before we start storing into the array.
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index f43d2d0..b5d335c 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -7491,7 +7491,7 @@
     return OFFSET_OF_RETURNED_VALUE(UntaggedTypeArguments, types);
   }
   static intptr_t type_at_offset(intptr_t index) {
-    return types_offset() + index * kWordSize;
+    return types_offset() + index * kCompressedWordSize;
   }
   void SetTypeAt(intptr_t index, const AbstractType& value) const;
 
@@ -7500,7 +7500,7 @@
       return TypeArguments::types_offset();
     }
 
-    static constexpr intptr_t kElementSize = kWordSize;
+    static constexpr intptr_t kElementSize = kCompressedWordSize;
   };
 
   // The nullability of a type argument vector represents the nullability of its
@@ -7683,7 +7683,7 @@
     return OFFSET_OF(UntaggedTypeArguments, instantiations_);
   }
 
-  static const intptr_t kBytesPerElement = kWordSize;
+  static const intptr_t kBytesPerElement = kCompressedWordSize;
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
@@ -7696,7 +7696,7 @@
     // Ensure that the types() is not adding to the object size, which includes
     // 4 fields: instantiations_, length_, hash_, and nullability_.
     ASSERT(sizeof(UntaggedTypeArguments) ==
-           (sizeof(UntaggedObject) + (kNumFields * kWordSize)));
+           (sizeof(UntaggedObject) + (kNumFields * kCompressedWordSize)));
     ASSERT(0 <= len && len <= kMaxElements);
     return RoundedAllocationSize(sizeof(UntaggedTypeArguments) +
                                  (len * kBytesPerElement));
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 7e32ade..d99acc8 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -180,7 +180,7 @@
     case kTypeArgumentsCid: {
       const TypeArgumentsPtr raw_array =
           static_cast<const TypeArgumentsPtr>(this);
-      intptr_t array_length = Smi::Value(raw_array->untag()->length_);
+      intptr_t array_length = Smi::Value(raw_array->untag()->length());
       instance_size = TypeArguments::InstanceSize(array_length);
       break;
     }
@@ -572,7 +572,8 @@
 COMPRESSED_VISITOR(UserTag)
 REGULAR_VISITOR(SubtypeTestCache)
 COMPRESSED_VISITOR(LoadingUnit)
-VARIABLE_VISITOR(TypeArguments, Smi::Value(raw_obj->untag()->length_))
+VARIABLE_COMPRESSED_VISITOR(TypeArguments,
+                            Smi::Value(raw_obj->untag()->length()))
 VARIABLE_COMPRESSED_VISITOR(LocalVarDescriptors, raw_obj->untag()->num_entries_)
 VARIABLE_COMPRESSED_VISITOR(ExceptionHandlers, raw_obj->untag()->num_entries_)
 VARIABLE_VISITOR(Context, raw_obj->untag()->num_variables_)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 308284a..33003af 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -166,7 +166,7 @@
     }
 
     static constexpr bool SizeFits(intptr_t size) {
-      DEBUG_ASSERT(Utils::IsAligned(size, kObjectAlignment));
+      assert(Utils::IsAligned(size, kObjectAlignment));
       return (size <= kMaxSizeTag);
     }
 
@@ -585,10 +585,11 @@
     }
   }
 
-  void StorePointer(CompressedObjectPtr* addr,
-                    ObjectPtr value,
-                    Thread* thread) {
-    *addr = value;
+  template <typename type, typename compressed_type>
+  void StoreCompressedPointer(compressed_type const* addr,
+                              type value,
+                              Thread* thread) {
+    *const_cast<compressed_type*>(addr) = value;
     if (value->IsHeapObject()) {
       CheckHeapPointerStore(value, thread);
     }
@@ -619,10 +620,23 @@
     }
   }
 
-  void StoreArrayPointer(CompressedObjectPtr* addr,
-                         ObjectPtr value,
-                         Thread* thread) {
-    *addr = value;
+  template <typename type,
+            typename compressed_type,
+            std::memory_order order = std::memory_order_relaxed>
+  void StoreCompressedArrayPointer(compressed_type const* addr, type value) {
+    reinterpret_cast<std::atomic<compressed_type>*>(
+        const_cast<compressed_type*>(addr))
+        ->store(static_cast<compressed_type>(value), order);
+    if (value->IsHeapObject()) {
+      CheckArrayPointerStore(addr, value, Thread::Current());
+    }
+  }
+
+  template <typename type, typename compressed_type>
+  void StoreCompressedArrayPointer(compressed_type const* addr,
+                                   type value,
+                                   Thread* thread) {
+    *const_cast<compressed_type*>(addr) = value;
     if (value->IsHeapObject()) {
       CheckArrayPointerStore(addr, value, thread);
     }
@@ -844,6 +858,27 @@
   type* array_name() { OPEN_ARRAY_START(type, type); }                         \
   type const* array_name() const { OPEN_ARRAY_START(type, type); }
 
+#define COMPRESSED_VARIABLE_POINTER_FIELDS(type, accessor_name, array_name)    \
+ public:                                                                       \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  type accessor_name(intptr_t index) const {                                   \
+    return LoadCompressedPointer<type, Compressed##type, order>(               \
+        &array_name()[index]);                                                 \
+  }                                                                            \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  void set_##accessor_name(intptr_t index, type value) {                       \
+    StoreCompressedArrayPointer<type, Compressed##type, order>(                \
+        &array_name()[index], value);                                          \
+  }                                                                            \
+                                                                               \
+ protected:                                                                    \
+  Compressed##type* array_name() {                                             \
+    OPEN_ARRAY_START(Compressed##type, Compressed##type);                      \
+  }                                                                            \
+  Compressed##type const* array_name() const {                                 \
+    OPEN_ARRAY_START(Compressed##type, Compressed##type);                      \
+  }
+
 #define SMI_FIELD(type, name)                                                  \
  public:                                                                       \
   template <std::memory_order order = std::memory_order_relaxed>               \
@@ -2443,17 +2478,17 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments);
 
-  VISIT_FROM(ObjectPtr, instantiations)
+  VISIT_FROM(CompressedObjectPtr, instantiations)
   // The instantiations_ array remains empty for instantiated type arguments.
-  POINTER_FIELD(ArrayPtr,
-                instantiations)  // Of 3-tuple: 2 instantiators, result.
-  SMI_FIELD(SmiPtr, length)
-  SMI_FIELD(SmiPtr, hash)
-  SMI_FIELD(SmiPtr, nullability)
+  // Of 3-tuple: 2 instantiators, result.
+  COMPRESSED_POINTER_FIELD(ArrayPtr, instantiations)
+  COMPRESSED_SMI_FIELD(SmiPtr, length)
+  COMPRESSED_SMI_FIELD(SmiPtr, hash)
+  COMPRESSED_SMI_FIELD(SmiPtr, nullability)
   // Variable length data follows here.
-  VARIABLE_POINTER_FIELDS(AbstractTypePtr, element, types)
-  ObjectPtr* to(intptr_t length) {
-    return reinterpret_cast<ObjectPtr*>(&types()[length - 1]);
+  COMPRESSED_VARIABLE_POINTER_FIELDS(AbstractTypePtr, element, types)
+  CompressedObjectPtr* to(intptr_t length) {
+    return reinterpret_cast<CompressedObjectPtr*>(&types()[length - 1]);
   }
 
   friend class Object;
@@ -2473,11 +2508,10 @@
  protected:
   static constexpr intptr_t kTypeStateBitSize = 2;
 
-  uword type_test_stub_entry_point_;  // Accessed from generated code.
-  COMPRESSED_POINTER_FIELD(
-      CodePtr,
-      type_test_stub)  // Must be the last field, since subclasses use it
-                       // in their VISIT_FROM.
+  // Accessed from generated code.
+  uword type_test_stub_entry_point_;
+  // Must be the last field, since subclasses use it in their VISIT_FROM.
+  COMPRESSED_POINTER_FIELD(CodePtr, type_test_stub)
 
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType);
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 9f8b670..924f0a4 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -354,7 +354,7 @@
     // across (isolates spawned using spawnURI) we send them as dynamic.
     if (!writer->can_send_any_object()) {
       // Lookup the type class.
-      TypePtr raw_type = Type::RawCast(types()[i]);
+      TypePtr raw_type = Type::RawCast(element(i));
       SmiPtr raw_type_class_id =
           Smi::RawCast(raw_type->untag()->type_class_id());
       ClassPtr type_class = writer->isolate_group()->class_table()->At(
@@ -362,10 +362,10 @@
       if (!writer->AllowObjectsInDartLibrary(type_class->untag()->library())) {
         writer->WriteVMIsolateObject(kDynamicType);
       } else {
-        writer->WriteObjectImpl(types()[i], as_reference);
+        writer->WriteObjectImpl(element(i), as_reference);
       }
     } else {
-      writer->WriteObjectImpl(types()[i], as_reference);
+      writer->WriteObjectImpl(element(i), as_reference);
     }
   }
 }
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 34e5f63..165c7b5 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -464,12 +464,12 @@
     __ CompareObject(kTypeArgumentsReg, Object::null_object());
     __ BranchIf(EQUAL, &is_dynamic);
 
-    __ LoadField(
+    __ LoadCompressedField(
         TTSInternalRegs::kScratchReg,
         compiler::FieldAddress(kTypeArgumentsReg,
                                compiler::target::TypeArguments::type_at_offset(
                                    type_param.index())));
-    __ CompareWithFieldValue(
+    __ CompareWithCompressedFieldValue(
         TTSInternalRegs::kScratchReg,
         compiler::FieldAddress(TTSInternalRegs::kInstanceTypeArgumentsReg,
                                compiler::target::TypeArguments::type_at_offset(
@@ -483,12 +483,12 @@
                                   /*include_abstract=*/true,
                                   /*exclude_null=*/!null_is_assignable);
 
-    __ LoadField(
+    __ LoadCompressedField(
         TTSInternalRegs::kScratchReg,
         compiler::FieldAddress(TTSInternalRegs::kInstanceTypeArgumentsReg,
                                compiler::target::TypeArguments::type_at_offset(
                                    type_param_value_offset_i)));
-    __ LoadField(
+    __ LoadCompressedField(
         TTSInternalRegs::kScratchReg,
         compiler::FieldAddress(TTSInternalRegs::kScratchReg,
                                compiler::target::Type::type_class_id_offset()));
@@ -515,11 +515,12 @@
       // Nullable type is not a subtype of non-nullable type.
       // TODO(dartbug.com/40736): Allocate a register for instance type argument
       // and avoid reloading it.
-      __ LoadField(TTSInternalRegs::kScratchReg,
-                   compiler::FieldAddress(
-                       TTSInternalRegs::kInstanceTypeArgumentsReg,
-                       compiler::target::TypeArguments::type_at_offset(
-                           type_param_value_offset_i)));
+      __ LoadCompressedField(
+          TTSInternalRegs::kScratchReg,
+          compiler::FieldAddress(
+              TTSInternalRegs::kInstanceTypeArgumentsReg,
+              compiler::target::TypeArguments::type_at_offset(
+                  type_param_value_offset_i)));
       __ CompareTypeNullabilityWith(TTSInternalRegs::kScratchReg,
                                     compiler::target::Nullability::kNullable);
       __ BranchIf(EQUAL, check_failed);
diff --git a/runtime/vm/v8_snapshot_writer.h b/runtime/vm/v8_snapshot_writer.h
index 63544c9..ea844ce 100644
--- a/runtime/vm/v8_snapshot_writer.h
+++ b/runtime/vm/v8_snapshot_writer.h
@@ -32,7 +32,8 @@
   struct ObjectId {
     ObjectId() : ObjectId(IdSpace::kInvalid, -1) {}
     ObjectId(IdSpace space, int64_t nonce)
-        : encoded_((nonce << kIdSpaceBits) | static_cast<intptr_t>(space)) {
+        : encoded_((static_cast<uint64_t>(nonce) << kIdSpaceBits) |
+                   static_cast<intptr_t>(space)) {
       ASSERT(Utils::IsInt(kBitsPerInt64 - kIdSpaceBits, nonce));
     }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index a5e1837..cfaaeee 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -54,11 +54,7 @@
 
 import 'dart:_native_typed_data';
 
-import 'dart:_js_names'
-    show
-        extractKeys,
-        unmangleGlobalNameIfPreservedAnyways,
-        unmangleAllIdentifiersIfPreservedAnyways;
+import 'dart:_js_names' show unmangleGlobalNameIfPreservedAnyways;
 
 import 'dart:_rti' as newRti
     show
@@ -1003,29 +999,6 @@
   }
 }
 
-/// Helper class for allocating and using JS object literals as caches.
-class JsCache {
-  /// Returns a JavaScript object suitable for use as a cache.
-  static allocate() {
-    var result = JS('=Object', 'Object.create(null)');
-    // Deleting a property makes V8 assume that it shouldn't create a hidden
-    // class for [result] and map transitions. Although these map transitions
-    // pay off if there are many cache hits for the same keys, it becomes
-    // really slow when there aren't many repeated hits.
-    JS('void', '#.x=0', result);
-    JS('void', 'delete #.x', result);
-    return result;
-  }
-
-  static fetch(cache, String key) {
-    return JS('', '#[#]', cache, key);
-  }
-
-  static void update(cache, String key, value) {
-    JS('void', '#[#] = #', cache, key, value);
-  }
-}
-
 /// Called by generated code to throw an illegal-argument exception,
 /// for example, if a non-integer index is given to an optimized
 /// indexed access.
diff --git a/sdk/lib/_internal/js_runtime/lib/js_names.dart b/sdk/lib/_internal/js_runtime/lib/js_names.dart
index 10efacf..678df00 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_names.dart
@@ -4,164 +4,21 @@
 
 library dart._js_names;
 
-import 'dart:_js_embedded_names'
-    show JsGetName, MANGLED_GLOBAL_NAMES, MANGLED_NAMES;
+import 'dart:_js_embedded_names' show MANGLED_GLOBAL_NAMES;
 
-import 'dart:_foreign_helper' show JS, JS_EMBEDDED_GLOBAL, JS_GET_NAME;
+import 'dart:_foreign_helper' show JS, JS_EMBEDDED_GLOBAL;
 
-import 'dart:_js_helper' show JsCache, NoInline;
-
-import 'dart:_interceptors' show JSArray;
-
-/// No-op method that is called to inform the compiler that unmangled named
-/// must be preserved.
-preserveNames() {}
-
-/// A map from mangled names to "reflective" names, that is, unmangled names
-/// with some additional information, such as, number of required arguments.
-/// This map is for mangled names used as instance members.
-final _LazyMangledNamesMap mangledNames = new _LazyMangledInstanceNamesMap(
-    JS_EMBEDDED_GLOBAL('=Object', MANGLED_NAMES));
-
-/// A map from "reflective" names to mangled names (the reverse of
-/// [mangledNames]).
-final _LazyReflectiveNamesMap reflectiveNames = new _LazyReflectiveNamesMap(
-    JS_EMBEDDED_GLOBAL('=Object', MANGLED_NAMES), true);
-
-/// A map from mangled names to "reflective" names (see [mangledNames]).  This
-/// map is for globals, that is, static and top-level members.
-final _LazyMangledNamesMap mangledGlobalNames = new _LazyMangledNamesMap(
-    JS_EMBEDDED_GLOBAL('=Object', MANGLED_GLOBAL_NAMES));
-
-/// A map from "reflective" names to mangled names (the reverse of
-/// [mangledGlobalNames]).
-final _LazyReflectiveNamesMap reflectiveGlobalNames =
-    new _LazyReflectiveNamesMap(
-        JS_EMBEDDED_GLOBAL('=Object', MANGLED_GLOBAL_NAMES), false);
-
-/// Implements a mapping from mangled names to their reflective counterparts.
-/// The propertiy names of [_jsMangledNames] are the mangled names, and the
-/// values are the "reflective" names.
-class _LazyMangledNamesMap {
-  /// [_jsMangledNames] is a JavaScript object literal.
-  var _jsMangledNames;
-
-  _LazyMangledNamesMap(this._jsMangledNames);
-
-  String? operator [](String key) {
-    var result = JS('var', '#[#]', _jsMangledNames, key);
-    // Filter out all non-string values to protect against polution from
-    // ancillary fields in [_jsMangledNames].
-    bool filter = JS('bool', 'typeof # !== "string"', result);
-    // To ensure that the inferrer sees that result is a String, we explicitly
-    // give it a better type here.
-    return filter ? null : JS('String', '#', result);
-  }
-}
-
-/// Extends [_LazyMangledNamesMap] with additional support for adding mappings
-/// from mangled setter names to their reflective counterpart by rewriting a
-/// corresponding entry for a getter name, if it exists.
-class _LazyMangledInstanceNamesMap extends _LazyMangledNamesMap {
-  _LazyMangledInstanceNamesMap(_jsMangledNames) : super(_jsMangledNames);
-
-  String? operator [](String key) {
-    String? result = super[key];
-    String setterPrefix = JS_GET_NAME(JsGetName.SETTER_PREFIX);
-    if (result == null && key.startsWith(setterPrefix)) {
-      String getterPrefix = JS_GET_NAME(JsGetName.GETTER_PREFIX);
-      int setterPrefixLength = setterPrefix.length;
-
-      // Generate the setter name from the getter name.
-      key = '$getterPrefix${key.substring(setterPrefixLength)}';
-      result = super[key];
-      return (result != null) ? "${result}=" : null;
-    }
-    return result;
-  }
-}
-
-/// Implements the inverse of [_LazyMangledNamesMap]. As it would be too
-/// expensive to search the mangled names map for a value that corresponds to
-/// the lookup key on each invocation, we compute the full mapping in demand
-/// and cache it. The cache is invalidated when the underlying [_jsMangledNames]
-/// object changes its length. This condition is sufficient as the name mapping
-/// can only grow over time.
-/// When [_isInstance] is true, we also apply the inverse of the setter/getter
-/// name conversion implemented by [_LazyMangledInstanceNamesMap].
-class _LazyReflectiveNamesMap {
-  /// [_jsMangledNames] is a JavaScript object literal.
-  final _jsMangledNames;
-  final bool _isInstance;
-  int _cacheLength = 0;
-  Map<String, String>? _cache;
-
-  _LazyReflectiveNamesMap(this._jsMangledNames, this._isInstance);
-
-  Map<String, String> _updateReflectiveNames() {
-    preserveNames();
-    Map<String, String> result = <String, String>{};
-    List keys = JS('List', 'Object.keys(#)', _jsMangledNames);
-    for (String key in keys) {
-      var reflectiveName = JS('var', '#[#]', _jsMangledNames, key);
-      // Filter out all non-string values to protect against polution from
-      // ancillary fields in [_jsMangledNames].
-      bool filter = JS('bool', 'typeof # !== "string"', reflectiveName);
-      if (filter) continue;
-      result[reflectiveName] = JS('String', '#', key);
-
-      String getterPrefix = JS_GET_NAME(JsGetName.GETTER_PREFIX);
-      if (_isInstance && key.startsWith(getterPrefix)) {
-        int getterPrefixLength = getterPrefix.length;
-        String setterPrefix = JS_GET_NAME(JsGetName.SETTER_PREFIX);
-        result['$reflectiveName='] =
-            '$setterPrefix${key.substring(getterPrefixLength)}';
-      }
-    }
-    return result;
-  }
-
-  int get _jsMangledNamesLength =>
-      JS('int', 'Object.keys(#).length', _jsMangledNames);
-
-  String? operator [](String key) {
-    if (_cache == null || _jsMangledNamesLength != _cacheLength) {
-      _cache = _updateReflectiveNames();
-      _cacheLength = _jsMangledNamesLength;
-    }
-    return _cache![key];
-  }
-}
-
-@pragma('dart2js:noInline')
-List extractKeys(victim) {
-  var result = JS('', '# ? Object.keys(#) : []', victim, victim);
-  return new JSArray.markFixed(result);
-}
-
-/// Returns the (global) unmangled version of [name].
+/// Returns the (global) unminified version of [name], or (usual case) `null` if
+/// the name is not known.
 ///
-/// Normally, you should use [mangledGlobalNames] directly, but this method
-/// doesn't tell the compiler to preserve names. So this method only returns a
-/// non-null value if some other component has made the compiler preserve names.
-///
-/// This is used, for example, to return unmangled names from TypeImpl.toString
-/// *if* names are being preserved for other reasons (use of dart:mirrors, for
-/// example).
+/// The generated app contains a small table that translates a few minified
+/// names to their unminified text.  This is used to return unminified names in
+/// some parts of Type.toString. Historically a much more comprehensive and
+/// large table was generated to support 'dart:mirrors', but 'dart:mirrors' is
+/// no longer supported on the web platforms, in part due to the size of tables
+/// like this. The names included are chosen by the emitter, but limited to a
+/// few primitives and `List`.
 String? unmangleGlobalNameIfPreservedAnyways(String name) {
   var names = JS_EMBEDDED_GLOBAL('', MANGLED_GLOBAL_NAMES);
-  return JS('String|Null', '#', JsCache.fetch(names, name));
-}
-
-String unmangleAllIdentifiersIfPreservedAnyways(String str) {
-  return JS(
-      'String',
-      r'''
-        (function(str, names) {
-          return str.replace(
-              /[^<,> ]+/g,
-              function(m) { return names[m] || m; });
-        })(#, #)''',
-      str,
-      JS_EMBEDDED_GLOBAL('', MANGLED_GLOBAL_NAMES));
+  return JS('String|Null', '#[#]', names, name);
 }
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 9301ce3..fe6dcf0 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -17,6 +17,15 @@
 ///
 /// The [error] and [stackTrace] are the error and stack trace that
 /// was uncaught in [zone].
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
+///
+/// If the uncaught error handler throws, the error will be passed
+/// to `parent.handleUncaughtError`. If the thrown object is [error],
+/// the throw is considered a re-throw and the original [stackTrace]
+/// is retained. This allows an asynchronous error to leave the error zone.
 typedef HandleUncaughtErrorHandler = void Function(Zone self,
     ZoneDelegate parent, Zone zone, Object error, StackTrace stackTrace);
 
@@ -34,6 +43,10 @@
 /// to call [f] in the current zone, [zone].
 /// A custom handler can do things before, after or instead of
 /// calling [f].
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef RunHandler = R Function<R>(
     Zone self, ZoneDelegate parent, Zone zone, R Function() f);
 
@@ -51,6 +64,10 @@
 /// to call [f] with argument [arg] in the current zone, [zone].
 /// A custom handler can do things before, after or instead of
 /// calling [f].
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef RunUnaryHandler = R Function<R, T>(
     Zone self, ZoneDelegate parent, Zone zone, R Function(T arg) f, T arg);
 
@@ -68,6 +85,10 @@
 /// to call [f] with arguments [arg1] and [arg2] in the current zone, [zone].
 /// A custom handler can do things before, after or instead of
 /// calling [f].
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef RunBinaryHandler = R Function<R, T1, T2>(Zone self, ZoneDelegate parent,
     Zone zone, R Function(T1 arg1, T2 arg2) f, T1 arg1, T2 arg2);
 
@@ -85,6 +106,10 @@
 /// or another function replacing [f],
 /// typically by wrapping [f] in a function
 /// which does something extra before and after invoking [f]
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef RegisterCallbackHandler = ZoneCallback<R> Function<R>(
     Zone self, ZoneDelegate parent, Zone zone, R Function() f);
 
@@ -102,6 +127,10 @@
 /// or another function replacing [f],
 /// typically by wrapping [f] in a function
 /// which does something extra before and after invoking [f]
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef RegisterUnaryCallbackHandler = ZoneUnaryCallback<R, T> Function<R, T>(
     Zone self, ZoneDelegate parent, Zone zone, R Function(T arg) f);
 
@@ -137,6 +166,12 @@
 /// to replace the original error and stack trace,
 /// or an [AsyncError] containing a replacement error and stack trace
 /// which will be used to replace the originals.
+///
+/// The error callback handler must not throw.
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef AsyncError? ErrorCallbackHandler(Zone self, ZoneDelegate parent,
     Zone zone, Object error, StackTrace? stackTrace);
 
@@ -155,6 +190,10 @@
 /// and then call `parent.scheduleMicrotask(zone, replacement)`.
 /// or it can implement its own microtask scheduling queue, which typically
 /// still depends on `parent.scheduleMicrotask` to as a way to get started.
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef void ScheduleMicrotaskHandler(
     Zone self, ZoneDelegate parent, Zone zone, void f());
 
@@ -177,6 +216,10 @@
 ///
 /// The function should return a [Timer] object which can be used
 /// to inspect and control the scheduled timer callback.
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef Timer CreateTimerHandler(
     Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f());
 
@@ -199,6 +242,10 @@
 ///
 /// The function should return a [Timer] object which can be used
 /// to inspect and control the scheduled timer callbacks.
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef Timer CreatePeriodicTimerHandler(Zone self, ZoneDelegate parent,
     Zone zone, Duration period, void f(Timer timer));
 
@@ -214,6 +261,10 @@
 ///
 /// The custom handler can intercept print operations and
 /// redirect them to other targets than the console.
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef void PrintHandler(
     Zone self, ZoneDelegate parent, Zone zone, String line);
 
@@ -235,6 +286,10 @@
 /// values before calling `parent.fork(zone, specification, zoneValues)`,
 /// but it has to call the [parent]'s [ZoneDelegate.fork] in order
 /// to create a valid [Zone] object.
+///
+/// The function must only access zone-related functionality through
+/// [self], [parent] or [zone].
+/// It should not depend on the current zone ([Zone.current]).
 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
     ZoneSpecification? specification, Map<Object?, Object?>? zoneValues);
 
@@ -915,10 +970,7 @@
   _ZoneDelegate(this._delegationTarget);
 
   void handleUncaughtError(Zone zone, Object error, StackTrace stackTrace) {
-    var implementation = _delegationTarget._handleUncaughtError;
-    _Zone implZone = implementation.zone;
-    HandleUncaughtErrorHandler handler = implementation.function;
-    return handler(implZone, implZone._parentDelegate, zone, error, stackTrace);
+    _delegationTarget._processUncaughtError(zone, error, stackTrace);
   }
 
   R run<R>(Zone zone, R f()) {
@@ -1040,6 +1092,28 @@
     return identical(this, otherZone) ||
         identical(errorZone, otherZone.errorZone);
   }
+
+  void _processUncaughtError(Zone zone, Object error, StackTrace stackTrace) {
+    var implementation = _handleUncaughtError;
+    _Zone implZone = implementation.zone;
+    if (identical(implZone, _rootZone)) {
+      _rootHandleError(error, stackTrace);
+      return;
+    }
+    HandleUncaughtErrorHandler handler = implementation.function;
+    ZoneDelegate parentDelegate = implZone._parentDelegate;
+    _Zone parentZone = implZone.parent!; // Not null for non-root zones.
+    _Zone currentZone = Zone._current;
+    try {
+      Zone._current = parentZone;
+      handler(implZone, parentDelegate, zone, error, stackTrace);
+      Zone._current = currentZone;
+    } catch (e, s) {
+      Zone._current = currentZone;
+      parentZone._processUncaughtError(
+          implZone, e, identical(error, e) ? stackTrace : s);
+    }
+  }
 }
 
 class _CustomZone extends _Zone {
@@ -1235,11 +1309,7 @@
   // Methods that can be customized by the zone specification.
 
   void handleUncaughtError(Object error, StackTrace stackTrace) {
-    var implementation = this._handleUncaughtError;
-    ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
-    HandleUncaughtErrorHandler handler = implementation.function;
-    return handler(
-        implementation.zone, parentDelegate, this, error, stackTrace);
+    _processUncaughtError(this, error, stackTrace);
   }
 
   Zone fork(
@@ -1335,6 +1405,10 @@
 
 void _rootHandleUncaughtError(Zone? self, ZoneDelegate? parent, Zone zone,
     Object error, StackTrace stackTrace) {
+  _rootHandleError(error, stackTrace);
+}
+
+void _rootHandleError(Object error, StackTrace stackTrace) {
   _schedulePriorityAsyncCallback(() {
     _rethrow(error, stackTrace);
   });
diff --git a/tests/language/const_functions/const_functions_map_test.dart b/tests/language/const_functions/const_functions_map_test.dart
new file mode 100644
index 0000000..1dae725
--- /dev/null
+++ b/tests/language/const_functions/const_functions_map_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 map usage with const functions.
+
+// SharedOptions=--enable-experiment=const-functions
+
+import "package:expect/expect.dart";
+
+const var1 = fn({'key': 'val'}, 'key');
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+
+const var2 = fn({'key': 2}, 'key');
+//           ^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+
+const var3 = fn({'key': 2}, 'invalid');
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+
+const map = {'key1': 2, 'key2': 3, 'key3': 4};
+const var4 = fn(map, 'key1');
+//           ^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+const var5 = fn(map, 'key2');
+//           ^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+const var6 = fn(map, 'key3');
+//           ^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+
+Object? fn(Map<Object, Object> map, Object key) {
+  return map[key];
+}
+
+const var7 = fn2();
+//           ^^^^^
+// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+int? fn2() {
+  const y = {'key': 2};
+  return y['key'];
+}
+
+void main() {
+  Expect.equals(var1, 'val');
+  Expect.equals(var2, 2);
+  Expect.equals(var3, null);
+  Expect.equals(var4, 2);
+  Expect.equals(var5, 3);
+  Expect.equals(var6, 4);
+  Expect.equals(var7, 2);
+}
diff --git a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
index c74a8b2..9ff7eb0 100644
--- a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
+++ b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
@@ -655,7 +655,7 @@
   // [context 94] 'bad' refers to a property so it couldn't be promoted.
 }
 
-test(C33 c) {
+explicitExtensionInvocation(C33 c) {
   if (c.bad == null) return;
   E33(c.bad).f();
   //  ^^^^^
diff --git a/tests/language/why_not_promoted/this_error_test.dart b/tests/language/why_not_promoted/this_error_test.dart
index 2d836ee..87d98c9 100644
--- a/tests/language/why_not_promoted/this_error_test.dart
+++ b/tests/language/why_not_promoted/this_error_test.dart
@@ -11,22 +11,22 @@
 
 extension on int? {
   extension_explicit_this() {
-    // TODO(paulberry): get this to work with the CFE.
     if (this == null) return;
     this.isEven;
 //       ^^^^^^
-// [analyzer 2] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-// [context 2] 'this' can't be promoted.  See http://dart.dev/go/non-promo-this
-// [cfe] Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+// [analyzer 1] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+// [context 1] 'this' can't be promoted.  See http://dart.dev/go/non-promo-this
+// [cfe 3] Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+// [context 3] 'this' can't be promoted.
   }
 
   extension_implicit_this() {
-    // TODO(paulberry): get this to work with the CFE.
     if (this == null) return;
     isEven;
 //  ^^^^^^
-// [analyzer 1] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-// [context 1] 'this' can't be promoted.  See http://dart.dev/go/non-promo-this
-// [cfe] Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+// [analyzer 2] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+// [context 2] 'this' can't be promoted.  See http://dart.dev/go/non-promo-this
+// [cfe 4] Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+// [context 4] 'this' can't be promoted.
   }
 }
diff --git a/tests/lib/async/uncaught_error_handler_throws_test.dart b/tests/lib/async/uncaught_error_handler_throws_test.dart
new file mode 100644
index 0000000..f70f098
--- /dev/null
+++ b/tests/lib/async/uncaught_error_handler_throws_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+import 'package:async_helper/async_helper.dart';
+import 'dart:async';
+
+void main() async {
+  asyncStart();
+  await testThrowSame();
+  await testThrowOther();
+  asyncEnd();
+}
+
+Future<void> testThrowSame() async {
+  asyncStart();
+  var object1 = Object();
+  var stack1 = StackTrace.current;
+  var outerZone = Zone.current;
+  var firstZone = Zone.current.fork(specification: onError((error, stack) {
+    // Uncaught error handlers run in the parent zone.
+    Expect.identical(outerZone, Zone.current);
+    Expect.identical(object1, error);
+    Expect.identical(stack1, stack); // Get same stack trace.
+    asyncEnd();
+  }));
+  firstZone.run(() async {
+    Expect.identical(firstZone, Zone.current);
+    var secondZone = Zone.current.fork(specification: onError((error, stack) {
+      // Uncaught error handlers run in the parent zone.
+      Expect.identical(firstZone, Zone.current);
+      Expect.identical(object1, error);
+      Expect.identical(stack1, stack);
+      throw error; // Throw same object
+    }));
+    secondZone.run(() async {
+      Expect.identical(secondZone, Zone.current);
+      Future.error(object1, stack1); // Unhandled async error.
+      await Future(() {});
+    });
+  });
+}
+
+Future<void> testThrowOther() async {
+  asyncStart();
+  var object1 = Object();
+  var object2 = Object();
+  var stack1 = StackTrace.current;
+  var outerZone = Zone.current;
+  var firstZone = Zone.current.fork(specification: onError((error, stack) {
+    Expect.identical(outerZone, Zone.current);
+    Expect.identical(object2, error);
+    Expect.notIdentical(stack1, stack); // Get different stack trace.
+    asyncEnd();
+  }));
+  firstZone.run(() async {
+    Expect.identical(firstZone, Zone.current);
+    var secondZone = Zone.current.fork(specification: onError((error, stack) {
+      Expect.identical(firstZone, Zone.current);
+      Expect.identical(object1, error);
+      Expect.identical(stack1, stack);
+      throw object2; // Throw different object
+    }));
+    secondZone.run(() async {
+      Expect.identical(secondZone, Zone.current);
+      Future.error(object1, stack1); // Unhandled async error.
+      await Future(() {});
+    });
+  });
+}
+
+ZoneSpecification onError(void Function(Object, StackTrace) handler) {
+  return ZoneSpecification(
+      handleUncaughtError: (s, p, z, e, st) => handler(e, st));
+}
diff --git a/tests/lib_2/async/slow_consumer2_test.dart b/tests/lib_2/async/slow_consumer2_test.dart
index de37668..23a001a 100644
--- a/tests/lib_2/async/slow_consumer2_test.dart
+++ b/tests/lib_2/async/slow_consumer2_test.dart
@@ -88,7 +88,7 @@
       listSize -= sentCount - targetCount;
       sentCount = targetCount;
     }
-    controller.add(new List(listSize));
+    controller.add(new List<int>(listSize));
     int ms = listSize * 1000 ~/ bytesPerSecond;
     Duration duration = new Duration(milliseconds: ms);
     if (!controller.isPaused) new Timer(duration, send);
diff --git a/tests/lib_2/async/uncaught_error_handler_throws_test.dart b/tests/lib_2/async/uncaught_error_handler_throws_test.dart
new file mode 100644
index 0000000..f70f098
--- /dev/null
+++ b/tests/lib_2/async/uncaught_error_handler_throws_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+import 'package:async_helper/async_helper.dart';
+import 'dart:async';
+
+void main() async {
+  asyncStart();
+  await testThrowSame();
+  await testThrowOther();
+  asyncEnd();
+}
+
+Future<void> testThrowSame() async {
+  asyncStart();
+  var object1 = Object();
+  var stack1 = StackTrace.current;
+  var outerZone = Zone.current;
+  var firstZone = Zone.current.fork(specification: onError((error, stack) {
+    // Uncaught error handlers run in the parent zone.
+    Expect.identical(outerZone, Zone.current);
+    Expect.identical(object1, error);
+    Expect.identical(stack1, stack); // Get same stack trace.
+    asyncEnd();
+  }));
+  firstZone.run(() async {
+    Expect.identical(firstZone, Zone.current);
+    var secondZone = Zone.current.fork(specification: onError((error, stack) {
+      // Uncaught error handlers run in the parent zone.
+      Expect.identical(firstZone, Zone.current);
+      Expect.identical(object1, error);
+      Expect.identical(stack1, stack);
+      throw error; // Throw same object
+    }));
+    secondZone.run(() async {
+      Expect.identical(secondZone, Zone.current);
+      Future.error(object1, stack1); // Unhandled async error.
+      await Future(() {});
+    });
+  });
+}
+
+Future<void> testThrowOther() async {
+  asyncStart();
+  var object1 = Object();
+  var object2 = Object();
+  var stack1 = StackTrace.current;
+  var outerZone = Zone.current;
+  var firstZone = Zone.current.fork(specification: onError((error, stack) {
+    Expect.identical(outerZone, Zone.current);
+    Expect.identical(object2, error);
+    Expect.notIdentical(stack1, stack); // Get different stack trace.
+    asyncEnd();
+  }));
+  firstZone.run(() async {
+    Expect.identical(firstZone, Zone.current);
+    var secondZone = Zone.current.fork(specification: onError((error, stack) {
+      Expect.identical(firstZone, Zone.current);
+      Expect.identical(object1, error);
+      Expect.identical(stack1, stack);
+      throw object2; // Throw different object
+    }));
+    secondZone.run(() async {
+      Expect.identical(secondZone, Zone.current);
+      Future.error(object1, stack1); // Unhandled async error.
+      await Future(() {});
+    });
+  });
+}
+
+ZoneSpecification onError(void Function(Object, StackTrace) handler) {
+  return ZoneSpecification(
+      handleUncaughtError: (s, p, z, e, st) => handler(e, st));
+}
diff --git a/tools/VERSION b/tools/VERSION
index 6eca443..b292fbb 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 22
+PRERELEASE 23
 PRERELEASE_PATCH 0
\ No newline at end of file
