diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index b6def05..b6f9a73 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-09-01T12:41:37.776425",
+  "generated": "2021-09-08T14:55:24.803714",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -70,7 +70,7 @@
       "name": "analysis_server",
       "rootUri": "../pkg/analysis_server",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.14"
     },
     {
       "name": "analysis_server_client",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 95f63a5..ffd3eec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -78,6 +78,10 @@
 - The experimental `waitFor` functionality, and the library containing only that
   function, are now deprecated.
 
+### `dart:core`
+
+- Add `Enum.compareByIndex` helper function for comparing enum values by index.
+
 ### Tools
 
 #### Dart command line
diff --git a/DEPS b/DEPS
index 728cf56..5416d53 100644
--- a/DEPS
+++ b/DEPS
@@ -72,7 +72,7 @@
   "gperftools_revision": "180bfa10d7cb38e8b3784d60943d50e8fcef0dcb",
 
   # Revisions of /third_party/* dependencies.
-  "args_rev": "bf4c8796881b62fd5d3f6d86ab43014f9651eb20",
+  "args_rev": "3b3f55766af13d895d2020ec001a28e8dc147f91",
   "async_rev": "ecb3835c5b746f7762327d5f57bdc92e0a2e0450",
   "bazel_worker_rev": "0885637b037979afbf5bcd05fd748b309fd669c0",
   "benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7",
@@ -118,7 +118,6 @@
   "http_parser_rev": "202391286ddc13c4c3c284ac5b511f04697250ed",
   "http_rev": "778174bca2c13becd88ef3353309190b1e8b9479",
   "icu_rev" : "81d656878ec611cb0b42d52c82e9dae93920d9ba",
-  "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
   "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "7e00f893440a72de0637970325e4ea44bd1e8c8e",
@@ -140,7 +139,7 @@
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
   "pub_rev": "cd7a43f2109f7e5eb22e73c7f4e15d25fd57598e",
-  "pub_semver_rev": "f50d80ef10c4b2fa5f4c8878036a4d9342c0cc82",
+  "pub_semver_rev": "baeea5ac3503546269d25c66523d4334c784a4f9",
   "resource_rev": "6b79867d0becf5395e5819a75720963b8298e9a7",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
@@ -161,7 +160,7 @@
   "test_descriptor_rev": "ead23c1e7df079ac0f6457a35f7a71432892e527",
   "test_process_rev": "7c73ec8a8a6e0e63d0ec27d70c21ca4323fb5e8f",
   "term_glyph_rev": "6a0f9b6fb645ba75e7a00a4e20072678327a0347",
-  "test_reflective_loader_rev": "54e930a11c372683792e22bddad79197728c91ce",
+  "test_reflective_loader_rev": "fcfce37666672edac849d2af6dffc0f8df236a94",
   "test_rev": "099dcc4d052a30c6921489cfbefa1c8531d12975",
   "typed_data_rev": "29ce5a92b03326d0b8035916ac04f528874994bd",
   "usage_rev": "e0780cd8b2f8af69a28dc52678ffe8492da27d06",
@@ -170,7 +169,7 @@
   "webdriver_rev": "ff5ccb1522edf4bed578ead4d65e0cbc1f2c4f02",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_rev": "6448ce532445a8a458fa191d9346df071ae0acad",
-  "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
+  "WebCore_rev": "bcb10901266c884e7b3740abc597ab95373ab55c",
   "webdev_rev": "832b096c0c24798d3df46faa7b7661fe930573c2",
   "webkit_inspection_protocol_rev": "dd6fb5d8b536e19cedb384d0bbf1f5631923f1e8",
   "yaml_rev": "2af44871f684c89e973a96e39026b8b88dda1987",
@@ -298,10 +297,6 @@
       Var("chromium_git") + "/chromium/deps/icu.git" +
       "@" + Var("icu_rev"),
 
-  Var("dart_root") + "/tools/idl_parser":
-      Var("chromium_git") + "/chromium/src/tools/idl_parser.git" +
-      "@" + Var("idl_parser_rev"),
-
   Var("dart_root") + "/third_party/WebCore":
       Var("dart_git") + "webcore.git" + "@" + Var("WebCore_rev"),
 
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 7c0603b..03ef62f 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -16,7 +16,6 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
-import 'package:analyzer/src/generated/utilities_general.dart';
 
 const jsonEncoder = JsonEncoder.withIndent('    ');
 
@@ -76,11 +75,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, isAnalyzing.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => isAnalyzing.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -163,12 +158,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, label);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -260,12 +250,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, file.hashCode);
-    hash = JenkinsSmiHash.combine(hash, offset.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(file, offset);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -482,17 +467,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, libId.hashCode);
-    hash = JenkinsSmiHash.combine(hash, displayUri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rOffset.hashCode);
-    hash = JenkinsSmiHash.combine(hash, iLength.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rLength.hashCode);
-    hash = JenkinsSmiHash.combine(hash, file.hashCode);
-    hash = JenkinsSmiHash.combine(hash, offset.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(libId, displayUri, rOffset, iLength, rLength, file, offset);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -554,11 +530,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, port.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => port.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -724,16 +696,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, parameters.hashCode);
-    hash = JenkinsSmiHash.combine(hash, typeParameters.hashCode);
-    hash = JenkinsSmiHash.combine(hash, returnType.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(range, name, kind, parameters, typeParameters, returnType);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -980,19 +944,16 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, className.hashCode);
-    hash = JenkinsSmiHash.combine(hash, variableName.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(attributes));
-    hash = JenkinsSmiHash.combine(hash, dartElement.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(children));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      kind,
+      label,
+      className,
+      variableName,
+      lspHashCode(attributes),
+      dartElement,
+      range,
+      codeRange,
+      lspHashCode(children));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1099,13 +1060,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, valueRange.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(name, label, valueRange);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1243,14 +1198,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, element.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(children));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(element, range, codeRange, lspHashCode(children));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1365,13 +1314,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, packageName.hashCode);
-    hash = JenkinsSmiHash.combine(hash, file.hashCode);
-    hash = JenkinsSmiHash.combine(hash, offset.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(packageName, file, offset);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1461,12 +1404,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(labels));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, lspHashCode(labels));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1552,12 +1490,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, outline.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, outline);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1641,12 +1574,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, outline.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, outline);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1764,13 +1692,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, insertTextFormat.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, newText.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(insertTextFormat, range, newText);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index f40ac85..e9701cd 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -16,7 +16,6 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
-import 'package:analyzer/src/generated/utilities_general.dart';
 
 const jsonEncoder = JsonEncoder.withIndent('    ');
 
@@ -132,13 +131,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, annotationId.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, newText.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(annotationId, range, newText);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -220,12 +213,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, edit.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(label, edit);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -336,13 +324,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, applied.hashCode);
-    hash = JenkinsSmiHash.combine(hash, failureReason.hashCode);
-    hash = JenkinsSmiHash.combine(hash, failedChange.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(applied, failureReason, failedChange);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -404,11 +386,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -502,12 +480,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, from.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(fromRanges));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(from, lspHashCode(fromRanges));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -629,13 +602,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, item.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(item, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -870,18 +837,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tags));
-    hash = JenkinsSmiHash.combine(hash, detail.hashCode);
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, selectionRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, data.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      name, kind, lspHashCode(tags), detail, uri, range, selectionRange, data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -940,11 +897,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1038,12 +991,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, to.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(fromRanges));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(to, lspHashCode(fromRanges));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1165,13 +1113,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, item.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(item, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1292,13 +1234,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, position, workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1412,13 +1348,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress, id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1484,11 +1415,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => id.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1598,13 +1525,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, needsConfirmation.hashCode);
-    hash = JenkinsSmiHash.combine(hash, description.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(label, needsConfirmation, description);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1756,15 +1677,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workspace.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, window.hashCode);
-    hash = JenkinsSmiHash.combine(hash, general.hashCode);
-    hash = JenkinsSmiHash.combine(hash, experimental.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(workspace, textDocument, window, general, experimental);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -1952,17 +1866,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didCreate.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willCreate.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didRename.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willRename.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didDelete.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willDelete.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, didCreate, willCreate,
+      didRename, willRename, didDelete, willDelete);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -2052,12 +1957,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, regularExpressions.hashCode);
-    hash = JenkinsSmiHash.combine(hash, markdown.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(regularExpressions, markdown);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -2174,13 +2074,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, showMessage.hashCode);
-    hash = JenkinsSmiHash.combine(hash, showDocument.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(workDoneProgress, showMessage, showDocument);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -2507,21 +2401,18 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, applyEdit.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workspaceEdit.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didChangeConfiguration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didChangeWatchedFiles.hashCode);
-    hash = JenkinsSmiHash.combine(hash, symbol.hashCode);
-    hash = JenkinsSmiHash.combine(hash, executeCommand.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workspaceFolders.hashCode);
-    hash = JenkinsSmiHash.combine(hash, configuration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, semanticTokens.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeLens.hashCode);
-    hash = JenkinsSmiHash.combine(hash, fileOperations.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      applyEdit,
+      workspaceEdit,
+      didChangeConfiguration,
+      didChangeWatchedFiles,
+      symbol,
+      executeCommand,
+      workspaceFolders,
+      configuration,
+      semanticTokens,
+      codeLens,
+      fileOperations);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -2769,18 +2660,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, title.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(diagnostics));
-    hash = JenkinsSmiHash.combine(hash, isPreferred.hashCode);
-    hash = JenkinsSmiHash.combine(hash, disabled.hashCode);
-    hash = JenkinsSmiHash.combine(hash, edit.hashCode);
-    hash = JenkinsSmiHash.combine(hash, command.hashCode);
-    hash = JenkinsSmiHash.combine(hash, data.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(title, kind, lspHashCode(diagnostics),
+      isPreferred, disabled, edit, command, data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -2993,17 +2874,14 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeActionLiteralSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, isPreferredSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, disabledSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, dataSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, resolveSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, honorsChangeAnnotations.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      dynamicRegistration,
+      codeActionLiteralSupport,
+      isPreferredSupport,
+      disabledSupport,
+      dataSupport,
+      resolveSupport,
+      honorsChangeAnnotations);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3077,11 +2955,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3154,11 +3028,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, codeActionKind.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => codeActionKind.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3229,11 +3099,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(properties));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(properties);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3336,12 +3202,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(diagnostics));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(only));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(diagnostics), lspHashCode(only));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3406,11 +3267,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, reason.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => reason.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3594,13 +3451,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(codeActionKinds));
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(codeActionKinds), resolveProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3780,15 +3632,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, context.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      textDocument, range, context, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -3932,14 +3777,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(codeActionKinds));
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(documentSelector),
+      lspHashCode(codeActionKinds), resolveProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4003,11 +3842,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, href.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => href.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4108,13 +3943,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, command.hashCode);
-    hash = JenkinsSmiHash.combine(hash, data.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, command, data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4171,11 +4000,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4253,12 +4078,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(resolveProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4382,13 +4202,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4497,13 +4312,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(documentSelector), resolveProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4569,11 +4379,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, refreshSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => refreshSupport.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4715,14 +4521,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, red.hashCode);
-    hash = JenkinsSmiHash.combine(hash, green.hashCode);
-    hash = JenkinsSmiHash.combine(hash, blue.hashCode);
-    hash = JenkinsSmiHash.combine(hash, alpha.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(red, green, blue, alpha);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4808,12 +4607,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, color.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, color);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -4933,13 +4727,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textEdit.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(additionalTextEdits));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(label, textEdit, lspHashCode(additionalTextEdits));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5118,15 +4907,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, color.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      textDocument, color, range, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5235,13 +5017,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, title.hashCode);
-    hash = JenkinsSmiHash.combine(hash, command.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(arguments));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(title, command, lspHashCode(arguments));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5376,14 +5152,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, completionItem.hashCode);
-    hash = JenkinsSmiHash.combine(hash, completionItemKind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, contextSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      dynamicRegistration, completionItem, completionItemKind, contextSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5659,19 +5429,16 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, snippetSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, commitCharactersSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentationFormat));
-    hash = JenkinsSmiHash.combine(hash, deprecatedSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, preselectSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, tagSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insertReplaceSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, resolveSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insertTextModeSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      snippetSupport,
+      commitCharactersSupport,
+      lspHashCode(documentationFormat),
+      deprecatedSupport,
+      preselectSupport,
+      tagSupport,
+      insertReplaceSupport,
+      resolveSupport,
+      insertTextModeSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5744,11 +5511,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5821,11 +5584,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5896,11 +5655,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(properties));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(properties);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -5972,11 +5727,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -6062,12 +5813,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, triggerKind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, triggerCharacter.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(triggerKind, triggerCharacter);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -6577,27 +6323,24 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tags));
-    hash = JenkinsSmiHash.combine(hash, detail.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
-    hash = JenkinsSmiHash.combine(hash, deprecated.hashCode);
-    hash = JenkinsSmiHash.combine(hash, preselect.hashCode);
-    hash = JenkinsSmiHash.combine(hash, sortText.hashCode);
-    hash = JenkinsSmiHash.combine(hash, filterText.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insertText.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insertTextFormat.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insertTextMode.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textEdit.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(additionalTextEdits));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(commitCharacters));
-    hash = JenkinsSmiHash.combine(hash, command.hashCode);
-    hash = JenkinsSmiHash.combine(hash, data.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      label,
+      kind,
+      lspHashCode(tags),
+      detail,
+      documentation,
+      deprecated,
+      preselect,
+      sortText,
+      filterText,
+      insertText,
+      insertTextFormat,
+      insertTextMode,
+      textEdit,
+      lspHashCode(additionalTextEdits),
+      lspHashCode(commitCharacters),
+      command,
+      data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -6768,12 +6511,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, isIncomplete.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(items));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(isIncomplete, lspHashCode(items));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -6924,14 +6662,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(triggerCharacters));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(allCommitCharacters));
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(triggerCharacters),
+      lspHashCode(allCommitCharacters), resolveProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7111,15 +6843,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, context.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      context, textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7299,15 +7024,12 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(triggerCharacters));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(allCommitCharacters));
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(documentSelector),
+      lspHashCode(triggerCharacters),
+      lspHashCode(allCommitCharacters),
+      resolveProvider,
+      workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7421,12 +7143,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, scopeUri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, section.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(scopeUri, section);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7494,11 +7211,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(items));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(items);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7638,14 +7351,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, options.hashCode);
-    hash = JenkinsSmiHash.combine(hash, annotationId.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(kind, uri, options, annotationId);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7723,12 +7429,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, overwrite.hashCode);
-    hash = JenkinsSmiHash.combine(hash, ignoreIfExists.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(overwrite, ignoreIfExists);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7798,11 +7499,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(files));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(files);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7883,12 +7580,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, linkSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -7947,11 +7639,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8106,14 +7794,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8227,13 +7909,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(workDoneProgress, lspHashCode(documentSelector), id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8313,12 +7990,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, linkSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8376,11 +8048,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8535,14 +8203,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8629,12 +8291,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8774,14 +8432,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, options.hashCode);
-    hash = JenkinsSmiHash.combine(hash, annotationId.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(kind, uri, options, annotationId);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8859,12 +8510,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, recursive.hashCode);
-    hash = JenkinsSmiHash.combine(hash, ignoreIfNotExists.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(recursive, ignoreIfNotExists);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -8934,11 +8580,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(files));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(files);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9200,19 +8842,16 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, severity.hashCode);
-    hash = JenkinsSmiHash.combine(hash, code.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeDescription.hashCode);
-    hash = JenkinsSmiHash.combine(hash, source.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tags));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(relatedInformation));
-    hash = JenkinsSmiHash.combine(hash, data.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      range,
+      severity,
+      code,
+      codeDescription,
+      source,
+      message,
+      lspHashCode(tags),
+      lspHashCode(relatedInformation),
+      data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9303,12 +8942,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, location.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(location, message);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9436,11 +9070,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9486,11 +9116,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, settings.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => settings.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9625,12 +9251,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(contentChanges));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, lspHashCode(contentChanges));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9693,11 +9314,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9766,11 +9383,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(changes));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(changes);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9843,11 +9456,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(watchers));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(watchers);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9912,11 +9521,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, event.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => event.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -9980,11 +9585,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => textDocument.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10048,11 +9649,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => textDocument.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10135,12 +9732,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, text.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, text);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10199,11 +9791,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10262,11 +9850,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10391,13 +9975,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10511,13 +10090,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), id, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10624,13 +10198,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, language.hashCode);
-    hash = JenkinsSmiHash.combine(hash, scheme.hashCode);
-    hash = JenkinsSmiHash.combine(hash, pattern.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(language, scheme, pattern);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10691,11 +10259,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10755,11 +10319,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10880,13 +10440,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, options.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, options, workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10979,12 +10533,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11069,12 +10619,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, kind);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11135,11 +10680,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11231,11 +10772,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11391,14 +10928,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11491,12 +11022,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11616,14 +11143,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, target.hashCode);
-    hash = JenkinsSmiHash.combine(hash, tooltip.hashCode);
-    hash = JenkinsSmiHash.combine(hash, data.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, target, tooltip, data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11705,12 +11225,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, tooltipSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, tooltipSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11789,12 +11304,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(resolveProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -11919,13 +11429,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12037,13 +11542,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(documentSelector), resolveProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12104,11 +11604,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12204,12 +11700,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, firstTriggerCharacter.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(moreTriggerCharacter));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(firstTriggerCharacter, lspHashCode(moreTriggerCharacter));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12360,14 +11852,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, ch.hashCode);
-    hash = JenkinsSmiHash.combine(hash, options.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(ch, options, textDocument, position);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12496,13 +11981,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, firstTriggerCharacter.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(moreTriggerCharacter));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(documentSelector),
+      firstTriggerCharacter, lspHashCode(moreTriggerCharacter));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12563,11 +12043,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12629,11 +12105,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12785,14 +12257,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, options.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, range, options, workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -12885,12 +12350,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13143,18 +12604,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    hash = JenkinsSmiHash.combine(hash, detail.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tags));
-    hash = JenkinsSmiHash.combine(hash, deprecated.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, selectionRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(children));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(name, detail, kind, lspHashCode(tags),
+      deprecated, range, selectionRange, lspHashCode(children));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13323,16 +12774,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, symbolKind.hashCode);
-    hash = JenkinsSmiHash.combine(
-        hash, hierarchicalDocumentSymbolSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, tagSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, labelSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, symbolKind,
+      hierarchicalDocumentSymbolSupport, tagSupport, labelSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13404,11 +12847,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13479,11 +12918,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13564,12 +12999,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(label, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13694,13 +13124,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13814,13 +13239,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), label, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -13932,11 +13352,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14024,12 +13440,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(commands));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(commands), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14143,13 +13554,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, command.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(arguments));
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(command, lspHashCode(arguments), workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14238,12 +13644,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(commands));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(commands), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14385,11 +13786,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => uri.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14453,11 +13850,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => uri.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14544,12 +13937,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, type.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, type);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14634,12 +14022,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, scheme.hashCode);
-    hash = JenkinsSmiHash.combine(hash, pattern.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(scheme, pattern);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14763,13 +14146,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, glob.hashCode);
-    hash = JenkinsSmiHash.combine(hash, matches.hashCode);
-    hash = JenkinsSmiHash.combine(hash, options.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(glob, matches, options);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14859,11 +14236,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, ignoreCase.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => ignoreCase.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -14936,11 +14309,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(filters));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(filters);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15028,12 +14397,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, oldUri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, newUri.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(oldUri, newUri);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15126,12 +14490,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, globPattern.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(globPattern, kind);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15299,15 +14658,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, startLine.hashCode);
-    hash = JenkinsSmiHash.combine(hash, startCharacter.hashCode);
-    hash = JenkinsSmiHash.combine(hash, endLine.hashCode);
-    hash = JenkinsSmiHash.combine(hash, endCharacter.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(startLine, startCharacter, endLine, endCharacter, kind);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15415,13 +14767,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rangeLimit.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lineFoldingOnly.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(dynamicRegistration, rangeLimit, lineFoldingOnly);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15511,11 +14858,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15640,13 +14983,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15760,13 +15098,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress, id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -15926,15 +15259,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, tabSize.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insertSpaces.hashCode);
-    hash = JenkinsSmiHash.combine(hash, trimTrailingWhitespace.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insertFinalNewline.hashCode);
-    hash = JenkinsSmiHash.combine(hash, trimFinalNewlines.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(tabSize, insertSpaces, trimTrailingWhitespace,
+      insertFinalNewline, trimFinalNewlines);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16024,12 +15350,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, contents.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(contents, range);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16116,12 +15437,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(contentFormat));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(dynamicRegistration, lspHashCode(contentFormat));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16179,11 +15496,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16303,13 +15616,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, position, workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16395,12 +15702,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16483,12 +15786,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, linkSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16547,11 +15845,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16707,14 +16001,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -16828,13 +16116,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress, id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17120,20 +16403,17 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, processId.hashCode);
-    hash = JenkinsSmiHash.combine(hash, clientInfo.hashCode);
-    hash = JenkinsSmiHash.combine(hash, locale.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rootPath.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rootUri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, initializationOptions.hashCode);
-    hash = JenkinsSmiHash.combine(hash, capabilities.hashCode);
-    hash = JenkinsSmiHash.combine(hash, trace.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(workspaceFolders));
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      processId,
+      clientInfo,
+      locale,
+      rootPath,
+      rootUri,
+      initializationOptions,
+      capabilities,
+      trace,
+      lspHashCode(workspaceFolders),
+      workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17214,12 +16494,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(name, version);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17307,12 +16582,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, capabilities.hashCode);
-    hash = JenkinsSmiHash.combine(hash, serverInfo.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(capabilities, serverInfo);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17393,12 +16663,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(name, version);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17435,10 +16700,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => 42;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17555,13 +16817,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, newText.hashCode);
-    hash = JenkinsSmiHash.combine(hash, insert.hashCode);
-    hash = JenkinsSmiHash.combine(hash, replace.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(newText, insert, replace);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17701,11 +16957,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17765,11 +17017,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -17890,13 +17138,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, position, workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18012,13 +17254,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress, id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18108,12 +17345,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(ranges));
-    hash = JenkinsSmiHash.combine(hash, wordPattern.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(ranges), wordPattern);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18196,12 +17428,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, range);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18353,14 +17580,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, originSelectionRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, targetUri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, targetRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, targetSelectionRange.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      originSelectionRange, targetUri, targetRange, targetSelectionRange);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18446,12 +17667,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, type.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(type, message);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18532,12 +17748,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    hash = JenkinsSmiHash.combine(hash, verbose.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(message, verbose);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18620,12 +17831,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, parser.hashCode);
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(parser, version);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18732,12 +17938,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, value.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(kind, value);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18843,11 +18044,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => jsonrpc.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -18909,11 +18106,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, title.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => title.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -19358,14 +18551,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, scheme.hashCode);
-    hash = JenkinsSmiHash.combine(hash, identifier.hashCode);
-    hash = JenkinsSmiHash.combine(hash, unique.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(scheme, identifier, unique, kind);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -19425,11 +18611,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -19519,11 +18701,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -19678,14 +18856,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -19771,12 +18943,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -19875,13 +19043,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, method.hashCode);
-    hash = JenkinsSmiHash.combine(hash, params.hashCode);
-    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(method, params, jsonrpc);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -19976,12 +19138,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(version, uri);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20086,12 +19243,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(label, documentation);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20222,11 +19374,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => partialResultToken.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20317,12 +19465,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, line.hashCode);
-    hash = JenkinsSmiHash.combine(hash, character.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(line, character);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20412,12 +19555,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, position);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20515,12 +19653,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, token.hashCode);
-    hash = JenkinsSmiHash.combine(hash, value.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(token, value);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20682,15 +19815,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, relatedInformation.hashCode);
-    hash = JenkinsSmiHash.combine(hash, tagSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, versionSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeDescriptionSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, dataSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(relatedInformation, tagSupport,
+      versionSupport, codeDescriptionSupport, dataSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20762,11 +19888,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20883,13 +20005,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(diagnostics));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, version, lspHashCode(diagnostics));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -20974,12 +20090,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, start.hashCode);
-    hash = JenkinsSmiHash.combine(hash, end.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(start, end);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21063,12 +20174,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, placeholder.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, placeholder);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21127,11 +20233,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21193,11 +20295,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, includeDeclaration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => includeDeclaration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21255,11 +20353,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21441,15 +20535,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, context.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      context, textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21536,12 +20623,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21641,13 +20724,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    hash = JenkinsSmiHash.combine(hash, method.hashCode);
-    hash = JenkinsSmiHash.combine(hash, registerOptions.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(id, method, registerOptions);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21716,11 +20793,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(registrations));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(registrations);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21806,12 +20879,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, engine.hashCode);
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(engine, version);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -21955,14 +21023,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, prepareSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, prepareSupportDefaultBehavior.hashCode);
-    hash = JenkinsSmiHash.combine(hash, honorsChangeAnnotations.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, prepareSupport,
+      prepareSupportDefaultBehavior, honorsChangeAnnotations);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22132,15 +21194,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, oldUri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, newUri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, options.hashCode);
-    hash = JenkinsSmiHash.combine(hash, annotationId.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(kind, oldUri, newUri, options, annotationId);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22218,12 +21272,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, overwrite.hashCode);
-    hash = JenkinsSmiHash.combine(hash, ignoreIfExists.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(overwrite, ignoreIfExists);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22294,11 +21343,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(files));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(files);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22376,12 +21421,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, prepareProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(prepareProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22531,14 +21571,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, newName.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(newName, textDocument, position, workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22646,13 +21680,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, prepareProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(documentSelector), prepareProvider, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22781,14 +21810,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    hash = JenkinsSmiHash.combine(hash, method.hashCode);
-    hash = JenkinsSmiHash.combine(hash, params.hashCode);
-    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(id, method, params, jsonrpc);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -22933,13 +21955,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, code.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    hash = JenkinsSmiHash.combine(hash, data.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(code, message, data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23060,14 +22076,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    hash = JenkinsSmiHash.combine(hash, result.hashCode);
-    hash = JenkinsSmiHash.combine(hash, error.hashCode);
-    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(id, result, error, jsonrpc);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23123,11 +22132,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, includeText.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => includeText.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23210,12 +22215,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, parent.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, parent);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23277,11 +22277,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => dynamicRegistration.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23340,11 +22336,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23500,14 +22492,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(positions));
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      textDocument, lspHashCode(positions), workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23621,13 +22607,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(workDoneProgress, lspHashCode(documentSelector), id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -23793,12 +22774,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, resultId.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(data));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(resultId, lspHashCode(data));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24035,17 +23011,14 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, requests.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tokenTypes));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tokenModifiers));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(formats));
-    hash = JenkinsSmiHash.combine(hash, overlappingTokenSupport.hashCode);
-    hash = JenkinsSmiHash.combine(hash, multilineTokenSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      dynamicRegistration,
+      requests,
+      lspHashCode(tokenTypes),
+      lspHashCode(tokenModifiers),
+      lspHashCode(formats),
+      overlappingTokenSupport,
+      multilineTokenSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24106,11 +23079,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, delta.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => delta.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24151,10 +23120,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => 42;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24260,12 +23226,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, full.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, full);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24352,12 +23313,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, resultId.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(edits));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(resultId, lspHashCode(edits));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24510,14 +23466,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, previousResultId.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      textDocument, previousResultId, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24587,11 +23537,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(edits));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(edits);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24703,13 +23649,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, start.hashCode);
-    hash = JenkinsSmiHash.combine(hash, deleteCount.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(data));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(start, deleteCount, lspHashCode(data));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24808,12 +23748,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tokenTypes));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tokenModifiers));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(tokenTypes), lspHashCode(tokenModifiers));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24965,14 +23901,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, legend.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, full.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(legend, range, full, workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -25029,11 +23958,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, delta.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => delta.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -25071,10 +23996,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => 42;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -25199,13 +24121,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -25269,11 +24186,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(data));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(data);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -25425,14 +24338,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, range, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -25642,16 +24549,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, legend.hashCode);
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, full.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(documentSelector), legend, range, full, workDoneProgress, id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -25718,11 +24617,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, refreshSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => refreshSupport.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -26768,41 +25663,37 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocumentSync.hashCode);
-    hash = JenkinsSmiHash.combine(hash, completionProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, hoverProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, signatureHelpProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, declarationProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, definitionProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, typeDefinitionProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, implementationProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, referencesProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentHighlightProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentSymbolProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeActionProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeLensProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentLinkProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, colorProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentFormattingProvider.hashCode);
-    hash =
-        JenkinsSmiHash.combine(hash, documentRangeFormattingProvider.hashCode);
-    hash =
-        JenkinsSmiHash.combine(hash, documentOnTypeFormattingProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, renameProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, foldingRangeProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, executeCommandProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, selectionRangeProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, linkedEditingRangeProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, callHierarchyProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, semanticTokensProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, monikerProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workspaceSymbolProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workspace.hashCode);
-    hash = JenkinsSmiHash.combine(hash, experimental.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hashAll([
+        textDocumentSync,
+        completionProvider,
+        hoverProvider,
+        signatureHelpProvider,
+        declarationProvider,
+        definitionProvider,
+        typeDefinitionProvider,
+        implementationProvider,
+        referencesProvider,
+        documentHighlightProvider,
+        documentSymbolProvider,
+        codeActionProvider,
+        codeLensProvider,
+        documentLinkProvider,
+        colorProvider,
+        documentFormattingProvider,
+        documentRangeFormattingProvider,
+        documentOnTypeFormattingProvider,
+        renameProvider,
+        foldingRangeProvider,
+        executeCommandProvider,
+        selectionRangeProvider,
+        linkedEditingRangeProvider,
+        callHierarchyProvider,
+        semanticTokensProvider,
+        monikerProvider,
+        workspaceSymbolProvider,
+        workspace,
+        experimental
+      ]);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27001,16 +25892,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, didCreate.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willCreate.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didRename.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willRename.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didDelete.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willDelete.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      didCreate, willCreate, didRename, willRename, didDelete, willDelete);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27103,12 +25986,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workspaceFolders.hashCode);
-    hash = JenkinsSmiHash.combine(hash, fileOperations.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(workspaceFolders, fileOperations);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27172,11 +26050,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, value.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => value.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27242,11 +26116,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, support.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => support.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27382,14 +26252,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, external.hashCode);
-    hash = JenkinsSmiHash.combine(hash, takeFocus.hashCode);
-    hash = JenkinsSmiHash.combine(hash, selection.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, external, takeFocus, selection);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27454,11 +26317,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, success.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => success.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27544,12 +26403,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, type.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(type, message);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27618,11 +26472,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, messageActionItem.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => messageActionItem.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27690,11 +26540,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, additionalPropertiesSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => additionalPropertiesSupport.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27811,13 +26657,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, type.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(actions));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(type, message, lspHashCode(actions));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -27944,13 +26784,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(signatures));
-    hash = JenkinsSmiHash.combine(hash, activeSignature.hashCode);
-    hash = JenkinsSmiHash.combine(hash, activeParameter.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(signatures), activeSignature, activeParameter);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -28065,13 +26900,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, signatureInformation.hashCode);
-    hash = JenkinsSmiHash.combine(hash, contextSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(dynamicRegistration, signatureInformation, contextSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -28137,11 +26967,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, labelOffsetSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => labelOffsetSupport.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -28266,13 +27092,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentationFormat));
-    hash = JenkinsSmiHash.combine(hash, parameterInformation.hashCode);
-    hash = JenkinsSmiHash.combine(hash, activeParameterSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(documentationFormat),
+      parameterInformation, activeParameterSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -28425,14 +27246,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, triggerKind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, triggerCharacter.hashCode);
-    hash = JenkinsSmiHash.combine(hash, isRetrigger.hashCode);
-    hash = JenkinsSmiHash.combine(hash, activeSignatureHelp.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      triggerKind, triggerCharacter, isRetrigger, activeSignatureHelp);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -28549,13 +27364,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(triggerCharacters));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(retriggerCharacters));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(triggerCharacters),
+      lspHashCode(retriggerCharacters), workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -28705,14 +27515,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, context.hashCode);
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(context, textDocument, position, workDoneToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -28861,14 +27665,11 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(triggerCharacters));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(retriggerCharacters));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(documentSelector),
+      lspHashCode(triggerCharacters),
+      lspHashCode(retriggerCharacters),
+      workDoneProgress);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -29055,14 +27856,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, label.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(parameters));
-    hash = JenkinsSmiHash.combine(hash, activeParameter.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      label, documentation, lspHashCode(parameters), activeParameter);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -29149,11 +27944,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => id.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -29354,16 +28145,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(tags));
-    hash = JenkinsSmiHash.combine(hash, deprecated.hashCode);
-    hash = JenkinsSmiHash.combine(hash, location.hashCode);
-    hash = JenkinsSmiHash.combine(hash, containerName.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      name, kind, lspHashCode(tags), deprecated, location, containerName);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -29539,12 +28322,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, syncKind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(syncKind, lspHashCode(documentSelector));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -30278,36 +29056,34 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, synchronization.hashCode);
-    hash = JenkinsSmiHash.combine(hash, completion.hashCode);
-    hash = JenkinsSmiHash.combine(hash, hover.hashCode);
-    hash = JenkinsSmiHash.combine(hash, signatureHelp.hashCode);
-    hash = JenkinsSmiHash.combine(hash, declaration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, definition.hashCode);
-    hash = JenkinsSmiHash.combine(hash, typeDefinition.hashCode);
-    hash = JenkinsSmiHash.combine(hash, implementation.hashCode);
-    hash = JenkinsSmiHash.combine(hash, references.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentHighlight.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentSymbol.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeAction.hashCode);
-    hash = JenkinsSmiHash.combine(hash, codeLens.hashCode);
-    hash = JenkinsSmiHash.combine(hash, documentLink.hashCode);
-    hash = JenkinsSmiHash.combine(hash, colorProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, formatting.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rangeFormatting.hashCode);
-    hash = JenkinsSmiHash.combine(hash, onTypeFormatting.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rename.hashCode);
-    hash = JenkinsSmiHash.combine(hash, publishDiagnostics.hashCode);
-    hash = JenkinsSmiHash.combine(hash, foldingRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, selectionRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, linkedEditingRange.hashCode);
-    hash = JenkinsSmiHash.combine(hash, callHierarchy.hashCode);
-    hash = JenkinsSmiHash.combine(hash, semanticTokens.hashCode);
-    hash = JenkinsSmiHash.combine(hash, moniker.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hashAll([
+        synchronization,
+        completion,
+        hover,
+        signatureHelp,
+        declaration,
+        definition,
+        typeDefinition,
+        implementation,
+        references,
+        documentHighlight,
+        documentSymbol,
+        codeAction,
+        codeLens,
+        documentLink,
+        colorProvider,
+        formatting,
+        rangeFormatting,
+        onTypeFormatting,
+        rename,
+        publishDiagnostics,
+        foldingRange,
+        selectionRange,
+        linkedEditingRange,
+        callHierarchy,
+        semanticTokens,
+        moniker
+      ]);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -30419,13 +29195,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, rangeLength.hashCode);
-    hash = JenkinsSmiHash.combine(hash, text.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, rangeLength, text);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -30489,11 +29259,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, text.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => text.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -30607,12 +29373,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(edits));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, lspHashCode(edits));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -30682,11 +29443,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => uri.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -30830,14 +29587,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, languageId.hashCode);
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    hash = JenkinsSmiHash.combine(hash, text.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, languageId, version, text);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -30974,12 +29724,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, position);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -31133,11 +29878,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(documentSelector);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -31262,12 +30003,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, includeText.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(includeText, lspHashCode(documentSelector));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -31395,14 +30131,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willSave.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willSaveWaitUntil.hashCode);
-    hash = JenkinsSmiHash.combine(hash, didSave.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(dynamicRegistration, willSave, willSaveWaitUntil, didSave);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -31597,15 +30327,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, openClose.hashCode);
-    hash = JenkinsSmiHash.combine(hash, change.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willSave.hashCode);
-    hash = JenkinsSmiHash.combine(hash, willSaveWaitUntil.hashCode);
-    hash = JenkinsSmiHash.combine(hash, save.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(openClose, change, willSave, willSaveWaitUntil, save);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -31698,12 +30421,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    hash = JenkinsSmiHash.combine(hash, newText.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(range, newText);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -31809,12 +30527,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, linkSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -31873,11 +30586,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32033,14 +30742,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(textDocument, position, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32154,13 +30857,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(lspHashCode(documentSelector), workDoneProgress, id);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32285,12 +30983,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    hash = JenkinsSmiHash.combine(hash, method.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(id, method);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32362,11 +31055,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(unregisterations));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(unregisterations);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32458,12 +31147,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, version.hashCode);
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(version, uri);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32586,12 +31270,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, reason.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(textDocument, reason);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32763,15 +31442,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, title.hashCode);
-    hash = JenkinsSmiHash.combine(hash, cancellable.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    hash = JenkinsSmiHash.combine(hash, percentage.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode =>
+      Object.hash(kind, title, cancellable, message, percentage);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32839,11 +31511,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, token.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => token.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -32911,11 +31579,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, token.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => token.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33000,12 +31664,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(kind, message);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33136,11 +31795,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33297,11 +31952,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneToken.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33443,14 +32094,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, cancellable.hashCode);
-    hash = JenkinsSmiHash.combine(hash, message.hashCode);
-    hash = JenkinsSmiHash.combine(hash, percentage.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(kind, cancellable, message, percentage);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33618,13 +32262,8 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(changes));
-    hash = JenkinsSmiHash.combine(hash, documentChanges.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(changeAnnotations));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      lspHashCode(changes), documentChanges, lspHashCode(changeAnnotations));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33795,15 +32434,12 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, documentChanges.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(resourceOperations));
-    hash = JenkinsSmiHash.combine(hash, failureHandling.hashCode);
-    hash = JenkinsSmiHash.combine(hash, normalizesLineEndings.hashCode);
-    hash = JenkinsSmiHash.combine(hash, changeAnnotationSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(
+      documentChanges,
+      lspHashCode(resourceOperations),
+      failureHandling,
+      normalizesLineEndings,
+      changeAnnotationSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33868,11 +32504,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, groupsOnLabel.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => groupsOnLabel.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -33959,12 +32591,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
-    hash = JenkinsSmiHash.combine(hash, name.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(uri, name);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34065,12 +32692,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(added));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(removed));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(lspHashCode(added), lspHashCode(removed));
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34164,12 +32786,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, supported.hashCode);
-    hash = JenkinsSmiHash.combine(hash, changeNotifications.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(supported, changeNotifications);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34285,13 +32902,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
-    hash = JenkinsSmiHash.combine(hash, symbolKind.hashCode);
-    hash = JenkinsSmiHash.combine(hash, tagSupport.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(dynamicRegistration, symbolKind, tagSupport);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34363,11 +32974,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34438,11 +33045,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => lspHashCode(valueSet);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34502,11 +33105,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34630,13 +33229,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, query.hashCode);
-    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
-    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => Object.hash(query, workDoneToken, partialResultToken);
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -34697,11 +33290,7 @@
   }
 
   @override
-  int get hashCode {
-    var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
+  int get hashCode => workDoneProgress.hashCode;
 
   @override
   String toString() => jsonEncoder.convert(toJson());
diff --git a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
index 5eaa592..e433551 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 
 /// Compute which suggestion sets should be included into completion inside
@@ -362,8 +361,7 @@
   @override
   final int hashCode;
 
-  _ImportedElement(this.uri, this.name)
-      : hashCode = JenkinsSmiHash.hash2(uri, name);
+  _ImportedElement(this.uri, this.name) : hashCode = Object.hash(uri, name);
 
   @override
   bool operator ==(other) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_switch_case_break.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_switch_case_break.dart
new file mode 100644
index 0000000..fc4225d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_switch_case_break.dart
@@ -0,0 +1,37 @@
+// 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class AddSwitchCaseBreak extends CorrectionProducer {
+  @override
+  bool get canBeAppliedToFile => true;
+
+  @override
+  FixKind get fixKind => DartFixKind.ADD_SWITCH_CASE_BREAK;
+
+  @override
+  FixKind get multiFixKind => DartFixKind.ADD_SWITCH_CASE_BREAK_MULTI;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    var node = this.node;
+    if (node is! SwitchCase) return;
+
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addInsertion(node.end, (builder) {
+        builder.write(eol);
+        builder.write(utils.getNodePrefix(node.statements.last));
+        builder.write('break;');
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static AddSwitchCaseBreak newInstance() => AddSwitchCaseBreak();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_abstract.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_abstract.dart
new file mode 100644
index 0000000..7a6dc30b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_abstract.dart
@@ -0,0 +1,37 @@
+// 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class RemoveAbstract extends CorrectionProducerWithDiagnostic {
+  @override
+  bool get canBeAppliedToFile => true;
+
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_ABSTRACT;
+
+  @override
+  FixKind get multiFixKind => DartFixKind.REMOVE_ABSTRACT_MULTI;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    // 'abstract' keyword does not exist in AST
+    var offset = diagnostic.problemMessage.offset;
+    var content = resolvedResult.content;
+    var i = offset + 'abstract '.length;
+    while (content[i].trim().isEmpty) {
+      i++;
+    }
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addDeletion(SourceRange(offset, i - offset));
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveAbstract newInstance() => RemoveAbstract();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_constructor_name.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_constructor_name.dart
new file mode 100644
index 0000000..059bb3b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_constructor_name.dart
@@ -0,0 +1,39 @@
+// 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveConstructorName extends CorrectionProducer {
+  @override
+  bool get canBeAppliedInBulk => true;
+
+  @override
+  bool get canBeAppliedToFile => true;
+
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_CONSTRUCTOR_NAME;
+
+  @override
+  FixKind get multiFixKind => DartFixKind.REMOVE_CONSTRUCTOR_NAME_MULTI;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    final identifier = node;
+    if (identifier is! SimpleIdentifier) return;
+
+    // The '.' in ".new"
+    var dotToken = identifier.token.previous!;
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addDeletion(range.startStart(dotToken, identifier.token.next!));
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveConstructorName newInstance() => RemoveConstructorName();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.dart
index 8f0f19b..9c84f73 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.dart
@@ -43,6 +43,16 @@
             builder.write(utils.getNodeText(expression.function));
           });
         });
+      } else if (expression is InstanceCreationExpression) {
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addReplacement(range.node(ancestor), (builder) {
+            var constructorName = expression.constructorName;
+            builder.write(utils.getNodeText(constructorName));
+            if (constructorName.name == null) {
+              builder.write('.new');
+            }
+          });
+        });
       }
     }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 1d19faa..1c03c65 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -234,6 +234,16 @@
     DartFixKindPriority.DEFAULT,
     'Add super constructor {0} invocation',
   );
+  static const ADD_SWITCH_CASE_BREAK = FixKind(
+    'dart.fix.add.switchCaseReturn',
+    DartFixKindPriority.DEFAULT,
+    "Add 'break'",
+  );
+  static const ADD_SWITCH_CASE_BREAK_MULTI = FixKind(
+    'dart.fix.add.switchCaseReturn.multi',
+    DartFixKindPriority.IN_FILE,
+    "Add 'break' everywhere in file",
+  );
   static const ADD_TYPE_ANNOTATION = FixKind(
     'dart.fix.add.typeAnnotation',
     DartFixKindPriority.DEFAULT,
@@ -703,6 +713,16 @@
     DartFixKindPriority.DEFAULT,
     "Use '{0}'",
   );
+  static const REMOVE_ABSTRACT = FixKind(
+    'dart.fix.remove.abstract',
+    DartFixKindPriority.DEFAULT,
+    "Remove the 'abstract' keyword",
+  );
+  static const REMOVE_ABSTRACT_MULTI = FixKind(
+    'dart.fix.remove.abstract.multi',
+    DartFixKindPriority.IN_FILE,
+    "Remove the 'abstract' keyword everywhere in file",
+  );
   static const REMOVE_ANNOTATION = FixKind(
     'dart.fix.remove.annotation',
     DartFixKindPriority.DEFAULT,
@@ -745,6 +765,16 @@
     DartFixKindPriority.DEFAULT,
     'Remove const',
   );
+  static const REMOVE_CONSTRUCTOR_NAME = FixKind(
+    'dart.fix.remove.constructorName',
+    DartFixKindPriority.DEFAULT,
+    "Remove 'new'",
+  );
+  static const REMOVE_CONSTRUCTOR_NAME_MULTI = FixKind(
+    'dart.fix.remove.constructorName.multi',
+    DartFixKindPriority.IN_FILE,
+    'Remove constructor names in file',
+  );
   static const REMOVE_DEAD_CODE = FixKind(
     'dart.fix.remove.deadCode',
     DartFixKindPriority.DEFAULT,
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 9f2403c..3633b99 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -28,6 +28,7 @@
 import 'package:analysis_server/src/services/correction/dart/add_return_type.dart';
 import 'package:analysis_server/src/services/correction/dart/add_static.dart';
 import 'package:analysis_server/src/services/correction/dart/add_super_constructor_invocation.dart';
+import 'package:analysis_server/src/services/correction/dart/add_switch_case_break.dart';
 import 'package:analysis_server/src/services/correction/dart/add_type_annotation.dart';
 import 'package:analysis_server/src/services/correction/dart/change_argument_name.dart';
 import 'package:analysis_server/src/services/correction/dart/change_to.dart';
@@ -96,6 +97,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_await.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_comparison.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_const.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_constructor_name.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_code.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_if_null.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_duplicate_case.dart';
@@ -176,6 +178,8 @@
 import 'package:analyzer_plugin/utilities/change_builder/conflicting_edit_exception.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart' hide FixContributor;
 
+import 'dart/remove_abstract.dart';
+
 /// A function that can be executed to create a multi-correction producer.
 typedef MultiProducerGenerator = MultiCorrectionProducer Function();
 
@@ -556,6 +560,9 @@
     LintNames.unnecessary_const: [
       RemoveUnnecessaryConst.newInstance,
     ],
+    LintNames.unnecessary_constructor_name: [
+      RemoveConstructorName.newInstance,
+    ],
     LintNames.unnecessary_final: [
       ReplaceFinalWithVar.newInstance,
     ],
@@ -928,6 +935,9 @@
       MakeReturnTypeNullable.newInstance,
       ReplaceReturnType.newInstance,
     ],
+    CompileTimeErrorCode.SWITCH_CASE_COMPLETES_NORMALLY: [
+      AddSwitchCaseBreak.newInstance,
+    ],
     CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME: [
       ChangeTo.classOrMixin,
       CreateClass.newInstance,
@@ -1209,6 +1219,9 @@
     HintCode.UNUSED_SHOWN_NAME: [
       RemoveNameFromCombinator.newInstance,
     ],
+    ParserErrorCode.ABSTRACT_CLASS_MEMBER: [
+      RemoveAbstract.newInstance,
+    ],
     ParserErrorCode.EXPECTED_TOKEN: [
       InsertSemicolon.newInstance,
     ],
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index ccafb32..af54793 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -111,6 +111,8 @@
   static const String unnecessary_brace_in_string_interps =
       'unnecessary_brace_in_string_interps';
   static const String unnecessary_const = 'unnecessary_const';
+  static const String unnecessary_constructor_name =
+      'unnecessary_constructor_name';
   static const String unnecessary_final = 'unnecessary_final';
   static const String unnecessary_lambdas = 'unnecessary_lambdas';
   static const String unnecessary_new = 'unnecessary_new';
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 5629eb1..0879e01 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -3,7 +3,7 @@
 publish_to: none
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.14.0 <3.0.0'
 
 dependencies:
   _fe_analyzer_shared:
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_switch_case_break_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_switch_case_break_test.dart
new file mode 100644
index 0000000..618ca93
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_switch_case_break_test.dart
@@ -0,0 +1,83 @@
+// 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddSwitchCaseBreakBulkTest);
+    defineReflectiveTests(AddSwitchCaseBreakTest);
+  });
+}
+
+@reflectiveTest
+class AddSwitchCaseBreakBulkTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_SWITCH_CASE_BREAK_MULTI;
+
+  Future<void> test_add_break_bulk() async {
+    await resolveTestCode('''
+void f(int i) {
+  switch(i) {
+    case 0:
+      i++;
+    case 1:
+      i++;
+    case 2:
+      i++;
+  }
+}
+''');
+    await assertHasFixAllFix(
+        CompileTimeErrorCode.SWITCH_CASE_COMPLETES_NORMALLY, '''
+void f(int i) {
+  switch(i) {
+    case 0:
+      i++;
+      break;
+    case 1:
+      i++;
+      break;
+    case 2:
+      i++;
+  }
+}
+''');
+  }
+}
+
+@reflectiveTest
+class AddSwitchCaseBreakTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_SWITCH_CASE_BREAK;
+
+  Future<void> test_indentation() async {
+    await resolveTestCode('''
+void f(int i) {
+    switch(i) {
+        case 0:
+            i++;
+        case 1:
+            i++;
+  }
+}
+''');
+    await assertHasFix('''
+void f(int i) {
+    switch(i) {
+        case 0:
+            i++;
+            break;
+        case 1:
+            i++;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_abstract_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_abstract_test.dart
new file mode 100644
index 0000000..f1cab1e
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_abstract_test.dart
@@ -0,0 +1,83 @@
+// 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveAbstractBulkTest);
+    defineReflectiveTests(RemoveAbstractTest);
+  });
+}
+
+@reflectiveTest
+class RemoveAbstractBulkTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_ABSTRACT_MULTI;
+
+  Future<void> test_bulk() async {
+    await resolveTestCode('''
+class MyClass {
+  abstract void m1() {}
+  abstract void m2() {}
+}
+''');
+    await assertHasFixAllFix(ParserErrorCode.ABSTRACT_CLASS_MEMBER, '''
+class MyClass {
+  void m1() {}
+  void m2() {}
+}
+''');
+  }
+}
+
+@reflectiveTest
+class RemoveAbstractTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_ABSTRACT;
+
+  Future<void> test_extension() async {
+    await resolveTestCode('''
+extension E on String {
+  abstract void m() {}
+}
+''');
+    await assertHasFix('''
+extension E on String {
+  void m() {}
+}
+''');
+  }
+
+  Future<void> test_mixin() async {
+    await resolveTestCode('''
+mixin M {
+  abstract void m() {}
+}
+''');
+    await assertHasFix('''
+mixin M {
+  void m() {}
+}
+''');
+  }
+
+  Future<void> test_spaces() async {
+    await resolveTestCode('''
+abstract class MyClass {
+  abstract    void m1();
+}
+''');
+    await assertHasFix('''
+abstract class MyClass {
+  void m1();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_constructor_name_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_constructor_name_test.dart
new file mode 100644
index 0000000..27e84a8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_constructor_name_test.dart
@@ -0,0 +1,106 @@
+// 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/expect.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveConstructorNameBulkTest);
+    defineReflectiveTests(RemoveConstructorNameInFileTest);
+    defineReflectiveTests(RemoveConstructorNameTest);
+  });
+}
+
+@reflectiveTest
+class RemoveConstructorNameBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.unnecessary_constructor_name;
+
+  Future<void> test_singleFile() async {
+    await resolveTestCode(r'''
+class A {
+  A.new(int x) {
+    print('new: $x');
+  }
+}
+var a = A.new(3);
+''');
+    await assertHasFix(r'''
+class A {
+  A(int x) {
+    print('new: $x');
+  }
+}
+var a = A(3);
+''');
+  }
+}
+
+@reflectiveTest
+class RemoveConstructorNameInFileTest extends FixInFileProcessorTest {
+  Future<void> test_File() async {
+    createAnalysisOptionsFile(lints: [LintNames.unnecessary_constructor_name]);
+    await resolveTestCode(r'''
+class A {
+  A.new(int x) {
+    print('new: $x');
+  }
+}
+var a = A.new(3);
+''');
+    var fixes = await getFixesForFirstError();
+    expect(fixes, hasLength(1));
+    assertProduces(fixes.first, r'''
+class A {
+  A(int x) {
+    print('new: $x');
+  }
+}
+var a = A(3);
+''');
+  }
+}
+
+@reflectiveTest
+class RemoveConstructorNameTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_CONSTRUCTOR_NAME;
+
+  @override
+  String get lintCode => LintNames.unnecessary_constructor_name;
+
+  Future<void> test_constructorDeclaration() async {
+    await resolveTestCode(r'''
+class A {
+  A.new(int x) {
+    print('new: $x');
+  }
+}
+''');
+    await assertHasFix(r'''
+class A {
+  A(int x) {
+    print('new: $x');
+  }
+}
+''');
+  }
+
+  Future<void> test_constructorInvocation() async {
+    await resolveTestCode(r'''
+class A { }
+var a = A.new();
+''');
+    await assertHasFix(r'''
+class A { }
+var a = A();
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
index 52898ab..49f9041 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
@@ -53,6 +53,121 @@
   @override
   String get lintCode => LintNames.unnecessary_lambdas;
 
+  Future<void> test_constructorTearOff_named() async {
+    await resolveTestCode('''
+class C {
+  int c;
+  C.create([this.c = 3]);
+}
+
+void f() {
+  var listOfInts = [1, 2, 3];
+  for (var c in listOfInts.map((x) => C.create(x))) {
+    print(c.c);
+  }
+}
+''');
+    await assertHasFix('''
+class C {
+  int c;
+  C.create([this.c = 3]);
+}
+
+void f() {
+  var listOfInts = [1, 2, 3];
+  for (var c in listOfInts.map(C.create)) {
+    print(c.c);
+  }
+}
+''');
+  }
+
+  // @soloTest
+  Future<void> test_constructorTearOff_nameUnnamed() async {
+    await resolveTestCode('''
+class C {
+  int c;
+  C([this.c = 3]);
+}
+
+void f() {
+  var listOfInts = [1, 2, 3];
+  for (var c in listOfInts.map((x) => C.new(x))) {
+    print(c.c);
+  }
+}
+''');
+    await assertHasFix('''
+class C {
+  int c;
+  C([this.c = 3]);
+}
+
+void f() {
+  var listOfInts = [1, 2, 3];
+  for (var c in listOfInts.map(C.new)) {
+    print(c.c);
+  }
+}
+''');
+  }
+
+  Future<void> test_constructorTearOff_oneParameter() async {
+    await resolveTestCode('''
+class C {
+  int c;
+  C([this.c = 3]);
+}
+
+void f() {
+  var listOfInts = [1, 2, 3];
+  for (var c in listOfInts.map((x) => C(x))) {
+    print(c.c);
+  }
+}
+''');
+    await assertHasFix('''
+class C {
+  int c;
+  C([this.c = 3]);
+}
+
+void f() {
+  var listOfInts = [1, 2, 3];
+  for (var c in listOfInts.map(C.new)) {
+    print(c.c);
+  }
+}
+''');
+  }
+
+  Future<void> test_constructorTearOff_zeroParameters() async {
+    await resolveTestCode('''
+typedef Maker = Object Function();
+
+class C {
+  int c;
+  C([this.c = 3]);
+}
+
+var l = <Maker>[
+  () => C(),
+];
+''');
+    await assertHasFix('''
+typedef Maker = Object Function();
+
+class C {
+  int c;
+  C([this.c = 3]);
+}
+
+var l = <Maker>[
+  C.new,
+];
+''');
+  }
+
   Future<void> test_function_oneParameter() async {
     await resolveTestCode('''
 Function f() => (name) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 9d30ea0..bd0d10c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -34,6 +34,7 @@
 import 'add_static_test.dart' as add_static;
 import 'add_super_constructor_invocation_test.dart'
     as add_super_constructor_invocation;
+import 'add_switch_case_break_test.dart' as add_switch_case_break;
 import 'add_type_annotation_test.dart' as add_type_annotation;
 import 'analysis_options/test_all.dart' as analysis_options;
 import 'bulk_fix_processor_test.dart' as bulk_fix_processor;
@@ -111,11 +112,13 @@
 import 'organize_imports_test.dart' as organize_imports;
 import 'pubspec/test_all.dart' as pubspec;
 import 'qualify_reference_test.dart' as qualify_reference;
+import 'remove_abstract_test.dart' as remove_abstract;
 import 'remove_annotation_test.dart' as remove_annotation;
 import 'remove_argument_test.dart' as remove_argument;
 import 'remove_await_test.dart' as remove_await;
 import 'remove_comparison_test.dart' as remove_comparison;
 import 'remove_const_test.dart' as remove_const;
+import 'remove_constructor_name_test.dart' as remove_constructor_name;
 import 'remove_dead_code_test.dart' as remove_dead_code;
 import 'remove_duplicate_case_test.dart' as remove_duplicate_case;
 import 'remove_empty_catch_test.dart' as remove_empty_catch;
@@ -222,6 +225,7 @@
     add_return_type.main();
     add_static.main();
     add_super_constructor_invocation.main();
+    add_switch_case_break.main();
     add_type_annotation.main();
     analysis_options.main();
     bulk_fix_processor.main();
@@ -293,11 +297,13 @@
     organize_imports.main();
     pubspec.main();
     qualify_reference.main();
+    remove_abstract.main();
     remove_annotation.main();
     remove_argument.main();
     remove_await.main();
     remove_comparison.main();
     remove_const.main();
+    remove_constructor_name.main();
     remove_dead_code.main();
     remove_duplicate_case.main();
     remove_empty_catch.main();
diff --git a/pkg/analysis_server/tool/code_completion/metrics_util.dart b/pkg/analysis_server/tool/code_completion/metrics_util.dart
index ab038b0..673f1bb 100644
--- a/pkg/analysis_server/tool/code_completion/metrics_util.dart
+++ b/pkg/analysis_server/tool/code_completion/metrics_util.dart
@@ -5,7 +5,6 @@
 import 'dart:math' as math;
 
 import 'package:analysis_server/src/status/pages.dart';
-import 'package:analyzer/src/generated/utilities_general.dart';
 
 import 'output_utilities.dart';
 
@@ -321,7 +320,7 @@
   int get denominator => _denominator;
 
   @override
-  int get hashCode => JenkinsSmiHash.hash2(_numerator, _denominator);
+  int get hashCode => Object.hash(_numerator, _denominator);
 
   int get numerator => _numerator;
 
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 0aecc40..7b95c29 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -647,23 +647,41 @@
 void _writeHashCode(IndentableStringBuffer buffer, Interface interface) {
   buffer
     ..writeIndentedln('@override')
-    ..writeIndentedln('int get hashCode {')
-    ..indent()
-    ..writeIndentedln('var hash = 0;');
-  for (var field in _getAllFields(interface)) {
-    final type = resolveTypeAlias(field.type);
-    if (type is ArrayType || type is MapType) {
-      buffer.writeIndentedln(
-          'hash = JenkinsSmiHash.combine(hash, lspHashCode(${field.name}));');
-    } else {
-      buffer.writeIndentedln(
-          'hash = JenkinsSmiHash.combine(hash, ${field.name}.hashCode);');
-    }
+    ..writeIndentedln('int get hashCode =>');
+
+  final fields = _getAllFields(interface);
+
+  String endWith;
+  if (fields.isEmpty) {
+    buffer.write('42');
+    endWith = ';';
+  } else if (fields.length == 1) {
+    endWith = ';';
+  } else if (fields.length > 20) {
+    buffer.write('Object.hashAll([');
+    endWith = ']);';
+  } else {
+    buffer.write('Object.hash(');
+    endWith = ');';
   }
+
+  buffer.writeAll(
+    fields.map((field) {
+      final type = resolveTypeAlias(field.type);
+      if (type is ArrayType || type is MapType) {
+        return 'lspHashCode(${field.name})';
+      } else {
+        if (fields.length == 1) {
+          return '${field.name}.hashCode';
+        }
+        return field.name;
+      }
+    }),
+    ',',
+  );
   buffer
-    ..writeIndentedln('return JenkinsSmiHash.finish(hash);')
-    ..outdent()
-    ..writeIndentedln('}');
+    ..writeln(endWith)
+    ..writeln();
 }
 
 void _writeInterface(IndentableStringBuffer buffer, Interface interface) {
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 81f8eb0..24a06ed 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -170,7 +170,6 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
-import 'package:analyzer/src/generated/utilities_general.dart';
 
 const jsonEncoder = JsonEncoder.withIndent('    ');
 
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 846f845..5e1f329 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1348,60 +1348,6 @@
     return result;
   }
 
-  /// If there is a single type which is at least as specific as all of the
-  /// types in [types], return it.  Otherwise return `null`.
-  static DartType? findMostSpecificType(
-      List<DartType> types, TypeSystemImpl typeSystem) {
-    // The << relation ("more specific than") is a partial ordering on types,
-    // so to find the most specific type of a set, we keep a bucket of the most
-    // specific types seen so far such that no type in the bucket is more
-    // specific than any other type in the bucket.
-    List<DartType> bucket = <DartType>[];
-
-    // Then we consider each type in turn.
-    for (DartType type in types) {
-      // If any existing type in the bucket is more specific than this type,
-      // then we can ignore this type.
-      if (bucket.any((DartType t) => typeSystem.isSubtypeOf(t, type))) {
-        continue;
-      }
-      // Otherwise, we need to add this type to the bucket and remove any types
-      // that are less specific than it.
-      bool added = false;
-      int i = 0;
-      while (i < bucket.length) {
-        if (typeSystem.isSubtypeOf(type, bucket[i])) {
-          if (added) {
-            if (i < bucket.length - 1) {
-              bucket[i] = bucket.removeLast();
-            } else {
-              bucket.removeLast();
-            }
-          } else {
-            bucket[i] = type;
-            i++;
-            added = true;
-          }
-        } else {
-          i++;
-        }
-      }
-      if (!added) {
-        bucket.add(type);
-      }
-    }
-
-    // Now that we are finished, if there is exactly one type left in the
-    // bucket, it is the most specific type.
-    if (bucket.length == 1) {
-      return bucket[0];
-    }
-
-    // Otherwise, there is no single type that is more specific than the
-    // others.
-    return null;
-  }
-
   /// Returns a "smart" version of the "least upper bound" of the given types.
   ///
   /// If these types have the same element and differ only in terms of the type
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index 711f2ab..4e01067 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -228,35 +228,22 @@
       return (flatten(S) as TypeImpl).withNullability(nullabilitySuffix);
     }
 
+    // otherwise if T is FutureOr<S> then flatten(T) = S
+    // otherwise if T is Future<S> then flatten(T) = S (shortcut)
     if (type is InterfaceType) {
-      // Implement the cases:
-      //  - "If T = FutureOr<S> then flatten(T) = S."
-      //  - "If T = Future<S> then flatten(T) = S."
       if (type.isDartAsyncFutureOr || type.isDartAsyncFuture) {
-        return type.typeArguments.isNotEmpty
-            ? type.typeArguments[0]
-            : DynamicTypeImpl.instance;
-      }
-      // Implement the case: "Otherwise if T <: Future then let S be a type
-      // such that T << Future<S> and for all R, if T << Future<R> then S << R.
-      // Then flatten(T) = S."
-      //
-      // In other words, given the set of all types R such that T << Future<R>,
-      // let S be the most specific of those types, if any such S exists.
-      //
-      // Since we only care about the most specific type, it is sufficient to
-      // look at the types appearing as a parameter to Future in the type
-      // hierarchy of T.  We don't need to consider the supertypes of those
-      // types, since they are by definition less specific.
-      List<DartType> candidateTypes =
-          _searchTypeHierarchyForFutureTypeParameters(type);
-      var flattenResult =
-          InterfaceTypeImpl.findMostSpecificType(candidateTypes, this);
-      if (flattenResult != null) {
-        return flattenResult;
+        return type.typeArguments[0];
       }
     }
-    // Implement the case: "In any other circumstance, flatten(T) = T."
+
+    // otherwise if T <: Future then let S be a type such that T <: Future<S>
+    //   and for all R, if T <: Future<R> then S <: R; then flatten(T) = S
+    var futureType = type.asInstanceOf(typeProvider.futureElement);
+    if (futureType != null) {
+      return futureType.typeArguments[0];
+    }
+
+    // otherwise flatten(T) = T
     return type;
   }
 
@@ -1854,31 +1841,6 @@
     );
   }
 
-  /// Starting from the given [type], search its class hierarchy for types of
-  /// the form Future<R>, and return a list of the resulting R's.
-  List<DartType> _searchTypeHierarchyForFutureTypeParameters(
-      InterfaceType type) {
-    List<DartType> result = <DartType>[];
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    void recurse(InterfaceType type) {
-      if (type.isDartAsyncFuture && type.typeArguments.isNotEmpty) {
-        result.add(type.typeArguments[0]);
-      }
-      if (visitedClasses.add(type.element)) {
-        if (type.superclass != null) {
-          recurse(type.superclass!);
-        }
-        for (InterfaceType interface in type.interfaces) {
-          recurse(interface);
-        }
-        visitedClasses.remove(type.element);
-      }
-    }
-
-    recurse(type);
-    return result;
-  }
-
   static NullabilitySuffix _promotedTypeParameterTypeNullability(
     NullabilitySuffix nullabilityOfType,
     NullabilitySuffix nullabilityOfBound,
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index caf21ee..513220e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -266,21 +266,31 @@
       return node;
     }
     var receiver = node.target!;
-    if (receiver is! FunctionReference) {
-      return node;
-    }
     var propertyName = node.propertyName;
     if (propertyName.isSynthetic) {
       // This isn't a constructor reference.
       return node;
     }
-    // A [ConstructorReference] with explicit type arguments is initially parsed
-    // as a [PropertyAccess] with a [FunctionReference] target; for example:
-    // `List<int>.filled` or `core.List<int>.filled`.
-    var receiverIdentifier = receiver.function;
-    if (receiverIdentifier is! Identifier) {
-      // If [receiverIdentifier] is not an Identifier then [node] is not a
-      // ConstructorReference.
+
+    Identifier receiverIdentifier;
+    TypeArgumentList? typeArguments;
+    if (receiver is PrefixedIdentifier) {
+      receiverIdentifier = receiver;
+    } else if (receiver is FunctionReference) {
+      // A [ConstructorReference] with explicit type arguments is initially
+      // parsed as a [PropertyAccess] with a [FunctionReference] target; for
+      // example: `List<int>.filled` or `core.List<int>.filled`.
+      var function = receiver.function;
+      if (function is! Identifier) {
+        // If [receiverIdentifier] is not an Identifier then [node] is not a
+        // ConstructorReference.
+        return node;
+      }
+      receiverIdentifier = function;
+      typeArguments = receiver.typeArguments;
+    } else {
+      // If the receiver is not (initially) a prefixed identifier or a function
+      // reference, then [node] is not a constructor reference.
       return node;
     }
 
@@ -310,7 +320,7 @@
       return _toConstructorReference_propertyAccess(
         node: node,
         receiver: receiverIdentifier,
-        typeArguments: receiver.typeArguments!,
+        typeArguments: typeArguments,
         classElement: element,
       );
     } else if (element is TypeAliasElement) {
@@ -323,7 +333,7 @@
         return _toConstructorReference_propertyAccess(
           node: node,
           receiver: receiverIdentifier,
-          typeArguments: receiver.typeArguments!,
+          typeArguments: typeArguments,
           classElement: aliasedType.element,
         );
       }
@@ -393,12 +403,24 @@
     return constructorReference;
   }
 
-  ConstructorReference _toConstructorReference_propertyAccess({
+  AstNode _toConstructorReference_propertyAccess({
     required PropertyAccess node,
     required Identifier receiver,
-    required TypeArgumentList typeArguments,
+    required TypeArgumentList? typeArguments,
     required ClassElement classElement,
   }) {
+    var name = node.propertyName.name;
+    var constructorElement = name == 'new'
+        ? classElement.unnamedConstructor
+        : classElement.getNamedConstructor(name);
+    if (constructorElement == null && typeArguments == null) {
+      // If there is no constructor by this name, and no type arguments,
+      // do not rewrite the node. If there _are_ type arguments (like
+      // `prefix.C<int>.name`, then it looks more like a constructor tearoff
+      // than anything else, so continue with the rewrite.
+      return node;
+    }
+
     var operator = node.operator;
 
     var typeName = astFactory.typeName(receiver, typeArguments);
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index 7035778..8e7e1ae 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -92,6 +92,12 @@
   }
 
   @override
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    usedElements.addElement(node.staticElement);
+    super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
   void visitIndexExpression(IndexExpression node) {
     var element = node.writeOrReadElement;
     usedElements.addMember(element);
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index ef26b14..5515c76 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1423,15 +1423,17 @@
       _enclosingFunction = outerFunction;
     }
 
-    // TODO(scheglov) encapsulate
-    var bodyContext = BodyInferenceContext.of(
-      node.functionExpression.body,
-    );
-    checkForBodyMayCompleteNormally(
-      returnType: bodyContext?.contextType,
-      body: node.functionExpression.body,
-      errorNode: node.name,
-    );
+    if (!node.isSetter) {
+      // TODO(scheglov) encapsulate
+      var bodyContext = BodyInferenceContext.of(
+        node.functionExpression.body,
+      );
+      checkForBodyMayCompleteNormally(
+        returnType: bodyContext?.contextType,
+        body: node.functionExpression.body,
+        errorNode: node.name,
+      );
+    }
     flowAnalysis.executableDeclaration_exit(
       node.functionExpression.body,
       isLocal,
@@ -1650,13 +1652,15 @@
       _thisType = null;
     }
 
-    // TODO(scheglov) encapsulate
-    var bodyContext = BodyInferenceContext.of(node.body);
-    checkForBodyMayCompleteNormally(
-      returnType: bodyContext?.contextType,
-      body: node.body,
-      errorNode: node.name,
-    );
+    if (!node.isSetter) {
+      // TODO(scheglov) encapsulate
+      var bodyContext = BodyInferenceContext.of(node.body);
+      checkForBodyMayCompleteNormally(
+        returnType: bodyContext?.contextType,
+        body: node.body,
+        errorNode: node.name,
+      );
+    }
     flowAnalysis.executableDeclaration_exit(node.body, false);
     flowAnalysis.topLevelDeclaration_exit();
     nullSafetyDeadCodeVerifier.flowEnd(node);
diff --git a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
index 105e799..de300b9 100644
--- a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
@@ -2,16 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../generated/elements_types_mixin.dart';
-import '../../../generated/test_analysis_context.dart';
+import '../../../generated/type_system_test.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -20,26 +16,7 @@
 }
 
 @reflectiveTest
-class FlattenTypeTest with ElementsTypesMixin {
-  @override
-  late final TypeProvider typeProvider;
-
-  late final TypeSystemImpl typeSystem;
-
-  FeatureSet get testFeatureSet {
-    return FeatureSet.forTesting(
-      additionalFeatures: [Feature.non_nullable],
-    );
-  }
-
-  void setUp() {
-    var analysisContext = TestAnalysisContext(
-      featureSet: testFeatureSet,
-    );
-    typeProvider = analysisContext.typeProviderNonNullableByDefault;
-    typeSystem = analysisContext.typeSystemNonNullableByDefault;
-  }
-
+class FlattenTypeTest extends AbstractTypeSystemNullSafetyTest {
   test_dynamic() {
     _check(dynamicNone, 'dynamic');
   }
@@ -53,6 +30,11 @@
     _check(futureOrNone(intNone), 'int');
     _check(futureOrNone(intQuestion), 'int?');
     _check(futureOrNone(intStar), 'int*');
+
+    var A = class_(name: 'A', interfaces: [
+      futureNone(intNone),
+    ]);
+    _check(interfaceTypeNone(A), 'int');
   }
 
   test_interfaceType_question() {
@@ -83,6 +65,23 @@
     _check(futureOrStar(intStar), 'int*');
   }
 
+  test_typeParameterType_none() {
+    _check(
+      typeParameterTypeNone(
+        typeParameter('T', bound: futureNone(intNone)),
+      ),
+      'int',
+    );
+
+    _check(
+      typeParameterTypeNone(
+        typeParameter('T'),
+        promotedBound: futureNone(intNone),
+      ),
+      'int',
+    );
+  }
+
   test_unknownInferredType() {
     var type = UnknownInferredType.instance;
     expect(typeSystem.flatten(type), same(type));
diff --git a/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
index 3262f0b..21f09c6 100644
--- a/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
@@ -696,6 +696,108 @@
     );
   }
 
+  test_prefixedAlias_nonGeneric_named() async {
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  A.foo();
+}
+typedef TA = A;
+''');
+    await assertNoErrorsInCode('''
+import 'a.dart' as a;
+bar() {
+  a.TA.foo;
+}
+''');
+
+    var classElement =
+        findElement.importFind('package:test/a.dart').class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('a.TA.foo;'),
+      classElement.getNamedConstructor('foo'),
+      classElement,
+      'A Function()',
+      expectedPrefix: findElement.import('package:test/a.dart').prefix,
+      expectedTypeNameElement:
+          findElement.importFind('package:test/a.dart').typeAlias('TA'),
+    );
+  }
+
+  test_prefixedAlias_nonGeneric_unnamed() async {
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  A();
+}
+typedef TA = A;
+''');
+    await assertNoErrorsInCode('''
+import 'a.dart' as a;
+bar() {
+  a.TA.new;
+}
+''');
+
+    var classElement =
+        findElement.importFind('package:test/a.dart').class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('a.TA.new;'),
+      classElement.unnamedConstructor,
+      classElement,
+      'A Function()',
+      expectedPrefix: findElement.import('package:test/a.dart').prefix,
+      expectedTypeNameElement:
+          findElement.importFind('package:test/a.dart').typeAlias('TA'),
+    );
+  }
+
+  test_prefixedClass_nonGeneric_named() async {
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  A.foo();
+}
+''');
+    await assertNoErrorsInCode('''
+import 'a.dart' as a;
+bar() {
+  a.A.foo;
+}
+''');
+
+    var classElement =
+        findElement.importFind('package:test/a.dart').class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('a.A.foo;'),
+      classElement.getNamedConstructor('foo'),
+      classElement,
+      'A Function()',
+      expectedPrefix: findElement.import('package:test/a.dart').prefix,
+    );
+  }
+
+  test_prefixedClass_nonGeneric_unnamed() async {
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  A();
+}
+''');
+    await assertNoErrorsInCode('''
+import 'a.dart' as a;
+bar() {
+  a.A.new;
+}
+''');
+
+    var classElement =
+        findElement.importFind('package:test/a.dart').class_('A');
+    assertConstructorReference(
+      findNode.constructorReference('a.A.new;'),
+      classElement.unnamedConstructor,
+      classElement,
+      'A Function()',
+      expectedPrefix: findElement.import('package:test/a.dart').prefix,
+    );
+  }
+
   test_typeAlias_generic_const() async {
     await assertNoErrorsInCode('''
 class A<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
index a69898c..e223720 100644
--- a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
@@ -367,4 +367,15 @@
 }
 ''');
   }
+
+  test_setter() async {
+    // Even though this code has an illegal return type for a setter, do not
+    // use the invalid return type to report BODY_MIGHT_COMPLETE_NORMALLY for
+    // setters.
+    await assertErrorsInCode(r'''
+bool set s(int value) {}
+''', [
+      error(CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, 0, 4),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
index 6bd9c21..9a32b62 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
@@ -816,6 +816,18 @@
 ''');
   }
 
+  test_method_isUsed_privateExtension_methodCall() async {
+    await assertNoErrorsInCode(r'''
+extension _E on int {
+  void call() {}
+}
+
+void f() {
+  0();
+}
+''');
+  }
+
   test_method_isUsed_privateExtension_operator_assignment() async {
     await assertNoErrorsInCode(r'''
 extension _A on String {
@@ -881,6 +893,18 @@
 ''');
   }
 
+  test_method_isUsed_unnamedExtension_methodCall() async {
+    await assertNoErrorsInCode(r'''
+extension on int {
+  void call() {}
+}
+
+void f() {
+  0();
+}
+''');
+  }
+
   test_method_isUsed_unnamedExtension_operator() async {
     await assertNoErrorsInCode(r'''
 extension on String {
@@ -948,6 +972,16 @@
     ]);
   }
 
+  test_method_notUsed_privateExtension_methodCall() async {
+    await assertErrorsInCode(r'''
+extension _E on int {
+  void call() {}
+}
+''', [
+      error(HintCode.UNUSED_ELEMENT, 29, 4),
+    ]);
+  }
+
   /// Assignment operators can only be called, not defined. The "notUsed" sibling
   /// to this test is the test on a binary operator.
   test_method_notUsed_privateExtension_operator() async {
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 434091d..92170e9 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -119,6 +119,8 @@
   static const String readClosedWorld = '--read-closed-world';
   static const String readCodegen = '--read-codegen';
   static const String writeCodegen = '--write-codegen';
+  static const String readModularAnalysis = '--read-modular-analysis';
+  static const String writeModularAnalysis = '--write-modular-analysis';
   static const String codegenShard = '--codegen-shard';
   static const String codegenShards = '--codegen-shards';
   static const String cfeOnly = '--cfe-only';
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 3a7a7f3..25a1041 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -253,7 +253,7 @@
   bool get usesInterceptor => _usesInterceptor;
 
   void registerAsyncMarker(AsyncMarker asyncMarker) {
-    _asyncMarkers ??= EnumSet<AsyncMarker>();
+    _asyncMarkers ??= EnumSet();
     _asyncMarkers.add(asyncMarker);
   }
 
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 024488f..8f0efb1 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -13,7 +13,7 @@
 import '../compiler_new.dart' as api;
 import 'backend_strategy.dart';
 import 'common/codegen.dart';
-import 'common/names.dart' show Selectors, Uris;
+import 'common/names.dart' show Selectors;
 import 'common/tasks.dart' show CompilerTask, GenericTask, Measurer;
 import 'common/work.dart' show WorkItem;
 import 'common.dart';
@@ -38,6 +38,7 @@
 import 'inferrer/types.dart'
     show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
 import 'io/source_information.dart' show SourceInformation;
+import 'ir/modular.dart';
 import 'js_backend/backend.dart' show CodegenInputs, JavaScriptImpactStrategy;
 import 'js_backend/inferred_data.dart';
 import 'js_model/js_strategy.dart';
@@ -300,16 +301,17 @@
 
       frontendStrategy.registerLoadedLibraries(result);
 
-      // TODO(efortuna, sigmund): These validation steps should be done in the
-      // front end for the Kernel path since Kernel doesn't have the notion of
-      // imports (everything has already been resolved). (See
-      // https://github.com/dart-lang/sdk/issues/29368)
-      if (result.libraries.contains(Uris.dart_mirrors)) {
-        reporter.reportWarningMessage(NO_LOCATION_SPANNABLE,
-            MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_CFE);
+      if (options.modularMode) {
+        await runModularAnalysis(result);
+      } else {
+        List<ModuleData> data;
+        if (options.modularAnalysisInputs != null) {
+          data =
+              await serializationTask.deserializeModuleData(result.component);
+        }
+        frontendStrategy.registerModuleData(data);
+        await compileFromKernel(result.rootLibraryUri, result.libraries);
       }
-
-      await compileFromKernel(result.rootLibraryUri, result.libraries);
     }
   }
 
@@ -411,6 +413,24 @@
     return closedWorld;
   }
 
+  void runModularAnalysis(KernelResult result) {
+    _userCodeLocations
+        .addAll(result.moduleLibraries.map((module) => CodeLocation(module)));
+    selfTask.measureSubtask('runModularAnalysis', () {
+      impactStrategy = JavaScriptImpactStrategy(
+          impactCacheDeleter, dumpInfoTask,
+          supportDeferredLoad: true, supportDumpInfo: true);
+      var included = result.moduleLibraries.toSet();
+      var elementMap = (frontendStrategy as KernelFrontendStrategy).elementMap;
+      var moduleData = computeModuleData(result.component, included, options,
+          reporter, environment, elementMap);
+      if (compilationFailed) return;
+      serializationTask.testModuleSerialization(moduleData, result.component);
+      serializationTask.serializeModuleData(
+          moduleData, result.component, included);
+    });
+  }
+
   GlobalTypeInferenceResults performGlobalTypeInference(
       JClosedWorld closedWorld) {
     FunctionEntity mainFunction = closedWorld.elementEnvironment.mainFunction;
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 5b95d9e..4693cbc 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -105,6 +105,7 @@
   bool outputSpecified = false;
   Uri out;
   Uri sourceMapOut;
+  Uri writeModularAnalysisUri;
   Uri readDataUri;
   Uri writeDataUri;
   Uri readClosedWorldUri;
@@ -274,6 +275,41 @@
         Uri.base.resolve(extractPath(argument, isDirectory: true));
   }
 
+  void setUriList(String flag, String argument) {
+    String list = extractParameter(argument);
+    String uriList = list.splitMapJoin(',',
+        onMatch: (_) => ',', onNonMatch: (p) => '${fe.nativeToUri(p)}');
+    options.add('${flag}=${uriList}');
+  }
+
+  void setModularAnalysisInputs(String argument) {
+    setUriList(Flags.readModularAnalysis, argument);
+  }
+
+  void setWriteModularAnalysis(String argument) {
+    if (writeStrategy == WriteStrategy.toClosedWorld) {
+      fail("Cannot use ${Flags.writeModularAnalysis} "
+          "and write serialized closed world simultaneously.");
+    }
+    if (writeStrategy == WriteStrategy.toData) {
+      fail("Cannot use ${Flags.writeModularAnalysis} "
+          "and write serialized global data simultaneously.");
+    }
+    if (writeStrategy == WriteStrategy.toCodegen) {
+      fail("Cannot use ${Flags.writeModularAnalysis} "
+          "and write serialized codegen simultaneously.");
+    }
+    if (writeStrategy == WriteStrategy.toKernel) {
+      fail("Cannot use ${Flags.writeModularAnalysis} "
+          "and run the CFE simultaneously.");
+    }
+    if (argument != Flags.writeModularAnalysis) {
+      writeModularAnalysisUri =
+          fe.nativeToUri(extractPath(argument, isDirectory: false));
+    }
+    writeStrategy = WriteStrategy.toModularAnalysis;
+  }
+
   void setReadData(String argument) {
     if (argument != Flags.readData) {
       readDataUri = fe.nativeToUri(extractPath(argument, isDirectory: false));
@@ -308,13 +344,14 @@
   }
 
   void setDillDependencies(String argument) {
-    String dependencies = extractParameter(argument);
-    String uriDependencies = dependencies.splitMapJoin(',',
-        onMatch: (_) => ',', onNonMatch: (p) => '${fe.nativeToUri(p)}');
-    options.add('${Flags.dillDependencies}=${uriDependencies}');
+    setUriList(Flags.dillDependencies, argument);
   }
 
   void setCfeOnly(String argument) {
+    if (writeStrategy == WriteStrategy.toModularAnalysis) {
+      fail("Cannot use ${Flags.cfeOnly} "
+          "and write serialized modular analysis simultaneously.");
+    }
     if (writeStrategy == WriteStrategy.toClosedWorld) {
       fail("Cannot use ${Flags.cfeOnly} "
           "and write serialized closed world simultaneously.");
@@ -490,6 +527,11 @@
     new OptionHandler('--library-root=.+', ignoreOption),
     new OptionHandler('--libraries-spec=.+', setLibrarySpecificationUri),
     new OptionHandler('${Flags.dillDependencies}=.+', setDillDependencies),
+    new OptionHandler(
+        '${Flags.readModularAnalysis}=.+', setModularAnalysisInputs),
+    new OptionHandler(
+        '${Flags.writeModularAnalysis}|${Flags.writeModularAnalysis}=.+',
+        setWriteModularAnalysis),
     new OptionHandler('${Flags.readData}|${Flags.readData}=.+', setReadData),
     new OptionHandler('${Flags.writeData}|${Flags.writeData}=.+', setWriteData),
     new OptionHandler(Flags.noClosedWorldInData, passThrough),
@@ -719,6 +761,11 @@
             "and read serialized codegen simultaneously.");
       }
       break;
+    case WriteStrategy.toModularAnalysis:
+      writeModularAnalysisUri ??= Uri.base.resolve('$out.mdata');
+      options.add('${Flags.writeModularAnalysis}=${writeModularAnalysisUri}');
+      out ??= Uri.base.resolve('out.dill');
+      break;
     case WriteStrategy.toClosedWorld:
       out ??= Uri.base.resolve('out.dill');
       writeClosedWorldUri ??= Uri.base.resolve('$out.world');
@@ -930,6 +977,15 @@
         String output = fe.relativizeUri(Uri.base, out, Platform.isWindows);
         summary += 'compiled to dill: ${output}.';
         break;
+      case WriteStrategy.toModularAnalysis:
+        processName = 'Serialized';
+        outputName = 'bytes data';
+        outputSize = outputProvider.totalDataWritten;
+        String output = fe.relativizeUri(Uri.base, out, Platform.isWindows);
+        String dataOutput = fe.relativizeUri(
+            Uri.base, writeModularAnalysisUri, Platform.isWindows);
+        summary += 'serialized to dill and data: ${output} and ${dataOutput}.';
+        break;
       case WriteStrategy.toClosedWorld:
         processName = 'Serialized';
         outputName = 'bytes data';
@@ -1453,4 +1509,11 @@
   fromCodegenAndData,
   fromCodegenAndClosedWorldAndData,
 }
-enum WriteStrategy { toKernel, toClosedWorld, toData, toCodegen, toJs }
+enum WriteStrategy {
+  toKernel,
+  toModularAnalysis,
+  toClosedWorld,
+  toData,
+  toCodegen,
+  toJs
+}
diff --git a/pkg/compiler/lib/src/elements/entities.dart b/pkg/compiler/lib/src/elements/entities.dart
index b0f12cf..a9f5514 100644
--- a/pkg/compiler/lib/src/elements/entities.dart
+++ b/pkg/compiler/lib/src/elements/entities.dart
@@ -166,21 +166,19 @@
 /// Enum for the synchronous/asynchronous function body modifiers.
 class AsyncMarker {
   /// The default function body marker.
-  static const AsyncMarker SYNC = const AsyncMarker._(AsyncModifier.Sync);
+  static const AsyncMarker SYNC = AsyncMarker._(AsyncModifier.Sync);
 
   /// The `sync*` function body marker.
   static const AsyncMarker SYNC_STAR =
-      const AsyncMarker._(AsyncModifier.SyncStar, isYielding: true);
+      AsyncMarker._(AsyncModifier.SyncStar, isYielding: true);
 
   /// The `async` function body marker.
   static const AsyncMarker ASYNC =
-      const AsyncMarker._(AsyncModifier.Async, isAsync: true);
+      AsyncMarker._(AsyncModifier.Async, isAsync: true);
 
   /// The `async*` function body marker.
-  static const AsyncMarker ASYNC_STAR = const AsyncMarker._(
-      AsyncModifier.AsyncStar,
-      isAsync: true,
-      isYielding: true);
+  static const AsyncMarker ASYNC_STAR =
+      AsyncMarker._(AsyncModifier.AsyncStar, isAsync: true, isYielding: true);
 
   /// Is `true` if this marker defines the function body to have an
   /// asynchronous result, that is, either a [Future] or a [Stream].
@@ -193,7 +191,7 @@
   final AsyncModifier asyncParserState;
 
   const AsyncMarker._(this.asyncParserState,
-      {this.isAsync: false, this.isYielding: false});
+      {this.isAsync = false, this.isYielding = false});
 
   @override
   String toString() {
@@ -203,7 +201,7 @@
   /// Canonical list of marker values.
   ///
   /// Added to make [AsyncMarker] enum-like.
-  static const List<AsyncMarker> values = const <AsyncMarker>[
+  static const List<AsyncMarker> values = <AsyncMarker>[
     SYNC,
     SYNC_STAR,
     ASYNC,
diff --git a/pkg/compiler/lib/src/elements/indexed.dart b/pkg/compiler/lib/src/elements/indexed.dart
index 781d600..6d09e99 100644
--- a/pkg/compiler/lib/src/elements/indexed.dart
+++ b/pkg/compiler/lib/src/elements/indexed.dart
@@ -119,7 +119,7 @@
   D getData(E entity) {
     int index = entity._index;
     if (index < _list.length && index >= _data.length) {
-      throw new StateError(
+      throw StateError(
           'Data is in the process of being created for ${_list[index]}.');
     }
     return _data[index];
@@ -169,7 +169,7 @@
   /// Calls [f] for each non-null entity with its corresponding data object.
   void forEach<E0 extends E, D0 extends D>(void f(E0 entity, D0 data)) {
     if (_list.length != _data.length) {
-      throw new StateError('Data is in the process of being created.');
+      throw StateError('Data is in the process of being created.');
     }
     for (int index = 0; index < _list.length; index++) {
       E entity = _list[index];
@@ -190,7 +190,7 @@
   V getEnv(E entity) {
     int index = entity._index;
     if (index < _list.length && index >= _env.length) {
-      throw new StateError(
+      throw StateError(
           'Env is in the process of being created for ${_list[index]}.');
     }
     return _env[index];
@@ -244,10 +244,10 @@
   void forEach<E0 extends E, D0 extends D, V0 extends V>(
       void f(E0 entity, D0 data, V0 env)) {
     if (_list.length != _data.length) {
-      throw new StateError('Data is in the process of being created.');
+      throw StateError('Data is in the process of being created.');
     }
     if (_list.length != _env.length) {
-      throw new StateError('Env is in the process of being created.');
+      throw StateError('Env is in the process of being created.');
     }
     for (int index = 0; index < _list.length; index++) {
       E entity = _list[index];
diff --git a/pkg/compiler/lib/src/elements/jumps.dart b/pkg/compiler/lib/src/elements/jumps.dart
index 53bf887..16fc90f 100644
--- a/pkg/compiler/lib/src/elements/jumps.dart
+++ b/pkg/compiler/lib/src/elements/jumps.dart
@@ -34,5 +34,5 @@
   bool get isSwitchCase;
 
   LabelDefinition addLabel(String labelName,
-      {bool isBreakTarget: false, bool isContinueTarget: false});
+      {bool isBreakTarget = false, bool isContinueTarget = false});
 }
diff --git a/pkg/compiler/lib/src/elements/names.dart b/pkg/compiler/lib/src/elements/names.dart
index 0a004de..c3ff551 100644
--- a/pkg/compiler/lib/src/elements/names.dart
+++ b/pkg/compiler/lib/src/elements/names.dart
@@ -15,11 +15,11 @@
   /// Create a [Name] for an identifier [text]. If [text] begins with '_' a
   /// private name with respect to [library] is created. If [isSetter] is `true`
   /// the created name represents the setter name 'text='.
-  factory Name(String text, LibraryEntity library, {bool isSetter: false}) {
+  factory Name(String text, LibraryEntity library, {bool isSetter = false}) {
     if (isPrivateName(text)) {
-      return new PrivateName(text, library, isSetter: isSetter);
+      return PrivateName(text, library, isSetter: isSetter);
     }
-    return new PublicName(text, isSetter: isSetter);
+    return PublicName(text, isSetter: isSetter);
   }
 
   /// The text of the name without prefixed library name or suffixed '=' if
@@ -66,13 +66,13 @@
   @override
   final bool isSetter;
 
-  const PublicName(this.text, {this.isSetter: false});
+  const PublicName(this.text, {this.isSetter = false});
 
   @override
-  Name get getter => isSetter ? new PublicName(text) : this;
+  Name get getter => isSetter ? PublicName(text) : this;
 
   @override
-  Name get setter => isSetter ? this : new PublicName(text, isSetter: true);
+  Name get setter => isSetter ? this : PublicName(text, isSetter: true);
 
   @override
   bool isAccessibleFrom(LibraryEntity element) => true;
@@ -106,15 +106,15 @@
   @override
   final LibraryEntity library;
 
-  PrivateName(String text, this.library, {bool isSetter: false})
+  PrivateName(String text, this.library, {bool isSetter = false})
       : super(text, isSetter: isSetter);
 
   @override
-  Name get getter => isSetter ? new PrivateName(text, library) : this;
+  Name get getter => isSetter ? PrivateName(text, library) : this;
 
   @override
   Name get setter {
-    return isSetter ? this : new PrivateName(text, library, isSetter: true);
+    return isSetter ? this : PrivateName(text, library, isSetter: true);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/elements/operators.dart b/pkg/compiler/lib/src/elements/operators.dart
index 182511b..56a3797 100644
--- a/pkg/compiler/lib/src/elements/operators.dart
+++ b/pkg/compiler/lib/src/elements/operators.dart
@@ -23,23 +23,23 @@
 
   bool get isUserDefinable => selectorName != null;
 
-  Selector get selector => new Selector(SelectorKind.OPERATOR,
-      new PublicName(selectorName), CallStructure.NO_ARGS);
+  Selector get selector => Selector(
+      SelectorKind.OPERATOR, PublicName(selectorName), CallStructure.NO_ARGS);
 
   @override
   String toString() => name;
 
   /// The unary ! operator.
   static const UnaryOperator NOT =
-      const UnaryOperator(UnaryOperatorKind.NOT, '!', null);
+      UnaryOperator(UnaryOperatorKind.NOT, '!', null);
 
   /// The unary - operator.
   static const UnaryOperator NEGATE =
-      const UnaryOperator(UnaryOperatorKind.NEGATE, '-', 'unary-');
+      UnaryOperator(UnaryOperatorKind.NEGATE, '-', 'unary-');
 
   /// The unary ~ operator.
   static const UnaryOperator COMPLEMENT =
-      const UnaryOperator(UnaryOperatorKind.COMPLEMENT, '~', '~');
+      UnaryOperator(UnaryOperatorKind.COMPLEMENT, '~', '~');
 
   static UnaryOperator parse(String value) {
     switch (value) {
@@ -109,90 +109,87 @@
 
   /// The == operator.
   static const BinaryOperator EQ =
-      const BinaryOperator._(BinaryOperatorKind.EQ, '==');
+      BinaryOperator._(BinaryOperatorKind.EQ, '==');
 
   /// The != operator.
-  static const BinaryOperator NOT_EQ = const _NotEqualsOperator();
+  static const BinaryOperator NOT_EQ = _NotEqualsOperator();
 
   /// The [] operator.
   static const BinaryOperator INDEX =
-      const BinaryOperator._(BinaryOperatorKind.INDEX, '[]');
+      BinaryOperator._(BinaryOperatorKind.INDEX, '[]');
 
   /// The binary + operator.
   static const BinaryOperator ADD =
-      const BinaryOperator._(BinaryOperatorKind.ADD, '+');
+      BinaryOperator._(BinaryOperatorKind.ADD, '+');
 
   /// The binary - operator.
   static const BinaryOperator SUB =
-      const BinaryOperator._(BinaryOperatorKind.SUB, '-');
+      BinaryOperator._(BinaryOperatorKind.SUB, '-');
 
   /// The binary * operator.
   static const BinaryOperator MUL =
-      const BinaryOperator._(BinaryOperatorKind.MUL, '*');
+      BinaryOperator._(BinaryOperatorKind.MUL, '*');
 
   /// The binary / operator.
   static const BinaryOperator DIV =
-      const BinaryOperator._(BinaryOperatorKind.DIV, '/');
+      BinaryOperator._(BinaryOperatorKind.DIV, '/');
 
   /// The binary ~/ operator.
   static const BinaryOperator IDIV =
-      const BinaryOperator._(BinaryOperatorKind.IDIV, '~/');
+      BinaryOperator._(BinaryOperatorKind.IDIV, '~/');
 
   /// The binary % operator.
   static const BinaryOperator MOD =
-      const BinaryOperator._(BinaryOperatorKind.MOD, '%');
+      BinaryOperator._(BinaryOperatorKind.MOD, '%');
 
   /// The binary << operator.
   static const BinaryOperator SHL =
-      const BinaryOperator._(BinaryOperatorKind.SHL, '<<');
+      BinaryOperator._(BinaryOperatorKind.SHL, '<<');
 
   /// The binary >> operator.
   static const BinaryOperator SHR =
-      const BinaryOperator._(BinaryOperatorKind.SHR, '>>');
+      BinaryOperator._(BinaryOperatorKind.SHR, '>>');
 
   /// The binary >>> operator.
   static const BinaryOperator SHRU =
-      const BinaryOperator._(BinaryOperatorKind.SHRU, '>>>');
+      BinaryOperator._(BinaryOperatorKind.SHRU, '>>>');
 
   /// The binary >= operator.
   static const BinaryOperator GTEQ =
-      const BinaryOperator._(BinaryOperatorKind.GTEQ, '>=');
+      BinaryOperator._(BinaryOperatorKind.GTEQ, '>=');
 
   /// The binary > operator.
-  static const BinaryOperator GT =
-      const BinaryOperator._(BinaryOperatorKind.GT, '>');
+  static const BinaryOperator GT = BinaryOperator._(BinaryOperatorKind.GT, '>');
 
   /// The binary <= operator.
   static const BinaryOperator LTEQ =
-      const BinaryOperator._(BinaryOperatorKind.LTEQ, '<=');
+      BinaryOperator._(BinaryOperatorKind.LTEQ, '<=');
 
   /// The binary < operator.
-  static const BinaryOperator LT =
-      const BinaryOperator._(BinaryOperatorKind.LT, '<');
+  static const BinaryOperator LT = BinaryOperator._(BinaryOperatorKind.LT, '<');
 
   /// The binary & operator.
   static const BinaryOperator AND =
-      const BinaryOperator._(BinaryOperatorKind.AND, '&');
+      BinaryOperator._(BinaryOperatorKind.AND, '&');
 
   /// The binary | operator.
-  static const BinaryOperator OR =
-      const BinaryOperator._(BinaryOperatorKind.OR, '|');
+  static const BinaryOperator OR = BinaryOperator._(BinaryOperatorKind.OR, '|');
 
   /// The binary ^ operator.
   static const BinaryOperator XOR =
-      const BinaryOperator._(BinaryOperatorKind.XOR, '^');
+      BinaryOperator._(BinaryOperatorKind.XOR, '^');
 
   /// The logical && operator.
   static const BinaryOperator LOGICAL_AND =
-      const _LogicalOperator(BinaryOperatorKind.LOGICAL_AND, '&&');
+      _LogicalOperator(BinaryOperatorKind.LOGICAL_AND, '&&');
 
   /// The binary | operator.
   static const BinaryOperator LOGICAL_OR =
-      const _LogicalOperator(BinaryOperatorKind.LOGICAL_OR, '||');
+      _LogicalOperator(BinaryOperatorKind.LOGICAL_OR, '||');
 
   /// The if-null ?? operator.
   static const BinaryOperator IF_NULL =
-      const _IfNullOperator(BinaryOperatorKind.IF_NULL, '??');
+      _IfNullOperator(BinaryOperatorKind.IF_NULL, '??');
 
   static BinaryOperator parse(String value) {
     switch (value) {
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 7b34a8a..fdb24b7 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -134,7 +134,7 @@
 
   void _addAssumption(FunctionTypeVariable a, FunctionTypeVariable b) {
     _assumptionMap
-        .putIfAbsent(a, () => new Set<FunctionTypeVariable>.identity())
+        .putIfAbsent(a, () => Set<FunctionTypeVariable>.identity())
         .add(b);
   }
 
@@ -185,7 +185,7 @@
 
   @override
   String toString() {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('_Assumptions(');
     String comma = '';
     _assumptionMap
@@ -480,6 +480,9 @@
   }
 
   @override
+  int get hashCode => index * 113; // ignore bound which can have cycles.
+
+  @override
   bool _equals(DartType other, _Assumptions assumptions) {
     if (identical(this, other)) return true;
     if (other is! FunctionTypeVariable) return false;
@@ -1882,13 +1885,14 @@
   /// If [assumeInstantiations], generic function types are assumed to be
   /// potentially instantiated.
   bool isPotentialSubtype(DartType s, DartType t,
-          {bool assumeInstantiations: true}) =>
+          {bool assumeInstantiations = true}) =>
       _subtypeHelper(s, t,
           allowPotentialSubtypes: true,
           assumeInstantiations: assumeInstantiations);
 
   bool _subtypeHelper(DartType s, DartType t,
-      {bool allowPotentialSubtypes: false, bool assumeInstantiations: false}) {
+      {bool allowPotentialSubtypes = false,
+      bool assumeInstantiations = false}) {
     assert(allowPotentialSubtypes || !assumeInstantiations);
 
     // TODO(fishythefish): Add constraint solving for potential subtypes.
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 5fb4571..423a69b 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -11,6 +11,7 @@
 import 'deferred_load/deferred_load.dart' show DeferredLoadTask;
 import 'elements/entities.dart';
 import 'enqueue.dart';
+import 'ir/modular.dart';
 import 'js_backend/native_data.dart';
 import 'js_backend/no_such_method_registry.dart';
 import 'kernel/loader.dart';
@@ -22,6 +23,8 @@
   /// Registers a set of loaded libraries with this strategy.
   void registerLoadedLibraries(KernelResult result);
 
+  void registerModuleData(List<ModuleData> data);
+
   /// Returns the [ElementEnvironment] for the element model used in this
   /// strategy.
   ElementEnvironment get elementEnvironment;
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index 16fbc15..703f19a 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -7,6 +7,7 @@
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../common.dart';
+import '../serialization/serialization.dart';
 import 'constants.dart';
 import 'impact_data.dart';
 import 'runtime_type_analysis.dart';
@@ -707,7 +708,7 @@
     }
     node.accept(this);
     return new ImpactBuilderData(
-        impactData, typeMapsForTesting, getStaticTypeCache());
+        node, impactData, typeMapsForTesting, getStaticTypeCache());
   }
 }
 
@@ -716,12 +717,32 @@
     arguments.named.map((n) => n.name).toList();
 
 class ImpactBuilderData {
+  static const String tag = 'ImpactBuilderData';
+
+  final ir.Member node;
   final ImpactData impactData;
   final Map<ir.Expression, TypeMap> typeMapsForTesting;
   final StaticTypeCache cachedStaticTypes;
 
-  ImpactBuilderData(
-      this.impactData, this.typeMapsForTesting, this.cachedStaticTypes);
+  ImpactBuilderData(this.node, this.impactData, this.typeMapsForTesting,
+      this.cachedStaticTypes);
+
+  factory ImpactBuilderData.fromDataSource(DataSource source) {
+    source.begin(tag);
+    var node = source.readMemberNode();
+    var data = ImpactData.fromDataSource(source);
+    var cache = StaticTypeCache.readFromDataSource(source, node);
+    source.end(tag);
+    return ImpactBuilderData(node, data, const {}, cache);
+  }
+
+  void toDataSink(DataSink sink) {
+    sink.begin(tag);
+    sink.writeMemberNode(node);
+    impactData.toDataSink(sink);
+    cachedStaticTypes.writeToDataSink(sink, node);
+    sink.end(tag);
+  }
 }
 
 class ConstantImpactVisitor extends ir.VisitOnceConstantVisitor {
diff --git a/pkg/compiler/lib/src/ir/impact_data.dart b/pkg/compiler/lib/src/ir/impact_data.dart
index f259a4f..c7ff190 100644
--- a/pkg/compiler/lib/src/ir/impact_data.dart
+++ b/pkg/compiler/lib/src/ir/impact_data.dart
@@ -574,7 +574,7 @@
     _redirectingInitializers = source.readList(
         () => new _RedirectingInitializer.fromDataSource(source),
         emptyAsNull: true);
-    _fieldInitializers = source.readMemberNodes(emptyAsNull: true);
+    _fieldInitializers = source.readMemberNodes<ir.Field>(emptyAsNull: true);
     _fieldConstantInitializers =
         source.readMemberNodeMap(source.readTreeNodes, emptyAsNull: true);
     _typeLiterals = source.readList(
@@ -601,16 +601,16 @@
     _setLiterals = source.readList(
         () => new _ContainerLiteral.fromDataSource(source),
         emptyAsNull: true);
-    _symbolLiterals = source.readStrings(emptyAsNull: true).toSet();
-    _stringLiterals = source.readStrings(emptyAsNull: true).toSet();
+    _symbolLiterals = source.readStrings(emptyAsNull: true)?.toSet();
+    _stringLiterals = source.readStrings(emptyAsNull: true)?.toSet();
     _boolLiterals =
-        source.readList(() => source.readBool(), emptyAsNull: true).toSet();
+        source.readList(() => source.readBool(), emptyAsNull: true)?.toSet();
     _doubleLiterals = source
         .readList(() => source.readDoubleValue(), emptyAsNull: true)
-        .toSet();
+        ?.toSet();
     _intLiterals = source
         .readList(() => source.readIntegerValue(), emptyAsNull: true)
-        .toSet();
+        ?.toSet();
     _runtimeTypeUses = source.readList(
         () => new _RuntimeTypeUse.fromDataSource(source),
         emptyAsNull: true);
@@ -1563,6 +1563,7 @@
     ir.DartType elementType = source.readDartTypeNode();
     bool isConst = source.readBool();
     bool isEmpty = source.readBool();
+    source.end(tag);
     return new _ContainerLiteral(elementType,
         isConst: isConst, isEmpty: isEmpty);
   }
@@ -1594,6 +1595,7 @@
     RuntimeTypeUseKind kind = source.readEnum(RuntimeTypeUseKind.values);
     ir.DartType receiverType = source.readDartTypeNode();
     ir.DartType argumentType = source.readDartTypeNode(allowNull: true);
+    source.end(tag);
     return new _RuntimeTypeUse(node, kind, receiverType, argumentType);
   }
 
diff --git a/pkg/compiler/lib/src/ir/modular.dart b/pkg/compiler/lib/src/ir/modular.dart
index ed49fcb..5c5d752 100644
--- a/pkg/compiler/lib/src/ir/modular.dart
+++ b/pkg/compiler/lib/src/ir/modular.dart
@@ -3,8 +3,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
 
+import 'package:front_end/src/api_unstable/dart2js.dart' as ir
+    show LocatedMessage;
+
+import '../diagnostics/diagnostic_listener.dart';
+import '../diagnostics/messages.dart';
+import '../diagnostics/source_span.dart';
+import '../kernel/element_map_impl.dart';
+import '../environment.dart';
+import '../ir/constants.dart';
+import '../ir/static_type.dart';
 import '../js_backend/annotations.dart';
+import '../options.dart';
+import '../serialization/serialization.dart';
 import '../util/enumset.dart';
 import 'annotations.dart';
 import 'constants.dart';
@@ -32,3 +46,101 @@
   ModularMemberData getModularMemberData(
       ir.Member node, EnumSet<PragmaAnnotation> pragmaAnnotations);
 }
+
+/// Data computed for an entire compilation module.
+class ModuleData {
+  static const String tag = 'ModuleData';
+
+  // TODO(joshualitt) Support serializing ModularMemberData;
+  final Map<ir.Member, ImpactBuilderData> impactData;
+
+  ModuleData(this.impactData);
+
+  factory ModuleData.fromDataSource(DataSource source) {
+    source.begin(tag);
+    var impactData = source
+        .readMemberNodeMap(() => ImpactBuilderData.fromDataSource(source));
+    source.end(tag);
+    return ModuleData(impactData);
+  }
+
+  void toDataSink(DataSink sink) {
+    sink.begin(tag);
+    sink.writeMemberNodeMap<ImpactBuilderData>(
+        impactData, (e) => e.toDataSink(sink));
+    sink.end(tag);
+  }
+}
+
+/// Compute [ModularMemberData] from the IR.
+ModularMemberData computeModularMemberData(ir.Member node,
+    {CompilerOptions options,
+    ir.TypeEnvironment typeEnvironment,
+    ir.ClassHierarchy classHierarchy,
+    ScopeModel scopeModel,
+    EnumSet<PragmaAnnotation> annotations}) {
+  var staticTypeCache = StaticTypeCacheImpl();
+  var impactBuilderData = ImpactBuilder(
+          ir.StaticTypeContext(node, typeEnvironment, cache: staticTypeCache),
+          staticTypeCache,
+          classHierarchy,
+          scopeModel.variableScopeModel,
+          useAsserts: options.enableUserAssertions,
+          inferEffectivelyFinalVariableTypes:
+              !annotations.contains(PragmaAnnotation.disableFinal))
+      .computeImpact(node);
+  return ModularMemberData(scopeModel, impactBuilderData);
+}
+
+ModuleData computeModuleData(
+    ir.Component component,
+    Set<Uri> includedLibraries,
+    CompilerOptions options,
+    DiagnosticReporter reporter,
+    Environment environment,
+    KernelToElementMapImpl elementMap) {
+  var classHierarchy = elementMap.classHierarchy;
+  var typeEnvironment = elementMap.typeEnvironment;
+  var constantEvaluator = elementMap.constantEvaluator;
+  var result = <ir.Member, ImpactBuilderData>{};
+  void computeForMember(ir.Member member) {
+    var scopeModel = ScopeModel.from(member, constantEvaluator);
+    var annotations = processMemberAnnotations(
+        options, reporter, member, computePragmaAnnotationDataFromIr(member));
+    result[member] = computeModularMemberData(member,
+            options: options,
+            typeEnvironment: typeEnvironment,
+            classHierarchy: classHierarchy,
+            scopeModel: scopeModel,
+            annotations: annotations)
+        .impactBuilderData;
+  }
+
+  for (var library in component.libraries) {
+    if (!includedLibraries.contains(library.importUri)) continue;
+    library.members.forEach(computeForMember);
+    for (var cls in library.classes) {
+      cls.members.forEach(computeForMember);
+    }
+  }
+  return ModuleData(result);
+}
+
+void reportLocatedMessage(DiagnosticReporter reporter,
+    ir.LocatedMessage message, List<ir.LocatedMessage> context) {
+  DiagnosticMessage diagnosticMessage =
+      _createDiagnosticMessage(reporter, message);
+  var infos = <DiagnosticMessage>[];
+  for (ir.LocatedMessage message in context) {
+    infos.add(_createDiagnosticMessage(reporter, message));
+  }
+  reporter.reportError(diagnosticMessage, infos);
+}
+
+DiagnosticMessage _createDiagnosticMessage(
+    DiagnosticReporter reporter, ir.LocatedMessage message) {
+  var sourceSpan = SourceSpan(
+      message.uri, message.charOffset, message.charOffset + message.length);
+  return reporter.createMessage(
+      sourceSpan, MessageKind.GENERIC, {'text': message.message});
+}
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index 6fe6cff..7ea0790 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:front_end/src/api_unstable/dart2js.dart' as ir;
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
@@ -113,7 +114,11 @@
       }
     } else {
       assert(node is ir.Procedure || node is ir.Constructor);
-      node.accept(this);
+      if (!(node is ir.Procedure && ir.isRedirectingFactory(node))) {
+        // Skip redirecting factories: they contain invalid expressions only
+        // used to suppport internal CFE modular compilation.
+        node.accept(this);
+      }
     }
     return new ScopeModel(
         closureScopeModel: _model,
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 43b81f4..9607437 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -5,7 +5,6 @@
 library dart2js.kernel.frontend_strategy;
 
 import 'package:kernel/ast.dart' as ir;
-import 'package:kernel/type_environment.dart' as ir;
 
 import '../common.dart';
 import '../common/backend_api.dart';
@@ -25,7 +24,6 @@
 import '../ir/impact.dart';
 import '../ir/modular.dart';
 import '../ir/scope.dart' show ScopeModel;
-import '../ir/static_type.dart';
 import '../js_backend/annotations.dart';
 import '../js_backend/backend_impact.dart';
 import '../js_backend/backend_usage.dart';
@@ -257,6 +255,16 @@
     }
   }
 
+  @override
+  void registerModuleData(List<ModuleData> data) {
+    if (data == null) {
+      _modularStrategy = KernelModularStrategy(_compilerTask, _elementMap);
+    } else {
+      _modularStrategy =
+          DeserializedModularStrategy(_compilerTask, _elementMap, data);
+    }
+  }
+
   IrAnnotationData get irAnnotationDataForTesting => _irAnnotationData;
 
   ModularStrategy get modularStrategyForTesting => _modularStrategy;
@@ -376,7 +384,7 @@
       EnumSet<PragmaAnnotation> annotations = processMemberAnnotations(
           _elementMap.options,
           _elementMap.reporter,
-          _elementMap.getMemberNode(element),
+          node,
           pragmaAnnotationData);
       _annotationsDataBuilder.registerPragmaAnnotations(element, annotations);
 
@@ -433,25 +441,48 @@
       ir.Member node, EnumSet<PragmaAnnotation> annotations) {
     ScopeModel scopeModel = _compilerTask.measureSubtask(
         'closures', () => ScopeModel.from(node, _elementMap.constantEvaluator));
-    ImpactBuilderData impactBuilderData;
     if (useImpactDataForTesting) {
-      // TODO(johnniwinther): Always create and use the [ImpactBuilderData].
-      // Currently it is a bit half-baked since we cannot compute data that
-      // depend on metadata, so these parts of the impact data need to be
-      // computed during conversion to [ResolutionImpact].
-      impactBuilderData = _compilerTask.measureSubtask('worldImpact', () {
-        StaticTypeCacheImpl staticTypeCache = StaticTypeCacheImpl();
-        ImpactBuilder builder = ImpactBuilder(
-            ir.StaticTypeContext(node, _elementMap.typeEnvironment,
-                cache: staticTypeCache),
-            staticTypeCache,
-            _elementMap.classHierarchy,
-            scopeModel.variableScopeModel,
-            useAsserts: _elementMap.options.enableUserAssertions,
-            inferEffectivelyFinalVariableTypes:
-                !annotations.contains(PragmaAnnotation.disableFinal));
-        return builder.computeImpact(node);
+      return _compilerTask.measureSubtask('worldImpact', () {
+        return computeModularMemberData(node,
+            options: _elementMap.options,
+            typeEnvironment: _elementMap.typeEnvironment,
+            classHierarchy: _elementMap.classHierarchy,
+            scopeModel: scopeModel,
+            annotations: annotations);
       });
+    } else {
+      ImpactBuilderData impactBuilderData;
+      return ModularMemberData(scopeModel, impactBuilderData);
+    }
+  }
+}
+
+class DeserializedModularStrategy extends ModularStrategy {
+  final CompilerTask _compilerTask;
+  final KernelToElementMapImpl _elementMap;
+  final Map<ir.Member, ImpactBuilderData> _cache = {};
+
+  DeserializedModularStrategy(
+      this._compilerTask, this._elementMap, List<ModuleData> data) {
+    for (var module in data) {
+      _cache.addAll(module.impactData);
+    }
+  }
+
+  @override
+  List<PragmaAnnotationData> getPragmaAnnotationData(ir.Member node) {
+    return computePragmaAnnotationDataFromIr(node);
+  }
+
+  @override
+  ModularMemberData getModularMemberData(
+      ir.Member node, EnumSet<PragmaAnnotation> annotations) {
+    // TODO(joshualitt): serialize scope model too.
+    var scopeModel = _compilerTask.measureSubtask(
+        'closures', () => ScopeModel.from(node, _elementMap.constantEvaluator));
+    var impactBuilderData = _cache[node];
+    if (impactBuilderData == null) {
+      throw 'missing modular analysis data for $node';
     }
     return ModularMemberData(scopeModel, impactBuilderData);
   }
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index f80936d..7fd39d4 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -72,7 +72,10 @@
       }
 
       ir.Component component;
-      var isDill = resolvedUri.path.endsWith('.dill');
+      List<Uri> moduleLibraries = const [];
+      var isDill = resolvedUri.path.endsWith('.dill') ||
+          resolvedUri.path.endsWith('.gdill') ||
+          resolvedUri.path.endsWith('.mdill');
 
       void inferNullSafetyMode(bool isSound) {
         if (_options.nullSafetyMode == NullSafetyMode.unspecified) {
@@ -94,6 +97,10 @@
         }
 
         await read(resolvedUri);
+        if (_options.modularMode) {
+          moduleLibraries =
+              component.libraries.map((lib) => lib.importUri).toList();
+        }
 
         var isStrongDill =
             component.mode == ir.NonNullableByDefaultCompiledMode.Strong;
@@ -109,13 +116,19 @@
         inferNullSafetyMode(isStrongDill);
         validateNullSafetyMode();
 
+        // Modular compiles do not include the platform on the input dill
+        // either.
+        if (_options.platformBinaries != null) {
+          var platformUri =
+              _options.platformBinaries.resolve(getPlatformFilename());
+          // Modular analysis can be run on the sdk by providing directly the
+          // path to the platform.dill file. In that case, we do not load the
+          // platform file implicitly.
+          // TODO(joshualitt): Change how we detect this case so it is less
+          // brittle.
+          if (platformUri != resolvedUri) await read(platformUri);
+        }
         if (_options.dillDependencies != null) {
-          // Modular compiles do not include the platform on the input dill
-          // either.
-          if (_options.platformBinaries != null) {
-            await read(
-                _options.platformBinaries.resolve(getPlatformFilename()));
-          }
           for (Uri dependency in _options.dillDependencies) {
             await read(dependency);
           }
@@ -123,7 +136,7 @@
 
         // This is not expected to be null when creating a whole-program .dill
         // file, but needs to be checked for modular inputs.
-        if (component.mainMethod == null) {
+        if (component.mainMethod == null && !_options.modularMode) {
           // TODO(sigmund): move this so that we use the same error template
           // from the CFE.
           _reporter.reportError(_reporter.createMessage(NO_LOCATION_SPANNABLE,
@@ -201,14 +214,14 @@
         component = new ir.Component();
         new BinaryBuilder(data).readComponent(component);
       }
-      return _toResult(component);
+      return _toResult(component, moduleLibraries);
     });
   }
 
-  KernelResult _toResult(ir.Component component) {
+  KernelResult _toResult(ir.Component component, List<Uri> moduleLibraries) {
     Uri rootLibraryUri = null;
     Iterable<ir.Library> libraries = component.libraries;
-    if (component.mainMethod != null) {
+    if (!_options.modularMode && component.mainMethod != null) {
       var root = component.mainMethod.enclosingLibrary;
       rootLibraryUri = root.importUri;
 
@@ -235,7 +248,7 @@
       libraries = libraries.where(seen.contains);
     }
     return new KernelResult(component, rootLibraryUri,
-        libraries.map((lib) => lib.importUri).toList());
+        libraries.map((lib) => lib.importUri).toList(), moduleLibraries);
   }
 }
 
@@ -244,6 +257,8 @@
   final ir.Component component;
 
   /// The [Uri] of the root library containing main.
+  /// Note: rootLibraryUri will be null for some modules, for example in the
+  /// case of dependent libraries processed modularly.
   final Uri rootLibraryUri;
 
   /// Returns the [Uri]s of all libraries that have been loaded that are
@@ -252,10 +267,18 @@
   /// Note that [component] may contain some libraries that are excluded here.
   final Iterable<Uri> libraries;
 
-  KernelResult(this.component, this.rootLibraryUri, this.libraries) {
-    assert(rootLibraryUri != null);
-  }
+  /// When running only dart2js modular analysis, returns the [Uri]s for
+  /// libraries loaded in the input module.
+  ///
+  /// This excludes other libraries reachable from them that were loaded as
+  /// dependencies. The result of [moduleLibraries] is always a subset of
+  /// [libraries].
+  final Iterable<Uri> moduleLibraries;
+
+  KernelResult(this.component, this.rootLibraryUri, this.libraries,
+      this.moduleLibraries);
 
   @override
-  String toString() => 'root=$rootLibraryUri,libraries=${libraries}';
+  String toString() =>
+      'root=$rootLibraryUri,libraries=$libraries,module=$moduleLibraries';
 }
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index 788d79e..194c2b1 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -437,7 +437,7 @@
         validTags == null || (validTags.toSet()..removeAll(validTags)).isEmpty);
     if (validTags == null) validTags = knownTags;
 
-    Map<String, String> values = <String, String>{};
+    Map<String, String> values = {};
 
     for (String spec in specs) {
       List<String> tagAndValue = spec.split(':');
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 9f97703..2177dd4 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -37,8 +37,8 @@
 }
 
 abstract class NativeEnqueuerBase implements NativeEnqueuer {
-  final Set<ClassEntity> _registeredClasses = Set<ClassEntity>();
-  final Set<ClassEntity> _unusedClasses = Set<ClassEntity>();
+  final Set<ClassEntity> _registeredClasses = {};
+  final Set<ClassEntity> _unusedClasses = {};
 
   @override
   bool get hasInstantiatedNativeClasses => !_registeredClasses.isEmpty;
@@ -92,7 +92,7 @@
     }
 
     int unusedBefore = _unusedClasses.length;
-    Set<ClassEntity> matchingClasses = Set<ClassEntity>();
+    Set<ClassEntity> matchingClasses = {};
     for (var type in behavior.typesInstantiated) {
       if (type is SpecialType) {
         if (type == SpecialType.JsObject) {
@@ -182,7 +182,7 @@
 
   /// The set of all native classes.  Each native class is in [nativeClasses]
   /// and exactly one of [unusedClasses] and [registeredClasses].
-  final Set<ClassEntity> _nativeClasses = Set<ClassEntity>();
+  final Set<ClassEntity> _nativeClasses = {};
 
   NativeResolutionEnqueuer(
       CompilerOptions options,
@@ -224,7 +224,7 @@
   final Iterable<ClassEntity> _nativeClasses;
   final NativeData _nativeData;
 
-  final Set<ClassEntity> _doneAddSubtypes = Set<ClassEntity>();
+  final Set<ClassEntity> _doneAddSubtypes = {};
 
   NativeCodegenEnqueuer(
       CompilerOptions options,
@@ -246,7 +246,7 @@
     }
 
     // HACK HACK - add all the resolved classes.
-    Set<ClassEntity> matchingClasses = Set<ClassEntity>();
+    Set<ClassEntity> matchingClasses = {};
     for (ClassEntity classElement in _nativeClasses) {
       if (_unusedClasses.contains(classElement)) {
         matchingClasses.add(classElement);
diff --git a/pkg/compiler/lib/src/native/resolver.dart b/pkg/compiler/lib/src/native/resolver.dart
index b20f6d8..2fa78b5 100644
--- a/pkg/compiler/lib/src/native/resolver.dart
+++ b/pkg/compiler/lib/src/native/resolver.dart
@@ -28,13 +28,13 @@
   final KElementEnvironment _elementEnvironment;
   final NativeBasicData _nativeBasicData;
 
-  Map<String, ClassEntity> _tagOwner = Map<String, ClassEntity>();
+  Map<String, ClassEntity> _tagOwner = {};
 
   BaseNativeClassFinder(this._elementEnvironment, this._nativeBasicData);
 
   @override
   Iterable<ClassEntity> computeNativeClasses(Iterable<Uri> libraries) {
-    Set<ClassEntity> nativeClasses = Set<ClassEntity>();
+    Set<ClassEntity> nativeClasses = {};
     libraries.forEach((uri) => _processNativeClassesInLibrary(
         _elementEnvironment.lookupLibrary(uri), nativeClasses));
     _processSubclassesOfNativeClasses(libraries, nativeClasses);
@@ -84,23 +84,22 @@
   /// [nativeClasses].
   void _processSubclassesOfNativeClasses(
       Iterable<Uri> libraries, Set<ClassEntity> nativeClasses) {
-    Set<ClassEntity> nativeClassesAndSubclasses = Set<ClassEntity>();
+    Set<ClassEntity> nativeClassesAndSubclasses = {};
     // Collect potential subclasses, e.g.
     //
     //     class B extends foo.A {}
     //
     // String "A" has a potential subclass B.
 
-    Map<String, Set<ClassEntity>> potentialExtends =
-        <String, Set<ClassEntity>>{};
+    Map<String, Set<ClassEntity>> potentialExtends = {};
 
     libraries.forEach((Uri uri) {
       LibraryEntity library = _elementEnvironment.lookupLibrary(uri);
       _elementEnvironment.forEachClass(library, (ClassEntity cls) {
         String extendsName = _findExtendsNameOfClass(cls);
         if (extendsName != null) {
-          Set<ClassEntity> potentialSubclasses = potentialExtends.putIfAbsent(
-              extendsName, () => Set<ClassEntity>());
+          Set<ClassEntity> potentialSubclasses =
+              potentialExtends.putIfAbsent(extendsName, () => {});
           potentialSubclasses.add(cls);
         }
       });
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 8e07e11..a4097df 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -86,12 +86,15 @@
     bool _shouldPrint(FeatureOption feature) {
       return feature.isNegativeFlag ? feature.isDisabled : feature.isEnabled;
     }
+
     String _toString(FeatureOption feature) {
       return feature.isNegativeFlag ? 'no-${feature.flag}' : feature.flag;
     }
+
     Iterable<String> _listToString(List<FeatureOption> options) {
       return options.where(_shouldPrint).map(_toString);
     }
+
     return _listToString(shipping).followedBy(_listToString(canary)).join(', ');
   }
 
@@ -153,6 +156,13 @@
   /// files for linking.
   List<Uri>? dillDependencies;
 
+  Uri? writeModularAnalysisUri;
+
+  /// Helper to determine if compiler is being run just for modular analysis.
+  bool get modularMode => writeModularAnalysisUri != null;
+
+  List<Uri>? modularAnalysisInputs;
+
   /// Location from which serialized inference data is read.
   ///
   /// If this is set, the [entryPoint] is expected to be a .dill file and the
@@ -637,6 +647,10 @@
           _extractUriListOption(options, '${Flags.dillDependencies}')
       ..readProgramSplit =
           _extractUriOption(options, '${Flags.readProgramSplit}=')
+      ..writeModularAnalysisUri =
+          _extractUriOption(options, '${Flags.writeModularAnalysis}=')
+      ..modularAnalysisInputs =
+          _extractUriListOption(options, '${Flags.readModularAnalysis}')
       ..readDataUri = _extractUriOption(options, '${Flags.readData}=')
       ..writeDataUri = _extractUriOption(options, '${Flags.writeData}=')
       ..noClosedWorldInData = _hasOption(options, Flags.noClosedWorldInData)
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index ff64822..9435c0b 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -36,61 +36,50 @@
 
   void registerMapLiteral(MapLiteralUse mapLiteralUse) {
     assert(mapLiteralUse != null);
-    _mapLiterals ??= new Setlet<MapLiteralUse>();
+    _mapLiterals ??= Setlet();
     _mapLiterals.add(mapLiteralUse);
   }
 
   @override
-  Iterable<MapLiteralUse> get mapLiterals {
-    return _mapLiterals != null ? _mapLiterals : const <MapLiteralUse>[];
-  }
+  Iterable<MapLiteralUse> get mapLiterals => _mapLiterals ?? const [];
 
   void registerSetLiteral(SetLiteralUse setLiteralUse) {
     assert(setLiteralUse != null);
-    _setLiterals ??= new Setlet<SetLiteralUse>();
+    _setLiterals ??= Setlet();
     _setLiterals.add(setLiteralUse);
   }
 
   @override
-  Iterable<SetLiteralUse> get setLiterals =>
-      _setLiterals ?? const <SetLiteralUse>[];
+  Iterable<SetLiteralUse> get setLiterals => _setLiterals ?? const [];
 
   void registerListLiteral(ListLiteralUse listLiteralUse) {
     assert(listLiteralUse != null);
-    _listLiterals ??= new Setlet<ListLiteralUse>();
+    _listLiterals ??= Setlet();
     _listLiterals.add(listLiteralUse);
   }
 
   @override
-  Iterable<ListLiteralUse> get listLiterals {
-    return _listLiterals != null ? _listLiterals : const <ListLiteralUse>[];
-  }
+  Iterable<ListLiteralUse> get listLiterals => _listLiterals ?? const [];
 
   void registerRuntimeTypeUse(RuntimeTypeUse runtimeTypeUse) {
     assert(runtimeTypeUse != null);
-    _runtimeTypeUses ??= new Setlet<RuntimeTypeUse>();
+    _runtimeTypeUses ??= Setlet();
     _runtimeTypeUses.add(runtimeTypeUse);
   }
 
   @override
-  Iterable<RuntimeTypeUse> get runtimeTypeUses {
-    return _runtimeTypeUses != null
-        ? _runtimeTypeUses
-        : const <RuntimeTypeUse>[];
-  }
+  Iterable<RuntimeTypeUse> get runtimeTypeUses => _runtimeTypeUses ?? const [];
 
   void registerConstSymbolName(String name) {
-    _constSymbolNames ??= new Setlet<String>();
+    _constSymbolNames ??= Setlet();
     _constSymbolNames.add(name);
   }
 
   @override
-  Iterable<String> get constSymbolNames {
-    return _constSymbolNames != null ? _constSymbolNames : const <String>[];
-  }
+  Iterable<String> get constSymbolNames => _constSymbolNames ?? const [];
 
   void registerFeature(Feature feature) {
-    _features ??= new EnumSet<Feature>();
+    _features ??= EnumSet();
     _features.add(feature);
   }
 
@@ -102,51 +91,42 @@
   }
 
   void registerConstantLiteral(ConstantValue constant) {
-    _constantLiterals ??= new Setlet<ConstantValue>();
+    _constantLiterals ??= Setlet();
     _constantLiterals.add(constant);
   }
 
   @override
-  Iterable<ConstantValue> get constantLiterals {
-    return _constantLiterals != null
-        ? _constantLiterals
-        : const <ConstantValue>[];
-  }
+  Iterable<ConstantValue> get constantLiterals => _constantLiterals ?? const [];
 
   void registerNativeData(dynamic nativeData) {
     assert(nativeData != null);
-    _nativeData ??= new Setlet<dynamic>();
+    _nativeData ??= Setlet();
     _nativeData.add(nativeData);
   }
 
   @override
-  Iterable<dynamic> get nativeData {
-    return _nativeData != null ? _nativeData : const <dynamic>[];
-  }
+  Iterable<dynamic> get nativeData => _nativeData ?? const [];
 
   void registerSeenClass(ClassEntity seenClass) {
-    _seenClasses ??= new Setlet<ClassEntity>();
+    _seenClasses ??= Setlet();
     _seenClasses.add(seenClass);
   }
 
   @override
-  Iterable<ClassEntity> get seenClasses {
-    return _seenClasses ?? const <ClassEntity>[];
-  }
+  Iterable<ClassEntity> get seenClasses => _seenClasses ?? const [];
 
   void registerInstantiation(GenericInstantiation instantiation) {
-    _genericInstantiations ??= new Set<GenericInstantiation>();
+    _genericInstantiations ??= Setlet();
     _genericInstantiations.add(instantiation);
   }
 
   @override
-  Iterable<GenericInstantiation> get genericInstantiations {
-    return _genericInstantiations ?? const <GenericInstantiation>[];
-  }
+  Iterable<GenericInstantiation> get genericInstantiations =>
+      _genericInstantiations ?? const [];
 
   @override
   String toString() {
-    StringBuffer sb = new StringBuffer();
+    StringBuffer sb = StringBuffer();
     sb.write('ResolutionWorldImpactBuilder($member)');
     WorldImpact.printOn(sb, this);
     if (_features != null) {
diff --git a/pkg/compiler/lib/src/serialization/member_data.dart b/pkg/compiler/lib/src/serialization/member_data.dart
index 72b2148..df58f12 100644
--- a/pkg/compiler/lib/src/serialization/member_data.dart
+++ b/pkg/compiler/lib/src/serialization/member_data.dart
@@ -30,12 +30,12 @@
 /// Returns a name uniquely identifying a member within its enclosing library
 /// or class.
 String _computeMemberName(ir.Member member) {
-  if (member.name.isPrivate &&
-      member.name.libraryName != member.enclosingLibrary.reference) {
-    // TODO(33732): Handle noSuchMethod forwarders for private members from
-    // other libraries.
-    return null;
-  }
+  // This should mostly be empty except when serializing the name of nSM
+  // forwarders (see dartbug.com/33732).
+  String libraryPrefix = member.name.isPrivate &&
+          member.name.libraryName != member.enclosingLibrary.reference
+      ? '${member.name.libraryName.canonicalName.name}:'
+      : '';
   String name = member.name.text;
   if (member is ir.Constructor) {
     name = '.$name';
@@ -46,7 +46,7 @@
       name += "=";
     }
   }
-  return name;
+  return '${libraryPrefix}${name}';
 }
 
 /// Helper for looking up classes and members from an [ir.Library] node.
diff --git a/pkg/compiler/lib/src/serialization/node_indexer.dart b/pkg/compiler/lib/src/serialization/node_indexer.dart
index 1e52a8f..d62ed9f 100644
--- a/pkg/compiler/lib/src/serialization/node_indexer.dart
+++ b/pkg/compiler/lib/src/serialization/node_indexer.dart
@@ -252,14 +252,10 @@
 
 /// Visitor that ascribes an index to all [ir.Constant]s that we potentially
 /// need to reference for serialization and deserialization.
-///
-/// Currently this is only list, map, and set constants, which are used as
-/// allocation identities in the global inference.
 class _ConstantNodeIndexerVisitor implements ir.ConstantVisitor<void> {
   int _currentIndex = 0;
   final Map<int, ir.Constant> _indexToNodeMap = {};
   final Map<ir.Constant, int> _nodeToIndexMap = {};
-  final Set<ir.Constant> _visitedNonindexedNodes = {};
 
   /// Returns `true` if node not already registered.
   bool _register(ir.Constant node) {
@@ -283,34 +279,48 @@
   }
 
   @override
-  void visitUnevaluatedConstant(ir.UnevaluatedConstant node) {}
+  void visitUnevaluatedConstant(ir.UnevaluatedConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitTypeLiteralConstant(ir.TypeLiteralConstant node) {}
+  void visitTypeLiteralConstant(ir.TypeLiteralConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitStaticTearOffConstant(ir.StaticTearOffConstant node) {}
+  void visitStaticTearOffConstant(ir.StaticTearOffConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitConstructorTearOffConstant(ir.ConstructorTearOffConstant node) {}
+  void visitConstructorTearOffConstant(ir.ConstructorTearOffConstant node) {
+    _register(node);
+  }
 
   @override
   void visitRedirectingFactoryTearOffConstant(
-      ir.RedirectingFactoryTearOffConstant node) {}
+      ir.RedirectingFactoryTearOffConstant node) {
+    _register(node);
+  }
 
   @override
   void visitInstantiationConstant(ir.InstantiationConstant node) {
-    node.tearOffConstant.accept(this);
+    if (_register(node)) {
+      node.tearOffConstant.accept(this);
+    }
   }
 
   @override
   void visitTypedefTearOffConstant(ir.TypedefTearOffConstant node) {
-    node.tearOffConstant.accept(this);
+    if (_register(node)) {
+      node.tearOffConstant.accept(this);
+    }
   }
 
   @override
   void visitInstanceConstant(ir.InstanceConstant node) {
-    if (_visitedNonindexedNodes.add(node)) {
+    if (_register(node)) {
       node.fieldValues.forEach((_, ir.Constant value) {
         value.accept(this);
       });
@@ -346,22 +356,34 @@
   }
 
   @override
-  void visitSymbolConstant(ir.SymbolConstant node) {}
+  void visitSymbolConstant(ir.SymbolConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitStringConstant(ir.StringConstant node) {}
+  void visitStringConstant(ir.StringConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitDoubleConstant(ir.DoubleConstant node) {}
+  void visitDoubleConstant(ir.DoubleConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitIntConstant(ir.IntConstant node) {}
+  void visitIntConstant(ir.IntConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitBoolConstant(ir.BoolConstant node) {}
+  void visitBoolConstant(ir.BoolConstant node) {
+    _register(node);
+  }
 
   @override
-  void visitNullConstant(ir.NullConstant node) {}
+  void visitNullConstant(ir.NullConstant node) {
+    _register(node);
+  }
 
   @override
   void defaultConstant(ir.Constant node) {
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index c0240ca..72bd9b1 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -6,6 +6,7 @@
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/binary/ast_from_binary.dart' as ir;
 import 'package:kernel/binary/ast_to_binary.dart' as ir;
+import 'package:front_end/src/fasta/util/bytes_sink.dart';
 import '../../compiler_new.dart' as api;
 import '../backend_strategy.dart';
 import '../commandline_options.dart' show Flags;
@@ -16,6 +17,7 @@
 import '../environment.dart';
 import '../inferrer/abstract_value_domain.dart';
 import '../inferrer/types.dart';
+import '../ir/modular.dart';
 import '../js_backend/backend.dart';
 import '../js_backend/inferred_data.dart';
 import '../js_model/js_world.dart';
@@ -182,6 +184,67 @@
     return component;
   }
 
+  void serializeModuleData(
+      ModuleData data, ir.Component component, Set<Uri> includedLibraries) {
+    measureSubtask('serialize transformed dill', () {
+      _reporter.log('Writing dill to ${_options.outputUri}');
+      var dillOutput = _outputProvider.createBinarySink(_options.outputUri);
+      var irSink = BinaryOutputSinkAdapter(dillOutput);
+      ir.BinaryPrinter printer = ir.BinaryPrinter(irSink,
+          libraryFilter: (ir.Library l) =>
+              includedLibraries.contains(l.importUri));
+      printer.writeComponentFile(component);
+      irSink.close();
+    });
+
+    measureSubtask('serialize module data', () {
+      _reporter.log('Writing data to ${_options.writeModularAnalysisUri}');
+      api.BinaryOutputSink dataOutput =
+          _outputProvider.createBinarySink(_options.writeModularAnalysisUri);
+      DataSink sink = BinarySink(BinaryOutputSinkAdapter(dataOutput));
+      data.toDataSink(sink);
+      sink.close();
+    });
+  }
+
+  void testModuleSerialization(ModuleData data, ir.Component component) {
+    if (_options.testMode) {
+      // TODO(joshualitt):
+      // Consider using a strategy like we do for the global data, so we can also
+      // test it with the objectSink/objectSource:
+      //   List<Object> encoding = [];
+      //   DataSink sink = new ObjectSink(encoding, useDataKinds: true);
+      //   data.toDataSink(sink);
+      //   DataSource source = new ObjectSource(encoding, useDataKinds: true);
+      //   source.registerComponentLookup(new ComponentLookup(component));
+      //   ModuleData.fromDataSource(source);
+
+      BytesSink bytes = BytesSink();
+      BinarySink binarySink = BinarySink(bytes, useDataKinds: true);
+      data.toDataSink(binarySink);
+      binarySink.close();
+      var source =
+          BinarySourceImpl(bytes.builder.toBytes(), useDataKinds: true);
+      source.registerComponentLookup(ComponentLookup(component));
+      ModuleData.fromDataSource(source);
+    }
+  }
+
+  Future<List<ModuleData>> deserializeModuleData(ir.Component component) async {
+    return await measureIoSubtask('deserialize module data', () async {
+      _reporter.log('Reading data from ${_options.modularAnalysisInputs}');
+      List<ModuleData> results = [];
+      for (Uri uri in _options.modularAnalysisInputs) {
+        api.Input<List<int>> dataInput =
+            await _provider.readFromUri(uri, inputKind: api.InputKind.binary);
+        DataSource source = BinarySourceImpl(dataInput.data);
+        source.registerComponentLookup(ComponentLookup(component));
+        results.add(ModuleData.fromDataSource(source));
+      }
+      return results;
+    });
+  }
+
   void serializeClosedWorld(JsClosedWorld closedWorld) {
     measureSubtask('serialize closed world', () {
       _reporter.log('Writing closed world to ${_options.writeClosedWorldUri}');
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index 1e1dd45..ca27733 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -267,13 +267,23 @@
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! GenericInstantiation) return false;
-    return functionType == other.functionType &&
-        equalElements(typeArguments, other.typeArguments);
+    if (functionType == other.functionType &&
+        equalElements(typeArguments, other.typeArguments)) {
+      assert(
+          this.hashCode == other.hashCode,
+          '\nthis:  ${this.hashCode}  $this'
+          '\nthis:  ${other.hashCode}  $other');
+      return true;
+    } else {
+      return false;
+    }
   }
 
   @override
   String toString() {
-    return 'GenericInstantiation(functionType:$functionType,'
-        'typeArguments:$typeArguments)';
+    return 'GenericInstantiation('
+        'functionType:$functionType,'
+        'typeArguments:$typeArguments'
+        ')';
   }
 }
diff --git a/pkg/compiler/test/rti/data/method_signatures_generic.dart b/pkg/compiler/test/rti/data/method_signatures_generic.dart
index 0d2c352..b7e0859 100644
--- a/pkg/compiler/test/rti/data/method_signatures_generic.dart
+++ b/pkg/compiler/test/rti/data/method_signatures_generic.dart
@@ -18,7 +18,7 @@
 }
 
 class Class2 {
-  /*spec.member: Class2.method4:direct,explicit=[method4.T*],needsArgs,needsInst=[<num*>,<num*>,<num*>,<num*>]*/
+  /*spec.member: Class2.method4:direct,explicit=[method4.T*],needsArgs,needsInst=[<num*>,<num*>]*/
   num method4<T>(T n) => null;
 }
 
@@ -32,7 +32,7 @@
   num method6<T>(num n, T t) => null;
 }
 
-/*spec.member: method7:direct,explicit=[method7.T*],needsArgs,needsInst=[<num*>,<num*>,<num*>,<num*>]*/
+/*spec.member: method7:direct,explicit=[method7.T*],needsArgs,needsInst=[<num*>,<num*>]*/
 num method7<T>(T n) => null;
 
 /*member: method8:*/
diff --git a/pkg/compiler/tool/modular_test_suite.dart b/pkg/compiler/tool/modular_test_suite.dart
index 780c182..4d42ff3 100644
--- a/pkg/compiler/tool/modular_test_suite.dart
+++ b/pkg/compiler/tool/modular_test_suite.dart
@@ -36,42 +36,43 @@
         sdkRoot.resolve('tests/modular/'),
         'tests/modular',
         _options,
-        new IOPipeline([
+        IOPipeline([
           SourceToDillStep(),
-          ComputeClosedWorldStep(),
+          ModularAnalysisStep(),
+          ComputeClosedWorldStep(useModularAnalysis: true),
           GlobalAnalysisStep(),
           Dart2jsCodegenStep(codeId0),
           Dart2jsCodegenStep(codeId1),
           Dart2jsEmissionStep(),
           RunD8(),
         ], cacheSharedModules: true)),
-    // TODO(joshualitt) Delete this when we stop supporting this way of running
-    // the compiler.
     runSuite(
         sdkRoot.resolve('tests/modular/'),
         'tests/modular',
         _options,
-        new IOPipeline([
+        IOPipeline([
           SourceToDillStep(),
-          ComputeClosedWorldStep(),
+          ComputeClosedWorldStep(useModularAnalysis: false),
           LegacyGlobalAnalysisStep(),
           LegacyDart2jsCodegenStep(codeId0),
           LegacyDart2jsCodegenStep(codeId1),
           LegacyDart2jsEmissionStep(),
           RunD8(),
-        ], cacheSharedModules: true)),
+        ], cacheSharedModules: true))
   ]);
 }
 
-const dillId = const DataId("dill");
-const updatedDillId = const DataId("udill");
-const closedWorldId = const DataId("world");
-const globalDataId = const DataId("gdata");
-const codeId = const ShardsDataId("code", 2);
-const codeId0 = const ShardDataId(codeId, 0);
-const codeId1 = const ShardDataId(codeId, 1);
-const jsId = const DataId("js");
-const txtId = const DataId("txt");
+const dillId = DataId("dill");
+const modularUpdatedDillId = DataId("mdill");
+const modularDataId = DataId("mdata");
+const closedWorldId = DataId("world");
+const globalUpdatedDillId = DataId("gdill");
+const globalDataId = DataId("gdata");
+const codeId = ShardsDataId("code", 2);
+const codeId0 = ShardDataId(codeId, 0);
+const codeId1 = ShardDataId(codeId, 1);
+const jsId = DataId("js");
+const txtId = DataId("txt");
 
 String _packageConfigEntry(String name, Uri root,
     {Uri packageRoot, LanguageVersion version}) {
@@ -140,7 +141,7 @@
     // for these dummy entries..
     // TODO(joshualitt): Generate just the json file.
     var packagesJson = [];
-    var packagesContents = new StringBuffer();
+    var packagesContents = StringBuffer();
     if (module.isPackage) {
       packagesContents.write('${module.name}:${module.packageBase}\n');
       packagesJson.add(_packageConfigEntry(
@@ -232,10 +233,9 @@
   }
 }
 
-// Step that invokes the dart2js closed world computation.
-class ComputeClosedWorldStep implements IOModularStep {
+class ModularAnalysisStep implements IOModularStep {
   @override
-  List<DataId> get resultData => const [closedWorldId, updatedDillId];
+  List<DataId> get resultData => const [modularDataId, modularUpdatedDillId];
 
   @override
   bool get needsSources => false;
@@ -247,6 +247,69 @@
   List<DataId> get moduleDataNeeded => const [dillId];
 
   @override
+  bool get onlyOnMain => false;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: modular analysis on $module");
+    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    Iterable<String> dillDependencies =
+        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${toUri(module, dillId)}',
+      if (dillDependencies.isNotEmpty)
+        '--dill-dependencies=${dillDependencies.join(',')}',
+      '--out=${toUri(module, modularUpdatedDillId)}',
+      '${Flags.writeModularAnalysis}=${toUri(module, modularDataId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) {
+      print("cached step: dart2js modular analysis on $module");
+    }
+  }
+}
+
+DataId idForDill({bool useModularAnalysis}) =>
+    useModularAnalysis ? modularUpdatedDillId : dillId;
+
+List<DataId> inputFromAnalysis({bool useModularAnalysis = false}) => [
+      idForDill(useModularAnalysis: useModularAnalysis),
+      if (useModularAnalysis) modularDataId,
+    ];
+
+// Step that invokes the dart2js closed world computation.
+class ComputeClosedWorldStep implements IOModularStep {
+  final bool useModularAnalysis;
+
+  ComputeClosedWorldStep({this.useModularAnalysis});
+
+  @override
+  List<DataId> get resultData => const [closedWorldId, globalUpdatedDillId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded =>
+      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
+
+  @override
+  List<DataId> get moduleDataNeeded =>
+      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
+
+  @override
   bool get onlyOnMain => true;
 
   @override
@@ -255,8 +318,13 @@
     if (_options.verbose)
       print("\nstep: dart2js compute closed world on $module");
     Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    DataId dillId = idForDill(useModularAnalysis: useModularAnalysis);
     Iterable<String> dillDependencies =
         transitiveDependencies.map((m) => '${toUri(m, dillId)}');
+    List<String> dataDependencies = transitiveDependencies
+        .map((m) => '${toUri(m, modularDataId)}')
+        .toList();
+    dataDependencies.add('${toUri(module, modularDataId)}');
     List<String> args = [
       '--packages=${sdkRoot.toFilePath()}/.packages',
       _dart2jsScript,
@@ -265,8 +333,10 @@
       '${toUri(module, dillId)}',
       for (String flag in flags) '--enable-experiment=$flag',
       '${Flags.dillDependencies}=${dillDependencies.join(',')}',
+      if (useModularAnalysis)
+        '${Flags.readModularAnalysis}=${dataDependencies.join(',')}',
       '${Flags.writeClosedWorld}=${toUri(module, closedWorldId)}',
-      '--out=${toUri(module, updatedDillId)}',
+      '--out=${toUri(module, globalUpdatedDillId)}',
     ];
     var result =
         await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
@@ -281,8 +351,7 @@
   }
 }
 
-// Step that invokes the dart2js global analysis on the main module by providing
-// the .dill files of all transitive modules as inputs.
+// Step that runs the dart2js modular analysis.
 class GlobalAnalysisStep implements IOModularStep {
   @override
   List<DataId> get resultData => const [globalDataId];
@@ -291,10 +360,11 @@
   bool get needsSources => false;
 
   @override
-  List<DataId> get dependencyDataNeeded => const [updatedDillId];
+  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
 
   @override
-  List<DataId> get moduleDataNeeded => const [closedWorldId, updatedDillId];
+  List<DataId> get moduleDataNeeded =>
+      const [closedWorldId, globalUpdatedDillId];
 
   @override
   bool get onlyOnMain => true;
@@ -308,7 +378,7 @@
       _dart2jsScript,
       // TODO(sigmund): remove this dependency on libraries.json
       if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${toUri(module, updatedDillId)}',
+      '${toUri(module, globalUpdatedDillId)}',
       for (String flag in flags) '--enable-experiment=$flag',
       '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
       '${Flags.writeData}=${toUri(module, globalDataId)}',
@@ -347,7 +417,7 @@
 
   @override
   List<DataId> get moduleDataNeeded =>
-      const [updatedDillId, closedWorldId, globalDataId];
+      const [globalUpdatedDillId, closedWorldId, globalDataId];
 
   @override
   bool get onlyOnMain => true;
@@ -360,7 +430,7 @@
       '--packages=${sdkRoot.toFilePath()}/.packages',
       _dart2jsScript,
       if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${toUri(module, updatedDillId)}',
+      '${toUri(module, globalUpdatedDillId)}',
       for (String flag in flags) '--enable-experiment=$flag',
       '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
       '${Flags.readData}=${toUri(module, globalDataId)}',
@@ -393,8 +463,13 @@
   List<DataId> get dependencyDataNeeded => const [];
 
   @override
-  List<DataId> get moduleDataNeeded =>
-      const [updatedDillId, closedWorldId, globalDataId, codeId0, codeId1];
+  List<DataId> get moduleDataNeeded => const [
+        globalUpdatedDillId,
+        closedWorldId,
+        globalDataId,
+        codeId0,
+        codeId1
+      ];
 
   @override
   bool get onlyOnMain => true;
@@ -407,7 +482,7 @@
       '--packages=${sdkRoot.toFilePath()}/.packages',
       _dart2jsScript,
       if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${toUri(module, updatedDillId)}',
+      '${toUri(module, globalUpdatedDillId)}',
       for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
       '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
       '${Flags.readData}=${toUri(module, globalDataId)}',
@@ -436,10 +511,11 @@
   bool get needsSources => false;
 
   @override
-  List<DataId> get dependencyDataNeeded => const [updatedDillId];
+  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
 
   @override
-  List<DataId> get moduleDataNeeded => const [closedWorldId, updatedDillId];
+  List<DataId> get moduleDataNeeded =>
+      const [closedWorldId, globalUpdatedDillId];
 
   @override
   bool get onlyOnMain => true;
@@ -453,7 +529,7 @@
       _dart2jsScript,
       // TODO(sigmund): remove this dependency on libraries.json
       if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${toUri(module, updatedDillId)}',
+      '${toUri(module, globalUpdatedDillId)}',
       for (String flag in flags) '--enable-experiment=$flag',
       '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
       '${Flags.writeData}=${toUri(module, globalDataId)}',
@@ -490,7 +566,8 @@
   List<DataId> get dependencyDataNeeded => const [];
 
   @override
-  List<DataId> get moduleDataNeeded => const [updatedDillId, globalDataId];
+  List<DataId> get moduleDataNeeded =>
+      const [globalUpdatedDillId, globalDataId];
 
   @override
   bool get onlyOnMain => true;
@@ -503,7 +580,7 @@
       '--packages=${sdkRoot.toFilePath()}/.packages',
       _dart2jsScript,
       if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${toUri(module, updatedDillId)}',
+      '${toUri(module, globalUpdatedDillId)}',
       for (String flag in flags) '--enable-experiment=$flag',
       '${Flags.readData}=${toUri(module, globalDataId)}',
       '${Flags.writeCodegen}=${toUri(module, codeId.dataId)}',
@@ -537,7 +614,7 @@
 
   @override
   List<DataId> get moduleDataNeeded =>
-      const [updatedDillId, globalDataId, codeId0, codeId1];
+      const [globalUpdatedDillId, globalDataId, codeId0, codeId1];
 
   @override
   bool get onlyOnMain => true;
@@ -550,7 +627,7 @@
       '--packages=${sdkRoot.toFilePath()}/.packages',
       _dart2jsScript,
       if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${toUri(module, updatedDillId)}',
+      '${toUri(module, globalUpdatedDillId)}',
       for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
       '${Flags.readData}=${toUri(module, globalDataId)}',
       '${Flags.readCodegen}=${toUri(module, codeId)}',
@@ -639,7 +716,7 @@
   } else if (Platform.isMacOS) {
     return 'third_party/d8/macos/d8';
   }
-  throw new UnsupportedError('Unsupported platform.');
+  throw UnsupportedError('Unsupported platform.');
 }
 
 class ShardsDataId implements DataId {
diff --git a/pkg/dds/lib/src/dap/protocol_generated.dart b/pkg/dds/lib/src/dap/protocol_generated.dart
index a39f56f..105ca1f 100644
--- a/pkg/dds/lib/src/dap/protocol_generated.dart
+++ b/pkg/dds/lib/src/dap/protocol_generated.dart
@@ -172,7 +172,7 @@
     if (obj['offset'] is! int?) {
       return false;
     }
-    if (!Source?.canParse(obj['source'])) {
+    if (!Source.canParse(obj['source'])) {
       return false;
     }
     if (obj['verified'] is! bool) {
@@ -1114,7 +1114,7 @@
     if (obj['text'] is! String?) {
       return false;
     }
-    if (!CompletionItemType?.canParse(obj['type'])) {
+    if (!CompletionItemType.canParse(obj['type'])) {
       return false;
     }
     return true;
@@ -1420,7 +1420,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!DataBreakpointAccessType?.canParse(obj['accessType'])) {
+    if (!DataBreakpointAccessType.canParse(obj['accessType'])) {
       return false;
     }
     if (obj['condition'] is! String?) {
@@ -1748,7 +1748,7 @@
     if (obj['line'] is! int?) {
       return false;
     }
-    if (!Source?.canParse(obj['location'])) {
+    if (!Source.canParse(obj['location'])) {
       return false;
     }
     if (obj['symbol'] is! String?) {
@@ -1949,7 +1949,7 @@
     if (obj['expression'] is! String) {
       return false;
     }
-    if (!ValueFormat?.canParse(obj['format'])) {
+    if (!ValueFormat.canParse(obj['format'])) {
       return false;
     }
     if (obj['frameId'] is! int?) {
@@ -2923,7 +2923,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!Capabilities?.canParse(obj['body'])) {
+    if (!Capabilities.canParse(obj['body'])) {
       return false;
     }
     return Response.canParse(obj);
@@ -3518,7 +3518,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+    if (!SteppingGranularity.canParse(obj['granularity'])) {
       return false;
     }
     if (obj['threadId'] is! int) {
@@ -4317,7 +4317,7 @@
     if (obj['presentationHint'] is! String?) {
       return false;
     }
-    if (!Source?.canParse(obj['source'])) {
+    if (!Source.canParse(obj['source'])) {
       return false;
     }
     if (obj['variablesReference'] is! int) {
@@ -4757,7 +4757,7 @@
     if (obj['expression'] is! String) {
       return false;
     }
-    if (!ValueFormat?.canParse(obj['format'])) {
+    if (!ValueFormat.canParse(obj['format'])) {
       return false;
     }
     if (obj['frameId'] is! int?) {
@@ -5004,7 +5004,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!ValueFormat?.canParse(obj['format'])) {
+    if (!ValueFormat.canParse(obj['format'])) {
       return false;
     }
     if (obj['name'] is! String) {
@@ -5206,7 +5206,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!Source?.canParse(obj['source'])) {
+    if (!Source.canParse(obj['source'])) {
       return false;
     }
     if (obj['sourceReference'] is! int) {
@@ -5454,7 +5454,7 @@
     if (obj['presentationHint'] is! String?) {
       return false;
     }
-    if (!Source?.canParse(obj['source'])) {
+    if (!Source.canParse(obj['source'])) {
       return false;
     }
     return true;
@@ -5606,7 +5606,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!StackFrameFormat?.canParse(obj['format'])) {
+    if (!StackFrameFormat.canParse(obj['format'])) {
       return false;
     }
     if (obj['levels'] is! int?) {
@@ -5696,7 +5696,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+    if (!SteppingGranularity.canParse(obj['granularity'])) {
       return false;
     }
     if (obj['threadId'] is! int) {
@@ -5781,7 +5781,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+    if (!SteppingGranularity.canParse(obj['granularity'])) {
       return false;
     }
     if (obj['targetId'] is! int?) {
@@ -5974,7 +5974,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!SteppingGranularity?.canParse(obj['granularity'])) {
+    if (!SteppingGranularity.canParse(obj['granularity'])) {
       return false;
     }
     if (obj['threadId'] is! int) {
@@ -6393,7 +6393,7 @@
     if (obj['namedVariables'] is! int?) {
       return false;
     }
-    if (!VariablePresentationHint?.canParse(obj['presentationHint'])) {
+    if (!VariablePresentationHint.canParse(obj['presentationHint'])) {
       return false;
     }
     if (obj['type'] is! String?) {
@@ -6527,7 +6527,7 @@
     if (obj['filter'] is! String?) {
       return false;
     }
-    if (!ValueFormat?.canParse(obj['format'])) {
+    if (!ValueFormat.canParse(obj['format'])) {
       return false;
     }
     if (obj['start'] is! int?) {
@@ -6999,7 +6999,7 @@
     if (obj is! Map<String, dynamic>) {
       return false;
     }
-    if (!Message?.canParse(obj['error'])) {
+    if (!Message.canParse(obj['error'])) {
       return false;
     }
     return true;
@@ -7088,7 +7088,7 @@
     if (obj['namedVariables'] is! int?) {
       return false;
     }
-    if (!VariablePresentationHint?.canParse(obj['presentationHint'])) {
+    if (!VariablePresentationHint.canParse(obj['presentationHint'])) {
       return false;
     }
     if (obj['result'] is! String) {
@@ -7156,7 +7156,7 @@
     if (obj['description'] is! String?) {
       return false;
     }
-    if (!ExceptionDetails?.canParse(obj['details'])) {
+    if (!ExceptionDetails.canParse(obj['details'])) {
       return false;
     }
     if (obj['exceptionId'] is! String) {
@@ -7614,7 +7614,7 @@
     if (obj['output'] is! String) {
       return false;
     }
-    if (!Source?.canParse(obj['source'])) {
+    if (!Source.canParse(obj['source'])) {
       return false;
     }
     if (obj['variablesReference'] is! int?) {
@@ -8253,7 +8253,7 @@
     if (obj['namedVariables'] is! int?) {
       return false;
     }
-    if (!VariablePresentationHint?.canParse(obj['presentationHint'])) {
+    if (!VariablePresentationHint.canParse(obj['presentationHint'])) {
       return false;
     }
     if (obj['type'] is! String?) {
diff --git a/pkg/dds/tool/dap/codegen.dart b/pkg/dds/tool/dap/codegen.dart
index 7dee5b3..ccb78a6 100644
--- a/pkg/dds/tool/dap/codegen.dart
+++ b/pkg/dds/tool/dap/codegen.dart
@@ -646,7 +646,7 @@
       }
       buffer.write(')');
     } else if (type.isSpecType) {
-      buffer.write('$opBang$dartType.canParse($valueCode)');
+      buffer.write('$opBang${type.asDartType()}.canParse($valueCode)');
     } else {
       throw 'Unable to type check $valueCode against $type';
     }
diff --git a/pkg/dds/tool/dap/generate_all.dart b/pkg/dds/tool/dap/generate_all.dart
index 8fe4b60..ec769fe9 100644
--- a/pkg/dds/tool/dap/generate_all.dart
+++ b/pkg/dds/tool/dap/generate_all.dart
@@ -46,8 +46,8 @@
 
 // This code was auto-generated by tool/dap/generate_all.dart - do not hand-edit!
 
-import 'package:dds/src/dap/protocol_common.dart';
-import 'package:dds/src/dap/protocol_special.dart';
+import 'protocol_common.dart';
+import 'protocol_special.dart';
 ''';
 final argParser = ArgParser()
   ..addFlag(argHelp, hide: true)
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect b/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect
index 85568b7..c3f1e06 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect
@@ -564,37 +564,37 @@
 // Try adding explicit types.
 //   operator ==<T>(a) => true;
 //            ^^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is one of the overridden members.
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is one of the overridden members.
+//   external bool operator ==(Object other);
+//                          ^^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: The method 'Operators1.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==() => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: The method 'Operators2.==' has more required arguments than those of overridden method 'Object.=='.
 //   operator ==(a, b) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:71:12: Error: The method 'Operators4.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==({a}) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
 //   operator ==<T>(a) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect b/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect
index 9474e68..c1ee228 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect
@@ -564,37 +564,37 @@
 // Try adding explicit types.
 //   operator ==<T>(a) => true;
 //            ^^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is one of the overridden members.
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is one of the overridden members.
+//   external bool operator ==(Object other);
+//                          ^^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: The method 'Operators1.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==() => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: The method 'Operators2.==' has more required arguments than those of overridden method 'Object.=='.
 //   operator ==(a, b) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:71:12: Error: The method 'Operators4.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==({a}) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
 //   operator ==<T>(a) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/issue46389.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue46389.dart.weak.transformed.expect
index cd3ad34..c3ae0b5 100644
--- a/pkg/front_end/testcases/general/issue46389.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue46389.dart.weak.transformed.expect
@@ -32,10 +32,14 @@
   synthetic constructor •() → self::_C&A&B
     : super self::A::•()
     ;
-  abstract set boz(generic-covariant-impl core::num x) → void;
-  abstract method foo(generic-covariant-impl core::num x) → core::num;
-  abstract method bar({required generic-covariant-impl core::num x = #C1}) → core::num;
-  abstract set baz(generic-covariant-impl core::num x) → void;
+  set boz(generic-covariant-impl core::num x) → void
+    return super.{self::A::boz} = x as core::int;
+  method foo(generic-covariant-impl core::num x) → core::num
+    return super.{self::A::foo}(x as core::int);
+  method bar({required generic-covariant-impl core::num x = #C1}) → core::num
+    return super.{self::A::bar}(x: x as core::int);
+  set baz(generic-covariant-impl core::num x) → void
+    return super.{self::A::baz} = x as core::int;
 }
 class C extends self::_C&A&B {
   synthetic constructor •() → self::C
diff --git a/pkg/front_end/testcases/general/issue46390.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue46390.dart.weak.transformed.expect
index 898098e..7ba41a0 100644
--- a/pkg/front_end/testcases/general/issue46390.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue46390.dart.weak.transformed.expect
@@ -21,7 +21,8 @@
   synthetic constructor •() → self::_C&A&B
     : super self::A::•()
     ;
-  abstract method foo(generic-covariant-impl core::num x) → core::num;
+  method foo(generic-covariant-impl core::num x) → core::num
+    return super.{self::A::foo}(x);
 }
 class C extends self::_C&A&B {
   synthetic constructor •() → self::C
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
index b7191c8..1717f29 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
@@ -9,9 +9,9 @@
 // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   bool operator ==() => true;
 //                 ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
 //   bool operator ==(Object? other) => super == other;
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
index b7191c8..1717f29 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
@@ -9,9 +9,9 @@
 // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   bool operator ==() => true;
 //                 ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
 //   bool operator ==(Object? other) => super == other;
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect
index 7475e9f..f1a33e9 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect
@@ -9,9 +9,9 @@
 // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   bool operator ==() => true;
 //                 ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:26:17: Context: This is the overridden method ('==').
-//   bool operator ==(Object other) native "Object_equals";
-//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
 //
 // pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
 //   bool operator ==(Object? other) => super == other;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
index 5af8040..92c7fe5 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect
@@ -30,7 +30,8 @@
     ;
   abstract method extendedConcreteMixedInAbstractMethod() → void;
   method extendedConcreteMixedInConcreteMethod() → void {}
-  abstract method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void;
+  method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void
+    return super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(i);
   method extendedConcreteMixedInConcreteImplementedMethod(covariant core::int i) → void {}
 }
 class Sub extends self::Class {
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 81489e3..9093936 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -84,8 +84,6 @@
 general/issue41210b/issue41210.no_link: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
 general/issue44733: TypeCheckError
-general/issue46389: RuntimeError # issue 46389
-general/issue46390: RuntimeError # issue 46390
 general/issue_46886: RuntimeError
 general/micro: RuntimeError
 general/mixin_application_override: TypeCheckError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 1057daf..6af034c 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -88,8 +88,6 @@
 general/issue41210b/issue41210.no_link: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
 general/issue44733: TypeCheckError
-general/issue46389: RuntimeError # issue 46389
-general/issue46390: RuntimeError # issue 46390
 general/issue_46886: RuntimeError
 general/micro: RuntimeError
 general/mixin_application_override: ExpectationFileMismatch # Too many errors.
diff --git a/pkg/kernel/lib/external_name.dart b/pkg/kernel/lib/external_name.dart
index f491275..367b5d2 100644
--- a/pkg/kernel/lib/external_name.dart
+++ b/pkg/kernel/lib/external_name.dart
@@ -5,22 +5,30 @@
 library kernel.external_name;
 
 import 'ast.dart';
+import 'core_types.dart';
 
 /// Returns external (native) name of given [Member].
-String? getExternalName(Member procedure) {
+String? getExternalName(CoreTypes coreTypes, Member procedure) {
   // Native procedures are marked as external and have an annotation,
   // which looks like this:
   //
+  //    @pragma("vm:external-name", "<name-of-native>")
+  //    external Object foo(arg0, ...);
+  //
+  // Previously the following encoding was used, which is still supported
+  // until all users are migrated away from it:
+  //
   //    import 'dart:_internal' as internal;
   //
   //    @internal.ExternalName("<name-of-native>")
   //    external Object foo(arg0, ...);
   //
+
   if (!procedure.isExternal) {
     return null;
   }
   for (final Expression annotation in procedure.annotations) {
-    final String? value = _getExternalNameValue(annotation);
+    final String? value = _getExternalNameValue(coreTypes, annotation);
     if (value != null) {
       return value;
     }
@@ -28,28 +36,25 @@
   return null;
 }
 
-/// Returns native extension URIs for given [library].
-List<String> getNativeExtensionUris(Library library) {
-  final List<String> uris = <String>[];
-  for (Expression annotation in library.annotations) {
-    final String? value = _getExternalNameValue(annotation);
-    if (value != null) {
-      uris.add(value);
-    }
-  }
-  return uris;
-}
-
-String? _getExternalNameValue(Expression annotation) {
-  if (annotation is ConstructorInvocation) {
-    if (_isExternalName(annotation.target.enclosingClass)) {
-      return (annotation.arguments.positional.single as StringLiteral).value;
-    }
-  } else if (annotation is ConstantExpression) {
+String? _getExternalNameValue(CoreTypes coreTypes, Expression annotation) {
+  if (annotation is ConstantExpression) {
     final Constant constant = annotation.constant;
     if (constant is InstanceConstant) {
       if (_isExternalName(constant.classNode)) {
         return (constant.fieldValues.values.single as StringConstant).value;
+      } else if (_isPragma(constant.classNode)) {
+        final String pragmaName =
+            (constant.fieldValues[coreTypes.pragmaName.getterReference]
+                    as StringConstant)
+                .value;
+        final Constant? pragmaOptionsValue =
+            constant.fieldValues[coreTypes.pragmaOptions.getterReference];
+        final String? pragmaOptions = pragmaOptionsValue is StringConstant
+            ? pragmaOptionsValue.value
+            : null;
+        if (pragmaName == _externalNamePragma && pragmaOptions != null) {
+          return pragmaOptions;
+        }
       }
     }
   }
@@ -59,3 +64,9 @@
 bool _isExternalName(Class klass) =>
     klass.name == 'ExternalName' &&
     klass.enclosingLibrary.importUri.toString() == 'dart:_internal';
+
+bool _isPragma(Class klass) =>
+    klass.name == 'pragma' &&
+    klass.enclosingLibrary.importUri.toString() == 'dart:core';
+
+const String _externalNamePragma = 'vm:external-name';
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index d293799..6c80c5a 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -146,7 +146,9 @@
         class_.addField(clone);
       }
       class_.procedures.clear();
-      class_.procedures..addAll(nonSetters.values)..addAll(setters.values);
+      class_.procedures
+        ..addAll(nonSetters.values)
+        ..addAll(setters.values);
     }
 
     // Existing procedures in the class should only be forwarding stubs.
@@ -190,6 +192,17 @@
             // and don't add several procedures with the same name to the class.
             continue outer;
           }
+          if (procedure.isAbstract &&
+              (originalProcedure.stubKind ==
+                      ProcedureStubKind.ConcreteForwardingStub ||
+                  originalProcedure.stubKind ==
+                      ProcedureStubKind.ConcreteMixinStub)) {
+            // Don't replace concrete stubs with abstract methods.
+            originalProcedure.stubKind = ProcedureStubKind.Regular;
+            originalProcedure.stubTarget = null;
+            continue outer;
+          }
+
           originalIndex = i;
           break;
         }
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index f271dcf..76d2703 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -15,7 +15,6 @@
 import 'package:nnbd_migration/fix_reason_target.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
-import 'package:nnbd_migration/src/utilities/hint_utils.dart';
 
 Map<int?, List<AtomicEdit>>? _removeCode(
     int offset, int end, _RemovalStyle removalStyle, AtomicEditInfo? info) {
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index bcfdef6..a4f43e2 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -35,7 +35,6 @@
 import 'package:nnbd_migration/src/edit_plan.dart';
 import 'package:nnbd_migration/src/fix_aggregator.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
-import 'package:nnbd_migration/src/utilities/hint_utils.dart';
 import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
 import 'package:nnbd_migration/src/utilities/resolution_utils.dart';
 import 'package:nnbd_migration/src/utilities/where_or_null_transformer.dart';
diff --git a/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart b/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
index 90adae8..4e6da6b 100644
--- a/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
-import 'package:nnbd_migration/src/utilities/hint_utils.dart';
 
 /// Class with the capability of writing out a machine-readable summary of
 /// migration results.
diff --git a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
index d89b551..abc2788 100644
--- a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
+++ b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
@@ -6,7 +6,6 @@
 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/source/line_info.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
index 5ae2e16..f09fc1a 100644
--- a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
+++ b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
 import 'package:kernel/external_name.dart';
 import 'package:kernel/type_environment.dart';
 
@@ -200,6 +201,7 @@
 
 class _Collect extends RecursiveVisitor {
   final SignatureShaker shaker;
+  final CoreTypes coreTypes;
 
   /// Parameters of the current function.
   final Map<VariableDeclaration, _ParameterInfo> localParameters = {};
@@ -209,7 +211,8 @@
   /// via [_ParameterInfo.useDependencies] and not marked as read immediately.
   final Set<VariableGet> useDependencies = {};
 
-  _Collect(this.shaker);
+  _Collect(this.shaker)
+      : coreTypes = shaker.typeFlowAnalysis.environment.coreTypes;
 
   void enterFunction(Member member) {
     final _ProcedureInfo? info = shaker._infoForMember(member);
@@ -233,7 +236,7 @@
         shaker.typeFlowAnalysis.nativeCodeOracle
             .isMemberReferencedFromNativeCode(member) ||
         shaker.typeFlowAnalysis.nativeCodeOracle.isRecognized(member) ||
-        getExternalName(member) != null ||
+        getExternalName(coreTypes, member) != null ||
         member.name.text == '==') {
       info.eligible = false;
     }
diff --git a/pkg/vm/lib/transformations/type_flow/unboxing_info.dart b/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
index 682cf58..bda15ba9 100644
--- a/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
+++ b/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
@@ -205,5 +205,5 @@
         _nativeCodeOracle.hasDisableUnboxedParameters(member);
   }
 
-  bool _isNative(Member member) => getExternalName(member) != null;
+  bool _isNative(Member member) => getExternalName(_coreTypes, member) != null;
 }
diff --git a/pkg/vm_service/test/get_http_profile_test.dart b/pkg/vm_service/test/get_http_profile_test.dart
index b111440..d812476 100644
--- a/pkg/vm_service/test/get_http_profile_test.dart
+++ b/pkg/vm_service/test/get_http_profile_test.dart
@@ -106,6 +106,7 @@
   for (int i = 0; i < 10; ++i) {
     final future = executeWithRandomDelay(() async {
       final r = await client.getUrl(randomlyAddRequestParams(address));
+      r.headers.add('cookie-eater', 'Cookie-Monster !');
       final response = await r.close();
       await response.drain();
     });
@@ -287,6 +288,24 @@
 Future<void> hasValidHttpPUTs(HttpProfile profile) =>
     hasValidHttpRequests(profile, 'PUT');
 
+void hasDefaultRequestHeaders(HttpProfile profile) {
+  for(final request in profile.requests) {
+    if(!request.request!.hasError) {
+      expect(request.request?.headers['host'], isNotNull);
+      expect(request.request?.headers['user-agent'], isNotNull);
+    }
+  }
+}
+
+void hasCustomRequestHeaders(HttpProfile profile) {
+  var requests = profile.requests.where((e) => e.method == "GET").toList();
+  for(final request in requests) {
+    if(!request.request!.hasError) {
+      expect(request.request?.headers['cookie-eater'], isNotNull);
+    }
+  }
+}
+
 var tests = <IsolateTest>[
   (VmService service, IsolateRef isolateRef) async {
     vmService = service;
@@ -303,6 +322,8 @@
     await hasValidHttpPATCHs(httpProfile);
     await hasValidHttpPOSTs(httpProfile);
     await hasValidHttpPUTs(httpProfile);
+    hasDefaultRequestHeaders(httpProfile);
+    hasCustomRequestHeaders(httpProfile);
   },
 ];
 
diff --git a/runtime/docs/pragmas.md b/runtime/docs/pragmas.md
index 0211a75..589699c 100644
--- a/runtime/docs/pragmas.md
+++ b/runtime/docs/pragmas.md
@@ -10,6 +10,7 @@
 | `vm:never-inline` | [Never inline a function or method](compiler/pragmas_recognized_by_compiler.md#requesting-a-function-never-be-inlined) |
 | `vm:prefer-inline` | [Inline a function or method when possible](compiler/pragmas_recognized_by_compiler.md#requesting-a-function-be-inlined) |
 | `vm:notify-debugger-on-exception` | Marks a function that catches exceptions, making the VM treat any caught exception as if they were uncaught. This can be used to notify an attached debugger during debugging, without pausing the app during regular execution. |
+| `vm:external-name` | Allows to specify an external (native) name for an `external` function. This name is used to lookup native implementation via native resolver associated with the current library through embedding APIs. This is a replacement for legacy VM specific `native "name"` syntax. |
 
 ## Unsafe pragmas for general use
 
diff --git a/runtime/tests/vm/dart/splay_ephemeron_test.dart b/runtime/tests/vm/dart/splay_ephemeron_test.dart
new file mode 100644
index 0000000..329d6d5
--- /dev/null
+++ b/runtime/tests/vm/dart/splay_ephemeron_test.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test is a copy of the Splay benchmark that is run with a variety of
+// different GC options. It makes for a good GC stress test because it
+// continuously makes small changes to a large, long-lived data structure,
+// stressing lots of combinations of references between new-gen and old-gen
+// objects, and between marked and unmarked objects.
+// The ephemeron variant of this test replaces the direct child pointers in the
+// tree with Expandos to stress the handling of WeakProperties/ephemerons.
+
+// VMOptions=
+// VMOptions=--no_concurrent_mark --no_concurrent_sweep
+// VMOptions=--no_concurrent_mark --concurrent_sweep
+// VMOptions=--no_concurrent_mark --use_compactor
+// VMOptions=--no_concurrent_mark --use_compactor --force_evacuation
+// VMOptions=--concurrent_mark --no_concurrent_sweep
+// VMOptions=--concurrent_mark --concurrent_sweep
+// VMOptions=--concurrent_mark --use_compactor
+// VMOptions=--concurrent_mark --use_compactor --force_evacuation
+// VMOptions=--scavenger_tasks=0
+// VMOptions=--scavenger_tasks=1
+// VMOptions=--scavenger_tasks=2
+// VMOptions=--scavenger_tasks=3
+// VMOptions=--verify_before_gc
+// VMOptions=--verify_after_gc
+// VMOptions=--verify_before_gc --verify_after_gc
+// VMOptions=--verify_store_buffer
+// VMOptions=--stress_write_barrier_elimination
+// VMOptions=--old_gen_heap_size=150
+
+import "dart:math";
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+void main() {
+  Splay.main();
+}
+
+class Splay extends BenchmarkBase {
+  const Splay() : super("Splay");
+
+  // Configuration.
+  static final int kTreeSize = 8000;
+  static final int kTreeModifications = 80;
+  static final int kTreePayloadDepth = 5;
+
+  static SplayTree? tree;
+
+  static Random rnd = new Random(12345);
+
+  // Insert new node with a unique key.
+  static num insertNewNode() {
+    num key;
+    final localTree = tree!;
+    do {
+      key = rnd.nextDouble();
+    } while (localTree.find(key) != null);
+    Payload payload = Payload.generate(kTreePayloadDepth, key.toString());
+    localTree.insert(key, payload);
+    return key;
+  }
+
+  static void mysetup() {
+    tree = new SplayTree();
+    for (int i = 0; i < kTreeSize; i++) insertNewNode();
+  }
+
+  static void tearDown() {
+    // Allow the garbage collector to reclaim the memory
+    // used by the splay tree no matter how we exit the
+    // tear down function.
+    List<num> keys = tree!.exportKeys();
+    tree = null;
+
+    // Verify that the splay tree has the right size.
+    int length = keys.length;
+    if (length != kTreeSize) throw new Error("Splay tree has wrong size");
+
+    // Verify that the splay tree has sorted, unique keys.
+    for (int i = 0; i < length - 1; i++) {
+      if (keys[i] >= keys[i + 1]) throw new Error("Splay tree not sorted");
+    }
+  }
+
+  void warmup() {
+    exercise();
+  }
+
+  void exercise() {
+    // Replace a few nodes in the splay tree.
+    final localTree = tree!;
+    for (int i = 0; i < kTreeModifications; i++) {
+      num key = insertNewNode();
+      Node? greatest = localTree.findGreatestLessThan(key);
+      if (greatest == null) {
+        localTree.remove(key);
+      } else {
+        localTree.remove(greatest.key);
+      }
+    }
+  }
+
+  static void main() {
+    mysetup();
+    new Splay().report();
+    tearDown();
+  }
+}
+
+
+class Leaf {
+  Leaf(String tag) :
+    string = "String for key $tag in leaf node",
+    array = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
+  {}
+  String string;
+  List<num> array;
+}
+
+
+class Payload {
+  Payload(left, right) {
+    this.left = left;
+    this.right = right;
+  }
+
+  // This ordering of fields is delibrate: one key is visited before the expando
+  // and one after.
+  final leftKey = new Object();
+  final expando = new Expando();
+  final rightKey = new Object();
+
+  get left => expando[leftKey];
+  set left(value) => expando[leftKey] = value;
+  get right => expando[rightKey];
+  set right(value) => expando[rightKey] = value;
+
+  static generate(depth, tag) {
+    if (depth == 0) return new Leaf(tag);
+    return new Payload(generate(depth - 1, tag),
+                       generate(depth - 1, tag));
+  }
+}
+
+class Error implements Exception {
+  const Error(this.message);
+  final String message;
+}
+
+
+/**
+ * A splay tree is a self-balancing binary search tree with the additional
+ * property that recently accessed elements are quick to access again.
+ * It performs basic operations such as insertion, look-up and removal
+ * in O(log(n)) amortized time.
+ */
+class SplayTree {
+  SplayTree();
+
+  /**
+   * Inserts a node into the tree with the specified [key] and value if
+   * the tree does not already contain a node with the specified key. If
+   * the value is inserted, it becomes the root of the tree.
+   */
+  void insert(num key, value) {
+    if (isEmpty) {
+      root = new Node(key, value);
+      return;
+    }
+    // Splay on the key to move the last node on the search path for
+    // the key to the root of the tree.
+    splay(key);
+    if (root!.key == key) return;
+    Node node = new Node(key, value);
+    if (key > root!.key) {
+      node.left = root;
+      node.right = root!.right;
+      root!.right = null;
+    } else {
+      node.right = root;
+      node.left = root!.left;
+      root!.left = null;
+    }
+    root = node;
+  }
+
+  /**
+   * Removes a node with the specified key from the tree if the tree
+   * contains a node with this key. The removed node is returned. If
+   * [key] is not found, an exception is thrown.
+   */
+  Node remove(num key) {
+    if (isEmpty) throw new Error('Key not found: $key');
+    splay(key);
+    if (root!.key != key) throw new Error('Key not found: $key');
+    Node removed = root!;
+    if (root!.left == null) {
+      root = root!.right;
+    } else {
+      Node? right = root!.right;
+      root = root!.left;
+      // Splay to make sure that the new root has an empty right child.
+      splay(key);
+      // Insert the original right child as the right child of the new
+      // root.
+      root!.right = right;
+    }
+    return removed;
+  }
+
+  /**
+   * Returns the node having the specified [key] or null if the tree doesn't
+   * contain a node with the specified [key].
+   */
+  Node? find(num key) {
+    if (isEmpty) return null;
+    splay(key);
+    return root!.key == key ? root : null;
+  }
+
+  /**
+   * Returns the Node having the maximum key value.
+   */
+  Node? findMax([Node? start]) {
+    if (isEmpty) return null;
+    Node current = null == start ? root! : start;
+    while (current.right != null) current = current.right!;
+    return current;
+  }
+
+  /**
+   * Returns the Node having the maximum key value that
+   * is less than the specified [key].
+   */
+  Node? findGreatestLessThan(num key) {
+    if (isEmpty) return null;
+    // Splay on the key to move the node with the given key or the last
+    // node on the search path to the top of the tree.
+    splay(key);
+    // Now the result is either the root node or the greatest node in
+    // the left subtree.
+    if (root!.key < key) return root;
+    if (root!.left != null) return findMax(root!.left);
+    return null;
+  }
+
+  /**
+   * Perform the splay operation for the given key. Moves the node with
+   * the given key to the top of the tree.  If no node has the given
+   * key, the last node on the search path is moved to the top of the
+   * tree. This is the simplified top-down splaying algorithm from:
+   * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
+   */
+  void splay(num key) {
+    if (isEmpty) return;
+    // Create a dummy node.  The use of the dummy node is a bit
+    // counter-intuitive: The right child of the dummy node will hold
+    // the L tree of the algorithm.  The left child of the dummy node
+    // will hold the R tree of the algorithm.  Using a dummy node, left
+    // and right will always be nodes and we avoid special cases.
+    final Node dummy = new Node(0, null);
+    Node left = dummy;
+    Node right = dummy;
+    Node current = root!;
+    while (true) {
+      if (key < current.key) {
+        if (current.left == null) break;
+        if (key < current.left!.key) {
+          // Rotate right.
+          Node tmp = current.left!;
+          current.left = tmp.right;
+          tmp.right = current;
+          current = tmp;
+          if (current.left == null) break;
+        }
+        // Link right.
+        right.left = current;
+        right = current;
+        current = current.left!;
+      } else if (key > current.key) {
+        if (current.right == null) break;
+        if (key > current.right!.key) {
+          // Rotate left.
+          Node tmp = current.right!;
+          current.right = tmp.left;
+          tmp.left = current;
+          current = tmp;
+          if (current.right == null) break;
+        }
+        // Link left.
+        left.right = current;
+        left = current;
+        current = current.right!;
+      } else {
+        break;
+      }
+    }
+    // Assemble.
+    left.right = current.left;
+    right.left = current.right;
+    current.left = dummy.right;
+    current.right = dummy.left;
+    root = current;
+  }
+
+  /**
+   * Returns a list with all the keys of the tree.
+   */
+  List<num> exportKeys() {
+    List<num> result = [];
+    if (!isEmpty) root!.traverse((Node node) => result.add(node.key));
+    return result;
+  }
+
+  // Tells whether the tree is empty.
+  bool get isEmpty => null == root;
+
+  // Pointer to the root node of the tree.
+  Node? root;
+}
+
+
+class Node {
+  Node(this.key, this.value);
+  final num key;
+  final Object? value;
+
+  // This ordering of fields is delibrate: one key is visited before the expando
+  // and one after.
+  final leftKey = new Object();
+  final expando = new Expando<Node>();
+  final rightKey = new Object();
+
+  Node? get left => expando[leftKey];
+  set left(Node? value) => expando[leftKey] = value;
+  Node? get right => expando[rightKey];
+  set right(Node? value) => expando[rightKey] = value;
+
+  /**
+   * Performs an ordered traversal of the subtree starting here.
+   */
+  void traverse(void f(Node n)) {
+    Node? current = this;
+    while (current != null) {
+      Node? left = current.left;
+      if (left != null) left.traverse(f);
+      f(current);
+      current = current.right;
+    }
+  }
+}
diff --git a/runtime/tests/vm/dart/splay_test.dart b/runtime/tests/vm/dart/splay_test.dart
index 47b4ccc..7e974a1 100644
--- a/runtime/tests/vm/dart/splay_test.dart
+++ b/runtime/tests/vm/dart/splay_test.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// This benchmark is based on a JavaScript log processing module used
-// by the V8 profiler to generate execution time profiles for runs of
-// JavaScript applications, and it effectively measures how fast the
-// JavaScript engine is at allocating nodes and reclaiming the memory
-// used for old nodes. Because of the way splay trees work, the engine
-// also has to deal with a lot of changes to the large tree object
-// graph.
+// This test is a copy of the Splay benchmark that is run with a variety of
+// different GC options. It makes for a good GC stress test because it
+// continuously makes small changes to a large, long-lived data structure,
+// stressing lots of combinations of references between new-gen and old-gen
+// objects, and between marked and unmarked objects.
 
 // VMOptions=
 // VMOptions=--no_concurrent_mark --no_concurrent_sweep
diff --git a/runtime/tests/vm/dart_2/splay_ephemeron_test.dart b/runtime/tests/vm/dart_2/splay_ephemeron_test.dart
new file mode 100644
index 0000000..7ab290a
--- /dev/null
+++ b/runtime/tests/vm/dart_2/splay_ephemeron_test.dart
@@ -0,0 +1,351 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test is a copy of the Splay benchmark that is run with a variety of
+// different GC options. It makes for a good GC stress test because it
+// continuously makes small changes to a large, long-lived data structure,
+// stressing lots of combinations of references between new-gen and old-gen
+// objects, and between marked and unmarked objects.
+// The ephemeron variant of this test replaces the direct child pointers in the
+// tree with Expandos to stress the handling of WeakProperties/ephemerons.
+
+// This file is copied into another directory and the default opt out scheme of
+// CFE using the pattern 'vm/dart_2' doesn't work, so opt it out explicitly.
+// @dart=2.9
+
+// VMOptions=
+// VMOptions=--no_concurrent_mark --no_concurrent_sweep
+// VMOptions=--no_concurrent_mark --concurrent_sweep
+// VMOptions=--no_concurrent_mark --use_compactor
+// VMOptions=--no_concurrent_mark --use_compactor --force_evacuation
+// VMOptions=--concurrent_mark --no_concurrent_sweep
+// VMOptions=--concurrent_mark --concurrent_sweep
+// VMOptions=--concurrent_mark --use_compactor
+// VMOptions=--concurrent_mark --use_compactor --force_evacuation
+// VMOptions=--scavenger_tasks=0
+// VMOptions=--scavenger_tasks=1
+// VMOptions=--scavenger_tasks=2
+// VMOptions=--scavenger_tasks=3
+// VMOptions=--verify_before_gc
+// VMOptions=--verify_after_gc
+// VMOptions=--verify_before_gc --verify_after_gc
+// VMOptions=--verify_store_buffer
+// VMOptions=--stress_write_barrier_elimination
+// VMOptions=--old_gen_heap_size=150
+
+import "dart:math";
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+void main() {
+  Splay.main();
+}
+
+class Splay extends BenchmarkBase {
+  const Splay() : super("Splay");
+
+  // Configuration.
+  static final int kTreeSize = 8000;
+  static final int kTreeModifications = 80;
+  static final int kTreePayloadDepth = 5;
+
+  static SplayTree tree;
+
+  static Random rnd = new Random(12345);
+
+  // Insert new node with a unique key.
+  static num insertNewNode() {
+    num key;
+    do {
+      key = rnd.nextDouble();
+    } while (tree.find(key) != null);
+    Payload payload = Payload.generate(kTreePayloadDepth, key.toString());
+    tree.insert(key, payload);
+    return key;
+  }
+
+  static void mysetup() {
+    tree = new SplayTree();
+    for (int i = 0; i < kTreeSize; i++) insertNewNode();
+  }
+
+  static void tearDown() {
+    // Allow the garbage collector to reclaim the memory
+    // used by the splay tree no matter how we exit the
+    // tear down function.
+    List<num> keys = tree.exportKeys();
+    tree = null;
+
+    // Verify that the splay tree has the right size.
+    int length = keys.length;
+    if (length != kTreeSize) throw new Error("Splay tree has wrong size");
+
+    // Verify that the splay tree has sorted, unique keys.
+    for (int i = 0; i < length - 1; i++) {
+      if (keys[i] >= keys[i + 1]) throw new Error("Splay tree not sorted");
+    }
+  }
+
+  void warmup() {
+    exercise();
+  }
+
+  void exercise() {
+    // Replace a few nodes in the splay tree.
+    for (int i = 0; i < kTreeModifications; i++) {
+      num key = insertNewNode();
+      Node greatest = tree.findGreatestLessThan(key);
+      if (greatest == null) tree.remove(key);
+      else tree.remove(greatest.key);
+    }
+  }
+
+  static void main() {
+    mysetup();
+    new Splay().report();
+    tearDown();
+  }
+}
+
+
+class Leaf {
+  Leaf(String tag) {
+    string = "String for key $tag in leaf node";
+    array = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
+  }
+  String string;
+  List<num> array;
+}
+
+
+class Payload {
+  Payload(left, right) {
+    this.left = left;
+    this.right = right;
+  }
+
+  // This ordering of fields is delibrate: one key is visited before the expando
+  // and one after.
+  final leftKey = new Object();
+  final expando = new Expando();
+  final rightKey = new Object();
+
+  get left => expando[leftKey];
+  set left(value) => expando[leftKey] = value;
+  get right => expando[rightKey];
+  set right(value) => expando[rightKey] = value;
+
+  static generate(depth, tag) {
+    if (depth == 0) return new Leaf(tag);
+    return new Payload(generate(depth - 1, tag),
+                       generate(depth - 1, tag));
+  }
+}
+
+class Error implements Exception {
+  const Error(this.message);
+  final String message;
+}
+
+
+/**
+ * A splay tree is a self-balancing binary search tree with the additional
+ * property that recently accessed elements are quick to access again.
+ * It performs basic operations such as insertion, look-up and removal
+ * in O(log(n)) amortized time.
+ */
+class SplayTree {
+  SplayTree();
+
+  /**
+   * Inserts a node into the tree with the specified [key] and value if
+   * the tree does not already contain a node with the specified key. If
+   * the value is inserted, it becomes the root of the tree.
+   */
+  void insert(num key, value) {
+    if (isEmpty) {
+      root = new Node(key, value);
+      return;
+    }
+    // Splay on the key to move the last node on the search path for
+    // the key to the root of the tree.
+    splay(key);
+    if (root.key == key) return;
+    Node node = new Node(key, value);
+    if (key > root.key) {
+      node.left = root;
+      node.right = root.right;
+      root.right = null;
+    } else {
+      node.right = root;
+      node.left = root.left;
+      root.left = null;
+    }
+    root = node;
+  }
+
+  /**
+   * Removes a node with the specified key from the tree if the tree
+   * contains a node with this key. The removed node is returned. If
+   * [key] is not found, an exception is thrown.
+   */
+  Node remove(num key) {
+    if (isEmpty) throw new Error('Key not found: $key');
+    splay(key);
+    if (root.key != key) throw new Error('Key not found: $key');
+    Node removed = root;
+    if (root.left == null) {
+      root = root.right;
+    } else {
+      Node right = root.right;
+      root = root.left;
+      // Splay to make sure that the new root has an empty right child.
+      splay(key);
+      // Insert the original right child as the right child of the new
+      // root.
+      root.right = right;
+    }
+    return removed;
+  }
+
+  /**
+   * Returns the node having the specified [key] or null if the tree doesn't
+   * contain a node with the specified [key].
+   */
+  Node find(num key) {
+    if (isEmpty) return null;
+    splay(key);
+    return root.key == key ? root : null;
+  }
+
+  /**
+   * Returns the Node having the maximum key value.
+   */
+  Node findMax([Node start]) {
+    if (isEmpty) return null;
+    Node current = null == start ? root : start;
+    while (current.right != null) current = current.right;
+    return current;
+  }
+
+  /**
+   * Returns the Node having the maximum key value that
+   * is less than the specified [key].
+   */
+  Node findGreatestLessThan(num key) {
+    if (isEmpty) return null;
+    // Splay on the key to move the node with the given key or the last
+    // node on the search path to the top of the tree.
+    splay(key);
+    // Now the result is either the root node or the greatest node in
+    // the left subtree.
+    if (root.key < key) return root;
+    if (root.left != null) return findMax(root.left);
+    return null;
+  }
+
+  /**
+   * Perform the splay operation for the given key. Moves the node with
+   * the given key to the top of the tree.  If no node has the given
+   * key, the last node on the search path is moved to the top of the
+   * tree. This is the simplified top-down splaying algorithm from:
+   * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
+   */
+  void splay(num key) {
+    if (isEmpty) return;
+    // Create a dummy node.  The use of the dummy node is a bit
+    // counter-intuitive: The right child of the dummy node will hold
+    // the L tree of the algorithm.  The left child of the dummy node
+    // will hold the R tree of the algorithm.  Using a dummy node, left
+    // and right will always be nodes and we avoid special cases.
+    final Node dummy = new Node(null, null);
+    Node left = dummy;
+    Node right = dummy;
+    Node current = root;
+    while (true) {
+      if (key < current.key) {
+        if (current.left == null) break;
+        if (key < current.left.key) {
+          // Rotate right.
+          Node tmp = current.left;
+          current.left = tmp.right;
+          tmp.right = current;
+          current = tmp;
+          if (current.left == null) break;
+        }
+        // Link right.
+        right.left = current;
+        right = current;
+        current = current.left;
+      } else if (key > current.key) {
+        if (current.right == null) break;
+        if (key > current.right.key) {
+          // Rotate left.
+          Node tmp = current.right;
+          current.right = tmp.left;
+          tmp.left = current;
+          current = tmp;
+          if (current.right == null) break;
+        }
+        // Link left.
+        left.right = current;
+        left = current;
+        current = current.right;
+      } else {
+        break;
+      }
+    }
+    // Assemble.
+    left.right = current.left;
+    right.left = current.right;
+    current.left = dummy.right;
+    current.right = dummy.left;
+    root = current;
+  }
+
+  /**
+   * Returns a list with all the keys of the tree.
+   */
+  List<num> exportKeys() {
+    List<num> result = [];
+    if (!isEmpty) root.traverse((Node node) => result.add(node.key));
+    return result;
+  }
+
+  // Tells whether the tree is empty.
+  bool get isEmpty => null == root;
+
+  // Pointer to the root node of the tree.
+  Node root;
+}
+
+
+class Node {
+  Node(this.key, this.value);
+  final num key;
+  final Object value;
+
+  // This ordering of fields is delibrate: one key is visited before the expando
+  // and one after.
+  final leftKey = new Object();
+  final expando = new Expando<Node>();
+  final rightKey = new Object();
+
+  Node get left => expando[leftKey];
+  set left(Node value) => expando[leftKey] = value;
+  Node get right => expando[rightKey];
+  set right(Node value) => expando[rightKey] = value;
+
+  /**
+   * Performs an ordered traversal of the subtree starting here.
+   */
+  void traverse(void f(Node n)) {
+    Node current = this;
+    while (current != null) {
+      Node left = current.left;
+      if (left != null) left.traverse(f);
+      f(current);
+      current = current.right;
+    }
+  }
+}
diff --git a/runtime/tests/vm/dart_2/splay_test.dart b/runtime/tests/vm/dart_2/splay_test.dart
index 06a2951..a793419 100644
--- a/runtime/tests/vm/dart_2/splay_test.dart
+++ b/runtime/tests/vm/dart_2/splay_test.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// This benchmark is based on a JavaScript log processing module used
-// by the V8 profiler to generate execution time profiles for runs of
-// JavaScript applications, and it effectively measures how fast the
-// JavaScript engine is at allocating nodes and reclaiming the memory
-// used for old nodes. Because of the way splay trees work, the engine
-// also has to deal with a lot of changes to the large tree object
-// graph.
-//
+// This test is a copy of the Splay benchmark that is run with a variety of
+// different GC options. It makes for a good GC stress test because it
+// continuously makes small changes to a large, long-lived data structure,
+// stressing lots of combinations of references between new-gen and old-gen
+// objects, and between marked and unmarked objects.
+
 // This file is copied into another directory and the default opt out scheme of
 // CFE using the pattern 'vm/dart_2' doesn't work, so opt it out explicitly.
 // @dart=2.9
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 2fe4811..45da2e8 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -166,20 +166,23 @@
 
 BENCHMARK(UseDartApi) {
   const int kNumIterations = 1000000;
-  const char* kScriptChars =
-      "import 'dart:nativewrappers';\n"
-      "class Class extends NativeFieldWrapperClass1 {\n"
-      "  void init() native 'init';\n"
-      "  int method(int param1, int param2) native 'method';\n"
-      "}\n"
-      "\n"
-      "void benchmark(int count) {\n"
-      "  Class c = Class();\n"
-      "  c.init();\n"
-      "  for (int i = 0; i < count; i++) {\n"
-      "    c.method(i,7);\n"
-      "  }\n"
-      "}\n";
+  const char* kScriptChars = R"(
+import 'dart:nativewrappers';
+
+class Class extends NativeFieldWrapperClass1 {
+  @pragma("vm:external-name", "init")
+  external void init();
+  @pragma("vm:external-name", "method")
+  external int method(int param1, int param2);
+}
+
+void benchmark(int count) {
+  Class c = Class();
+  c.init();
+  for (int i = 0; i < count; i++) {
+    c.method(i,7);
+  }
+})";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, bm_uda_lookup,
                                              RESOLVED_USER_TEST_URI, false);
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 20d63d2..203f9ca 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -138,12 +138,6 @@
       return Error::Cast(result).ptr();
     }
 
-    // The builtin library should be registered with the VM.
-    const auto& dart_builtin =
-        String::Handle(zone, String::New("dart:_builtin"));
-    library = Library::LookupLibrary(thread, dart_builtin);
-    isolate_group->object_store()->set_builtin_library(library);
-
     if (FLAG_precompiled_mode) {
       loader.ReadLoadingUnits();
     }
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index d4a768d..a3a9c93 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1374,7 +1374,7 @@
   ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
 
   // Now verify field offsets of 'Pointer' class.
-  cls = class_table.At(kFfiPointerCid);
+  cls = class_table.At(kPointerCid);
   error = cls.EnsureIsFinalized(thread);
   ASSERT(error.IsNull());
   ASSERT(cls.NumTypeParameters() == 1);
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index ad9f6b0..8d17bea 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -159,11 +159,9 @@
   V(Handle)
 
 #define CLASS_LIST_FFI(V)                                                      \
-  V(Pointer)                                                                   \
   V(NativeFunction)                                                            \
   CLASS_LIST_FFI_TYPE_MARKER(V)                                                \
   V(NativeType)                                                                \
-  V(DynamicLibrary)                                                            \
   V(Struct)
 
 #define DART_CLASS_LIST_TYPED_DATA(V)                                          \
@@ -389,7 +387,7 @@
 
 inline bool IsFfiTypeClassId(intptr_t index) {
   switch (index) {
-    case kFfiPointerCid:
+    case kPointerCid:
     case kFfiNativeFunctionCid:
 #define CASE_FFI_CID(name) case kFfi##name##Cid:
       CLASS_LIST_FFI_TYPE_MARKER(CASE_FFI_CID)
@@ -403,6 +401,8 @@
 
 inline bool IsFfiPredefinedClassId(classid_t class_id) {
   switch (class_id) {
+    case kPointerCid:
+    case kDynamicLibraryCid:
 #define CASE_FFI_CID(name) case kFfi##name##Cid:
     CLASS_LIST_FFI(CASE_FFI_CID)
 #undef CASE_FFI_CID
@@ -414,11 +414,11 @@
 }
 
 inline bool IsFfiPointerClassId(intptr_t index) {
-  return index == kFfiPointerCid;
+  return index == kPointerCid;
 }
 
 inline bool IsFfiDynamicLibraryClassId(intptr_t index) {
-  return index == kFfiDynamicLibraryCid;
+  return index == kDynamicLibraryCid;
 }
 
 inline bool IsInternalVMdefinedClassId(intptr_t index) {
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index e096382..955e5eb 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -40,23 +40,24 @@
 }
 
 TEST_CASE(StackMapGC) {
-  const char* kScriptChars =
-      "class A {"
-      "  static void func(var i, var k) native 'NativeFunc';"
-      "  static foo() {"
-      "    var i;"
-      "    var s1;"
-      "    var k;"
-      "    var s2;"
-      "    var s3;"
-      "    i = 10; s1 = 'abcd'; k = 20; s2 = 'B'; s3 = 'C';"
-      "    func(i, k);"
-      "    return i + k; }"
-      "  static void moo() {"
-      "    var i = A.foo();"
-      "    if (i != 30) throw '$i != 30';"
-      "  }\n"
-      "}\n";
+  const char* kScriptChars = R"(
+class A {
+  @pragma("vm:external-name", "NativeFunc")
+  external static void func(var i, var k);
+  static foo() {
+    var i;
+    var s1;
+    var k;
+    var s2;
+    var s3;
+    i = 10; s1 = 'abcd'; k = 20; s2 = 'B'; s3 = 'C';
+    func(i, k);
+    return i + k; }
+  static void moo() {
+    var i = A.foo();
+    if (i != 30) throw '$i != 30';
+  }
+})";
   // First setup the script and compile the script.
   TestCase::LoadTestScript(kScriptChars, native_resolver);
   TransitionNativeToVM transition(thread);
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index 23ffde4..4e0a257 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -120,7 +120,8 @@
 
 ISOLATE_UNIT_TEST_CASE(TryCatchOptimizer_DeadParameterElimination_Simple1) {
   const char* script_chars = R"(
-      dynamic blackhole([dynamic val]) native 'BlackholeNative';
+      @pragma("vm:external-name", "BlackholeNative")
+      external dynamic blackhole([dynamic val]);
       foo(int p) {
         var a = blackhole(), b = blackhole();
         try {
@@ -139,7 +140,8 @@
 
 ISOLATE_UNIT_TEST_CASE(TryCatchOptimizer_DeadParameterElimination_Simple2) {
   const char* script_chars = R"(
-      dynamic blackhole([dynamic val]) native 'BlackholeNative';
+      @pragma("vm:external-name", "BlackholeNative")
+      external dynamic blackhole([dynamic val]);
       foo(int p) {
         var a = blackhole(), b = blackhole();
         try {
@@ -159,7 +161,8 @@
 
 ISOLATE_UNIT_TEST_CASE(TryCatchOptimizer_DeadParameterElimination_Cyclic1) {
   const char* script_chars = R"(
-      dynamic blackhole([dynamic val]) native 'BlackholeNative';
+      @pragma("vm:external-name", "BlackholeNative")
+      external dynamic blackhole([dynamic val]);
       foo(int p) {
         var a = blackhole(), b;
         for (var i = 0; i < 42; i++) {
@@ -181,7 +184,8 @@
 
 ISOLATE_UNIT_TEST_CASE(TryCatchOptimizer_DeadParameterElimination_Cyclic2) {
   const char* script_chars = R"(
-      dynamic blackhole([dynamic val]) native 'BlackholeNative';
+      @pragma("vm:external-name", "BlackholeNative")
+      external dynamic blackhole([dynamic val]);
       foo(int p) {
         var a = blackhole(), b = blackhole();
         for (var i = 0; i < 42; i++) {
@@ -211,7 +215,8 @@
     std::function<Definition*(CompilerState* S, FlowGraph*, Definition*)>
         make_redefinition) {
   const char* script_chars = R"(
-    dynamic blackhole([a, b, c, d, e, f]) native 'BlackholeNative';
+    @pragma("vm:external-name", "BlackholeNative")
+    external dynamic blackhole([a, b, c, d, e, f]);
     class K {
       var field;
     }
@@ -375,7 +380,8 @@
     std::function<Definition*(CompilerState* S, FlowGraph*, Definition*)>
         make_redefinition) {
   const char* script_chars = R"(
-    dynamic blackhole([a, b, c, d, e, f]) native 'BlackholeNative';
+    @pragma("vm:external-name", "BlackholeNative")
+    external dynamic blackhole([a, b, c, d, e, f]);
     class K {
       var field;
     }
diff --git a/runtime/vm/compiler/ffi/marshaller.h b/runtime/vm/compiler/ffi/marshaller.h
index 4fafbe1..9d9f3cc 100644
--- a/runtime/vm/compiler/ffi/marshaller.h
+++ b/runtime/vm/compiler/ffi/marshaller.h
@@ -103,7 +103,7 @@
   // Requires boxing or unboxing.
   bool IsPointer(intptr_t arg_index) const {
     return AbstractType::Handle(zone_, CType(arg_index)).type_class_id() ==
-           kFfiPointerCid;
+           kPointerCid;
   }
   bool IsHandle(intptr_t arg_index) const {
     return AbstractType::Handle(zone_, CType(arg_index)).type_class_id() ==
diff --git a/runtime/vm/compiler/ffi/native_type.cc b/runtime/vm/compiler/ffi/native_type.cc
index b1f8d8c..125fa3e 100644
--- a/runtime/vm/compiler/ffi/native_type.cc
+++ b/runtime/vm/compiler/ffi/native_type.cc
@@ -372,7 +372,7 @@
       return kFloat;
     case kFfiDoubleCid:
       return kDouble;
-    case kFfiPointerCid:
+    case kPointerCid:
       return compiler::target::kWordSize == 4 ? kUint32 : kInt64;
     case kFfiVoidCid:
       return kVoid;
diff --git a/runtime/vm/compiler/ffi/recognized_method.cc b/runtime/vm/compiler/ffi/recognized_method.cc
index 6900a83..fa93dd3 100644
--- a/runtime/vm/compiler/ffi/recognized_method.cc
+++ b/runtime/vm/compiler/ffi/recognized_method.cc
@@ -13,9 +13,6 @@
 namespace ffi {
 
 classid_t ElementTypedDataCid(classid_t class_id) {
-  ASSERT(class_id >= kFfiPointerCid);
-  ASSERT(class_id < kFfiVoidCid);
-  ASSERT(class_id != kFfiNativeFunctionCid);
   switch (class_id) {
     case kFfiInt8Cid:
       return kTypedDataInt8ArrayCid;
@@ -36,7 +33,7 @@
     case kFfiIntPtrCid:
       return target::kWordSize == 4 ? kTypedDataInt32ArrayCid
                                     : kTypedDataInt64ArrayCid;
-    case kFfiPointerCid:
+    case kPointerCid:
       return target::kWordSize == 4 ? kTypedDataUint32ArrayCid
                                     : kTypedDataUint64ArrayCid;
     case kFfiFloatCid:
@@ -55,7 +52,6 @@
   case MethodRecognizer::kFfiStore##type:                                      \
     return kFfi##type##Cid;
     CLASS_LIST_FFI_NUMERIC(LOAD_STORE)
-    LOAD_STORE(Pointer)
 #undef LOAD_STORE
     case MethodRecognizer::kFfiLoadFloatUnaligned:
     case MethodRecognizer::kFfiStoreFloatUnaligned:
@@ -63,6 +59,9 @@
     case MethodRecognizer::kFfiLoadDoubleUnaligned:
     case MethodRecognizer::kFfiStoreDoubleUnaligned:
       return kFfiDoubleCid;
+    case MethodRecognizer::kFfiLoadPointer:
+    case MethodRecognizer::kFfiStorePointer:
+      return kPointerCid;
     default:
       UNREACHABLE();
   }
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 87ac359..ab29403 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1381,9 +1381,9 @@
           Box(LoadIndexedInstr::RepresentationOfArrayElement(typed_data_cid));
       if (kind == MethodRecognizer::kFfiLoadPointer) {
         const auto class_table = thread_->isolate_group()->class_table();
-        ASSERT(class_table->HasValidClassAt(kFfiPointerCid));
+        ASSERT(class_table->HasValidClassAt(kPointerCid));
         const auto& pointer_class =
-            Class::ZoneHandle(H.zone(), class_table->At(kFfiPointerCid));
+            Class::ZoneHandle(H.zone(), class_table->At(kPointerCid));
 
         // We find the reified type to use for the pointer allocation.
         //
@@ -1441,9 +1441,9 @@
       if (kind == MethodRecognizer::kFfiStorePointer) {
         // Do type check before anything untagged is on the stack.
         const auto class_table = thread_->isolate_group()->class_table();
-        ASSERT(class_table->HasValidClassAt(kFfiPointerCid));
+        ASSERT(class_table->HasValidClassAt(kPointerCid));
         const auto& pointer_class =
-            Class::ZoneHandle(H.zone(), class_table->At(kFfiPointerCid));
+            Class::ZoneHandle(H.zone(), class_table->At(kPointerCid));
         const auto& pointer_type_param =
             TypeParameter::ZoneHandle(pointer_class.TypeParameterAt(0));
 
@@ -1506,9 +1506,9 @@
     } break;
     case MethodRecognizer::kFfiFromAddress: {
       const auto class_table = thread_->isolate_group()->class_table();
-      ASSERT(class_table->HasValidClassAt(kFfiPointerCid));
+      ASSERT(class_table->HasValidClassAt(kPointerCid));
       const auto& pointer_class =
-          Class::ZoneHandle(H.zone(), class_table->At(kFfiPointerCid));
+          Class::ZoneHandle(H.zone(), class_table->At(kPointerCid));
 
       ASSERT(function.NumTypeParameters() == 1);
       ASSERT_EQUAL(function.NumParameters(), 1);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index af78cd4..0602be0 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -3125,7 +3125,6 @@
   result_ = Type::New(klass, type_arguments, nullability);
   result_ = result_.NormalizeFutureOrType(Heap::kOld);
   if (finalize_) {
-    ASSERT(active_class_->klass != NULL);
     result_ = ClassFinalizer::FinalizeType(result_);
   }
 }
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index c8e499b..e654eea 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -418,8 +418,8 @@
       return WeakProperty::InstanceSize();
     case kByteBufferCid:
     case kByteDataViewCid:
-    case kFfiPointerCid:
-    case kFfiDynamicLibraryCid:
+    case kPointerCid:
+    case kDynamicLibraryCid:
 #define HANDLE_CASE(clazz) case kFfi##clazz##Cid:
       CLASS_LIST_FFI_TYPE_MARKER(HANDLE_CASE)
 #undef HANDLE_CASE
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index fc1877f..a0b2dd3 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -89,6 +89,52 @@
   EXPECT(Dart_Cleanup() == NULL);
 }
 
+UNIT_TEST_CASE(DartAPI_DartInitializeHeapSizes) {
+  Dart_InitializeParams params;
+  memset(&params, 0, sizeof(Dart_InitializeParams));
+  params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
+  params.vm_snapshot_data = TesterState::vm_snapshot_data;
+  params.create_group = TesterState::create_callback;
+  params.shutdown_isolate = TesterState::shutdown_callback;
+  params.cleanup_group = TesterState::group_cleanup_callback;
+  params.start_kernel_isolate = true;
+
+  // Initialize with a normal heap size specification.
+  const char* options_1[] = {"--old-gen-heap-size=3192",
+                             "--new-gen-semi-max-size=32"};
+  EXPECT(Dart_SetVMFlags(2, options_1) == NULL);
+  EXPECT(Dart_Initialize(&params) == NULL);
+  EXPECT(FLAG_old_gen_heap_size == 3192);
+  EXPECT(FLAG_new_gen_semi_max_size == 32);
+  EXPECT(Dart_Cleanup() == NULL);
+
+  const char* options_2[] = {"--old-gen-heap-size=16384",
+                             "--new-gen-semi-max-size=16384"};
+  EXPECT(Dart_SetVMFlags(2, options_2) == NULL);
+  EXPECT(Dart_Initialize(&params) == NULL);
+  if (kMaxAddrSpaceMB == 4096) {
+    EXPECT(FLAG_old_gen_heap_size == 0);
+    EXPECT(FLAG_new_gen_semi_max_size == kDefaultNewGenSemiMaxSize);
+  } else {
+    EXPECT(FLAG_old_gen_heap_size == 16384);
+    EXPECT(FLAG_new_gen_semi_max_size == 16384);
+  }
+  EXPECT(Dart_Cleanup() == NULL);
+
+  const char* options_3[] = {"--old-gen-heap-size=30720",
+                             "--new-gen-semi-max-size=30720"};
+  EXPECT(Dart_SetVMFlags(2, options_3) == NULL);
+  EXPECT(Dart_Initialize(&params) == NULL);
+  if (kMaxAddrSpaceMB == 4096) {
+    EXPECT(FLAG_old_gen_heap_size == 0);
+    EXPECT(FLAG_new_gen_semi_max_size == kDefaultNewGenSemiMaxSize);
+  } else {
+    EXPECT(FLAG_old_gen_heap_size == 30720);
+    EXPECT(FLAG_new_gen_semi_max_size == 30720);
+  }
+  EXPECT(Dart_Cleanup() == NULL);
+}
+
 TEST_CASE(Dart_KillIsolate) {
   const char* kScriptChars =
       "int testMain() {\n"
@@ -478,8 +524,8 @@
   EXPECT_STREQ("inspectStack", cstr);
   Dart_StringToCString(script_url, &cstr);
   EXPECT_STREQ(test_lib, cstr);
-  EXPECT_EQ(1, line_number);
-  EXPECT_EQ(47, column_number);
+  EXPECT_EQ(3, line_number);
+  EXPECT_EQ(24, column_number);
 
   // Second frame is foo() positioned at call to inspectStack().
   result = Dart_GetActivationFrame(stacktrace, 1, &frame);
@@ -491,7 +537,7 @@
   EXPECT_STREQ("foo", cstr);
   Dart_StringToCString(script_url, &cstr);
   EXPECT_STREQ(test_lib, cstr);
-  EXPECT_EQ(2, line_number);
+  EXPECT_EQ(4, line_number);
   EXPECT_EQ(20, column_number);
 
   // Middle frames positioned at the recursive call.
@@ -506,7 +552,7 @@
     EXPECT_STREQ("foo", cstr);
     Dart_StringToCString(script_url, &cstr);
     EXPECT_STREQ(test_lib, cstr);
-    EXPECT_EQ(2, line_number);
+    EXPECT_EQ(4, line_number);
     EXPECT_EQ(37, column_number);
   }
 
@@ -520,7 +566,7 @@
   EXPECT_STREQ("testMain", cstr);
   Dart_StringToCString(script_url, &cstr);
   EXPECT_STREQ(test_lib, cstr);
-  EXPECT_EQ(3, line_number);
+  EXPECT_EQ(5, line_number);
   EXPECT_EQ(15, column_number);
 
   // Out-of-bounds frames.
@@ -543,10 +589,12 @@
 }
 
 TEST_CASE(DartAPI_CurrentStackTraceInfo) {
-  const char* kScriptChars =
-      "inspectStack() native 'CurrentStackTraceNatve';\n"
-      "foo(n) => n == 1 ? inspectStack() : foo(n-1);\n"
-      "testMain() => foo(100);\n";
+  const char* kScriptChars = R"(
+@pragma("vm:external-name", "CurrentStackTraceNatve")
+external inspectStack();
+foo(n) => n == 1 ? inspectStack() : foo(n-1);
+testMain() => foo(100);
+  )";
 
   Dart_Handle lib =
       TestCase::LoadTestScript(kScriptChars, &CurrentStackTraceNativeLookup);
@@ -692,16 +740,18 @@
 }
 
 TEST_CASE(DartAPI_PropagateCompileTimeError) {
-  const char* kScriptChars =
-      "raiseCompileError() {\n"
-      "  return missing_semicolon\n"
-      "}\n"
-      "\n"
-      "void nativeFunc(closure) native 'Test_nativeFunc';\n"
-      "\n"
-      "void Func1() {\n"
-      "  nativeFunc(() => raiseCompileError());\n"
-      "}\n";
+  const char* kScriptChars = R"(
+raiseCompileError() {
+  return missing_semicolon
+}
+
+@pragma("vm:external-name", "Test_nativeFunc")
+external void nativeFunc(closure);
+
+void Func1() {
+  nativeFunc(() => raiseCompileError());
+}
+)";
   Dart_Handle lib =
       TestCase::LoadTestScript(kScriptChars, &PropagateError_native_lookup);
   Dart_Handle result;
@@ -733,16 +783,18 @@
 }
 
 TEST_CASE(DartAPI_PropagateError) {
-  const char* kScriptChars =
-      "void throwException() {\n"
-      "  throw new Exception('myException');\n"
-      "}\n"
-      "\n"
-      "void nativeFunc(closure) native 'Test_nativeFunc';\n"
-      "\n"
-      "void Func2() {\n"
-      "  nativeFunc(() => throwException());\n"
-      "}\n";
+  const char* kScriptChars = R"(
+void throwException() {
+  throw new Exception('myException');
+}
+
+@pragma("vm:external-name", "Test_nativeFunc")
+external void nativeFunc(closure);
+
+void Func2() {
+  nativeFunc(() => throwException());
+}
+)";
   Dart_Handle lib =
       TestCase::LoadTestScript(kScriptChars, &PropagateError_native_lookup);
   Dart_Handle result;
@@ -2149,28 +2201,30 @@
 }
 
 TEST_CASE(DartAPI_ByteDataAccess) {
-  const char* kScriptChars =
-      "import 'dart:typed_data';\n"
-      "class Expect {\n"
-      "  static equals(a, b) {\n"
-      "    if (a != b) {\n"
-      "      throw 'not equal. expected: $a, got: $b';\n"
-      "    }\n"
-      "  }\n"
-      "}\n"
-      "ByteData createByteData() native 'CreateByteData';"
-      "ByteData main() {"
-      "  var length = 16;"
-      "  var a = createByteData();"
-      "  Expect.equals(length, a.lengthInBytes);"
-      "  for (int i = 0; i < length; i+=1) {"
-      "    a.setInt8(i, 0x42);"
-      "  }"
-      "  for (int i = 0; i < length; i+=2) {"
-      "    Expect.equals(0x4242, a.getInt16(i));"
-      "  }"
-      "  return a;"
-      "}\n";
+  const char* kScriptChars = R"(
+import 'dart:typed_data';
+class Expect {
+  static equals(a, b) {
+    if (a != b) {
+      throw 'not equal. expected: $a, got: $b';
+    }
+  }
+}
+@pragma("vm:external-name", "CreateByteData")
+external ByteData createByteData();
+ByteData main() {
+  var length = 16;
+  var a = createByteData();
+  Expect.equals(length, a.lengthInBytes);
+  for (int i = 0; i < length; i+=1) {
+    a.setInt8(i, 0x42);
+  }
+  for (int i = 0; i < length; i+=2) {
+    Expect.equals(0x4242, a.getInt16(i));
+  }
+  return a;
+}
+)";
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
@@ -2212,32 +2266,34 @@
 TEST_CASE(DartAPI_ExternalByteDataAccess) {
   // TODO(asiva): Once we have getInt16LE and getInt16BE support use the
   // appropriate getter instead of the host endian format used now.
-  const char* kScriptChars =
-      "import 'dart:typed_data';\n"
-      "class Expect {\n"
-      "  static equals(a, b) {\n"
-      "    if (a != b) {\n"
-      "      throw 'not equal. expected: $a, got: $b';\n"
-      "    }\n"
-      "  }\n"
-      "}\n"
-      "ByteData createExternalByteData() native 'CreateExternalByteData';"
-      "ByteData main() {"
-      "  var length = 16;"
-      "  var a = createExternalByteData();"
-      "  Expect.equals(length, a.lengthInBytes);"
-      "  for (int i = 0; i < length; i+=2) {"
-      "    Expect.equals(0x4241, a.getInt16(i, Endian.little));"
-      "  }"
-      "  for (int i = 0; i < length; i+=2) {"
-      "    a.setInt8(i, 0x24);"
-      "    a.setInt8(i + 1, 0x28);"
-      "  }"
-      "  for (int i = 0; i < length; i+=2) {"
-      "    Expect.equals(0x2824, a.getInt16(i, Endian.little));"
-      "  }"
-      "  return a;"
-      "}\n";
+  const char* kScriptChars = R"(
+import 'dart:typed_data';
+class Expect {
+  static equals(a, b) {
+    if (a != b) {
+      throw 'not equal. expected: $a, got: $b';
+    }
+  }
+}
+@pragma("vm:external-name", "CreateExternalByteData")
+external ByteData createExternalByteData();
+ByteData main() {
+  var length = 16;
+  var a = createExternalByteData();
+  Expect.equals(length, a.lengthInBytes);
+  for (int i = 0; i < length; i+=2) {
+    Expect.equals(0x4241, a.getInt16(i, Endian.little));
+  }
+  for (int i = 0; i < length; i+=2) {
+    a.setInt8(i, 0x24);
+    a.setInt8(i + 1, 0x28);
+  }
+  for (int i = 0; i < length; i+=2) {
+    Expect.equals(0x2824, a.getInt16(i, Endian.little));
+  }
+  return a;
+}
+)";
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
@@ -2347,31 +2403,33 @@
 }
 
 TEST_CASE(DartAPI_OptimizedExternalByteDataAccess) {
-  const char* kScriptChars =
-      "import 'dart:typed_data';\n"
-      "class Expect {\n"
-      "  static equals(a, b) {\n"
-      "    if (a != b) {\n"
-      "      throw 'not equal. expected: $a, got: $b';\n"
-      "    }\n"
-      "  }\n"
-      "}\n"
-      "ByteData createExternalByteData() native 'CreateExternalByteData';"
-      "access(ByteData a) {"
-      "  Expect.equals(0x04030201, a.getUint32(0, Endian.little));"
-      "  Expect.equals(0x08070605, a.getUint32(4, Endian.little));"
-      "  Expect.equals(0x0c0b0a09, a.getUint32(8, Endian.little));"
-      "  Expect.equals(0x100f0e0d, a.getUint32(12, Endian.little));"
-      "}"
-      "ByteData main() {"
-      "  var length = 16;"
-      "  var a = createExternalByteData();"
-      "  Expect.equals(length, a.lengthInBytes);"
-      "  for (int i = 0; i < 20; i++) {"
-      "    access(a);"
-      "  }"
-      "  return a;"
-      "}\n";
+  const char* kScriptChars = R"(
+import 'dart:typed_data';
+class Expect {
+  static equals(a, b) {
+    if (a != b) {
+      throw 'not equal. expected: $a, got: $b';
+    }
+  }
+}
+@pragma("vm:external-name", "CreateExternalByteData")
+external ByteData createExternalByteData();
+access(ByteData a) {
+  Expect.equals(0x04030201, a.getUint32(0, Endian.little));
+  Expect.equals(0x08070605, a.getUint32(4, Endian.little));
+  Expect.equals(0x0c0b0a09, a.getUint32(8, Endian.little));
+  Expect.equals(0x100f0e0d, a.getUint32(12, Endian.little));
+}
+ByteData main() {
+  var length = 16;
+  var a = createExternalByteData();
+  Expect.equals(length, a.lengthInBytes);
+  for (int i = 0; i < 20; i++) {
+    access(a);
+  }
+  return a;
+}
+)";
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
@@ -4141,9 +4199,12 @@
     import "dart:nativewrappers";
     class ExampleResource extends NativeFieldWrapperClass1 {
       ExampleResource() { _allocate(); }
-      void _allocate() native "ExampleResource_Allocate";
-      void use() native "ExampleResource_Use";
-      void dispose() native "ExampleResource_Dispose";
+      @pragma("vm:external-name", "ExampleResource_Allocate")
+      external void _allocate();
+      @pragma("vm:external-name", "ExampleResource_Use")
+      external void use();
+      @pragma("vm:external-name", "ExampleResource_Dispose")
+      external void dispose();
     }
     main() {
       var res = new ExampleResource();
@@ -4185,7 +4246,8 @@
     import 'dart:nativewrappers';
     class SecretKeeper extends NativeFieldWrapperClass1 {
       SecretKeeper(int secret) { _keepSecret(secret); }
-      void _keepSecret(int secret) native "SecretKeeper_KeepSecret";
+      @pragma("vm:external-name", "SecretKeeper_KeepSecret")
+      external void _keepSecret(int secret);
     }
     main() => getNativeField(SecretKeeper(321));
   )";
@@ -5346,29 +5408,32 @@
   // clang-format off
   auto kScriptChars = Utils::CStringUniquePtr(
       OS::SCreate(
-          nullptr,
-          "import 'dart:nativewrappers';"
-          "class NativeFields extends NativeFieldWrapperClass2 {\n"
-          "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
-          "  int fld1;\n"
-          "  final int fld2;\n"
-          "  static int%s fld3;\n"
-          "  static const int fld4 = 10;\n"
-          "  int%s initNativeFlds() native 'TestNativeFieldsAccess_init';\n"
-          "  int%s accessNativeFlds(int%s i) native "
-          "'TestNativeFieldsAccess_access';\n"
-          "}\n"
-          "class NoNativeFields {\n"
-          "  int neitherATypedDataNorNull = 0;\n"
-          "  invalidAccess() native 'TestNativeFieldsAccess_invalidAccess';\n"
-          "}\n"
-          "NativeFields testMain() {\n"
-          "  NativeFields obj = new NativeFields(10, 20);\n"
-          "  obj.initNativeFlds();\n"
-          "  obj.accessNativeFlds(null);\n"
-          "  new NoNativeFields().invalidAccess();\n"
-          "  return obj;\n"
-          "}\n",
+          nullptr, R"(
+          import 'dart:nativewrappers';
+          class NativeFields extends NativeFieldWrapperClass2 {
+            NativeFields(int i, int j) : fld1 = i, fld2 = j {}
+            int fld1;
+            final int fld2;
+            static int%s fld3;
+            static const int fld4 = 10;
+            @pragma('vm:external-name', 'TestNativeFieldsAccess_init')
+            external int%s initNativeFlds();
+            @pragma('vm:external-name', 'TestNativeFieldsAccess_access')
+            external int%s accessNativeFlds(int%s i);
+          }
+          class NoNativeFields {
+            int neitherATypedDataNorNull = 0;
+            @pragma('vm:external-name', 'TestNativeFieldsAccess_invalidAccess')
+            external invalidAccess();
+          }
+          NativeFields testMain() {
+            NativeFields obj = new NativeFields(10, 20);
+            obj.initNativeFlds();
+            obj.accessNativeFlds(null);
+            new NoNativeFields().invalidAccess();
+            return obj;
+          }
+          )",
           nullable_tag, nullable_tag, nullable_tag, nullable_tag),
       std::free);
   // clang-format on
@@ -6937,30 +7002,32 @@
 }
 
 TEST_CASE(DartAPI_GetNativeArguments) {
-  const char* kScriptChars =
-      "import 'dart:nativewrappers';"
-      "class MyObject extends NativeFieldWrapperClass2 {"
-      "  static MyObject createObject() native 'NativeArgument_Create';"
-      "  int accessFields(int arg1,"
-      "                   int arg2,"
-      "                   bool arg3,"
-      "                   double arg4,"
-      "                   String arg5,"
-      "                   String arg6,"
-      "                   MyObject arg7) native 'NativeArgument_Access';"
-      "}"
-      "int testMain(String extstr) {"
-      "  String str = 'abcdefg';"
-      "  MyObject obj1 = MyObject.createObject();"
-      "  MyObject obj2 = MyObject.createObject();"
-      "  return obj1.accessFields(77,"
-      "                           0x8000000000000000,"
-      "                           true,"
-      "                           3.14,"
-      "                           str,"
-      "                           extstr,"
-      "                           obj2);"
-      "}";
+  const char* kScriptChars = R"(
+import 'dart:nativewrappers';
+class MyObject extends NativeFieldWrapperClass2 {
+  @pragma("vm:external-name", "NativeArgument_Create")
+  external static MyObject createObject();
+  @pragma("vm:external-name", "NativeArgument_Access")
+  external int accessFields(int arg1,
+                   int arg2,
+                   bool arg3,
+                   double arg4,
+                   String arg5,
+                   String arg6,
+                   MyObject arg7);
+}
+int testMain(String extstr) {
+  String str = 'abcdefg';
+  MyObject obj1 = MyObject.createObject();
+  MyObject obj2 = MyObject.createObject();
+  return obj1.accessFields(77,
+                           0x8000000000000000,
+                           true,
+                           3.14,
+                           str,
+                           extstr,
+                           obj2);
+})";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_args_lookup);
 
@@ -6994,14 +7061,15 @@
 }
 
 TEST_CASE(DartAPI_GetNativeArgumentCount) {
-  const char* kScriptChars =
-      "class MyObject {"
-      "  int method1(int i, int j) native 'Name_Does_Not_Matter';"
-      "}"
-      "testMain() {"
-      "  MyObject obj = new MyObject();"
-      "  return obj.method1(77, 125);"
-      "}";
+  const char* kScriptChars = R"(
+class MyObject {
+  @pragma("vm:external-name", "Name_Does_Not_Matter")
+  external int method1(int i, int j);
+}
+testMain() {
+  MyObject obj = new MyObject();
+  return obj.method1(77, 125);
+})";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, gnac_lookup);
 
@@ -9164,19 +9232,20 @@
 }
 
 TEST_CASE(DartAPI_HintFreed) {
-  const char* kScriptChars =
-      "void hintFreed(int size) native 'Test_nativeFunc';\n"
-      "void main() {\n"
-      "  var v;\n"
-      "  for (var i = 0; i < 100; i++) {\n"
-      "    var t = [];\n"
-      "    for (var j = 0; j < 10000; j++) {\n"
-      "      t.add(List.filled(100, null));\n"
-      "    }\n"
-      "    v = t;\n"
-      "    hintFreed(100 * 10000 * 4);\n"
-      "  }\n"
-      "}\n";
+  const char* kScriptChars = R"(
+@pragma("vm:external-name", "Test_nativeFunc")
+external void hintFreed(int size);
+void main() {
+  var v;
+  for (var i = 0; i < 100; i++) {
+    var t = [];
+    for (var j = 0; j < 10000; j++) {
+      t.add(List.filled(100, null));
+    }
+    v = t;
+    hintFreed(100 * 10000 * 4);
+  }
+})";
   Dart_Handle lib =
       TestCase::LoadTestScript(kScriptChars, &HintFreed_native_lookup);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -9195,19 +9264,20 @@
 }
 
 TEST_CASE(DartAPI_NotifyIdleShort) {
-  const char* kScriptChars =
-      "void notifyIdle() native 'Test_nativeFunc';\n"
-      "void main() {\n"
-      "  var v;\n"
-      "  for (var i = 0; i < 100; i++) {\n"
-      "    var t = [];\n"
-      "    for (var j = 0; j < 10000; j++) {\n"
-      "      t.add(List.filled(100, null));\n"
-      "    }\n"
-      "    v = t;\n"
-      "    notifyIdle();\n"
-      "  }\n"
-      "}\n";
+  const char* kScriptChars = R"(
+@pragma("vm:external-name", "Test_nativeFunc")
+external void notifyIdle();
+void main() {
+  var v;
+  for (var i = 0; i < 100; i++) {
+    var t = [];
+    for (var j = 0; j < 10000; j++) {
+      t.add(List.filled(100, null));
+    }
+    v = t;
+    notifyIdle();
+  }
+})";
   Dart_Handle lib =
       TestCase::LoadTestScript(kScriptChars, &NotifyIdleShort_native_lookup);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -9226,19 +9296,21 @@
 }
 
 TEST_CASE(DartAPI_NotifyIdleLong) {
-  const char* kScriptChars =
-      "void notifyIdle() native 'Test_nativeFunc';\n"
-      "void main() {\n"
-      "  var v;\n"
-      "  for (var i = 0; i < 100; i++) {\n"
-      "    var t = [];\n"
-      "    for (var j = 0; j < 10000; j++) {\n"
-      "      t.add(List.filled(100, null));\n"
-      "    }\n"
-      "    v = t;\n"
-      "    notifyIdle();\n"
-      "  }\n"
-      "}\n";
+  const char* kScriptChars = R"(
+@pragma("vm:external-name", "Test_nativeFunc")
+external void notifyIdle();
+void main() {
+  var v;
+  for (var i = 0; i < 100; i++) {
+    var t = [];
+    for (var j = 0; j < 10000; j++) {
+      t.add(List.filled(100, null));
+    }
+    v = t;
+    notifyIdle();
+  }
+}
+)";
   Dart_Handle lib =
       TestCase::LoadTestScript(kScriptChars, &NotifyIdleLong_native_lookup);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -9257,20 +9329,21 @@
 }
 
 TEST_CASE(DartAPI_NotifyLowMemory) {
-  const char* kScriptChars =
-      "import 'dart:isolate';\n"
-      "void notifyLowMemory() native 'Test_nativeFunc';\n"
-      "void main() {\n"
-      "  var v;\n"
-      "  for (var i = 0; i < 100; i++) {\n"
-      "    var t = [];\n"
-      "    for (var j = 0; j < 10000; j++) {\n"
-      "      t.add(List.filled(100, null));\n"
-      "    }\n"
-      "    v = t;\n"
-      "    notifyLowMemory();\n"
-      "  }\n"
-      "}\n";
+  const char* kScriptChars = R"(
+import 'dart:isolate';
+@pragma("vm:external-name", "Test_nativeFunc")
+external void notifyLowMemory();
+void main() {
+  var v;
+  for (var i = 0; i < 100; i++) {
+    var t = [];
+    for (var j = 0; j < 10000; j++) {
+      t.add(List.filled(100, null));
+    }
+    v = t;
+    notifyLowMemory();
+  }
+})";
   Dart_Handle lib =
       TestCase::LoadTestScript(kScriptChars, &NotifyLowMemory_native_lookup);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index b5f86e7..a9628b4 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -152,7 +152,7 @@
     "Maximum number of polymorphic check, otherwise it is megamorphic.")       \
   P(max_equality_polymorphic_checks, int, 32,                                  \
     "Maximum number of polymorphic checks in equality operator,")              \
-  P(new_gen_semi_max_size, int, (kWordSize <= 4) ? 8 : 16,                     \
+  P(new_gen_semi_max_size, int, kDefaultNewGenSemiMaxSize,                     \
     "Max size of new gen semi space in MB")                                    \
   P(new_gen_semi_initial_size, int, (kWordSize <= 4) ? 1 : 2,                  \
     "Initial size of new gen semi space in MB")                                \
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index d3ac9ab..986c3a2 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -42,17 +42,19 @@
 static constexpr int kCompressedWordSizeLog2 = kWordSizeLog2;
 typedef uintptr_t compressed_uword;
 #endif
+const int kMaxAddrSpaceMB = (kWordSize <= 4) ? 4096 : kMaxInt;
 
 // Number of bytes per BigInt digit.
 const intptr_t kBytesPerBigIntDigit = 4;
 
-// The default old gen heap size in MB, where 0 == unlimited.
+// The default old gen heap size in MB, where 0 -- unlimited.
 // 32-bit: OS limit is 2 or 3 GB
 // 64-bit: Linux's limit is
 //   sysctl vm.max_map_count (default 2^16) * 512 KB OldPages = 32 GB
 // Set the VM limit below the OS limit to increase the likelihood of failing
 // gracefully with a Dart OutOfMemory exception instead of SIGABORT.
 const intptr_t kDefaultMaxOldGenHeapSize = (kWordSize <= 4) ? 1536 : 30720;
+const intptr_t kDefaultNewGenSemiMaxSize = (kWordSize <= 4) ? 8 : 16;
 
 #define kPosInfinity bit_cast<double>(DART_UINT64_C(0x7ff0000000000000))
 #define kNegInfinity bit_cast<double>(DART_UINT64_C(0xfff0000000000000))
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 8b4e869..46fc02f 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -46,7 +46,7 @@
   void AddMicros(int64_t micros) { marked_micros_ += micros; }
 
   bool ProcessPendingWeakProperties() {
-    bool marked = false;
+    bool more_to_mark = false;
     WeakPropertyPtr cur_weak = delayed_weak_properties_;
     delayed_weak_properties_ = WeakProperty::null();
     while (cur_weak != WeakProperty::null()) {
@@ -55,10 +55,11 @@
       ObjectPtr raw_key = cur_weak->untag()->key();
       // Reset the next pointer in the weak property.
       cur_weak->untag()->next_ = WeakProperty::null();
-      if (raw_key->untag()->IsMarked()) {
+      if (raw_key->IsSmiOrNewObject() || raw_key->untag()->IsMarked()) {
         ObjectPtr raw_val = cur_weak->untag()->value();
-        marked = marked ||
-                 (raw_val->IsHeapObject() && !raw_val->untag()->IsMarked());
+        if (!raw_val->IsSmiOrNewObject() && !raw_val->untag()->IsMarked()) {
+          more_to_mark = true;
+        }
 
         // The key is marked so we make sure to properly visit all pointers
         // originating from this weak property.
@@ -70,7 +71,7 @@
       // Advance to next weak property in the queue.
       cur_weak = next_weak;
     }
-    return marked;
+    return more_to_mark;
   }
 
   void DrainMarkingStack() {
@@ -175,16 +176,24 @@
     ObjectPtr raw_obj;
     while ((raw_obj = deferred_work_list_.Pop()) != nullptr) {
       ASSERT(raw_obj->IsHeapObject() && raw_obj->IsOldObject());
-      // N.B. We are scanning the object even if it is already marked.
+      // We need to scan objects even if they were already scanned via ordinary
+      // marking. An object may have changed since its ordinary scan and been
+      // added to deferred marking stack to compensate for write-barrier
+      // elimination.
+      // A given object may be included in the deferred marking stack multiple
+      // times. It may or may not also be in the ordinary marking stack, so
+      // failing to acquire the mark bit here doesn't reliably indicate the
+      // object was already encountered through the deferred marking stack. Our
+      // processing here is idempotent, so repeated visits only hurt performance
+      // but not correctness. Duplicatation is expected to be low.
+      // By the absence of a special case, we are treating WeakProperties as
+      // strong references here. This guarentees a WeakProperty will only be
+      // added to the delayed_weak_properties_ list of the worker that
+      // encounters it during ordinary marking. This is in the same spirit as
+      // the eliminated write barrier, which would have added the newly written
+      // key and value to the ordinary marking stack.
       bool did_mark = TryAcquireMarkBit(raw_obj);
-      const intptr_t class_id = raw_obj->GetClassId();
-      intptr_t size;
-      if (class_id != kWeakPropertyCid) {
-        size = raw_obj->untag()->VisitPointersNonvirtual(this);
-      } else {
-        WeakPropertyPtr raw_weak = static_cast<WeakPropertyPtr>(raw_obj);
-        size = ProcessWeakProperty(raw_weak, did_mark);
-      }
+      intptr_t size = raw_obj->untag()->VisitPointersNonvirtual(this);
       // Add the size only if we win the marking race to prevent
       // double-counting.
       if (did_mark) {
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 78b0ad3..d2652ba 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -288,11 +288,12 @@
   void UpdateStoreBuffer(ObjectPtr obj) {
     ASSERT(obj->IsHeapObject());
     // If the newly written object is not a new object, drop it immediately.
-    if (!obj->IsNewObject() || visiting_old_object_->untag()->IsRemembered()) {
+    if (!obj->IsNewObject()) {
       return;
     }
-    visiting_old_object_->untag()->SetRememberedBit();
-    thread_->StoreBufferAddObjectGC(visiting_old_object_);
+    if (visiting_old_object_->untag()->TryAcquireRememberedBit()) {
+      thread_->StoreBufferAddObjectGC(visiting_old_object_);
+    }
   }
 
   DART_FORCE_INLINE
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 3c538f6..3a35bd4 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -215,6 +215,8 @@
       potential_pragma_functions_(GrowableObjectArray::Handle(Z)),
       static_field_value_(Object::Handle(Z)),
       pragma_class_(Class::Handle(Z)),
+      pragma_name_field_(Field::Handle(Z)),
+      pragma_options_field_(Field::Handle(Z)),
       name_index_handle_(Smi::Handle(Z)),
       expression_evaluation_library_(Library::Handle(Z)) {
   if (!program->is_single_program()) {
@@ -485,6 +487,8 @@
       potential_pragma_functions_(GrowableObjectArray::Handle(Z)),
       static_field_value_(Object::Handle(Z)),
       pragma_class_(Class::Handle(Z)),
+      pragma_name_field_(Field::Handle(Z)),
+      pragma_options_field_(Field::Handle(Z)),
       name_index_handle_(Smi::Handle(Z)),
       expression_evaluation_library_(Library::Handle(Z)) {
   ASSERT(T.active_class_ == &active_class_);
@@ -524,8 +528,12 @@
 
   // Obtain `dart:_internal::ExternalName.name`.
   EnsureExternalClassIsLookedUp();
+  EnsurePragmaClassIsLookedUp();
+
   Instance& constant = Instance::Handle(Z);
   String& native_name = String::Handle(Z);
+  String& pragma_name = String::Handle(Z);
+  Object& pragma_options = Object::Handle(Z);
 
   // Start scanning all candidates in [potential_natives] for the annotation
   // constant.  If the annotation is found, flag the [Function] as native and
@@ -533,6 +541,7 @@
   Function& function = Function::Handle(Z);
   for (intptr_t i = 0; i < length; ++i) {
     function ^= potential_natives_.At(i);
+
     helper_.SetOffset(function.KernelDataProgramOffset() +
                       function.kernel_offset());
     {
@@ -562,6 +571,22 @@
           function.set_native_name(native_name);
           function.set_is_external(false);
           break;
+        } else if (constant_reader.IsInstanceConstant(constant_table_index,
+                                                      pragma_class_)) {
+          constant = constant_reader.ReadConstant(constant_table_index);
+          ASSERT(constant.clazz() == pragma_class_.ptr());
+          // We found the annotation, let's flag the function as native and
+          // set the native name!
+          pragma_name ^= constant.GetField(pragma_name_field_);
+          if (pragma_name.ptr() == Symbols::vm_external_name().ptr()) {
+            pragma_options = constant.GetField(pragma_options_field_);
+            if (pragma_options.IsString()) {
+              function.set_is_native(true);
+              function.set_native_name(String::Cast(pragma_options));
+              function.set_is_external(false);
+              break;
+            }
+          }
         }
       } else {
         helper_.SkipExpression();
@@ -1091,12 +1116,8 @@
     field_helper.ReadUntilExcluding(FieldHelper::kAnnotations);
     intptr_t annotation_count = helper_.ReadListLength();
     bool has_pragma_annotation;
-    {
-      String& native_name_unused = String::Handle();
-      bool is_potential_native_unused;
-      ReadVMAnnotations(library, annotation_count, &native_name_unused,
-                        &is_potential_native_unused, &has_pragma_annotation);
-    }
+    ReadVMAnnotations(library, annotation_count, /*native_name=*/nullptr,
+                      /*is_potential_native=*/nullptr, &has_pragma_annotation);
     field_helper.SetJustRead(FieldHelper::kAnnotations);
 
     field_helper.ReadUntilExcluding(FieldHelper::kType);
@@ -1387,12 +1408,8 @@
   class_helper.ReadUntilExcluding(ClassHelper::kAnnotations);
   intptr_t annotation_count = helper_.ReadListLength();
   bool has_pragma_annotation = false;
-  {
-    String& native_name_unused = String::Handle(Z);
-    bool is_potential_native_unused = false;
-    ReadVMAnnotations(library, annotation_count, &native_name_unused,
-                      &is_potential_native_unused, &has_pragma_annotation);
-  }
+  ReadVMAnnotations(library, annotation_count, /*native_name=*/nullptr,
+                    /*is_potential_native=*/nullptr, &has_pragma_annotation);
   if (has_pragma_annotation) {
     out_class->set_has_pragma(true);
   }
@@ -1467,12 +1484,9 @@
       field_helper.ReadUntilExcluding(FieldHelper::kAnnotations);
       intptr_t annotation_count = helper_.ReadListLength();
       bool has_pragma_annotation;
-      {
-        String& native_name_unused = String::Handle();
-        bool is_potential_native_unused;
-        ReadVMAnnotations(library, annotation_count, &native_name_unused,
-                          &is_potential_native_unused, &has_pragma_annotation);
-      }
+      ReadVMAnnotations(library, annotation_count, /*native_name=*/nullptr,
+                        /*is_potential_native=*/nullptr,
+                        &has_pragma_annotation);
       field_helper.SetJustRead(FieldHelper::kAnnotations);
 
       field_helper.ReadUntilExcluding(FieldHelper::kType);
@@ -1578,12 +1592,8 @@
     constructor_helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
     intptr_t annotation_count = helper_.ReadListLength();
     bool has_pragma_annotation;
-    {
-      String& native_name_unused = String::Handle();
-      bool is_potential_native_unused;
-      ReadVMAnnotations(library, annotation_count, &native_name_unused,
-                        &is_potential_native_unused, &has_pragma_annotation);
-    }
+    ReadVMAnnotations(library, annotation_count, /*native_name=*/nullptr,
+                      /*is_potential_native=*/nullptr, &has_pragma_annotation);
     constructor_helper.SetJustRead(ConstructorHelper::kAnnotations);
     constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
 
@@ -1744,21 +1754,33 @@
                                      String* native_name,
                                      bool* is_potential_native,
                                      bool* has_pragma_annotation) {
-  *is_potential_native = false;
+  if (is_potential_native != nullptr) {
+    *is_potential_native = false;
+  }
   *has_pragma_annotation = false;
+  if (annotation_count == 0) {
+    return;
+  }
+
+  const Array& constant_table_array =
+      Array::Handle(Z, kernel_program_info_.constants());
+  const bool have_read_constant_table = !constant_table_array.IsNull();
+
   Instance& constant = Instance::Handle(Z);
+  String& pragma_name = String::Handle(Z);
+  Object& pragma_options = Object::Handle(Z);
   for (intptr_t i = 0; i < annotation_count; ++i) {
     const intptr_t tag = helper_.PeekTag();
     if (tag == kConstantExpression) {
-      const Array& constant_table_array =
-          Array::Handle(kernel_program_info_.constants());
-      if (constant_table_array.IsNull()) {
+      if (!have_read_constant_table) {
         // We can only read in the constant table once all classes have been
         // finalized (otherwise we can't create instances of the classes!).
         //
         // We therefore delay the scanning for `ExternalName {name: ... }`
         // constants in the annotation list to later.
-        *is_potential_native = true;
+        if (is_potential_native != nullptr) {
+          *is_potential_native = true;
+        }
 
         ASSERT(kernel_program_info_.constants_table() !=
                ExternalTypedData::null());
@@ -1825,12 +1847,25 @@
         // ExternalName or Pragma class.
         if (constant_reader.IsInstanceConstant(constant_table_index,
                                                external_name_class_)) {
-          constant = constant_reader.ReadConstant(constant_table_index);
-          ASSERT(constant.clazz() == external_name_class_.ptr());
-          *native_name ^= constant.GetField(external_name_field_);
+          if (native_name != nullptr) {
+            constant = constant_reader.ReadConstant(constant_table_index);
+            ASSERT(constant.clazz() == external_name_class_.ptr());
+            *native_name ^= constant.GetField(external_name_field_);
+          }
         } else if (constant_reader.IsInstanceConstant(constant_table_index,
                                                       pragma_class_)) {
           *has_pragma_annotation = true;
+          if (native_name != nullptr) {
+            constant = constant_reader.ReadConstant(constant_table_index);
+            ASSERT(constant.clazz() == pragma_class_.ptr());
+            pragma_name ^= constant.GetField(pragma_name_field_);
+            if (pragma_name.ptr() == Symbols::vm_external_name().ptr()) {
+              pragma_options = constant.GetField(pragma_options_field_);
+              if (pragma_options.IsString()) {
+                *native_name ^= pragma_options.ptr();
+              }
+            }
+          }
         }
       }
     } else {
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 573711f..68cd64b 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -351,8 +351,12 @@
       const Library& core_lib =
           Library::Handle(zone_, dart::Library::CoreLibrary());
       pragma_class_ = core_lib.LookupLocalClass(Symbols::Pragma());
+      pragma_name_field_ = pragma_class_.LookupField(Symbols::name());
+      pragma_options_field_ = pragma_class_.LookupField(Symbols::options());
     }
     ASSERT(!pragma_class_.IsNull());
+    ASSERT(!pragma_name_field_.IsNull());
+    ASSERT(!pragma_options_field_.IsNull());
     ASSERT(pragma_class_.is_declaration_loaded());
   }
 
@@ -404,6 +408,8 @@
   Object& static_field_value_;
 
   Class& pragma_class_;
+  Field& pragma_name_field_;
+  Field& pragma_options_field_;
 
   Smi& name_index_handle_;
 
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index 5b880d3..e7cc76e 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -3128,8 +3128,6 @@
     // here that cannot happen in reality)
     ILLEGAL(DynamicLibrary)
     ILLEGAL(Pointer)
-    ILLEGAL(FfiDynamicLibrary)
-    ILLEGAL(FfiPointer)
 
 #undef ILLEGAL
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bae028b..1355962 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -662,12 +662,12 @@
 
   {
     Pointer fake_handle;
-    builtin_vtables_[kFfiPointerCid] = fake_handle.vtable();
+    builtin_vtables_[kPointerCid] = fake_handle.vtable();
   }
 
   {
     DynamicLibrary fake_handle;
-    builtin_vtables_[kFfiDynamicLibraryCid] = fake_handle.vtable();
+    builtin_vtables_[kDynamicLibraryCid] = fake_handle.vtable();
   }
 
 #define INIT_VTABLE(clazz)                                                     \
@@ -2310,12 +2310,12 @@
     pending_classes.Add(cls);
     RegisterClass(cls, Symbols::FfiNativeFunction(), lib);
 
-    cls = Class::NewPointerClass(kFfiPointerCid, isolate_group);
+    cls = Class::NewPointerClass(kPointerCid, isolate_group);
     object_store->set_ffi_pointer_class(cls);
     pending_classes.Add(cls);
     RegisterClass(cls, Symbols::FfiPointer(), lib);
 
-    cls = Class::New<DynamicLibrary, RTN::DynamicLibrary>(kFfiDynamicLibraryCid,
+    cls = Class::New<DynamicLibrary, RTN::DynamicLibrary>(kDynamicLibraryCid,
                                                           isolate_group);
     cls.set_instance_size(DynamicLibrary::InstanceSize(),
                           compiler::target::RoundedAllocationSize(
@@ -2433,10 +2433,10 @@
     cls = Class::New<Instance, RTN::Instance>(kFfiNativeFunctionCid,
                                               isolate_group);
 
-    cls = Class::NewPointerClass(kFfiPointerCid, isolate_group);
+    cls = Class::NewPointerClass(kPointerCid, isolate_group);
     object_store->set_ffi_pointer_class(cls);
 
-    cls = Class::New<DynamicLibrary, RTN::DynamicLibrary>(kFfiDynamicLibraryCid,
+    cls = Class::New<DynamicLibrary, RTN::DynamicLibrary>(kDynamicLibraryCid,
                                                           isolate_group);
 
     cls = Class::New<Instance, RTN::Instance>(kByteBufferCid, isolate_group,
@@ -2781,12 +2781,6 @@
 bool Class::HasCompressedPointers() const {
   const intptr_t cid = id();
   switch (cid) {
-    // Only a couple of FFI cids correspond to actual Dart classes. so they're
-    // explicitly listed here.
-    case kFfiPointerCid:
-      return Pointer::ContainsCompressedPointers();
-    case kFfiDynamicLibraryCid:
-      return DynamicLibrary::ContainsCompressedPointers();
     case kByteBufferCid:
       return ByteBuffer::ContainsCompressedPointers();
 #define HANDLE_CASE(clazz)                                                     \
@@ -4923,9 +4917,9 @@
     case kExternalTypedDataFloat64ArrayCid:
       return Symbols::Float64List().ToCString();
 
-    case kFfiPointerCid:
+    case kPointerCid:
       return Symbols::FfiPointer().ToCString();
-    case kFfiDynamicLibraryCid:
+    case kDynamicLibraryCid:
       return Symbols::FfiDynamicLibrary().ToCString();
 
 #if !defined(PRODUCT)
@@ -13868,10 +13862,6 @@
   return IsolateGroup::Current()->object_store()->native_wrappers_library();
 }
 
-LibraryPtr Library::ProfilerLibrary() {
-  return IsolateGroup::Current()->object_store()->profiler_library();
-}
-
 LibraryPtr Library::TypedDataLibrary() {
   return IsolateGroup::Current()->object_store()->typed_data_library();
 }
@@ -20280,7 +20270,7 @@
 }
 
 bool AbstractType::IsFfiPointerType() const {
-  return HasTypeClass() && type_class_id() == kFfiPointerCid;
+  return HasTypeClass() && type_class_id() == kPointerCid;
 }
 
 AbstractTypePtr AbstractType::UnwrapFutureOr() const {
@@ -25206,11 +25196,11 @@
   type_args = type_args.Canonicalize(thread, nullptr);
 
   const Class& cls =
-      Class::Handle(IsolateGroup::Current()->class_table()->At(kFfiPointerCid));
+      Class::Handle(IsolateGroup::Current()->class_table()->At(kPointerCid));
   cls.EnsureIsAllocateFinalized(Thread::Current());
 
   Pointer& result = Pointer::Handle(zone);
-  result ^= Object::Allocate(kFfiPointerCid, Pointer::InstanceSize(), space,
+  result ^= Object::Allocate(kPointerCid, Pointer::InstanceSize(), space,
                              Pointer::ContainsCompressedPointers());
   result.SetTypeArguments(type_args);
   result.SetNativeAddress(native_address);
@@ -25228,7 +25218,7 @@
 DynamicLibraryPtr DynamicLibrary::New(void* handle, Heap::Space space) {
   DynamicLibrary& result = DynamicLibrary::Handle();
   result ^=
-      Object::Allocate(kFfiDynamicLibraryCid, DynamicLibrary::InstanceSize(),
+      Object::Allocate(kDynamicLibraryCid, DynamicLibrary::InstanceSize(),
                        space, DynamicLibrary::ContainsCompressedPointers());
   NoSafepointScope no_safepoint;
   result.SetHandle(handle);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 45b8262..50d4136 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4966,7 +4966,6 @@
   static LibraryPtr MirrorsLibrary();
 #endif
   static LibraryPtr NativeWrappersLibrary();
-  static LibraryPtr ProfilerLibrary();
   static LibraryPtr TypedDataLibrary();
   static LibraryPtr VMServiceLibrary();
 
diff --git a/runtime/vm/object_graph_copy.cc b/runtime/vm/object_graph_copy.cc
index 757815a..86d9394 100644
--- a/runtime/vm/object_graph_copy.cc
+++ b/runtime/vm/object_graph_copy.cc
@@ -593,8 +593,6 @@
       // here that cannot happen in reality)
       HANDLE_ILLEGAL_CASE(DynamicLibrary)
       HANDLE_ILLEGAL_CASE(Pointer)
-      HANDLE_ILLEGAL_CASE(FfiDynamicLibrary)
-      HANDLE_ILLEGAL_CASE(FfiPointer)
       HANDLE_ILLEGAL_CASE(FunctionType)
       HANDLE_ILLEGAL_CASE(MirrorReference)
       HANDLE_ILLEGAL_CASE(ReceivePort)
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 530240b..ebb2d60 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -128,7 +128,6 @@
   RW(Array, canonical_type_parameters)                                         \
   RW(Array, canonical_type_arguments)                                          \
   RW(Library, async_library)                                                   \
-  RW(Library, builtin_library)                                                 \
   RW(Library, core_library)                                                    \
   RW(Library, collection_library)                                              \
   RW(Library, convert_library)                                                 \
@@ -139,7 +138,6 @@
   RW(Library, math_library)                                                    \
   RW(Library, mirrors_library)                                                 \
   RW(Library, native_wrappers_library)                                         \
-  RW(Library, profiler_library)                                                \
   RW(Library, root_library)                                                    \
   RW(Library, typed_data_library)                                              \
   RW(Library, _vmservice_library)                                              \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index cf90473..7b98530 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -4551,7 +4551,7 @@
         "\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":"
         "\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-patch\\/"
         "array.dart\",\"_kind\":\"kernel\"},\"tokenPos\":248,\"endTokenPos\":"
-        "7758},\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
+        "7917},\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"dart.core\",\"uri\":\"dart:core\"},\"typeParameters\":[{"
         "\"type\":\"@"
         "Instance\",\"_vmType\":\"TypeParameter\",\"class\":{\"type\":\"@"
@@ -4559,8 +4559,8 @@
         "vmName\":\"\",\"location\":{\"type\":"
         "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
         "\"id\":\"\",\"uri\":\"dart:core-patch\\/"
-        "type_patch.dart\",\"_kind\":\"kernel\"},\"tokenPos\":1584,"
-        "\"endTokenPos\":1729},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "type_patch.dart\",\"_kind\":\"kernel\"},\"tokenPos\":1749,"
+        "\"endTokenPos\":1894},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":",
         buffer);
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index ae6c199..7a184af 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -174,7 +174,7 @@
         break;
       }
 #undef SIZE_FROM_CLASS
-    case kFfiPointerCid:
+    case kPointerCid:
       instance_size = Pointer::InstanceSize();
       break;
     case kTypeArgumentsCid: {
@@ -327,17 +327,6 @@
       size = UntaggedInstance::VisitInstancePointers(raw_obj, visitor);
       break;
     }
-    case kFfiPointerCid: {
-      PointerPtr raw_obj = static_cast<PointerPtr>(this);
-      size = UntaggedPointer::VisitPointerPointers(raw_obj, visitor);
-      break;
-    }
-    case kFfiDynamicLibraryCid: {
-      DynamicLibraryPtr raw_obj = static_cast<DynamicLibraryPtr>(this);
-      size =
-          UntaggedDynamicLibrary::VisitDynamicLibraryPointers(raw_obj, visitor);
-      break;
-    }
 #define RAW_VISITPOINTERS(clazz) case kFfi##clazz##Cid:
       CLASS_LIST_FFI_TYPE_MARKER(RAW_VISITPOINTERS) {
         // NativeType do not have any fields or type arguments.
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 58b66be..98f481a 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -317,10 +317,9 @@
     ASSERT(IsOldObject());
     return !tags_.Read<OldAndNotRememberedBit>();
   }
-  void SetRememberedBit() {
-    ASSERT(!IsRemembered());
+  bool TryAcquireRememberedBit() {
     ASSERT(!IsCardRemembered());
-    tags_.UpdateBool<OldAndNotRememberedBit>(false);
+    return tags_.TryClear<OldAndNotRememberedBit>();
   }
   void ClearRememberedBit() {
     ASSERT(IsOldObject());
@@ -328,10 +327,10 @@
   }
 
   DART_FORCE_INLINE
-  void AddToRememberedSet(Thread* thread) {
-    ASSERT(!this->IsRemembered());
-    this->SetRememberedBit();
-    thread->StoreBufferAddObject(ObjectPtr(this));
+  void EnsureInRememberedSet(Thread* thread) {
+    if (TryAcquireRememberedBit()) {
+      thread->StoreBufferAddObject(ObjectPtr(this));
+    }
   }
 
   bool IsCardRemembered() const { return tags_.Read<CardRememberedBit>(); }
@@ -665,7 +664,7 @@
       if (value->IsNewObject()) {
         // Generational barrier: record when a store creates an
         // old-and-not-remembered -> new reference.
-        AddToRememberedSet(thread);
+        EnsureInRememberedSet(thread);
       } else {
         // Incremental barrier: record when a store creates an
         // old -> old-and-not-marked reference.
@@ -695,11 +694,9 @@
       if (value->IsNewObject()) {
         // Generational barrier: record when a store creates an
         // old-and-not-remembered -> new reference.
-        ASSERT(!this->IsRemembered());
         if (this->IsCardRemembered()) {
           RememberCard(addr);
-        } else {
-          this->SetRememberedBit();
+        } else if (this->TryAcquireRememberedBit()) {
           thread->StoreBufferAddObject(static_cast<ObjectPtr>(this));
         }
       } else {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index b3be100..994273d 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -522,7 +522,7 @@
   }
 
   if (add_to_remembered_set) {
-    object->untag()->AddToRememberedSet(thread);
+    object->untag()->EnsureInRememberedSet(thread);
   }
 
   // For incremental write barrier elimination, we need to ensure that the
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 2b43622..17b42b6 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -5226,7 +5226,7 @@
   {                                                                            \
     JSONArray internals(&map, #clazz);                                         \
     DEFINE_ADD_VALUE_F_CID(TypedData##clazz)                                   \
-    DEFINE_ADD_VALUE_F_CID(TypedData##clazz)                                   \
+    DEFINE_ADD_VALUE_F_CID(TypedData##clazz##View)                             \
     DEFINE_ADD_VALUE_F_CID(ExternalTypedData##clazz)                           \
   }
   CLASS_LIST_TYPED_DATA(DEFINE_ADD_MAP_KEY)
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index 8ed14b9..f537458 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -165,12 +165,14 @@
       OS::SCreate(
           nullptr,
           "class StackFrame {"
-          "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-          "  static int frameCount() native \"StackFrame_frameCount\";"
-          "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-          "  static validateFrame(int index,"
-          "                       String name) native "
-          "\"StackFrame_validateFrame\";"
+          "  @pragma('vm:external-name', 'StackFrame_equals')\n"
+          "  external static equals(var obj1, var obj2);\n"
+          "  @pragma('vm:external-name', 'StackFrame_frameCount')\n"
+          "  external static int frameCount();\n"
+          "  @pragma('vm:external-name', 'StackFrame_dartFrameCount')\n"
+          "  external static int dartFrameCount();\n"
+          "  @pragma('vm:external-name', 'StackFrame_validateFrame')\n"
+          "  external static validateFrame(int index, String name);"
           "} "
           "class First {"
           "  First() { }"
@@ -262,12 +264,14 @@
   if (FLAG_lazy_dispatchers) {
     kScriptChars =
         "class StackFrame {"
-        "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-        "  static int frameCount() native \"StackFrame_frameCount\";"
-        "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-        "  static validateFrame(int index,"
-        "                       String name) native "
-        "\"StackFrame_validateFrame\";"
+        "  @pragma('vm:external-name', 'StackFrame_equals')\n"
+        "  external static equals(var obj1, var obj2);\n"
+        "  @pragma('vm:external-name', 'StackFrame_frameCount')\n"
+        "  external static int frameCount();\n"
+        "  @pragma('vm:external-name', 'StackFrame_dartFrameCount')\n"
+        "  external static int dartFrameCount();\n"
+        "  @pragma('vm:external-name', 'StackFrame_validateFrame')\n"
+        "  external static validateFrame(int index, String name);"
         "} "
         "class StackFrame2Test {"
         "  StackFrame2Test() {}"
@@ -299,12 +303,14 @@
   } else {
     kScriptChars =
         "class StackFrame {"
-        "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-        "  static int frameCount() native \"StackFrame_frameCount\";"
-        "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-        "  static validateFrame(int index,"
-        "                       String name) native "
-        "\"StackFrame_validateFrame\";"
+        "  @pragma('vm:external-name', 'StackFrame_equals')\n"
+        "  external static equals(var obj1, var obj2);\n"
+        "  @pragma('vm:external-name', 'StackFrame_frameCount')\n"
+        "  external static int frameCount();\n"
+        "  @pragma('vm:external-name', 'StackFrame_dartFrameCount')\n"
+        "  external static int dartFrameCount();\n"
+        "  @pragma('vm:external-name', 'StackFrame_validateFrame')\n"
+        "  external static validateFrame(int index, String name);"
         "} "
         "class StackFrame2Test {"
         "  StackFrame2Test() {}"
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index eee7c62..0c5a759 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -467,7 +467,8 @@
   V(vm_recognized, "vm:recognized")                                            \
   V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn")            \
   V(vm_ffi_struct_fields, "vm:ffi:struct-fields")                              \
-  V(vm_unsafe_no_interrupts, "vm:unsafe:no-interrupts")
+  V(vm_unsafe_no_interrupts, "vm:unsafe:no-interrupts")                        \
+  V(vm_external_name, "vm:external-name")
 
 // Contains a list of frequently used strings in a canonicalized form. This
 // list is kept in the vm_isolate in order to share the copy across isolates
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 432b89f..4e46bbb 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -696,9 +696,7 @@
 
       switch (op_) {
         case Thread::RestoreWriteBarrierInvariantOp::kAddToRememberedSet:
-          if (!obj->untag()->IsRemembered()) {
-            obj->untag()->AddToRememberedSet(current_);
-          }
+          obj->untag()->EnsureInRememberedSet(current_);
           if (current_->is_marking()) {
             current_->DeferredMarkingStackAddObject(obj);
           }
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index b710b2a..cb67c6f 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -219,10 +219,14 @@
 }
 
 #ifndef PRODUCT
-static const char* kIsolateReloadTestLibSource =
-    "void reloadTest() native 'Test_Reload';\n"
-    "void collectNewSpace() native 'Test_CollectNewSpace';\n"
-    "void collectOldSpace() native 'Test_CollectOldSpace';\n";
+static const char* kIsolateReloadTestLibSource = R"(
+@pragma("vm:external-name", "Test_Reload")
+external void reloadTest();
+@pragma("vm:external-name", "Test_CollectNewSpace")
+external void collectNewSpace();
+@pragma("vm:external-name", "Test_CollectOldSpace")
+external void collectOldSpace();
+)";
 
 static const char* IsolateReloadTestLibUri() {
   return "test:isolate_reload_helper";
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index 49f9216..ee26123 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -52,6 +52,22 @@
 }
 
 void VirtualMemory::Init() {
+  if (FLAG_old_gen_heap_size < 0 || FLAG_old_gen_heap_size > kMaxAddrSpaceMB) {
+    OS::PrintErr(
+        "warning: value specified for --old_gen_heap_size %d is larger than"
+        " the physically addressable range, using 0(unlimited) instead.`\n",
+        FLAG_old_gen_heap_size);
+    FLAG_old_gen_heap_size = 0;
+  }
+  if (FLAG_new_gen_semi_max_size < 0 ||
+      FLAG_new_gen_semi_max_size > kMaxAddrSpaceMB) {
+    OS::PrintErr(
+        "warning: value specified for --new_gen_semi_max_size %d is larger"
+        " than the physically addressable range, using %" Pd " instead.`\n",
+        FLAG_new_gen_semi_max_size, kDefaultNewGenSemiMaxSize);
+    FLAG_new_gen_semi_max_size = kDefaultNewGenSemiMaxSize;
+  }
+
 #if defined(DART_COMPRESSED_POINTERS)
   if (compressed_heap_vmar_ == ZX_HANDLE_INVALID) {
     const zx_vm_option_t align_flag =
diff --git a/runtime/vm/virtual_memory_posix.cc b/runtime/vm/virtual_memory_posix.cc
index 4eaa832..f5fa5ac 100644
--- a/runtime/vm/virtual_memory_posix.cc
+++ b/runtime/vm/virtual_memory_posix.cc
@@ -105,8 +105,22 @@
 #endif  // LARGE_RESERVATIONS_MAY_FAIL
 
 void VirtualMemory::Init() {
+  if (FLAG_old_gen_heap_size < 0 || FLAG_old_gen_heap_size > kMaxAddrSpaceMB) {
+    OS::PrintErr(
+        "warning: value specified for --old_gen_heap_size %d is larger than"
+        " the physically addressable range, using 0(unlimited) instead.`\n",
+        FLAG_old_gen_heap_size);
+    FLAG_old_gen_heap_size = 0;
+  }
+  if (FLAG_new_gen_semi_max_size < 0 ||
+      FLAG_new_gen_semi_max_size > kMaxAddrSpaceMB) {
+    OS::PrintErr(
+        "warning: value specified for --new_gen_semi_max_size %d is larger"
+        " than the physically addressable range, using %" Pd " instead.`\n",
+        FLAG_new_gen_semi_max_size, kDefaultNewGenSemiMaxSize);
+    FLAG_new_gen_semi_max_size = kDefaultNewGenSemiMaxSize;
+  }
   page_size_ = CalculatePageSize();
-
 #if defined(DART_COMPRESSED_POINTERS)
   ASSERT(compressed_heap_ == nullptr);
 #if defined(LARGE_RESERVATIONS_MAY_FAIL)
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index f7b64f5..013adf0 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -53,8 +53,22 @@
 }
 
 void VirtualMemory::Init() {
+  if (FLAG_old_gen_heap_size < 0 || FLAG_old_gen_heap_size > kMaxAddrSpaceMB) {
+    OS::PrintErr(
+        "warning: value specified for --old_gen_heap_size %d is larger than"
+        " the physically addressable range, using 0(unlimited) instead.`\n",
+        FLAG_old_gen_heap_size);
+    FLAG_old_gen_heap_size = 0;
+  }
+  if (FLAG_new_gen_semi_max_size < 0 ||
+      FLAG_new_gen_semi_max_size > kMaxAddrSpaceMB) {
+    OS::PrintErr(
+        "warning: value specified for --new_gen_semi_max_size %d is larger"
+        " than the physically addressable range, using %" Pd " instead.`\n",
+        FLAG_new_gen_semi_max_size, kDefaultNewGenSemiMaxSize);
+    FLAG_new_gen_semi_max_size = kDefaultNewGenSemiMaxSize;
+  }
   page_size_ = CalculatePageSize();
-
 #if defined(DART_COMPRESSED_POINTERS)
   ASSERT(compressed_heap_ == nullptr);
   compressed_heap_ = Reserve(kCompressedHeapSize, kCompressedHeapAlignment);
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 2078dfa..6845f45 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -1429,8 +1429,6 @@
       headers.chunkedTransferEncoding = true;
     }
 
-    _profileData?.finishRequest(request: this);
-
     _responseCompleter.future.then((response) {
       _profileData?.requestEvent('Waiting (TTFB)');
       _profileData?.startResponse(
@@ -2144,6 +2142,9 @@
     // data).
     _httpParser.isHead = method == "HEAD";
     _streamFuture = outgoing.done.then<Socket>((Socket s) {
+      // Request sent, details available for profiling
+      profileData?.finishRequest(request: request);
+
       // Request sent, set up response completer.
       var nextResponseCompleter = new Completer<_HttpIncoming>();
       _nextResponseCompleter = nextResponseCompleter;
diff --git a/sdk/lib/_internal/vm/bin/builtin.dart b/sdk/lib/_internal/vm/bin/builtin.dart
index 7a3bafb..b5263e0 100644
--- a/sdk/lib/_internal/vm/bin/builtin.dart
+++ b/sdk/lib/_internal/vm/bin/builtin.dart
@@ -24,7 +24,8 @@
 // 'print' implementation.
 // The standalone embedder registers the closurized _print function with the
 // dart:core library.
-void _printString(String s) native "Builtin_PrintString";
+@pragma("vm:external-name", "Builtin_PrintString")
+external void _printString(String s);
 
 void _print(arg) {
   _printString(arg.toString());
diff --git a/sdk/lib/_internal/vm/bin/cli_patch.dart b/sdk/lib/_internal/vm/bin/cli_patch.dart
index 504a0db..40abe7b 100644
--- a/sdk/lib/_internal/vm/bin/cli_patch.dart
+++ b/sdk/lib/_internal/vm/bin/cli_patch.dart
@@ -5,4 +5,5 @@
 import "dart:_internal" show patch;
 
 @patch
-void _waitForEvent(int timeoutMillis) native "CLI_WaitForEvent";
+@pragma("vm:external-name", "CLI_WaitForEvent")
+external void _waitForEvent(int timeoutMillis);
diff --git a/sdk/lib/_internal/vm/bin/common_patch.dart b/sdk/lib/_internal/vm/bin/common_patch.dart
index 45e8ac1..ed789f0 100644
--- a/sdk/lib/_internal/vm/bin/common_patch.dart
+++ b/sdk/lib/_internal/vm/bin/common_patch.dart
@@ -65,13 +65,15 @@
 @patch
 class OSError {
   @patch
-  static int inProgressErrorCode() native "OSError_inProgressErrorCode";
+  @pragma("vm:external-name", "OSError_inProgressErrorCode")
+  external static int inProgressErrorCode();
 }
 
 @patch
 class _IOCrypto {
   @patch
-  static Uint8List getRandomBytes(int count) native "Crypto_GetRandomBytes";
+  @pragma("vm:external-name", "Crypto_GetRandomBytes")
+  external static Uint8List getRandomBytes(int count);
 }
 
 @pragma("vm:entry-point", "call")
diff --git a/sdk/lib/_internal/vm/bin/directory_patch.dart b/sdk/lib/_internal/vm/bin/directory_patch.dart
index 7549f72..5153162 100644
--- a/sdk/lib/_internal/vm/bin/directory_patch.dart
+++ b/sdk/lib/_internal/vm/bin/directory_patch.dart
@@ -7,34 +7,39 @@
 @patch
 class _Directory {
   @patch
-  static _current(_Namespace namespace) native "Directory_Current";
+  @pragma("vm:external-name", "Directory_Current")
+  external static _current(_Namespace namespace);
   @patch
-  static _setCurrent(_Namespace namespace, Uint8List rawPath)
-      native "Directory_SetCurrent";
+  @pragma("vm:external-name", "Directory_SetCurrent")
+  external static _setCurrent(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _createTemp(_Namespace namespace, Uint8List rawPath)
-      native "Directory_CreateTemp";
+  @pragma("vm:external-name", "Directory_CreateTemp")
+  external static _createTemp(_Namespace namespace, Uint8List rawPath);
   @patch
-  static String _systemTemp(_Namespace namespace) native "Directory_SystemTemp";
+  @pragma("vm:external-name", "Directory_SystemTemp")
+  external static String _systemTemp(_Namespace namespace);
   @patch
-  static _exists(_Namespace namespace, Uint8List rawPath)
-      native "Directory_Exists";
+  @pragma("vm:external-name", "Directory_Exists")
+  external static _exists(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _create(_Namespace namespace, Uint8List rawPath)
-      native "Directory_Create";
+  @pragma("vm:external-name", "Directory_Create")
+  external static _create(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _deleteNative(_Namespace namespace, Uint8List rawPath, bool recursive)
-      native "Directory_Delete";
+  @pragma("vm:external-name", "Directory_Delete")
+  external static _deleteNative(
+      _Namespace namespace, Uint8List rawPath, bool recursive);
   @patch
-  static _rename(_Namespace namespace, Uint8List rawPath, String newPath)
-      native "Directory_Rename";
+  @pragma("vm:external-name", "Directory_Rename")
+  external static _rename(
+      _Namespace namespace, Uint8List rawPath, String newPath);
   @patch
-  static void _fillWithDirectoryListing(
+  @pragma("vm:external-name", "Directory_FillWithDirectoryListing")
+  external static void _fillWithDirectoryListing(
       _Namespace namespace,
       List<FileSystemEntity> list,
       Uint8List rawPath,
       bool recursive,
-      bool followLinks) native "Directory_FillWithDirectoryListing";
+      bool followLinks);
 }
 
 @patch
@@ -51,9 +56,11 @@
   factory _AsyncDirectoryListerOpsImpl(int pointer) =>
       new _AsyncDirectoryListerOpsImpl._().._setPointer(pointer);
 
-  void _setPointer(int pointer)
-      native "Directory_SetAsyncDirectoryListerPointer";
-  int getPointer() native "Directory_GetAsyncDirectoryListerPointer";
+  @pragma("vm:external-name", "Directory_SetAsyncDirectoryListerPointer")
+  external void _setPointer(int pointer);
+
+  @pragma("vm:external-name", "Directory_GetAsyncDirectoryListerPointer")
+  external int getPointer();
 }
 
 // Corelib 'Uri.base' implementation.
diff --git a/sdk/lib/_internal/vm/bin/eventhandler_patch.dart b/sdk/lib/_internal/vm/bin/eventhandler_patch.dart
index 072d995..2538131 100644
--- a/sdk/lib/_internal/vm/bin/eventhandler_patch.dart
+++ b/sdk/lib/_internal/vm/bin/eventhandler_patch.dart
@@ -7,9 +7,9 @@
 @patch
 class _EventHandler {
   @patch
-  static void _sendData(Object? sender, SendPort sendPort, int data)
-      native "EventHandler_SendData";
+  @pragma("vm:external-name", "EventHandler_SendData")
+  external static void _sendData(Object? sender, SendPort sendPort, int data);
 
-  static int _timerMillisecondClock()
-      native "EventHandler_TimerMillisecondClock";
+  @pragma("vm:external-name", "EventHandler_TimerMillisecondClock")
+  external static int _timerMillisecondClock();
 }
diff --git a/sdk/lib/_internal/vm/bin/file_patch.dart b/sdk/lib/_internal/vm/bin/file_patch.dart
index 92a306b..b95e71a 100644
--- a/sdk/lib/_internal/vm/bin/file_patch.dart
+++ b/sdk/lib/_internal/vm/bin/file_patch.dart
@@ -7,50 +7,59 @@
 @patch
 class _File {
   @patch
-  static _exists(_Namespace namespace, Uint8List rawPath) native "File_Exists";
+  @pragma("vm:external-name", "File_Exists")
+  external static _exists(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _create(_Namespace namespace, Uint8List rawPath) native "File_Create";
+  @pragma("vm:external-name", "File_Create")
+  external static _create(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _createLink(_Namespace namespace, Uint8List rawPath, String target)
-      native "File_CreateLink";
+  @pragma("vm:external-name", "File_CreateLink")
+  external static _createLink(
+      _Namespace namespace, Uint8List rawPath, String target);
   @patch
-  static _linkTarget(_Namespace namespace, Uint8List rawPath)
-      native "File_LinkTarget";
+  @pragma("vm:external-name", "File_LinkTarget")
+  external static _linkTarget(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _deleteNative(_Namespace namespace, Uint8List rawPath)
-      native "File_Delete";
+  @pragma("vm:external-name", "File_Delete")
+  external static _deleteNative(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _deleteLinkNative(_Namespace namespace, Uint8List rawPath)
-      native "File_DeleteLink";
+  @pragma("vm:external-name", "File_DeleteLink")
+  external static _deleteLinkNative(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _rename(_Namespace namespace, Uint8List oldPath, String newPath)
-      native "File_Rename";
+  @pragma("vm:external-name", "File_Rename")
+  external static _rename(
+      _Namespace namespace, Uint8List oldPath, String newPath);
   @patch
-  static _renameLink(_Namespace namespace, Uint8List oldPath, String newPath)
-      native "File_RenameLink";
+  @pragma("vm:external-name", "File_RenameLink")
+  external static _renameLink(
+      _Namespace namespace, Uint8List oldPath, String newPath);
   @patch
-  static _copy(_Namespace namespace, Uint8List oldPath, String newPath)
-      native "File_Copy";
+  @pragma("vm:external-name", "File_Copy")
+  external static _copy(
+      _Namespace namespace, Uint8List oldPath, String newPath);
   @patch
-  static _lengthFromPath(_Namespace namespace, Uint8List rawPath)
-      native "File_LengthFromPath";
+  @pragma("vm:external-name", "File_LengthFromPath")
+  external static _lengthFromPath(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _lastModified(_Namespace namespace, Uint8List rawPath)
-      native "File_LastModified";
+  @pragma("vm:external-name", "File_LastModified")
+  external static _lastModified(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _setLastModified(_Namespace namespace, Uint8List rawPath, int millis)
-      native "File_SetLastModified";
+  @pragma("vm:external-name", "File_SetLastModified")
+  external static _setLastModified(
+      _Namespace namespace, Uint8List rawPath, int millis);
   @patch
-  static _lastAccessed(_Namespace namespace, Uint8List rawPath)
-      native "File_LastAccessed";
+  @pragma("vm:external-name", "File_LastAccessed")
+  external static _lastAccessed(_Namespace namespace, Uint8List rawPath);
   @patch
-  static _setLastAccessed(_Namespace namespace, Uint8List rawPath, int millis)
-      native "File_SetLastAccessed";
+  @pragma("vm:external-name", "File_SetLastAccessed")
+  external static _setLastAccessed(
+      _Namespace namespace, Uint8List rawPath, int millis);
   @patch
-  static _open(_Namespace namespace, Uint8List rawPath, int mode)
-      native "File_Open";
+  @pragma("vm:external-name", "File_Open")
+  external static _open(_Namespace namespace, Uint8List rawPath, int mode);
   @patch
-  static int _openStdio(int fd) native "File_OpenStdio";
+  @pragma("vm:external-name", "File_OpenStdio")
+  external static int _openStdio(int fd);
 }
 
 @patch
@@ -68,21 +77,35 @@
   factory _RandomAccessFileOpsImpl(int pointer) =>
       new _RandomAccessFileOpsImpl._().._setPointer(pointer);
 
-  void _setPointer(int pointer) native "File_SetPointer";
+  @pragma("vm:external-name", "File_SetPointer")
+  external void _setPointer(int pointer);
 
-  int getPointer() native "File_GetPointer";
-  int close() native "File_Close";
-  readByte() native "File_ReadByte";
-  read(int bytes) native "File_Read";
-  readInto(List<int> buffer, int start, int? end) native "File_ReadInto";
-  writeByte(int value) native "File_WriteByte";
-  writeFrom(List<int> buffer, int start, int? end) native "File_WriteFrom";
-  position() native "File_Position";
-  setPosition(int position) native "File_SetPosition";
-  truncate(int length) native "File_Truncate";
-  length() native "File_Length";
-  flush() native "File_Flush";
-  lock(int lock, int start, int end) native "File_Lock";
+  @pragma("vm:external-name", "File_GetPointer")
+  external int getPointer();
+  @pragma("vm:external-name", "File_Close")
+  external int close();
+  @pragma("vm:external-name", "File_ReadByte")
+  external readByte();
+  @pragma("vm:external-name", "File_Read")
+  external read(int bytes);
+  @pragma("vm:external-name", "File_ReadInto")
+  external readInto(List<int> buffer, int start, int? end);
+  @pragma("vm:external-name", "File_WriteByte")
+  external writeByte(int value);
+  @pragma("vm:external-name", "File_WriteFrom")
+  external writeFrom(List<int> buffer, int start, int? end);
+  @pragma("vm:external-name", "File_Position")
+  external position();
+  @pragma("vm:external-name", "File_SetPosition")
+  external setPosition(int position);
+  @pragma("vm:external-name", "File_Truncate")
+  external truncate(int length);
+  @pragma("vm:external-name", "File_Length")
+  external length();
+  @pragma("vm:external-name", "File_Flush")
+  external flush();
+  @pragma("vm:external-name", "File_Lock")
+  external lock(int lock, int start, int end);
 }
 
 class _WatcherPath {
@@ -339,19 +362,23 @@
   }
 
   @patch
-  static bool get isSupported native "FileSystemWatcher_IsSupported";
+  @pragma("vm:external-name", "FileSystemWatcher_IsSupported")
+  external static bool get isSupported;
 
-  static int _initWatcher() native "FileSystemWatcher_InitWatcher";
-  static void _closeWatcher(int id) native "FileSystemWatcher_CloseWatcher";
+  @pragma("vm:external-name", "FileSystemWatcher_InitWatcher")
+  external static int _initWatcher();
+  @pragma("vm:external-name", "FileSystemWatcher_CloseWatcher")
+  external static void _closeWatcher(int id);
 
-  static int _watchPath(int id, _Namespace namespace, String path, int events,
-      bool recursive) native "FileSystemWatcher_WatchPath";
-  static void _unwatchPath(int id, int path_id)
-      native "FileSystemWatcher_UnwatchPath";
-  static List _readEvents(int id, int path_id)
-      native "FileSystemWatcher_ReadEvents";
-  static int _getSocketId(int id, int path_id)
-      native "FileSystemWatcher_GetSocketId";
+  @pragma("vm:external-name", "FileSystemWatcher_WatchPath")
+  external static int _watchPath(
+      int id, _Namespace namespace, String path, int events, bool recursive);
+  @pragma("vm:external-name", "FileSystemWatcher_UnwatchPath")
+  external static void _unwatchPath(int id, int path_id);
+  @pragma("vm:external-name", "FileSystemWatcher_ReadEvents")
+  external static List _readEvents(int id, int path_id);
+  @pragma("vm:external-name", "FileSystemWatcher_GetSocketId")
+  external static int _getSocketId(int id, int path_id);
 }
 
 class _InotifyFileSystemWatcher extends _FileSystemWatcher {
diff --git a/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart b/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart
index 973e6b6..8ef9b96 100644
--- a/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart
+++ b/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart
@@ -7,18 +7,21 @@
 @patch
 class FileStat {
   @patch
-  static _statSync(_Namespace namespace, String path) native "File_Stat";
+  @pragma("vm:external-name", "File_Stat")
+  external static _statSync(_Namespace namespace, String path);
 }
 
 @patch
 class FileSystemEntity {
   @patch
-  static _getTypeNative(_Namespace namespace, Uint8List rawPath,
-      bool followLinks) native "File_GetType";
+  @pragma("vm:external-name", "File_GetType")
+  external static _getTypeNative(
+      _Namespace namespace, Uint8List rawPath, bool followLinks);
   @patch
-  static _identicalNative(_Namespace namespace, String path1, String path2)
-      native "File_AreIdentical";
+  @pragma("vm:external-name", "File_AreIdentical")
+  external static _identicalNative(
+      _Namespace namespace, String path1, String path2);
   @patch
-  static _resolveSymbolicLinks(_Namespace namespace, Uint8List path)
-      native "File_ResolveSymbolicLinks";
+  @pragma("vm:external-name", "File_ResolveSymbolicLinks")
+  external static _resolveSymbolicLinks(_Namespace namespace, Uint8List path);
 }
diff --git a/sdk/lib/_internal/vm/bin/filter_patch.dart b/sdk/lib/_internal/vm/bin/filter_patch.dart
index 06898f4..c8cf871 100644
--- a/sdk/lib/_internal/vm/bin/filter_patch.dart
+++ b/sdk/lib/_internal/vm/bin/filter_patch.dart
@@ -5,18 +5,19 @@
 // part of "common_patch.dart";
 
 class _FilterImpl extends NativeFieldWrapperClass1 implements RawZLibFilter {
-  void process(List<int> data, int start, int end) native "Filter_Process";
+  @pragma("vm:external-name", "Filter_Process")
+  external void process(List<int> data, int start, int end);
 
-  List<int>? processed({bool flush: true, bool end: false})
-      native "Filter_Processed";
+  @pragma("vm:external-name", "Filter_Processed")
+  external List<int>? processed({bool flush: true, bool end: false});
 }
 
 class _ZLibInflateFilter extends _FilterImpl {
   _ZLibInflateFilter(int windowBits, List<int>? dictionary, bool raw) {
     _init(windowBits, dictionary, raw);
   }
-  void _init(int windowBits, List<int>? dictionary, bool raw)
-      native "Filter_CreateZLibInflate";
+  @pragma("vm:external-name", "Filter_CreateZLibInflate")
+  external void _init(int windowBits, List<int>? dictionary, bool raw);
 }
 
 class _ZLibDeflateFilter extends _FilterImpl {
@@ -24,8 +25,9 @@
       int strategy, List<int>? dictionary, bool raw) {
     _init(gzip, level, windowBits, memLevel, strategy, dictionary, raw);
   }
-  void _init(bool gzip, int level, int windowBits, int memLevel, int strategy,
-      List<int>? dictionary, bool raw) native "Filter_CreateZLibDeflate";
+  @pragma("vm:external-name", "Filter_CreateZLibDeflate")
+  external void _init(bool gzip, int level, int windowBits, int memLevel,
+      int strategy, List<int>? dictionary, bool raw);
 }
 
 @patch
diff --git a/sdk/lib/_internal/vm/bin/io_service_patch.dart b/sdk/lib/_internal/vm/bin/io_service_patch.dart
index 7b93d0e..cbaf99c 100644
--- a/sdk/lib/_internal/vm/bin/io_service_patch.dart
+++ b/sdk/lib/_internal/vm/bin/io_service_patch.dart
@@ -40,7 +40,8 @@
     }
   }
 
-  static SendPort _newServicePort() native "IOService_NewServicePort";
+  @pragma("vm:external-name", "IOService_NewServicePort")
+  external static SendPort _newServicePort();
 }
 
 @patch
diff --git a/sdk/lib/_internal/vm/bin/namespace_patch.dart b/sdk/lib/_internal/vm/bin/namespace_patch.dart
index 2cf329f..50e3a70 100644
--- a/sdk/lib/_internal/vm/bin/namespace_patch.dart
+++ b/sdk/lib/_internal/vm/bin/namespace_patch.dart
@@ -6,11 +6,12 @@
 class _NamespaceImpl extends NativeFieldWrapperClass1 implements _Namespace {
   _NamespaceImpl._();
 
-  static _NamespaceImpl _create(_NamespaceImpl namespace, var n)
-      native "Namespace_Create";
-  static int _getPointer(_NamespaceImpl namespace)
-      native "Namespace_GetPointer";
-  static int _getDefault() native "Namespace_GetDefault";
+  @pragma("vm:external-name", "Namespace_Create")
+  external static _NamespaceImpl _create(_NamespaceImpl namespace, var n);
+  @pragma("vm:external-name", "Namespace_GetPointer")
+  external static int _getPointer(_NamespaceImpl namespace);
+  @pragma("vm:external-name", "Namespace_GetDefault")
+  external static int _getDefault();
 
   // If the platform supports "namespaces", this method is called by the
   // embedder with the platform-specific namespace information.
diff --git a/sdk/lib/_internal/vm/bin/platform_patch.dart b/sdk/lib/_internal/vm/bin/platform_patch.dart
index d187101..db632d6 100644
--- a/sdk/lib/_internal/vm/bin/platform_patch.dart
+++ b/sdk/lib/_internal/vm/bin/platform_patch.dart
@@ -8,29 +8,39 @@
 @pragma("vm:entry-point")
 class _Platform {
   @patch
-  static int _numberOfProcessors() native "Platform_NumberOfProcessors";
+  @pragma("vm:external-name", "Platform_NumberOfProcessors")
+  external static int _numberOfProcessors();
   @patch
-  static String _pathSeparator() native "Platform_PathSeparator";
+  @pragma("vm:external-name", "Platform_PathSeparator")
+  external static String _pathSeparator();
   @patch
-  static String _operatingSystem() native "Platform_OperatingSystem";
+  @pragma("vm:external-name", "Platform_OperatingSystem")
+  external static String _operatingSystem();
   @patch
-  static _operatingSystemVersion() native "Platform_OperatingSystemVersion";
+  @pragma("vm:external-name", "Platform_OperatingSystemVersion")
+  external static _operatingSystemVersion();
   @patch
-  static _localHostname() native "Platform_LocalHostname";
+  @pragma("vm:external-name", "Platform_LocalHostname")
+  external static _localHostname();
   @patch
-  static _executable() native "Platform_ExecutableName";
+  @pragma("vm:external-name", "Platform_ExecutableName")
+  external static _executable();
   @patch
-  static _resolvedExecutable() native "Platform_ResolvedExecutableName";
+  @pragma("vm:external-name", "Platform_ResolvedExecutableName")
+  external static _resolvedExecutable();
   @patch
-  static _environment() native "Platform_Environment";
+  @pragma("vm:external-name", "Platform_Environment")
+  external static _environment();
   @patch
-  static List<String> _executableArguments()
-      native "Platform_ExecutableArguments";
+  @pragma("vm:external-name", "Platform_ExecutableArguments")
+  external static List<String> _executableArguments();
   @patch
-  static String _version() native "Platform_GetVersion";
+  @pragma("vm:external-name", "Platform_GetVersion")
+  external static String _version();
 
   @patch
-  static String _localeName() native "Platform_LocaleName";
+  @pragma("vm:external-name", "Platform_LocaleName")
+  external static String _localeName();
 
   @patch
   static String? _packageRoot() => VMLibraryHooks.packageRootString;
diff --git a/sdk/lib/_internal/vm/bin/process_patch.dart b/sdk/lib/_internal/vm/bin/process_patch.dart
index 6a158e7..426f9d9 100644
--- a/sdk/lib/_internal/vm/bin/process_patch.dart
+++ b/sdk/lib/_internal/vm/bin/process_patch.dart
@@ -7,13 +7,15 @@
 @patch
 class _WindowsCodePageDecoder {
   @patch
-  static String _decodeBytes(List<int> bytes) native "SystemEncodingToString";
+  @pragma("vm:external-name", "SystemEncodingToString")
+  external static String _decodeBytes(List<int> bytes);
 }
 
 @patch
 class _WindowsCodePageEncoder {
   @patch
-  static List<int> _encodeString(String string) native "StringToSystemEncoding";
+  @pragma("vm:external-name", "StringToSystemEncoding")
+  external static List<int> _encodeString(String string);
 }
 
 @patch
@@ -124,9 +126,10 @@
     }
   }
 
-  static _setSignalHandler(int signal) native "Process_SetSignalHandler";
-  static void _clearSignalHandler(int signal)
-      native "Process_ClearSignalHandler";
+  @pragma("vm:external-name", "Process_SetSignalHandler")
+  external static _setSignalHandler(int signal);
+  @pragma("vm:external-name", "Process_ClearSignalHandler")
+  external static void _clearSignalHandler(int signal);
 }
 
 @pragma("vm:entry-point", "call")
@@ -135,16 +138,22 @@
 @patch
 class _ProcessUtils {
   @patch
-  static Never _exit(int status) native "Process_Exit";
+  @pragma("vm:external-name", "Process_Exit")
+  external static Never _exit(int status);
   @patch
-  static void _setExitCode(int status) native "Process_SetExitCode";
+  @pragma("vm:external-name", "Process_SetExitCode")
+  external static void _setExitCode(int status);
   @patch
-  static int _getExitCode() native "Process_GetExitCode";
+  @pragma("vm:external-name", "Process_GetExitCode")
+  external static int _getExitCode();
   @patch
-  static void _sleep(int millis) native "Process_Sleep";
+  @pragma("vm:external-name", "Process_Sleep")
+  external static void _sleep(int millis);
   @patch
-  static int _pid(Process? process) native "Process_Pid";
-  static bool _killPid(int pid, int signal) native "Process_KillPid";
+  @pragma("vm:external-name", "Process_Pid")
+  external static int _pid(Process? process);
+  @pragma("vm:external-name", "Process_KillPid")
+  external static bool _killPid(int pid, int signal);
   @patch
   static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
     if (signal != ProcessSignal.sighup &&
@@ -188,8 +197,10 @@
     return result;
   }
 
-  static _maxRss() native "ProcessInfo_MaxRSS";
-  static _currentRss() native "ProcessInfo_CurrentRSS";
+  @pragma("vm:external-name", "ProcessInfo_MaxRSS")
+  external static _maxRss();
+  @pragma("vm:external-name", "ProcessInfo_CurrentRSS")
+  external static _currentRss();
 }
 
 @pragma("vm:entry-point")
@@ -496,7 +507,8 @@
         getOutput(result[3], stderrEncoding));
   }
 
-  bool _startNative(
+  @pragma("vm:external-name", "Process_Start")
+  external bool _startNative(
       _Namespace namespace,
       String path,
       List<String> arguments,
@@ -507,10 +519,11 @@
       _NativeSocket? stdout,
       _NativeSocket? stderr,
       _NativeSocket? exitHandler,
-      _ProcessStartStatus status) native "Process_Start";
+      _ProcessStartStatus status);
 
-  _wait(_NativeSocket? stdin, _NativeSocket? stdout, _NativeSocket? stderr,
-      _NativeSocket exitHandler) native "Process_Wait";
+  @pragma("vm:external-name", "Process_Wait")
+  external _wait(_NativeSocket? stdin, _NativeSocket? stdout,
+      _NativeSocket? stderr, _NativeSocket exitHandler);
 
   Stream<List<int>> get stdout =>
       _stdout ?? (throw StateError("stdio is not connected"));
diff --git a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
index 5989763..cfd1d6b 100644
--- a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
@@ -83,28 +83,32 @@
     ];
   }
 
-  void connect(
+  @pragma("vm:external-name", "SecureSocket_Connect")
+  external void connect(
       String hostName,
       SecurityContext context,
       bool isServer,
       bool requestClientCertificate,
       bool requireClientCertificate,
-      Uint8List protocols) native "SecureSocket_Connect";
+      Uint8List protocols);
 
   void destroy() {
     buffers = null;
     _destroy();
   }
 
-  void _destroy() native "SecureSocket_Destroy";
+  @pragma("vm:external-name", "SecureSocket_Destroy")
+  external void _destroy();
 
-  int _handshake(SendPort replyPort) native "SecureSocket_Handshake";
+  @pragma("vm:external-name", "SecureSocket_Handshake")
+  external int _handshake(SendPort replyPort);
 
-  void _markAsTrusted(int certificatePtr, bool isTrusted)
-      native "SecureSocket_MarkAsTrusted";
+  @pragma("vm:external-name", "SecureSocket_MarkAsTrusted")
+  external void _markAsTrusted(int certificatePtr, bool isTrusted);
 
-  static X509Certificate _newX509CertificateWrapper(int certificatePtr)
-      native "SecureSocket_NewX509CertificateWrapper";
+  @pragma("vm:external-name", "SecureSocket_NewX509CertificateWrapper")
+  external static X509Certificate _newX509CertificateWrapper(
+      int certificatePtr);
 
   Future<bool> handshake() {
     Completer<bool> evaluatorCompleter = Completer<bool>();
@@ -158,17 +162,21 @@
 
   int processBuffer(int bufferIndex) => throw new UnimplementedError();
 
-  String? selectedProtocol() native "SecureSocket_GetSelectedProtocol";
+  @pragma("vm:external-name", "SecureSocket_GetSelectedProtocol")
+  external String? selectedProtocol();
 
-  void renegotiate(bool useSessionCache, bool requestClientCertificate,
-      bool requireClientCertificate) native "SecureSocket_Renegotiate";
+  @pragma("vm:external-name", "SecureSocket_Renegotiate")
+  external void renegotiate(bool useSessionCache, bool requestClientCertificate,
+      bool requireClientCertificate);
 
-  void init() native "SecureSocket_Init";
+  @pragma("vm:external-name", "SecureSocket_Init")
+  external void init();
 
-  X509Certificate? get peerCertificate native "SecureSocket_PeerCertificate";
+  @pragma("vm:external-name", "SecureSocket_PeerCertificate")
+  external X509Certificate? get peerCertificate;
 
-  void _registerBadCertificateCallback(Function callback)
-      native "SecureSocket_RegisterBadCertificateCallback";
+  @pragma("vm:external-name", "SecureSocket_RegisterBadCertificateCallback")
+  external void _registerBadCertificateCallback(Function callback);
 
   Function? badCertificateCallback;
 
@@ -177,11 +185,13 @@
     _registerBadCertificateCallback(callback);
   }
 
-  void registerHandshakeCompleteCallback(Function handshakeCompleteHandler)
-      native "SecureSocket_RegisterHandshakeCompleteCallback";
+  @pragma("vm:external-name", "SecureSocket_RegisterHandshakeCompleteCallback")
+  external void registerHandshakeCompleteCallback(
+      Function handshakeCompleteHandler);
 
   // This is a security issue, as it exposes a raw pointer to Dart code.
-  int _pointer() native "SecureSocket_FilterPointer";
+  @pragma("vm:external-name", "SecureSocket_FilterPointer")
+  external int _pointer();
 
   @pragma("vm:entry-point", "get")
   List<_ExternalBuffer>? buffers;
@@ -212,7 +222,8 @@
     }
   }
 
-  void _createNativeContext() native "SecurityContext_Allocate";
+  @pragma("vm:external-name", "SecurityContext_Allocate")
+  external void _createNativeContext();
 
   static final SecurityContext defaultContext = new _SecurityContext(true);
 
@@ -221,32 +232,35 @@
     usePrivateKeyBytes(bytes, password: password);
   }
 
-  void usePrivateKeyBytes(List<int> keyBytes, {String? password})
-      native "SecurityContext_UsePrivateKeyBytes";
+  @pragma("vm:external-name", "SecurityContext_UsePrivateKeyBytes")
+  external void usePrivateKeyBytes(List<int> keyBytes, {String? password});
 
   void setTrustedCertificates(String file, {String? password}) {
     List<int> bytes = (new File(file)).readAsBytesSync();
     setTrustedCertificatesBytes(bytes, password: password);
   }
 
-  void setTrustedCertificatesBytes(List<int> certBytes, {String? password})
-      native "SecurityContext_SetTrustedCertificatesBytes";
+  @pragma("vm:external-name", "SecurityContext_SetTrustedCertificatesBytes")
+  external void setTrustedCertificatesBytes(List<int> certBytes,
+      {String? password});
 
   void useCertificateChain(String file, {String? password}) {
     List<int> bytes = (new File(file)).readAsBytesSync();
     useCertificateChainBytes(bytes, password: password);
   }
 
-  void useCertificateChainBytes(List<int> chainBytes, {String? password})
-      native "SecurityContext_UseCertificateChainBytes";
+  @pragma("vm:external-name", "SecurityContext_UseCertificateChainBytes")
+  external void useCertificateChainBytes(List<int> chainBytes,
+      {String? password});
 
   void setClientAuthorities(String file, {String? password}) {
     List<int> bytes = (new File(file)).readAsBytesSync();
     setClientAuthoritiesBytes(bytes, password: password);
   }
 
-  void setClientAuthoritiesBytes(List<int> authCertBytes, {String? password})
-      native "SecurityContext_SetClientAuthoritiesBytes";
+  @pragma("vm:external-name", "SecurityContext_SetClientAuthoritiesBytes")
+  external void setClientAuthoritiesBytes(List<int> authCertBytes,
+      {String? password});
 
   void setAlpnProtocols(List<String> protocols, bool isServer) {
     Uint8List encodedProtocols =
@@ -254,9 +268,10 @@
     _setAlpnProtocols(encodedProtocols, isServer);
   }
 
-  void _setAlpnProtocols(Uint8List protocols, bool isServer)
-      native "SecurityContext_SetAlpnProtocols";
-  void _trustBuiltinRoots() native "SecurityContext_TrustBuiltinRoots";
+  @pragma("vm:external-name", "SecurityContext_SetAlpnProtocols")
+  external void _setAlpnProtocols(Uint8List protocols, bool isServer);
+  @pragma("vm:external-name", "SecurityContext_TrustBuiltinRoots")
+  external void _trustBuiltinRoots();
 }
 
 /**
@@ -269,17 +284,22 @@
   // This is done by WrappedX509Certificate in security_context.cc.
   _X509CertificateImpl._();
 
-  Uint8List get _der native "X509_Der";
+  @pragma("vm:external-name", "X509_Der")
+  external Uint8List get _der;
   late final Uint8List der = _der;
 
-  String get _pem native "X509_Pem";
+  @pragma("vm:external-name", "X509_Pem")
+  external String get _pem;
   late final String pem = _pem;
 
-  Uint8List get _sha1 native "X509_Sha1";
+  @pragma("vm:external-name", "X509_Sha1")
+  external Uint8List get _sha1;
   late final Uint8List sha1 = _sha1;
 
-  String get subject native "X509_Subject";
-  String get issuer native "X509_Issuer";
+  @pragma("vm:external-name", "X509_Subject")
+  external String get subject;
+  @pragma("vm:external-name", "X509_Issuer")
+  external String get issuer;
   DateTime get startValidity {
     return new DateTime.fromMillisecondsSinceEpoch(_startValidity(),
         isUtc: true);
@@ -289,6 +309,8 @@
     return new DateTime.fromMillisecondsSinceEpoch(_endValidity(), isUtc: true);
   }
 
-  int _startValidity() native "X509_StartValidity";
-  int _endValidity() native "X509_EndValidity";
+  @pragma("vm:external-name", "X509_StartValidity")
+  external int _startValidity();
+  @pragma("vm:external-name", "X509_EndValidity")
+  external int _endValidity();
 }
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index ad83f7b..c330ed8 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -41,8 +41,8 @@
     return _optionsCache[key] ??= _getNativeOptionValue(key);
   }
 
-  static int _getNativeOptionValue(int key)
-      native "RawSocketOption_GetOptionValue";
+  @pragma("vm:external-name", "RawSocketOption_GetOptionValue")
+  external static int _getNativeOptionValue(int key);
 }
 
 @patch
@@ -114,7 +114,8 @@
         type: type);
   }
 
-  static bool _listSupported() native "NetworkInterface_ListSupported";
+  @pragma("vm:external-name", "NetworkInterface_ListSupported")
+  external static bool _listSupported();
 }
 
 void _throwOnBadPort(int port) {
@@ -351,11 +352,13 @@
     return "InternetAddress('$address', ${type.name})";
   }
 
-  static String _rawAddrToString(Uint8List address)
-      native "InternetAddress_RawAddrToString";
-  static dynamic /* int | OSError */ _parseScopedLinkLocalAddress(
-      String address) native "InternetAddress_ParseScopedLinkLocalAddress";
-  static Uint8List? _parse(String address) native "InternetAddress_Parse";
+  @pragma("vm:external-name", "InternetAddress_RawAddrToString")
+  external static String _rawAddrToString(Uint8List address);
+  @pragma("vm:external-name", "InternetAddress_ParseScopedLinkLocalAddress")
+  external static dynamic /* int | OSError */ _parseScopedLinkLocalAddress(
+      String address);
+  @pragma("vm:external-name", "InternetAddress_Parse")
+  external static Uint8List? _parse(String address);
 }
 
 class _NetworkInterface implements NetworkInterface {
@@ -375,7 +378,8 @@
 class _NativeSocketNativeWrapper extends NativeFieldWrapperClass1 {}
 
 /// Returns error code that corresponds to EINPROGRESS OS error.
-int get _inProgressErrorCode native "OSError_inProgressErrorCode";
+@pragma("vm:external-name", "OSError_inProgressErrorCode")
+external int get _inProgressErrorCode;
 
 // The _NativeSocket class encapsulates an OS socket.
 class _NativeSocket extends _NativeSocketNativeWrapper with _ServiceObject {
@@ -1526,46 +1530,66 @@
         interfaceAddr?._in_addr, interfaceIndex);
   }
 
-  void nativeSetSocketId(int id, int typeFlags) native "Socket_SetSocketId";
-  int nativeAvailable() native "Socket_Available";
-  bool nativeAvailableDatagram() native "Socket_AvailableDatagram";
-  Uint8List? nativeRead(int len) native "Socket_Read";
-  Datagram? nativeRecvFrom() native "Socket_RecvFrom";
-  int nativeWrite(List<int> buffer, int offset, int bytes)
-      native "Socket_WriteList";
-  int nativeSendTo(List<int> buffer, int offset, int bytes, Uint8List address,
-      int port) native "Socket_SendTo";
-  nativeCreateConnect(Uint8List addr, int port, int scope_id)
-      native "Socket_CreateConnect";
-  nativeCreateUnixDomainConnect(String addr, _Namespace namespace)
-      native "Socket_CreateUnixDomainConnect";
-  nativeCreateBindConnect(Uint8List addr, int port, Uint8List sourceAddr,
-      int scope_id) native "Socket_CreateBindConnect";
-  nativeCreateUnixDomainBindConnect(String addr, String sourceAddr,
-      _Namespace namespace) native "Socket_CreateUnixDomainBindConnect";
-  bool isBindError(int errorNumber) native "SocketBase_IsBindError";
-  nativeCreateBindListen(Uint8List addr, int port, int backlog, bool v6Only,
-      bool shared, int scope_id) native "ServerSocket_CreateBindListen";
-  nativeCreateUnixDomainBindListen(String addr, int backlog, bool shared,
-      _Namespace namespace) native "ServerSocket_CreateUnixDomainBindListen";
-  nativeCreateBindDatagram(Uint8List addr, int port, bool reuseAddress,
-      bool reusePort, int ttl) native "Socket_CreateBindDatagram";
-  bool nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
-  dynamic nativeGetPort() native "Socket_GetPort";
-  List nativeGetRemotePeer() native "Socket_GetRemotePeer";
-  int nativeGetSocketId() native "Socket_GetSocketId";
-  OSError nativeGetError() native "Socket_GetError";
-  nativeGetOption(int option, int protocol) native "Socket_GetOption";
-  void nativeGetRawOption(int level, int option, Uint8List data)
-      native "Socket_GetRawOption";
-  void nativeSetOption(int option, int protocol, value)
-      native "Socket_SetOption";
-  void nativeSetRawOption(int level, int option, Uint8List data)
-      native "Socket_SetRawOption";
-  void nativeJoinMulticast(Uint8List addr, Uint8List? interfaceAddr,
-      int interfaceIndex) native "Socket_JoinMulticast";
-  void nativeLeaveMulticast(Uint8List addr, Uint8List? interfaceAddr,
-      int interfaceIndex) native "Socket_LeaveMulticast";
+  @pragma("vm:external-name", "Socket_SetSocketId")
+  external void nativeSetSocketId(int id, int typeFlags);
+  @pragma("vm:external-name", "Socket_Available")
+  external int nativeAvailable();
+  @pragma("vm:external-name", "Socket_AvailableDatagram")
+  external bool nativeAvailableDatagram();
+  @pragma("vm:external-name", "Socket_Read")
+  external Uint8List? nativeRead(int len);
+  @pragma("vm:external-name", "Socket_RecvFrom")
+  external Datagram? nativeRecvFrom();
+  @pragma("vm:external-name", "Socket_WriteList")
+  external int nativeWrite(List<int> buffer, int offset, int bytes);
+  @pragma("vm:external-name", "Socket_SendTo")
+  external int nativeSendTo(
+      List<int> buffer, int offset, int bytes, Uint8List address, int port);
+  @pragma("vm:external-name", "Socket_CreateConnect")
+  external nativeCreateConnect(Uint8List addr, int port, int scope_id);
+  @pragma("vm:external-name", "Socket_CreateUnixDomainConnect")
+  external nativeCreateUnixDomainConnect(String addr, _Namespace namespace);
+  @pragma("vm:external-name", "Socket_CreateBindConnect")
+  external nativeCreateBindConnect(
+      Uint8List addr, int port, Uint8List sourceAddr, int scope_id);
+  @pragma("vm:external-name", "Socket_CreateUnixDomainBindConnect")
+  external nativeCreateUnixDomainBindConnect(
+      String addr, String sourceAddr, _Namespace namespace);
+  @pragma("vm:external-name", "SocketBase_IsBindError")
+  external bool isBindError(int errorNumber);
+  @pragma("vm:external-name", "ServerSocket_CreateBindListen")
+  external nativeCreateBindListen(Uint8List addr, int port, int backlog,
+      bool v6Only, bool shared, int scope_id);
+  @pragma("vm:external-name", "ServerSocket_CreateUnixDomainBindListen")
+  external nativeCreateUnixDomainBindListen(
+      String addr, int backlog, bool shared, _Namespace namespace);
+  @pragma("vm:external-name", "Socket_CreateBindDatagram")
+  external nativeCreateBindDatagram(
+      Uint8List addr, int port, bool reuseAddress, bool reusePort, int ttl);
+  @pragma("vm:external-name", "ServerSocket_Accept")
+  external bool nativeAccept(_NativeSocket socket);
+  @pragma("vm:external-name", "Socket_GetPort")
+  external dynamic nativeGetPort();
+  @pragma("vm:external-name", "Socket_GetRemotePeer")
+  external List nativeGetRemotePeer();
+  @pragma("vm:external-name", "Socket_GetSocketId")
+  external int nativeGetSocketId();
+  @pragma("vm:external-name", "Socket_GetError")
+  external OSError nativeGetError();
+  @pragma("vm:external-name", "Socket_GetOption")
+  external nativeGetOption(int option, int protocol);
+  @pragma("vm:external-name", "Socket_GetRawOption")
+  external void nativeGetRawOption(int level, int option, Uint8List data);
+  @pragma("vm:external-name", "Socket_SetOption")
+  external void nativeSetOption(int option, int protocol, value);
+  @pragma("vm:external-name", "Socket_SetRawOption")
+  external void nativeSetRawOption(int level, int option, Uint8List data);
+  @pragma("vm:external-name", "Socket_JoinMulticast")
+  external void nativeJoinMulticast(
+      Uint8List addr, Uint8List? interfaceAddr, int interfaceIndex);
+  @pragma("vm:external-name", "Socket_LeaveMulticast")
+  external void nativeLeaveMulticast(
+      Uint8List addr, Uint8List? interfaceAddr, int interfaceIndex);
 }
 
 class _RawServerSocket extends Stream<RawSocket> implements RawServerSocket {
diff --git a/sdk/lib/_internal/vm/bin/stdio_patch.dart b/sdk/lib/_internal/vm/bin/stdio_patch.dart
index cf02d62..6a6bd2c 100644
--- a/sdk/lib/_internal/vm/bin/stdio_patch.dart
+++ b/sdk/lib/_internal/vm/bin/stdio_patch.dart
@@ -50,7 +50,8 @@
   }
 
   @patch
-  static _getStdioHandleType(int fd) native "File_GetStdioHandleType";
+  @pragma("vm:external-name", "File_GetStdioHandleType")
+  external static _getStdioHandleType(int fd);
 }
 
 @patch
@@ -115,12 +116,18 @@
     return result;
   }
 
-  static _echoMode(int fd) native "Stdin_GetEchoMode";
-  static _setEchoMode(int fd, bool enabled) native "Stdin_SetEchoMode";
-  static _lineMode(int fd) native "Stdin_GetLineMode";
-  static _setLineMode(int fd, bool enabled) native "Stdin_SetLineMode";
-  static _readByte(int fd) native "Stdin_ReadByte";
-  static _supportsAnsiEscapes(int fd) native "Stdin_AnsiSupported";
+  @pragma("vm:external-name", "Stdin_GetEchoMode")
+  external static _echoMode(int fd);
+  @pragma("vm:external-name", "Stdin_SetEchoMode")
+  external static _setEchoMode(int fd, bool enabled);
+  @pragma("vm:external-name", "Stdin_GetLineMode")
+  external static _lineMode(int fd);
+  @pragma("vm:external-name", "Stdin_SetLineMode")
+  external static _setLineMode(int fd, bool enabled);
+  @pragma("vm:external-name", "Stdin_ReadByte")
+  external static _readByte(int fd);
+  @pragma("vm:external-name", "Stdin_AnsiSupported")
+  external static _supportsAnsiEscapes(int fd);
 }
 
 @patch
@@ -140,7 +147,8 @@
     return size;
   }
 
-  static _getTerminalSize(int fd) native "Stdout_GetTerminalSize";
+  @pragma("vm:external-name", "Stdout_GetTerminalSize")
+  external static _getTerminalSize(int fd);
 
   @patch
   static bool _supportsAnsiEscapes(int fd) {
@@ -151,9 +159,11 @@
     return result;
   }
 
-  static _getAnsiSupported(int fd) native "Stdout_AnsiSupported";
+  @pragma("vm:external-name", "Stdout_AnsiSupported")
+  external static _getAnsiSupported(int fd);
 }
 
-bool _getStdioHandle(_NativeSocket socket, int num)
-    native "Socket_GetStdioHandle";
-_getSocketType(_NativeSocket nativeSocket) native "Socket_GetType";
+@pragma("vm:external-name", "Socket_GetStdioHandle")
+external bool _getStdioHandle(_NativeSocket socket, int num);
+@pragma("vm:external-name", "Socket_GetType")
+external _getSocketType(_NativeSocket nativeSocket);
diff --git a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
index 6554c11..708a1e7 100644
--- a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
@@ -298,19 +298,26 @@
   }
 
   // Native method declarations.
-  static _nativeLookupRequest(host, int type)
-      native "SynchronousSocket_LookupRequest";
-  _nativeCreateConnectSync(host, int port)
-      native "SynchronousSocket_CreateConnectSync";
-  _nativeAvailable() native "SynchronousSocket_Available";
-  _nativeCloseSync() native "SynchronousSocket_CloseSync";
-  int _nativeGetPort() native "SynchronousSocket_GetPort";
-  List _nativeGetRemotePeer() native "SynchronousSocket_GetRemotePeer";
-  _nativeRead(int len) native "SynchronousSocket_Read";
-  _nativeReadInto(List<int> buffer, int offset, int bytes)
-      native "SynchronousSocket_ReadList";
-  _nativeShutdownRead() native "SynchronousSocket_ShutdownRead";
-  _nativeShutdownWrite() native "SynchronousSocket_ShutdownWrite";
-  _nativeWrite(List<int> buffer, int offset, int bytes)
-      native "SynchronousSocket_WriteList";
+  @pragma("vm:external-name", "SynchronousSocket_LookupRequest")
+  external static _nativeLookupRequest(host, int type);
+  @pragma("vm:external-name", "SynchronousSocket_CreateConnectSync")
+  external _nativeCreateConnectSync(host, int port);
+  @pragma("vm:external-name", "SynchronousSocket_Available")
+  external _nativeAvailable();
+  @pragma("vm:external-name", "SynchronousSocket_CloseSync")
+  external _nativeCloseSync();
+  @pragma("vm:external-name", "SynchronousSocket_GetPort")
+  external int _nativeGetPort();
+  @pragma("vm:external-name", "SynchronousSocket_GetRemotePeer")
+  external List _nativeGetRemotePeer();
+  @pragma("vm:external-name", "SynchronousSocket_Read")
+  external _nativeRead(int len);
+  @pragma("vm:external-name", "SynchronousSocket_ReadList")
+  external _nativeReadInto(List<int> buffer, int offset, int bytes);
+  @pragma("vm:external-name", "SynchronousSocket_ShutdownRead")
+  external _nativeShutdownRead();
+  @pragma("vm:external-name", "SynchronousSocket_ShutdownWrite")
+  external _nativeShutdownWrite();
+  @pragma("vm:external-name", "SynchronousSocket_WriteList")
+  external _nativeWrite(List<int> buffer, int offset, int bytes);
 }
diff --git a/sdk/lib/_internal/vm/bin/vmservice_io.dart b/sdk/lib/_internal/vm/bin/vmservice_io.dart
index 833e5a2..fbedb80 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_io.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_io.dart
@@ -384,4 +384,5 @@
   _registerSignalHandlerTimer = Timer(shortDelay, _registerSignalHandler);
 }
 
-_shutdown() native 'VMServiceIO_Shutdown';
+@pragma("vm:external-name", "VMServiceIO_Shutdown")
+external _shutdown();
diff --git a/sdk/lib/_internal/vm/bin/vmservice_server.dart b/sdk/lib/_internal/vm/bin/vmservice_server.dart
index f5742ed..c8e61b2 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_server.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_server.dart
@@ -522,4 +522,5 @@
   }
 }
 
-void _notifyServerState(String uri) native 'VMServiceIO_NotifyServerState';
+@pragma("vm:external-name", "VMServiceIO_NotifyServerState")
+external void _notifyServerState(String uri);
diff --git a/sdk/lib/_internal/vm/lib/array.dart b/sdk/lib/_internal/vm/lib/array.dart
index 90a6fda..c897b67 100644
--- a/sdk/lib/_internal/vm/lib/array.dart
+++ b/sdk/lib/_internal/vm/lib/array.dart
@@ -10,7 +10,8 @@
   @pragma("vm:exact-result-type",
       <dynamic>[_List, "result-type-uses-passed-type-arguments"])
   @pragma("vm:prefer-inline")
-  factory _List(length) native "List_allocate";
+  @pragma("vm:external-name", "List_allocate")
+  external factory _List(length);
 
   // Specialization of List.empty constructor for growable == false.
   // Used by pkg/vm/lib/transformations/list_factory_specializer.dart.
@@ -107,7 +108,8 @@
   }
 
   @pragma("vm:recognized", "graph-intrinsic")
-  E operator [](int index) native "List_getIndexed";
+  @pragma("vm:external-name", "List_getIndexed")
+  external E operator [](int index);
 
   @pragma("vm:recognized", "other")
   void operator []=(int index, E value) {
@@ -115,12 +117,14 @@
   }
 
   @pragma("vm:recognized", "graph-intrinsic")
-  void _setIndexed(int index, E value) native "List_setIndexed";
+  @pragma("vm:external-name", "List_setIndexed")
+  external void _setIndexed(int index, E value);
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get length native "List_getLength";
+  @pragma("vm:external-name", "List_getLength")
+  external int get length;
 
   @pragma("vm:prefer-inline")
   _List _slice(int start, int count, bool needsTypeArgument) {
@@ -135,8 +139,8 @@
     }
   }
 
-  _List _sliceInternal(int start, int count, bool needsTypeArgument)
-      native "List_slice";
+  @pragma("vm:external-name", "List_slice")
+  external _List _sliceInternal(int start, int count, bool needsTypeArgument);
 
   // List interface.
   void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
@@ -261,16 +265,18 @@
         "ImmutableArray can only be allocated by the VM");
   }
 
-  factory _ImmutableList._from(List from, int offset, int length)
-      native "ImmutableList_from";
+  @pragma("vm:external-name", "ImmutableList_from")
+  external factory _ImmutableList._from(List from, int offset, int length);
 
   @pragma("vm:recognized", "graph-intrinsic")
-  E operator [](int index) native "List_getIndexed";
+  @pragma("vm:external-name", "List_getIndexed")
+  external E operator [](int index);
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get length native "List_getLength";
+  @pragma("vm:external-name", "List_getLength")
+  external int get length;
 
   List<E> sublist(int start, [int? end]) {
     final int actualEnd = RangeError.checkValidRange(start, end, this.length);
diff --git a/sdk/lib/_internal/vm/lib/array_patch.dart b/sdk/lib/_internal/vm/lib/array_patch.dart
index 92824e6..6aea645 100644
--- a/sdk/lib/_internal/vm/lib/array_patch.dart
+++ b/sdk/lib/_internal/vm/lib/array_patch.dart
@@ -13,7 +13,8 @@
 
   @patch
   @pragma("vm:recognized", "other")
-  factory List([int? length]) native "List_new";
+  @pragma("vm:external-name", "List_new")
+  external factory List([int? length]);
 
   @patch
   factory List.filled(int length, E fill, {bool growable: false}) {
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 5c5ee05..4e56a79 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -15,7 +15,8 @@
 // part "timer_patch.dart";
 
 // Equivalent of calling FATAL from C++ code.
-_fatal(msg) native "DartAsync_fatal";
+@pragma("vm:external-name", "DartAsync_fatal")
+external _fatal(msg);
 
 // We need to pass the value as first argument and leave the second and third
 // arguments empty (used for error handling).
@@ -244,7 +245,8 @@
 }
 
 @patch
-void _rethrow(Object error, StackTrace stackTrace) native "Async_rethrow";
+@pragma("vm:external-name", "Async_rethrow")
+external void _rethrow(Object error, StackTrace stackTrace);
 
 @patch
 class _StreamImpl<T> {
@@ -275,5 +277,5 @@
   }
 }
 
-void _moveNextDebuggerStepCheck(Function async_op)
-    native "AsyncStarMoveNext_debuggerStepCheck";
+@pragma("vm:external-name", "AsyncStarMoveNext_debuggerStepCheck")
+external void _moveNextDebuggerStepCheck(Function async_op);
diff --git a/sdk/lib/_internal/vm/lib/bool_patch.dart b/sdk/lib/_internal/vm/lib/bool_patch.dart
index d627d46..1bbaacd 100644
--- a/sdk/lib/_internal/vm/lib/bool_patch.dart
+++ b/sdk/lib/_internal/vm/lib/bool_patch.dart
@@ -8,11 +8,13 @@
 @pragma("vm:entry-point")
 class bool {
   @patch
-  const factory bool.fromEnvironment(String name, {bool defaultValue: false})
-      native "Bool_fromEnvironment";
+  @pragma("vm:external-name", "Bool_fromEnvironment")
+  external const factory bool.fromEnvironment(String name,
+      {bool defaultValue: false});
 
   @patch
-  const factory bool.hasEnvironment(String name) native "Bool_hasEnvironment";
+  @pragma("vm:external-name", "Bool_hasEnvironment")
+  external const factory bool.hasEnvironment(String name);
 
   @patch
   int get hashCode => this ? 1231 : 1237;
diff --git a/sdk/lib/_internal/vm/lib/class_id_fasta.dart b/sdk/lib/_internal/vm/lib/class_id_fasta.dart
index 52c81ad..0b79b93 100644
--- a/sdk/lib/_internal/vm/lib/class_id_fasta.dart
+++ b/sdk/lib/_internal/vm/lib/class_id_fasta.dart
@@ -8,7 +8,8 @@
 class ClassID {
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  static int getID(Object? value) native "ClassID_getID";
+  @pragma("vm:external-name", "ClassID_getID")
+  external static int getID(Object? value);
 
   @pragma("vm:entry-point")
   static final int cidArray = 0;
diff --git a/sdk/lib/_internal/vm/lib/compact_hash.dart b/sdk/lib/_internal/vm/lib/compact_hash.dart
index abd8baa..096f7ef 100644
--- a/sdk/lib/_internal/vm/lib/compact_hash.dart
+++ b/sdk/lib/_internal/vm/lib/compact_hash.dart
@@ -51,42 +51,52 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:typed_data#_Uint32List")
   @pragma("vm:prefer-inline")
-  Uint32List get _index native "LinkedHashBase_getIndex";
+  @pragma("vm:external-name", "LinkedHashBase_getIndex")
+  external Uint32List get _index;
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  void set _index(Uint32List value) native "LinkedHashBase_setIndex";
+  @pragma("vm:external-name", "LinkedHashBase_setIndex")
+  external void set _index(Uint32List value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get _hashMask native "LinkedHashBase_getHashMask";
+  @pragma("vm:external-name", "LinkedHashBase_getHashMask")
+  external int get _hashMask;
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  void set _hashMask(int value) native "LinkedHashBase_setHashMask";
+  @pragma("vm:external-name", "LinkedHashBase_setHashMask")
+  external void set _hashMask(int value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_List")
   @pragma("vm:prefer-inline")
-  List get _data native "LinkedHashBase_getData";
+  @pragma("vm:external-name", "LinkedHashBase_getData")
+  external List get _data;
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  void set _data(List value) native "LinkedHashBase_setData";
+  @pragma("vm:external-name", "LinkedHashBase_setData")
+  external void set _data(List value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get _usedData native "LinkedHashBase_getUsedData";
+  @pragma("vm:external-name", "LinkedHashBase_getUsedData")
+  external int get _usedData;
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  void set _usedData(int value) native "LinkedHashBase_setUsedData";
+  @pragma("vm:external-name", "LinkedHashBase_setUsedData")
+  external void set _usedData(int value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get _deletedKeys native "LinkedHashBase_getDeletedKeys";
+  @pragma("vm:external-name", "LinkedHashBase_getDeletedKeys")
+  external int get _deletedKeys;
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  void set _deletedKeys(int value) native "LinkedHashBase_setDeletedKeys";
+  @pragma("vm:external-name", "LinkedHashBase_setDeletedKeys")
+  external void set _deletedKeys(int value);
 }
 
 // Base class for VM-internal classes; keep in sync with _HashFieldBase.
diff --git a/sdk/lib/_internal/vm/lib/convert_patch.dart b/sdk/lib/_internal/vm/lib/convert_patch.dart
index 9e920ea..2885579 100644
--- a/sdk/lib/_internal/vm/lib/convert_patch.dart
+++ b/sdk/lib/_internal/vm/lib/convert_patch.dart
@@ -1574,7 +1574,8 @@
   }
 }
 
-double _parseDouble(String source, int start, int end) native "Double_parse";
+@pragma("vm:external-name", "Double_parse")
+external double _parseDouble(String source, int start, int end);
 
 /**
  * Implements the chunked conversion from a UTF-8 encoding of JSON
diff --git a/sdk/lib/_internal/vm/lib/core_patch.dart b/sdk/lib/_internal/vm/lib/core_patch.dart
index 561b7f1..3118350 100644
--- a/sdk/lib/_internal/vm/lib/core_patch.dart
+++ b/sdk/lib/_internal/vm/lib/core_patch.dart
@@ -231,5 +231,6 @@
 @patch
 class StackTrace {
   @patch
-  static StackTrace get current native "StackTrace_current";
+  @pragma("vm:external-name", "StackTrace_current")
+  external static StackTrace get current;
 }
diff --git a/sdk/lib/_internal/vm/lib/date_patch.dart b/sdk/lib/_internal/vm/lib/date_patch.dart
index 5485c90..eec2bf5 100644
--- a/sdk/lib/_internal/vm/lib/date_patch.dart
+++ b/sdk/lib/_internal/vm/lib/date_patch.dart
@@ -9,17 +9,19 @@
 class DateTime {
   // Natives.
   // The natives have been moved up here to work around Issue 10401.
-  static int _getCurrentMicros() native "DateTime_currentTimeMicros";
+  @pragma("vm:external-name", "DateTime_currentTimeMicros")
+  external static int _getCurrentMicros();
 
-  static String _timeZoneNameForClampedSeconds(int secondsSinceEpoch)
-      native "DateTime_timeZoneName";
+  @pragma("vm:external-name", "DateTime_timeZoneName")
+  external static String _timeZoneNameForClampedSeconds(int secondsSinceEpoch);
 
-  static int _timeZoneOffsetInSecondsForClampedSeconds(int secondsSinceEpoch)
-      native "DateTime_timeZoneOffsetInSeconds";
+  @pragma("vm:external-name", "DateTime_timeZoneOffsetInSeconds")
+  external static int _timeZoneOffsetInSecondsForClampedSeconds(
+      int secondsSinceEpoch);
 
   // Daylight-savings independent adjustment for the local time zone.
-  static int _localTimeZoneAdjustmentInSeconds()
-      native "DateTime_localTimeZoneAdjustmentInSeconds";
+  @pragma("vm:external-name", "DateTime_localTimeZoneAdjustmentInSeconds")
+  external static int _localTimeZoneAdjustmentInSeconds();
 
   static const _MICROSECOND_INDEX = 0;
   static const _MILLISECOND_INDEX = 1;
diff --git a/sdk/lib/_internal/vm/lib/developer.dart b/sdk/lib/_internal/vm/lib/developer.dart
index f0b2a1c..46d0507 100644
--- a/sdk/lib/_internal/vm/lib/developer.dart
+++ b/sdk/lib/_internal/vm/lib/developer.dart
@@ -18,10 +18,12 @@
 // part "timeline.dart"
 
 @patch
-bool debugger({bool when: true, String? message}) native "Developer_debugger";
+@pragma("vm:external-name", "Developer_debugger")
+external bool debugger({bool when: true, String? message});
 
 @patch
-Object? inspect(Object? object) native "Developer_inspect";
+@pragma("vm:external-name", "Developer_inspect")
+external Object? inspect(Object? object);
 
 @patch
 void log(String message,
@@ -50,20 +52,21 @@
 
 int _nextSequenceNumber = 0;
 
-_log(String message, int timestamp, int sequenceNumber, int level, String name,
-    Zone? zone, Object? error, StackTrace? stackTrace) native "Developer_log";
+@pragma("vm:external-name", "Developer_log")
+external _log(String message, int timestamp, int sequenceNumber, int level,
+    String name, Zone? zone, Object? error, StackTrace? stackTrace);
 
 @patch
-void _postEvent(String eventKind, String eventData)
-    native "Developer_postEvent";
+@pragma("vm:external-name", "Developer_postEvent")
+external void _postEvent(String eventKind, String eventData);
 
 @patch
-ServiceExtensionHandler? _lookupExtension(String method)
-    native "Developer_lookupExtension";
+@pragma("vm:external-name", "Developer_lookupExtension")
+external ServiceExtensionHandler? _lookupExtension(String method);
 
 @patch
-_registerExtension(String method, ServiceExtensionHandler handler)
-    native "Developer_registerExtension";
+@pragma("vm:external-name", "Developer_registerExtension")
+external _registerExtension(String method, ServiceExtensionHandler handler);
 
 // This code is only invoked when there is no other Dart code on the stack.
 @pragma("vm:entry-point", !const bool.fromEnvironment("dart.vm.product"))
@@ -152,18 +155,22 @@
 }
 
 @patch
-int _getServiceMajorVersion() native "Developer_getServiceMajorVersion";
+@pragma("vm:external-name", "Developer_getServiceMajorVersion")
+external int _getServiceMajorVersion();
 
 @patch
-int _getServiceMinorVersion() native "Developer_getServiceMinorVersion";
+@pragma("vm:external-name", "Developer_getServiceMinorVersion")
+external int _getServiceMinorVersion();
 
 @patch
-void _getServerInfo(SendPort sendPort) native "Developer_getServerInfo";
+@pragma("vm:external-name", "Developer_getServerInfo")
+external void _getServerInfo(SendPort sendPort);
 
 @patch
-void _webServerControl(SendPort sendPort, bool enable, bool? silenceOutput)
-    native "Developer_webServerControl";
+@pragma("vm:external-name", "Developer_webServerControl")
+external void _webServerControl(
+    SendPort sendPort, bool enable, bool? silenceOutput);
 
 @patch
-String _getIsolateIDFromSendPort(SendPort sendPort)
-    native "Developer_getIsolateIDFromSendPort";
+@pragma("vm:external-name", "Developer_getIsolateIDFromSendPort")
+external String _getIsolateIDFromSendPort(SendPort sendPort);
diff --git a/sdk/lib/_internal/vm/lib/double.dart b/sdk/lib/_internal/vm/lib/double.dart
index 7559150..e801e3d 100644
--- a/sdk/lib/_internal/vm/lib/double.dart
+++ b/sdk/lib/_internal/vm/lib/double.dart
@@ -8,12 +8,15 @@
 class _Double implements double {
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", _Double)
-  factory _Double.fromInteger(int value) native "Double_doubleFromInteger";
+  @pragma("vm:external-name", "Double_doubleFromInteger")
+  external factory _Double.fromInteger(int value);
 
   @pragma("vm:recognized", "asm-intrinsic")
-  int get hashCode native "Double_hashCode";
+  @pragma("vm:external-name", "Double_hashCode")
+  external int get hashCode;
   @pragma("vm:recognized", "asm-intrinsic")
-  int get _identityHashCode native "Double_hashCode";
+  @pragma("vm:external-name", "Double_hashCode")
+  external int get _identityHashCode;
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", _Double)
@@ -24,7 +27,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Double)
-  double _add(double other) native "Double_add";
+  @pragma("vm:external-name", "Double_add")
+  external double _add(double other);
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", _Double)
@@ -35,7 +39,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Double)
-  double _sub(double other) native "Double_sub";
+  @pragma("vm:external-name", "Double_sub")
+  external double _sub(double other);
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", _Double)
@@ -46,7 +51,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Double)
-  double _mul(double other) native "Double_mul";
+  @pragma("vm:external-name", "Double_mul")
+  external double _mul(double other);
 
   int operator ~/(num other) {
     return (this / other.toDouble()).truncate();
@@ -61,7 +67,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Double)
-  double _div(double other) native "Double_div";
+  @pragma("vm:external-name", "Double_div")
+  external double _div(double other);
 
   double operator %(num other) {
     return _modulo(other.toDouble());
@@ -70,17 +77,20 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
   @pragma("vm:exact-result-type", _Double)
-  double _modulo(double other) native "Double_modulo";
+  @pragma("vm:external-name", "Double_modulo")
+  external double _modulo(double other);
 
   double remainder(num other) {
     return _remainder(other.toDouble());
   }
 
-  double _remainder(double other) native "Double_remainder";
+  @pragma("vm:external-name", "Double_remainder")
+  external double _remainder(double other);
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", _Double)
-  double operator -() native "Double_flipSignBit";
+  @pragma("vm:external-name", "Double_flipSignBit")
+  external double operator -();
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
@@ -90,9 +100,11 @@
   }
 
   @pragma("vm:exact-result-type", bool)
-  bool _equal(double other) native "Double_equal";
+  @pragma("vm:external-name", "Double_equal")
+  external bool _equal(double other);
   @pragma("vm:exact-result-type", bool)
-  bool _equalToInteger(int other) native "Double_equalToInteger";
+  @pragma("vm:external-name", "Double_equalToInteger")
+  external bool _equalToInteger(int other);
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
@@ -109,7 +121,8 @@
   }
 
   @pragma("vm:exact-result-type", bool)
-  bool _greaterThan(double other) native "Double_greaterThan";
+  @pragma("vm:external-name", "Double_greaterThan")
+  external bool _greaterThan(double other);
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
@@ -151,18 +164,21 @@
     return new _Double.fromInteger(other)._remainder(this);
   }
 
-  bool _greaterThanFromInteger(int other)
-      native "Double_greaterThanFromInteger";
+  @pragma("vm:external-name", "Double_greaterThanFromInteger")
+  external bool _greaterThanFromInteger(int other);
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
-  bool get isNegative native "Double_getIsNegative";
+  @pragma("vm:external-name", "Double_getIsNegative")
+  external bool get isNegative;
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
-  bool get isInfinite native "Double_getIsInfinite";
+  @pragma("vm:external-name", "Double_getIsInfinite")
+  external bool get isInfinite;
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
-  bool get isNaN native "Double_getIsNaN";
+  @pragma("vm:external-name", "Double_getIsNaN")
+  external bool get isNaN;
   bool get isFinite => !isInfinite && !isNaN; // Can be optimized.
 
   double abs() {
@@ -190,19 +206,23 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
   @pragma("vm:exact-result-type", _Double)
-  double roundToDouble() native "Double_round";
+  @pragma("vm:external-name", "Double_round")
+  external double roundToDouble();
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
   @pragma("vm:exact-result-type", _Double)
-  double floorToDouble() native "Double_floor";
+  @pragma("vm:external-name", "Double_floor")
+  external double floorToDouble();
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
   @pragma("vm:exact-result-type", _Double)
-  double ceilToDouble() native "Double_ceil";
+  @pragma("vm:external-name", "Double_ceil")
+  external double ceilToDouble();
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
   @pragma("vm:exact-result-type", _Double)
-  double truncateToDouble() native "Double_truncate";
+  @pragma("vm:external-name", "Double_truncate")
+  external double truncateToDouble();
 
   num clamp(num lowerLimit, num upperLimit) {
     // TODO: Remove these null checks once all code is opted into strong nonnullable mode.
@@ -224,7 +244,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
   @pragma("vm:non-nullable-result-type")
-  int toInt() native "Double_toInt";
+  @pragma("vm:external-name", "Double_toInt")
+  external int toInt();
 
   double toDouble() {
     return this;
@@ -237,7 +258,8 @@
   static final List _cache = new List.filled(CACHE_LENGTH, null);
   static int _cacheEvictIndex = 0;
 
-  String _toString() native "Double_toString";
+  @pragma("vm:external-name", "Double_toString")
+  external String _toString();
 
   String toString() {
     // TODO(koda): Consider starting at most recently inserted.
@@ -288,7 +310,8 @@
     return _toStringAsFixed(fractionDigits);
   }
 
-  String _toStringAsFixed(int fractionDigits) native "Double_toStringAsFixed";
+  @pragma("vm:external-name", "Double_toStringAsFixed")
+  external String _toStringAsFixed(int fractionDigits);
 
   String toStringAsExponential([int? fractionDigits]) {
     // See ECMAScript-262, 15.7.4.6 for details.
@@ -315,8 +338,8 @@
     return _toStringAsExponential(fractionDigits);
   }
 
-  String _toStringAsExponential(int fractionDigits)
-      native "Double_toStringAsExponential";
+  @pragma("vm:external-name", "Double_toStringAsExponential")
+  external String _toStringAsExponential(int fractionDigits);
 
   String toStringAsPrecision(int precision) {
     // See ECMAScript-262, 15.7.4.7 for details.
@@ -340,8 +363,8 @@
     return _toStringAsPrecision(precision);
   }
 
-  String _toStringAsPrecision(int fractionDigits)
-      native "Double_toStringAsPrecision";
+  @pragma("vm:external-name", "Double_toStringAsPrecision")
+  external String _toStringAsPrecision(int fractionDigits);
 
   // Order is: NaN > Infinity > ... > 0.0 > -0.0 > ... > -Infinity.
   int compareTo(num other) {
diff --git a/sdk/lib/_internal/vm/lib/double_patch.dart b/sdk/lib/_internal/vm/lib/double_patch.dart
index e6ccf5c..5c66c88 100644
--- a/sdk/lib/_internal/vm/lib/double_patch.dart
+++ b/sdk/lib/_internal/vm/lib/double_patch.dart
@@ -8,8 +8,8 @@
 
 @patch
 class double {
-  static double? _nativeParse(String str, int start, int end)
-      native "Double_parse";
+  @pragma("vm:external-name", "Double_parse")
+  external static double? _nativeParse(String str, int start, int end);
 
   static double? _tryParseDouble(String str, int start, int end) {
     assert(start < end);
diff --git a/sdk/lib/_internal/vm/lib/errors_patch.dart b/sdk/lib/_internal/vm/lib/errors_patch.dart
index 3de48d4..0e3a676 100644
--- a/sdk/lib/_internal/vm/lib/errors_patch.dart
+++ b/sdk/lib/_internal/vm/lib/errors_patch.dart
@@ -42,10 +42,12 @@
     _doThrowNewSource('$name != null', line, column, null);
   }
 
-  static _doThrowNew(int assertionStart, int assertionEnd, Object? message)
-      native "AssertionError_throwNew";
-  static _doThrowNewSource(String failedAssertion, int line, int column,
-      Object? message) native "AssertionError_throwNewSource";
+  @pragma("vm:external-name", "AssertionError_throwNew")
+  external static _doThrowNew(
+      int assertionStart, int assertionEnd, Object? message);
+  @pragma("vm:external-name", "AssertionError_throwNewSource")
+  external static _doThrowNewSource(
+      String failedAssertion, int line, int column, Object? message);
 
   @pragma("vm:entry-point", "call")
   static _evaluateAssertion(condition) {
@@ -94,8 +96,9 @@
   _TypeError._create(this._url, this._line, this._column, this._message);
 
   @pragma("vm:entry-point", "call")
-  static _throwNew(int location, Object srcValue, _Type dstType, String dstName)
-      native "TypeError_throwNew";
+  @pragma("vm:external-name", "TypeError_throwNew")
+  external static _throwNew(
+      int location, Object srcValue, _Type dstType, String dstName);
 
   String toString() => _message;
 
@@ -127,7 +130,8 @@
   @pragma("vm:entry-point")
   FallThroughError._create(this._url, this._line);
 
-  static _throwNew(int caseClausePos) native "FallThroughError_throwNew";
+  @pragma("vm:external-name", "FallThroughError_throwNew")
+  external static _throwNew(int caseClausePos);
 
   @patch
   String toString() {
@@ -168,8 +172,8 @@
   AbstractClassInstantiationError._create(
       this._className, this._url, this._line);
 
-  static _throwNew(int caseClausePos, String className)
-      native "AbstractClassInstantiationError_throwNew";
+  @pragma("vm:external-name", "AbstractClassInstantiationError_throwNew")
+  external static _throwNew(int caseClausePos, String className);
 
   @patch
   String toString() {
@@ -264,8 +268,9 @@
                 ? _NamedArgumentsMap(arguments!, argumentNames)
                 : null);
 
-  static String? _existingMethodSignature(Object? receiver, String methodName,
-      int invocationType) native "NoSuchMethodError_existingMethodSignature";
+  @pragma("vm:external-name", "NoSuchMethodError_existingMethodSignature")
+  external static String? _existingMethodSignature(
+      Object? receiver, String methodName, int invocationType);
 
   @patch
   String toString() {
@@ -445,7 +450,9 @@
     if (invocation.typeArguments.isNotEmpty) {
       buffer.write("<");
       for (var type in invocation.typeArguments) {
-        buffer..write(separator)..write("_");
+        buffer
+          ..write(separator)
+          ..write("_");
         separator = ", ";
       }
       buffer.write(">");
@@ -453,14 +460,21 @@
     }
     buffer.write("(");
     for (var argument in invocation.positionalArguments) {
-      buffer..write(separator)..write("_");
+      buffer
+        ..write(separator)
+        ..write("_");
       separator = ", ";
     }
     if (invocation.namedArguments.isNotEmpty) {
-      buffer..write(separator)..write("{");
+      buffer
+        ..write(separator)
+        ..write("{");
       separator = "";
       for (var name in invocation.namedArguments.keys) {
-        buffer..write(separator)..write(_symbolToString(name))..write(": _");
+        buffer
+          ..write(separator)
+          ..write(_symbolToString(name))
+          ..write(": _");
         separator = ",";
       }
       buffer.write("}");
diff --git a/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart b/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart
index 2966149..b9bcaf0 100644
--- a/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart
@@ -8,9 +8,12 @@
 import 'dart:typed_data';
 import 'dart:isolate';
 
-DynamicLibrary _open(String path) native "Ffi_dl_open";
-DynamicLibrary _processLibrary() native "Ffi_dl_processLibrary";
-DynamicLibrary _executableLibrary() native "Ffi_dl_executableLibrary";
+@pragma("vm:external-name", "Ffi_dl_open")
+external DynamicLibrary _open(String path);
+@pragma("vm:external-name", "Ffi_dl_processLibrary")
+external DynamicLibrary _processLibrary();
+@pragma("vm:external-name", "Ffi_dl_executableLibrary")
+external DynamicLibrary _executableLibrary();
 
 @patch
 @pragma("vm:entry-point")
@@ -27,15 +30,17 @@
   factory DynamicLibrary.executable() => _executableLibrary();
 
   @patch
-  Pointer<T> lookup<T extends NativeType>(String symbolName)
-      native "Ffi_dl_lookup";
+  @pragma("vm:external-name", "Ffi_dl_lookup")
+  external Pointer<T> lookup<T extends NativeType>(String symbolName);
 
   @patch
-  bool providesSymbol(String symbolName) native "Ffi_dl_providesSymbol";
+  @pragma("vm:external-name", "Ffi_dl_providesSymbol")
+  external bool providesSymbol(String symbolName);
 
   // TODO(dacoharkes): Expose this to users, or extend Pointer?
   // https://github.com/dart-lang/sdk/issues/35881
-  int getHandle() native "Ffi_dl_getHandle";
+  @pragma("vm:external-name", "Ffi_dl_getHandle")
+  external int getHandle();
 
   @patch
   bool operator ==(Object other) {
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index ac745e3..b3faeab 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -31,18 +31,19 @@
 }
 
 @pragma("vm:recognized", "other")
-Pointer<T> _fromAddress<T extends NativeType>(int ptr) native "Ffi_fromAddress";
+@pragma("vm:external-name", "Ffi_fromAddress")
+external Pointer<T> _fromAddress<T extends NativeType>(int ptr);
 
 // The real implementation of this function (for interface calls) lives in
 // BuildFfiAsFunctionCall in the Kernel frontend. No calls can actually reach
 // this function.
 @pragma("vm:recognized", "other")
-DS _asFunctionInternal<DS extends Function, NS extends Function>(
-    Pointer<NativeFunction<NS>> ptr,
-    bool isLeaf) native "Ffi_asFunctionInternal";
+@pragma("vm:external-name", "Ffi_asFunctionInternal")
+external DS _asFunctionInternal<DS extends Function, NS extends Function>(
+    Pointer<NativeFunction<NS>> ptr, bool isLeaf);
 
-dynamic _asExternalTypedData(Pointer ptr, int count)
-    native "Ffi_asExternalTypedData";
+@pragma("vm:external-name", "Ffi_asExternalTypedData")
+external dynamic _asExternalTypedData(Pointer ptr, int count);
 
 // Returns a Function object for a native callback.
 //
@@ -61,11 +62,13 @@
 // Function objects returned by this native method are not Dart instances,
 // so we need to use top type as a return type to avoid type check.
 @pragma("vm:recognized", "other")
-dynamic _nativeCallbackFunction<NS extends Function>(Function target,
-    Object? exceptionalReturn) native "Ffi_nativeCallbackFunction";
+@pragma("vm:external-name", "Ffi_nativeCallbackFunction")
+external dynamic _nativeCallbackFunction<NS extends Function>(
+    Function target, Object? exceptionalReturn);
 
-Pointer<NS> _pointerFromFunction<NS extends NativeFunction>(dynamic function)
-    native "Ffi_pointerFromFunction";
+@pragma("vm:external-name", "Ffi_pointerFromFunction")
+external Pointer<NS> _pointerFromFunction<NS extends NativeFunction>(
+    dynamic function);
 
 @patch
 @pragma("vm:entry-point")
@@ -88,7 +91,8 @@
 
   @patch
   @pragma("vm:recognized", "other")
-  int get address native "Ffi_address";
+  @pragma("vm:external-name", "Ffi_address")
+  external int get address;
 
   // For statically known types, this is rewritten.
   @patch
@@ -139,8 +143,9 @@
 /// calculations. See pkg/vm/lib/transformations/ffi.dart.
 @pragma("vm:recognized", "other")
 @pragma('vm:prefer-inline')
-int _abi()
-    native "Recognized method: IR graph is built in the flow graph builder.";
+@pragma("vm:external-name",
+    "Recognized method: IR graph is built in the flow graph builder.")
+external int _abi();
 
 /// Copies data byte-wise from [source] to [target].
 ///
@@ -191,111 +196,122 @@
 // and GCing new spaces takes a lot of the benchmark time. The next speedup is
 // getting rid of these allocations by inlining these functions.
 @pragma("vm:recognized", "other")
-int _loadInt8(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt8";
+@pragma("vm:external-name", "Ffi_loadInt8")
+external int _loadInt8(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadInt16(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt16";
+@pragma("vm:external-name", "Ffi_loadInt16")
+external int _loadInt16(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadInt32(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt32";
+@pragma("vm:external-name", "Ffi_loadInt32")
+external int _loadInt32(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadInt64(Object typedDataBase, int offsetInBytes) native "Ffi_loadInt64";
+@pragma("vm:external-name", "Ffi_loadInt64")
+external int _loadInt64(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadUint8(Object typedDataBase, int offsetInBytes) native "Ffi_loadUint8";
+@pragma("vm:external-name", "Ffi_loadUint8")
+external int _loadUint8(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadUint16(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadUint16";
+@pragma("vm:external-name", "Ffi_loadUint16")
+external int _loadUint16(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadUint32(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadUint32";
+@pragma("vm:external-name", "Ffi_loadUint32")
+external int _loadUint32(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadUint64(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadUint64";
+@pragma("vm:external-name", "Ffi_loadUint64")
+external int _loadUint64(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-int _loadIntPtr(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadIntPtr";
+@pragma("vm:external-name", "Ffi_loadIntPtr")
+external int _loadIntPtr(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-double _loadFloat(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadFloat";
+@pragma("vm:external-name", "Ffi_loadFloat")
+external double _loadFloat(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-double _loadDouble(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadDouble";
+@pragma("vm:external-name", "Ffi_loadDouble")
+external double _loadDouble(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-double _loadFloatUnaligned(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadFloatUnaligned";
+@pragma("vm:external-name", "Ffi_loadFloatUnaligned")
+external double _loadFloatUnaligned(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-double _loadDoubleUnaligned(Object typedDataBase, int offsetInBytes)
-    native "Ffi_loadDoubleUnaligned";
+@pragma("vm:external-name", "Ffi_loadDoubleUnaligned")
+external double _loadDoubleUnaligned(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-Pointer<S> _loadPointer<S extends NativeType>(
-    Object typedDataBase, int offsetInBytes) native "Ffi_loadPointer";
+@pragma("vm:external-name", "Ffi_loadPointer")
+external Pointer<S> _loadPointer<S extends NativeType>(
+    Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
-void _storeInt8(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeInt8";
+@pragma("vm:external-name", "Ffi_storeInt8")
+external void _storeInt8(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeInt16(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeInt16";
+@pragma("vm:external-name", "Ffi_storeInt16")
+external void _storeInt16(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeInt32(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeInt32";
+@pragma("vm:external-name", "Ffi_storeInt32")
+external void _storeInt32(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeInt64(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeInt64";
+@pragma("vm:external-name", "Ffi_storeInt64")
+external void _storeInt64(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeUint8(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeUint8";
+@pragma("vm:external-name", "Ffi_storeUint8")
+external void _storeUint8(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeUint16(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeUint16";
+@pragma("vm:external-name", "Ffi_storeUint16")
+external void _storeUint16(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeUint32(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeUint32";
+@pragma("vm:external-name", "Ffi_storeUint32")
+external void _storeUint32(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeUint64(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeUint64";
+@pragma("vm:external-name", "Ffi_storeUint64")
+external void _storeUint64(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeIntPtr(Object typedDataBase, int offsetInBytes, int value)
-    native "Ffi_storeIntPtr";
+@pragma("vm:external-name", "Ffi_storeIntPtr")
+external void _storeIntPtr(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
-void _storeFloat(Object typedDataBase, int offsetInBytes, double value)
-    native "Ffi_storeFloat";
+@pragma("vm:external-name", "Ffi_storeFloat")
+external void _storeFloat(
+    Object typedDataBase, int offsetInBytes, double value);
 
 @pragma("vm:recognized", "other")
-void _storeDouble(Object typedDataBase, int offsetInBytes, double value)
-    native "Ffi_storeDouble";
+@pragma("vm:external-name", "Ffi_storeDouble")
+external void _storeDouble(
+    Object typedDataBase, int offsetInBytes, double value);
 
 @pragma("vm:recognized", "other")
-void _storeFloatUnaligned(Object typedDataBase, int offsetInBytes, double value)
-    native "Ffi_storeFloatUnaligned";
+@pragma("vm:external-name", "Ffi_storeFloatUnaligned")
+external void _storeFloatUnaligned(
+    Object typedDataBase, int offsetInBytes, double value);
 
 @pragma("vm:recognized", "other")
-void _storeDoubleUnaligned(Object typedDataBase, int offsetInBytes,
-    double value) native "Ffi_storeDoubleUnaligned";
+@pragma("vm:external-name", "Ffi_storeDoubleUnaligned")
+external void _storeDoubleUnaligned(
+    Object typedDataBase, int offsetInBytes, double value);
 
 @pragma("vm:recognized", "other")
-void _storePointer<S extends NativeType>(Object typedDataBase,
-    int offsetInBytes, Pointer<S> value) native "Ffi_storePointer";
+@pragma("vm:external-name", "Ffi_storePointer")
+external void _storePointer<S extends NativeType>(
+    Object typedDataBase, int offsetInBytes, Pointer<S> value);
 
 Pointer<Int8> _elementAtInt8(Pointer<Int8> pointer, int index) =>
     Pointer.fromAddress(pointer.address + 1 * index);
@@ -762,17 +778,21 @@
 
 extension NativePort on SendPort {
   @patch
-  int get nativePort native "SendPortImpl_get_id";
+  @pragma("vm:external-name", "SendPortImpl_get_id")
+  external int get nativePort;
 }
 
-int _nativeApiFunctionPointer(String symbol)
-    native "DartNativeApiFunctionPointer";
+@pragma("vm:external-name", "DartNativeApiFunctionPointer")
+external int _nativeApiFunctionPointer(String symbol);
 
-int _initializeApiDLData() native "DartApiDLInitializeData";
+@pragma("vm:external-name", "DartApiDLInitializeData")
+external int _initializeApiDLData();
 
-int _dartApiMajorVersion() native "DartApiDLMajorVersion";
+@pragma("vm:external-name", "DartApiDLMajorVersion")
+external int _dartApiMajorVersion();
 
-int _dartApiMinorVersion() native "DartApiDLMinorVersion";
+@pragma("vm:external-name", "DartApiDLMinorVersion")
+external int _dartApiMinorVersion();
 
 @patch
 abstract class NativeApi {
diff --git a/sdk/lib/_internal/vm/lib/function.dart b/sdk/lib/_internal/vm/lib/function.dart
index 710f1ef..b7c475c 100644
--- a/sdk/lib/_internal/vm/lib/function.dart
+++ b/sdk/lib/_internal/vm/lib/function.dart
@@ -10,7 +10,8 @@
     throw "Unreachable";
   }
 
-  bool operator ==(Object other) native "Closure_equals";
+  @pragma("vm:external-name", "Closure_equals")
+  external bool operator ==(Object other);
 
   int get hashCode {
     _hash ??= _computeHash();
@@ -19,7 +20,8 @@
 
   _Closure get call => this;
 
-  int _computeHash() native "Closure_computeHash";
+  @pragma("vm:external-name", "Closure_computeHash")
+  external int _computeHash();
 
   // No instance fields should be declared before the following fields whose
   // offsets must be identical in Dart and C++.
diff --git a/sdk/lib/_internal/vm/lib/function_patch.dart b/sdk/lib/_internal/vm/lib/function_patch.dart
index b4d3daa..98f3e1c 100644
--- a/sdk/lib/_internal/vm/lib/function_patch.dart
+++ b/sdk/lib/_internal/vm/lib/function_patch.dart
@@ -7,8 +7,8 @@
 @patch
 class Function {
   // TODO(regis): Pass type arguments to generic functions. Wait for API spec.
-  static _apply(List<dynamic>? arguments, List<dynamic>? names)
-      native "Function_apply";
+  @pragma("vm:external-name", "Function_apply")
+  external static _apply(List<dynamic>? arguments, List<dynamic>? names);
 
   @patch
   static apply(Function function, List<dynamic>? positionalArguments,
diff --git a/sdk/lib/_internal/vm/lib/growable_array.dart b/sdk/lib/_internal/vm/lib/growable_array.dart
index 519f095..516996f 100644
--- a/sdk/lib/_internal/vm/lib/growable_array.dart
+++ b/sdk/lib/_internal/vm/lib/growable_array.dart
@@ -204,17 +204,20 @@
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type",
       <dynamic>[_GrowableList, "result-type-uses-passed-type-arguments"])
-  factory _GrowableList._withData(_List data) native "GrowableList_allocate";
+  @pragma("vm:external-name", "GrowableList_allocate")
+  external factory _GrowableList._withData(_List data);
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get _capacity native "GrowableList_getCapacity";
+  @pragma("vm:external-name", "GrowableList_getCapacity")
+  external int get _capacity;
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get length native "GrowableList_getLength";
+  @pragma("vm:external-name", "GrowableList_getLength")
+  external int get length;
 
   void set length(int new_length) {
     if (new_length > length) {
@@ -245,13 +248,16 @@
   }
 
   @pragma("vm:recognized", "graph-intrinsic")
-  void _setLength(int new_length) native "GrowableList_setLength";
+  @pragma("vm:external-name", "GrowableList_setLength")
+  external void _setLength(int new_length);
 
   @pragma("vm:recognized", "graph-intrinsic")
-  void _setData(_List array) native "GrowableList_setData";
+  @pragma("vm:external-name", "GrowableList_setData")
+  external void _setData(_List array);
 
   @pragma("vm:recognized", "graph-intrinsic")
-  T operator [](int index) native "GrowableList_getIndexed";
+  @pragma("vm:external-name", "GrowableList_getIndexed")
+  external T operator [](int index);
 
   @pragma("vm:recognized", "other")
   void operator []=(int index, T value) {
@@ -259,7 +265,8 @@
   }
 
   @pragma("vm:recognized", "graph-intrinsic")
-  void _setIndexed(int index, T? value) native "GrowableList_setIndexed";
+  @pragma("vm:external-name", "GrowableList_setIndexed")
+  external void _setIndexed(int index, T? value);
 
   @pragma("vm:entry-point", "call")
   @pragma("vm:prefer-inline")
diff --git a/sdk/lib/_internal/vm/lib/identical_patch.dart b/sdk/lib/_internal/vm/lib/identical_patch.dart
index 9a9ff56..e33bc535 100644
--- a/sdk/lib/_internal/vm/lib/identical_patch.dart
+++ b/sdk/lib/_internal/vm/lib/identical_patch.dart
@@ -7,7 +7,8 @@
 @patch
 @pragma("vm:recognized", "other")
 @pragma("vm:exact-result-type", bool)
-bool identical(Object? a, Object? b) native "Identical_comparison";
+@pragma("vm:external-name", "Identical_comparison")
+external bool identical(Object? a, Object? b);
 
 @patch
 @pragma("vm:entry-point", "call")
diff --git a/sdk/lib/_internal/vm/lib/integers.dart b/sdk/lib/_internal/vm/lib/integers.dart
index ec5daff..703842b 100644
--- a/sdk/lib/_internal/vm/lib/integers.dart
+++ b/sdk/lib/_internal/vm/lib/integers.dart
@@ -78,27 +78,38 @@
   }
 
   @pragma("vm:non-nullable-result-type")
-  int _bitAndFromInteger(int other) native "Integer_bitAndFromInteger";
+  @pragma("vm:external-name", "Integer_bitAndFromInteger")
+  external int _bitAndFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _bitOrFromInteger(int other) native "Integer_bitOrFromInteger";
+  @pragma("vm:external-name", "Integer_bitOrFromInteger")
+  external int _bitOrFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _bitXorFromInteger(int other) native "Integer_bitXorFromInteger";
+  @pragma("vm:external-name", "Integer_bitXorFromInteger")
+  external int _bitXorFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _shrFromInteger(int other) native "Integer_shrFromInteger";
+  @pragma("vm:external-name", "Integer_shrFromInteger")
+  external int _shrFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _ushrFromInteger(int other) native "Integer_ushrFromInteger";
+  @pragma("vm:external-name", "Integer_ushrFromInteger")
+  external int _ushrFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _shlFromInteger(int other) native "Integer_shlFromInteger";
+  @pragma("vm:external-name", "Integer_shlFromInteger")
+  external int _shlFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _addFromInteger(int other) native "Integer_addFromInteger";
+  @pragma("vm:external-name", "Integer_addFromInteger")
+  external int _addFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _subFromInteger(int other) native "Integer_subFromInteger";
+  @pragma("vm:external-name", "Integer_subFromInteger")
+  external int _subFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _mulFromInteger(int other) native "Integer_mulFromInteger";
+  @pragma("vm:external-name", "Integer_mulFromInteger")
+  external int _mulFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _truncDivFromInteger(int other) native "Integer_truncDivFromInteger";
+  @pragma("vm:external-name", "Integer_truncDivFromInteger")
+  external int _truncDivFromInteger(int other);
   @pragma("vm:non-nullable-result-type")
-  int _moduloFromInteger(int other) native "Integer_moduloFromInteger";
+  @pragma("vm:external-name", "Integer_moduloFromInteger")
+  external int _moduloFromInteger(int other);
   int _remainderFromInteger(int other) {
     // Issue(https://dartbug.com/39639): The analyzer incorrectly reports the
     // result type as `num`.
@@ -150,8 +161,8 @@
   }
 
   @pragma("vm:exact-result-type", bool)
-  bool _greaterThanFromInteger(int other)
-      native "Integer_greaterThanFromInteger";
+  @pragma("vm:external-name", "Integer_greaterThanFromInteger")
+  external bool _greaterThanFromInteger(int other);
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
@@ -165,7 +176,8 @@
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
-  bool _equalToInteger(int other) native "Integer_equalToInteger";
+  @pragma("vm:external-name", "Integer_equalToInteger")
+  external bool _equalToInteger(int other);
   int abs() {
     return this < 0 ? -this : this;
   }
@@ -550,10 +562,12 @@
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:disable-unboxed-parameters")
-  int operator ~() native "Smi_bitNegate";
+  @pragma("vm:external-name", "Smi_bitNegate")
+  external int operator ~();
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int get bitLength native "Smi_bitLength";
+  @pragma("vm:external-name", "Smi_bitLength")
+  external int get bitLength;
 
   /**
    * The digits of '00', '01', ... '99' as a single array.
@@ -757,7 +771,9 @@
   int get hashCode => this;
   int get _identityHashCode => this;
   @pragma("vm:non-nullable-result-type")
-  int operator ~() native "Mint_bitNegate";
+  @pragma("vm:external-name", "Mint_bitNegate")
+  external int operator ~();
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int get bitLength native "Mint_bitLength";
+  @pragma("vm:external-name", "Mint_bitLength")
+  external int get bitLength;
 }
diff --git a/sdk/lib/_internal/vm/lib/integers_patch.dart b/sdk/lib/_internal/vm/lib/integers_patch.dart
index 1669d9c..4285b57 100644
--- a/sdk/lib/_internal/vm/lib/integers_patch.dart
+++ b/sdk/lib/_internal/vm/lib/integers_patch.dart
@@ -8,8 +8,9 @@
 @patch
 class int {
   @patch
-  const factory int.fromEnvironment(String name, {int defaultValue = 0})
-      native "Integer_fromEnvironment";
+  @pragma("vm:external-name", "Integer_fromEnvironment")
+  external const factory int.fromEnvironment(String name,
+      {int defaultValue = 0});
 
   int _bitAndFromSmi(_Smi other);
   int _bitAndFromInteger(int other);
diff --git a/sdk/lib/_internal/vm/lib/internal_patch.dart b/sdk/lib/_internal/vm/lib/internal_patch.dart
index e71c95f..e762a8b 100644
--- a/sdk/lib/_internal/vm/lib/internal_patch.dart
+++ b/sdk/lib/_internal/vm/lib/internal_patch.dart
@@ -24,26 +24,26 @@
 bool typeAcceptsNull<T>() => (const <Null>[]) is List<int> || null is T;
 
 @patch
-List<T> makeListFixedLength<T>(List<T> growableList)
-    native "Internal_makeListFixedLength";
+@pragma("vm:external-name", "Internal_makeListFixedLength")
+external List<T> makeListFixedLength<T>(List<T> growableList);
 
 @patch
-List<T> makeFixedListUnmodifiable<T>(List<T> fixedLengthList)
-    native "Internal_makeFixedListUnmodifiable";
+@pragma("vm:external-name", "Internal_makeFixedListUnmodifiable")
+external List<T> makeFixedListUnmodifiable<T>(List<T> fixedLengthList);
 
 @patch
-Object? extractTypeArguments<T>(T instance, Function extract)
-    native "Internal_extractTypeArguments";
+@pragma("vm:external-name", "Internal_extractTypeArguments")
+external Object? extractTypeArguments<T>(T instance, Function extract);
 
 /// The returned string is a [_OneByteString] with uninitialized content.
 @pragma("vm:recognized", "asm-intrinsic")
-String allocateOneByteString(int length)
-    native "Internal_allocateOneByteString";
+@pragma("vm:external-name", "Internal_allocateOneByteString")
+external String allocateOneByteString(int length);
 
 /// The [string] must be a [_OneByteString]. The [index] must be valid.
 @pragma("vm:recognized", "asm-intrinsic")
-void writeIntoOneByteString(String string, int index, int codePoint)
-    native "Internal_writeIntoOneByteString";
+@pragma("vm:external-name", "Internal_writeIntoOneByteString")
+external void writeIntoOneByteString(String string, int index, int codePoint);
 
 /// It is assumed that [from] is a native [Uint8List] class and [to] is a
 /// [_OneByteString]. The [fromStart] and [toStart] indices together with the
@@ -59,13 +59,13 @@
 
 /// The returned string is a [_TwoByteString] with uninitialized content.
 @pragma("vm:recognized", "asm-intrinsic")
-String allocateTwoByteString(int length)
-    native "Internal_allocateTwoByteString";
+@pragma("vm:external-name", "Internal_allocateTwoByteString")
+external String allocateTwoByteString(int length);
 
 /// The [string] must be a [_TwoByteString]. The [index] must be valid.
 @pragma("vm:recognized", "asm-intrinsic")
-void writeIntoTwoByteString(String string, int index, int codePoint)
-    native "Internal_writeIntoTwoByteString";
+@pragma("vm:external-name", "Internal_writeIntoTwoByteString")
+external void writeIntoTwoByteString(String string, int index, int codePoint);
 
 class VMLibraryHooks {
   // Example: "dart:isolate _Timer._factory"
@@ -104,7 +104,8 @@
 
 @pragma("vm:recognized", "other")
 @pragma('vm:prefer-inline')
-bool get has63BitSmis native "Internal_has63BitSmis";
+@pragma("vm:external-name", "Internal_has63BitSmis")
+external bool get has63BitSmis;
 
 @pragma("vm:recognized", "other")
 @pragma("vm:entry-point", "call")
@@ -137,14 +138,15 @@
 // vectors are null or is a newly allocated and canonicalized vector of length
 // 'totalLen'.
 @pragma("vm:entry-point", "call")
-_prependTypeArguments(functionTypeArguments, parentTypeArguments, parentLen,
-    totalLen) native "Internal_prependTypeArguments";
+@pragma("vm:external-name", "Internal_prependTypeArguments")
+external _prependTypeArguments(
+    functionTypeArguments, parentTypeArguments, parentLen, totalLen);
 
 // Check that a set of type arguments satisfy the type parameter bounds on a
 // closure.
 @pragma("vm:entry-point", "call")
-_boundsCheckForPartialInstantiation(closure, typeArgs)
-    native "Internal_boundsCheckForPartialInstantiation";
+@pragma("vm:external-name", "Internal_boundsCheckForPartialInstantiation")
+external _boundsCheckForPartialInstantiation(closure, typeArgs);
 
 // Called by IRRegExpMacroAssembler::GrowStack.
 Int32List _growRegExpStack(Int32List stack) {
@@ -160,29 +162,33 @@
 // type of a value.
 //
 // Important: this is unsafe and must be used with care.
-T unsafeCast<T>(Object? v) native "Internal_unsafeCast";
+@pragma("vm:external-name", "Internal_unsafeCast")
+external T unsafeCast<T>(Object? v);
 
 // This function can be used to keep an object alive til that point.
 @pragma("vm:recognized", "other")
 @pragma('vm:prefer-inline')
-void reachabilityFence(Object object) native "Internal_reachabilityFence";
+@pragma("vm:external-name", "Internal_reachabilityFence")
+external void reachabilityFence(Object object);
 
 // This function can be used to encode native side effects.
 //
 // The function call and it's argument are removed in flow graph construction.
 @pragma("vm:recognized", "other")
-void _nativeEffect(Object object) native "Internal_nativeEffect";
+@pragma("vm:external-name", "Internal_nativeEffect")
+external void _nativeEffect(Object object);
 
-void sendAndExit(SendPort sendPort, var message)
-    native "SendPortImpl_sendAndExitInternal_";
+@pragma("vm:external-name", "SendPortImpl_sendAndExitInternal_")
+external void sendAndExit(SendPort sendPort, var message);
 
 // Collection of functions which should only be used for testing purposes.
 abstract class VMInternalsForTesting {
   // This function can be used by tests to enforce garbage collection.
-  static void collectAllGarbage() native "Internal_collectAllGarbage";
+  @pragma("vm:external-name", "Internal_collectAllGarbage")
+  external static void collectAllGarbage();
 
-  static void deoptimizeFunctionsOnStack()
-      native "Internal_deoptimizeFunctionsOnStack";
+  @pragma("vm:external-name", "Internal_deoptimizeFunctionsOnStack")
+  external static void deoptimizeFunctionsOnStack();
 }
 
 @patch
diff --git a/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart b/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart
index 075e001..ae387bf 100644
--- a/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart
+++ b/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart
@@ -105,8 +105,9 @@
   }
 
   // Unpack the given TypeArguments object into a new list of individual types.
-  static List<Type> _unpackTypeArguments(typeArguments, int numTypeArguments)
-      native "InvocationMirror_unpackTypeArguments";
+  @pragma("vm:external-name", "InvocationMirror_unpackTypeArguments")
+  external static List<Type> _unpackTypeArguments(
+      typeArguments, int numTypeArguments);
 
   List get positionalArguments {
     if (_positionalArguments == null) {
diff --git a/sdk/lib/_internal/vm/lib/isolate_patch.dart b/sdk/lib/_internal/vm/lib/isolate_patch.dart
index 519d188..b7bf498 100644
--- a/sdk/lib/_internal/vm/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/vm/lib/isolate_patch.dart
@@ -38,9 +38,10 @@
 
 @pragma("vm:entry-point")
 class _CapabilityImpl implements Capability {
-  factory _CapabilityImpl() native "CapabilityImpl_factory";
+  @pragma("vm:external-name", "CapabilityImpl_factory")
+  external factory _CapabilityImpl();
 
-  bool operator ==(var other) {
+  bool operator ==(Object other) {
     return (other is _CapabilityImpl) && _equals(other);
   }
 
@@ -48,8 +49,10 @@
     return _get_hashcode();
   }
 
-  _equals(other) native "CapabilityImpl_equals";
-  _get_hashcode() native "CapabilityImpl_get_hashcode";
+  @pragma("vm:external-name", "CapabilityImpl_equals")
+  external bool _equals(Object other);
+  @pragma("vm:external-name", "CapabilityImpl_get_hashcode")
+  external int _get_hashcode();
 }
 
 @patch
@@ -137,8 +140,8 @@
     return port;
   }
 
-  factory _RawReceivePortImpl._(String debugName)
-      native "RawReceivePortImpl_factory";
+  @pragma("vm:external-name", "RawReceivePortImpl_factory")
+  external factory _RawReceivePortImpl._(String debugName);
 
   close() {
     // Close the port and remove it from the handler map.
@@ -159,8 +162,10 @@
   }
 
   /**** Internal implementation details ****/
-  int _get_id() native "RawReceivePortImpl_get_id";
-  SendPort _get_sendport() native "RawReceivePortImpl_get_sendport";
+  @pragma("vm:external-name", "RawReceivePortImpl_get_id")
+  external int _get_id();
+  @pragma("vm:external-name", "RawReceivePortImpl_get_sendport")
+  external SendPort _get_sendport();
 
   // Called from the VM to retrieve the handler for a message.
   @pragma("vm:entry-point", "call")
@@ -190,13 +195,15 @@
   }
 
   // Call into the VM to close the VM maintained mappings.
-  int _closeInternal() native "RawReceivePortImpl_closeInternal";
+  @pragma("vm:external-name", "RawReceivePortImpl_closeInternal")
+  external int _closeInternal();
 
   // Set this port as active or inactive in the VM. If inactive, this port
   // will not be considered live even if it hasn't been explicitly closed.
   // TODO(bkonyi): determine if we want to expose this as an option through
   // RawReceivePort.
-  _setActive(bool active) native "RawReceivePortImpl_setActive";
+  @pragma("vm:external-name", "RawReceivePortImpl_setActive")
+  external _setActive(bool active);
 
   void set handler(Function? value) {
     final int id = this._get_id();
@@ -232,11 +239,14 @@
   }
 
   /*--- private implementation ---*/
-  _get_id() native "SendPortImpl_get_id";
-  _get_hashcode() native "SendPortImpl_get_hashcode";
+  @pragma("vm:external-name", "SendPortImpl_get_id")
+  external _get_id();
+  @pragma("vm:external-name", "SendPortImpl_get_hashcode")
+  external _get_hashcode();
 
   // Forward the implementation of sending messages to the VM.
-  void _sendInternal(var message) native "SendPortImpl_sendInternal_";
+  @pragma("vm:external-name", "SendPortImpl_sendInternal_")
+  external void _sendInternal(var message);
 }
 
 typedef _NullaryFunction();
@@ -371,7 +381,8 @@
     }
   }
 
-  static void _spawnFunction(
+  @pragma("vm:external-name", "Isolate_spawnFunction")
+  external static void _spawnFunction(
       SendPort readyPort,
       String uri,
       Function topLevelFunction,
@@ -381,7 +392,7 @@
       SendPort? onExit,
       SendPort? onError,
       String? packageConfig,
-      String? debugName) native "Isolate_spawnFunction";
+      String? debugName);
 
   @patch
   static Future<Isolate> spawnUri(Uri uri, List<String> args, var message,
@@ -502,7 +513,8 @@
 
   // For 'spawnFunction' see internal_patch.dart.
 
-  static void _spawnUri(
+  @pragma("vm:external-name", "Isolate_spawnUri")
+  external static void _spawnUri(
       SendPort readyPort,
       String uri,
       List<String> args,
@@ -514,12 +526,13 @@
       bool? checked,
       List? environment,
       String? packageConfig,
-      String? debugName) native "Isolate_spawnUri";
+      String? debugName);
 
-  static void _sendOOB(port, msg) native "Isolate_sendOOB";
+  @pragma("vm:external-name", "Isolate_sendOOB")
+  external static void _sendOOB(port, msg);
 
-  static String _getDebugName(SendPort controlPort)
-      native "Isolate_getDebugName";
+  @pragma("vm:external-name", "Isolate_getDebugName")
+  external static String _getDebugName(SendPort controlPort);
 
   @patch
   void _pause(Capability resumeCapability) {
@@ -619,8 +632,8 @@
         terminateCapability: portAndCapabilities[2]);
   }
 
-  static List _getPortAndCapabilitiesOfCurrentIsolate()
-      native "Isolate_getPortAndCapabilitiesOfCurrentIsolate";
+  @pragma("vm:external-name", "Isolate_getPortAndCapabilitiesOfCurrentIsolate")
+  external static List _getPortAndCapabilitiesOfCurrentIsolate();
 
   static Uri? _getCurrentRootUri() {
     try {
@@ -630,7 +643,8 @@
     }
   }
 
-  static String _getCurrentRootUriStr() native "Isolate_getCurrentRootUriStr";
+  @pragma("vm:external-name", "Isolate_getCurrentRootUriStr")
+  external static String _getCurrentRootUriStr();
 }
 
 @patch
@@ -652,13 +666,13 @@
 
 @pragma("vm:entry-point")
 class _TransferableTypedDataImpl implements TransferableTypedData {
-  factory _TransferableTypedDataImpl(List<TypedData> list)
-      native "TransferableTypedData_factory";
+  @pragma("vm:external-name", "TransferableTypedData_factory")
+  external factory _TransferableTypedDataImpl(List<TypedData> list);
 
   ByteBuffer materialize() {
     return _materializeIntoUint8List().buffer;
   }
 
-  Uint8List _materializeIntoUint8List()
-      native "TransferableTypedData_materialize";
+  @pragma("vm:external-name", "TransferableTypedData_materialize")
+  external Uint8List _materializeIntoUint8List();
 }
diff --git a/sdk/lib/_internal/vm/lib/lib_prefix.dart b/sdk/lib/_internal/vm/lib/lib_prefix.dart
index 7604f62..26e0368 100644
--- a/sdk/lib/_internal/vm/lib/lib_prefix.dart
+++ b/sdk/lib/_internal/vm/lib/lib_prefix.dart
@@ -11,10 +11,14 @@
     throw "Unreachable";
   }
 
-  bool _isLoaded() native "LibraryPrefix_isLoaded";
-  void _setLoaded() native "LibraryPrefix_setLoaded";
-  Object _loadingUnit() native "LibraryPrefix_loadingUnit";
-  static void _issueLoad(Object unit) native "LibraryPrefix_issueLoad";
+  @pragma("vm:external-name", "LibraryPrefix_isLoaded")
+  external bool _isLoaded();
+  @pragma("vm:external-name", "LibraryPrefix_setLoaded")
+  external void _setLoaded();
+  @pragma("vm:external-name", "LibraryPrefix_loadingUnit")
+  external Object _loadingUnit();
+  @pragma("vm:external-name", "LibraryPrefix_issueLoad")
+  external static void _issueLoad(Object unit);
 
   static final _loads = new Map<Object, Completer<void>>();
 }
diff --git a/sdk/lib/_internal/vm/lib/math_patch.dart b/sdk/lib/_internal/vm/lib/math_patch.dart
index ce3815b..cc1c7c0 100644
--- a/sdk/lib/_internal/vm/lib/math_patch.dart
+++ b/sdk/lib/_internal/vm/lib/math_patch.dart
@@ -101,7 +101,8 @@
   return _pow(base.toDouble(), exponent.toDouble());
 }
 
-double _pow(double base, double exponent) native "Math_doublePow";
+@pragma("vm:external-name", "Math_doublePow")
+external double _pow(double base, double exponent);
 
 @pragma("vm:recognized", "other")
 int _intPow(int base, int exponent) {
@@ -163,34 +164,44 @@
 
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _atan2(double a, double b) native "Math_atan2";
+@pragma("vm:external-name", "Math_atan2")
+external double _atan2(double a, double b);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _sin(double x) native "Math_sin";
+@pragma("vm:external-name", "Math_sin")
+external double _sin(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _cos(double x) native "Math_cos";
+@pragma("vm:external-name", "Math_cos")
+external double _cos(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _tan(double x) native "Math_tan";
+@pragma("vm:external-name", "Math_tan")
+external double _tan(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _acos(double x) native "Math_acos";
+@pragma("vm:external-name", "Math_acos")
+external double _acos(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _asin(double x) native "Math_asin";
+@pragma("vm:external-name", "Math_asin")
+external double _asin(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _atan(double x) native "Math_atan";
+@pragma("vm:external-name", "Math_atan")
+external double _atan(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _sqrt(double x) native "Math_sqrt";
+@pragma("vm:external-name", "Math_sqrt")
+external double _sqrt(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _exp(double x) native "Math_exp";
+@pragma("vm:external-name", "Math_exp")
+external double _exp(double x);
 @pragma("vm:recognized", "other")
 @pragma("vm:prefer-inline")
-double _log(double x) native "Math_log";
+@pragma("vm:external-name", "Math_log")
+external double _log(double x);
 
 // TODO(iposva): Handle patch methods within a patch class correctly.
 @patch
@@ -235,7 +246,8 @@
   // fail with --throw_on_javascript_int_overflow.
   // TODO(regis): Implement in Dart and remove Random_nextState in math.cc.
   @pragma("vm:recognized", "asm-intrinsic")
-  void _nextState() native "Random_nextState";
+  @pragma("vm:external-name", "Random_nextState")
+  external void _nextState();
 
   int nextInt(int max) {
     const limit = 0x3FFFFFFF;
@@ -278,9 +290,11 @@
   // This is a native to prevent 64-bit operations in Dart, which
   // fail with --throw_on_javascript_int_overflow.
   // TODO(regis): Implement here in Dart and remove native in math.cc.
-  static Uint32List _setupSeed(int seed) native "Random_setupSeed";
+  @pragma("vm:external-name", "Random_setupSeed")
+  external static Uint32List _setupSeed(int seed);
   // Get a seed from the VM's random number provider.
-  static Uint32List _initialSeed() native "Random_initialSeed";
+  @pragma("vm:external-name", "Random_initialSeed")
+  external static Uint32List _initialSeed();
 
   static int _nextSeed() {
     // Trigger the PRNG once to change the internal state.
@@ -296,7 +310,8 @@
   }
 
   // Return count bytes of entropy as a positive integer; count <= 8.
-  static int _getBytes(int count) native "SecureRandom_getBytes";
+  @pragma("vm:external-name", "SecureRandom_getBytes")
+  external static int _getBytes(int count);
 
   int nextInt(int max) {
     RangeError.checkValueInInterval(
diff --git a/sdk/lib/_internal/vm/lib/mirror_reference.dart b/sdk/lib/_internal/vm/lib/mirror_reference.dart
index 0cb1e37..d7872a8 100644
--- a/sdk/lib/_internal/vm/lib/mirror_reference.dart
+++ b/sdk/lib/_internal/vm/lib/mirror_reference.dart
@@ -10,5 +10,6 @@
     throw "Unreachable";
   }
 
-  bool operator ==(Object other) native "MirrorReference_equals";
+  @pragma("vm:external-name", "MirrorReference_equals")
+  external bool operator ==(Object other);
 }
diff --git a/sdk/lib/_internal/vm/lib/mirrors_impl.dart b/sdk/lib/_internal/vm/lib/mirrors_impl.dart
index a938cf7..2188df5 100644
--- a/sdk/lib/_internal/vm/lib/mirrors_impl.dart
+++ b/sdk/lib/_internal/vm/lib/mirrors_impl.dart
@@ -65,9 +65,11 @@
   return buf.toString();
 }
 
-SourceLocation? _location(reflectee) native "DeclarationMirror_location";
+@pragma("vm:external-name", "DeclarationMirror_location")
+external SourceLocation? _location(reflectee);
 
-List<dynamic> _metadata(reflectee) native 'DeclarationMirror_metadata';
+@pragma("vm:external-name", "DeclarationMirror_metadata")
+external List<dynamic> _metadata(reflectee);
 
 List<InstanceMirror> _wrapMetadata(List reflectees) {
   var mirrors = <InstanceMirror>[];
@@ -77,7 +79,8 @@
   return new UnmodifiableListView<InstanceMirror>(mirrors);
 }
 
-bool _subtypeTest(Type a, Type b) native 'TypeMirror_subtypeTest';
+@pragma("vm:external-name", "TypeMirror_subtypeTest")
+external bool _subtypeTest(Type a, Type b);
 
 class _MirrorSystem extends MirrorSystem {
   final TypeMirror dynamicType = new _SpecialTypeMirror._('dynamic');
@@ -97,7 +100,8 @@
     return _libraries;
   }
 
-  static List<dynamic> _computeLibraries() native "MirrorSystem_libraries";
+  @pragma("vm:external-name", "MirrorSystem_libraries")
+  external static List<dynamic> _computeLibraries();
 
   IsolateMirror? _isolate;
   IsolateMirror get isolate {
@@ -106,7 +110,8 @@
     return _isolate = _computeIsolate();
   }
 
-  static IsolateMirror _computeIsolate() native "MirrorSystem_isolate";
+  @pragma("vm:external-name", "MirrorSystem_isolate")
+  external static IsolateMirror _computeIsolate();
 
   String toString() => "MirrorSystem for isolate '${isolate.debugName}'";
 }
@@ -145,7 +150,8 @@
     return result;
   }
 
-  static LibraryMirror? _loadUri(String uri) native "IsolateMirror_loadUri";
+  @pragma("vm:external-name", "IsolateMirror_loadUri")
+  external static LibraryMirror? _loadUri(String uri);
 }
 
 class _SyntheticAccessor implements MethodMirror {
@@ -333,15 +339,17 @@
     return reflect(this._invoke(_reflectee, _n(memberName), arguments, names));
   }
 
-  _invoke(reflectee, functionName, arguments, argumentNames)
-      native 'InstanceMirror_invoke';
+  @pragma("vm:external-name", "InstanceMirror_invoke")
+  external _invoke(reflectee, functionName, arguments, argumentNames);
 
-  _invokeGetter(reflectee, getterName) native 'InstanceMirror_invokeGetter';
+  @pragma("vm:external-name", "InstanceMirror_invokeGetter")
+  external _invokeGetter(reflectee, getterName);
 
-  _invokeSetter(reflectee, setterName, value)
-      native 'InstanceMirror_invokeSetter';
+  @pragma("vm:external-name", "InstanceMirror_invokeSetter")
+  external _invokeSetter(reflectee, setterName, value);
 
-  static _computeType(reflectee) native 'InstanceMirror_computeType';
+  @pragma("vm:external-name", "InstanceMirror_computeType")
+  external static _computeType(reflectee);
 }
 
 class _ClosureMirror extends _InstanceMirror implements ClosureMirror {
@@ -361,7 +369,8 @@
 
   String toString() => "ClosureMirror on '${Error.safeToString(_reflectee)}'";
 
-  static _computeFunction(reflectee) native 'ClosureMirror_function';
+  @pragma("vm:external-name", "ClosureMirror_function")
+  external static _computeFunction(reflectee);
 }
 
 abstract class _TypeMirror {
@@ -712,45 +721,51 @@
     return false;
   }
 
-  static String _libraryUri(reflectee) native "ClassMirror_libraryUri";
+  @pragma("vm:external-name", "ClassMirror_libraryUri")
+  external static String _libraryUri(reflectee);
 
-  static Type? _supertype(reflectedType) native "ClassMirror_supertype";
+  @pragma("vm:external-name", "ClassMirror_supertype")
+  external static Type? _supertype(reflectedType);
 
-  static Type? _supertypeInstantiated(reflectedType)
-      native "ClassMirror_supertype_instantiated";
+  @pragma("vm:external-name", "ClassMirror_supertype_instantiated")
+  external static Type? _supertypeInstantiated(reflectedType);
 
-  static List<dynamic> _nativeInterfaces(reflectedType)
-      native "ClassMirror_interfaces";
+  @pragma("vm:external-name", "ClassMirror_interfaces")
+  external static List<dynamic> _nativeInterfaces(reflectedType);
 
-  static List<dynamic> _nativeInterfacesInstantiated(reflectedType)
-      native "ClassMirror_interfaces_instantiated";
+  @pragma("vm:external-name", "ClassMirror_interfaces_instantiated")
+  external static List<dynamic> _nativeInterfacesInstantiated(reflectedType);
 
-  static Type? _nativeMixin(reflectedType) native "ClassMirror_mixin";
+  @pragma("vm:external-name", "ClassMirror_mixin")
+  external static Type? _nativeMixin(reflectedType);
 
-  static Type? _nativeMixinInstantiated(reflectedType, instantiator)
-      native "ClassMirror_mixin_instantiated";
+  @pragma("vm:external-name", "ClassMirror_mixin_instantiated")
+  external static Type? _nativeMixinInstantiated(reflectedType, instantiator);
 
-  static List<dynamic> _computeMembers(owner, reflectee, instantiator)
-      native "ClassMirror_members";
+  @pragma("vm:external-name", "ClassMirror_members")
+  external static List<dynamic> _computeMembers(owner, reflectee, instantiator);
 
-  List<dynamic> _computeConstructors(reflectee, instantiator)
-      native "ClassMirror_constructors";
+  @pragma("vm:external-name", "ClassMirror_constructors")
+  external List<dynamic> _computeConstructors(reflectee, instantiator);
 
-  _invoke(reflectee, memberName, arguments, argumentNames)
-      native 'ClassMirror_invoke';
+  @pragma("vm:external-name", "ClassMirror_invoke")
+  external _invoke(reflectee, memberName, arguments, argumentNames);
 
-  _invokeGetter(reflectee, getterName) native 'ClassMirror_invokeGetter';
+  @pragma("vm:external-name", "ClassMirror_invokeGetter")
+  external _invokeGetter(reflectee, getterName);
 
-  _invokeSetter(reflectee, setterName, value) native 'ClassMirror_invokeSetter';
+  @pragma("vm:external-name", "ClassMirror_invokeSetter")
+  external _invokeSetter(reflectee, setterName, value);
 
-  static _invokeConstructor(reflectee, type, constructorName, arguments,
-      argumentNames) native 'ClassMirror_invokeConstructor';
+  @pragma("vm:external-name", "ClassMirror_invokeConstructor")
+  external static _invokeConstructor(
+      reflectee, type, constructorName, arguments, argumentNames);
 
-  static List<dynamic> _ClassMirror_type_variables(reflectee)
-      native "ClassMirror_type_variables";
+  @pragma("vm:external-name", "ClassMirror_type_variables")
+  external static List<dynamic> _ClassMirror_type_variables(reflectee);
 
-  static List<dynamic> _computeTypeArguments(reflectee)
-      native "ClassMirror_type_arguments";
+  @pragma("vm:external-name", "ClassMirror_type_arguments")
+  external static List<dynamic> _computeTypeArguments(reflectee);
 }
 
 class _FunctionTypeMirror extends _ClassMirror implements FunctionTypeMirror {
@@ -802,14 +817,14 @@
 
   String toString() => "FunctionTypeMirror on '${_n(simpleName)}'";
 
-  MethodMirror _FunctionTypeMirror_call_method(signatureReflectee)
-      native "FunctionTypeMirror_call_method";
+  @pragma("vm:external-name", "FunctionTypeMirror_call_method")
+  external MethodMirror _FunctionTypeMirror_call_method(signatureReflectee);
 
-  static Type _FunctionTypeMirror_return_type(signatureReflectee)
-      native "FunctionTypeMirror_return_type";
+  @pragma("vm:external-name", "FunctionTypeMirror_return_type")
+  external static Type _FunctionTypeMirror_return_type(signatureReflectee);
 
-  List<dynamic> _FunctionTypeMirror_parameters(signatureReflectee)
-      native "FunctionTypeMirror_parameters";
+  @pragma("vm:external-name", "FunctionTypeMirror_parameters")
+  external List<dynamic> _FunctionTypeMirror_parameters(signatureReflectee);
 }
 
 abstract class _DeclarationMirror extends Mirror implements DeclarationMirror {
@@ -906,11 +921,11 @@
         _subtypeTest(otherReflectedType, _reflectedType);
   }
 
-  static DeclarationMirror _TypeVariableMirror_owner(reflectee)
-      native "TypeVariableMirror_owner";
+  @pragma("vm:external-name", "TypeVariableMirror_owner")
+  external static DeclarationMirror _TypeVariableMirror_owner(reflectee);
 
-  static Type _TypeVariableMirror_upper_bound(reflectee)
-      native "TypeVariableMirror_upper_bound";
+  @pragma("vm:external-name", "TypeVariableMirror_upper_bound")
+  external static Type _TypeVariableMirror_upper_bound(reflectee);
 }
 
 Symbol _asSetter(Symbol getter, LibraryMirror library) {
@@ -977,18 +992,20 @@
             _libraryDependencies(_reflectee).cast<LibraryDependencyMirror>());
   }
 
-  List<dynamic> _libraryDependencies(reflectee)
-      native 'LibraryMirror_libraryDependencies';
+  @pragma("vm:external-name", "LibraryMirror_libraryDependencies")
+  external List<dynamic> _libraryDependencies(reflectee);
 
-  _invoke(reflectee, memberName, arguments, argumentNames)
-      native 'LibraryMirror_invoke';
+  @pragma("vm:external-name", "LibraryMirror_invoke")
+  external _invoke(reflectee, memberName, arguments, argumentNames);
 
-  _invokeGetter(reflectee, getterName) native 'LibraryMirror_invokeGetter';
+  @pragma("vm:external-name", "LibraryMirror_invokeGetter")
+  external _invokeGetter(reflectee, getterName);
 
-  _invokeSetter(reflectee, setterName, value)
-      native 'LibraryMirror_invokeSetter';
+  @pragma("vm:external-name", "LibraryMirror_invokeSetter")
+  external _invokeSetter(reflectee, setterName, value);
 
-  List<dynamic> _computeMembers(reflectee) native "LibraryMirror_members";
+  @pragma("vm:external-name", "LibraryMirror_members")
+  external List<dynamic> _computeMembers(reflectee);
 }
 
 class _LibraryDependencyMirror extends Mirror
@@ -1037,8 +1054,8 @@
     });
   }
 
-  static LibraryMirror _tryUpgradePrefix(libraryPrefix)
-      native "LibraryMirror_fromPrefix";
+  @pragma("vm:external-name", "LibraryMirror_fromPrefix")
+  external static LibraryMirror _tryUpgradePrefix(libraryPrefix);
 
   SourceLocation? get location => null;
 }
@@ -1169,16 +1186,17 @@
 
   String toString() => "MethodMirror on '${MirrorSystem.getName(simpleName)}'";
 
-  static dynamic _MethodMirror_owner(reflectee, instantiator)
-      native "MethodMirror_owner";
+  @pragma("vm:external-name", "MethodMirror_owner")
+  external static dynamic _MethodMirror_owner(reflectee, instantiator);
 
-  static dynamic _MethodMirror_return_type(reflectee, instantiator)
-      native "MethodMirror_return_type";
+  @pragma("vm:external-name", "MethodMirror_return_type")
+  external static dynamic _MethodMirror_return_type(reflectee, instantiator);
 
-  List<dynamic> _MethodMirror_parameters(reflectee)
-      native "MethodMirror_parameters";
+  @pragma("vm:external-name", "MethodMirror_parameters")
+  external List<dynamic> _MethodMirror_parameters(reflectee);
 
-  static String? _MethodMirror_source(reflectee) native "MethodMirror_source";
+  @pragma("vm:external-name", "MethodMirror_source")
+  external static String? _MethodMirror_source(reflectee);
 }
 
 class _VariableMirror extends _DeclarationMirror implements VariableMirror {
@@ -1217,8 +1235,8 @@
   String toString() =>
       "VariableMirror on '${MirrorSystem.getName(simpleName)}'";
 
-  static _VariableMirror_type(reflectee, instantiator)
-      native "VariableMirror_type";
+  @pragma("vm:external-name", "VariableMirror_type")
+  external static _VariableMirror_type(reflectee, instantiator);
 }
 
 class _ParameterMirror extends _VariableMirror implements ParameterMirror {
@@ -1282,8 +1300,9 @@
 
   String toString() => "ParameterMirror on '${_n(simpleName)}'";
 
-  static Type _ParameterMirror_type(_reflectee, _position, instantiator)
-      native "ParameterMirror_type";
+  @pragma("vm:external-name", "ParameterMirror_type")
+  external static Type _ParameterMirror_type(
+      _reflectee, _position, instantiator);
 }
 
 class _SpecialTypeMirror extends Mirror
@@ -1347,12 +1366,12 @@
         : new _InstanceMirror._(reflectee);
   }
 
-  static _ClassMirror _makeLocalClassMirror(Type key)
-      native "Mirrors_makeLocalClassMirror";
-  static TypeMirror _makeLocalTypeMirror(Type key)
-      native "Mirrors_makeLocalTypeMirror";
-  static Type _instantiateGenericType(Type key, typeArguments)
-      native "Mirrors_instantiateGenericType";
+  @pragma("vm:external-name", "Mirrors_makeLocalClassMirror")
+  external static _ClassMirror _makeLocalClassMirror(Type key);
+  @pragma("vm:external-name", "Mirrors_makeLocalTypeMirror")
+  external static TypeMirror _makeLocalTypeMirror(Type key);
+  @pragma("vm:external-name", "Mirrors_instantiateGenericType")
+  external static Type _instantiateGenericType(Type key, typeArguments);
 
   static Expando<_ClassMirror> _declarationCache = new Expando("ClassMirror");
   static Expando<TypeMirror> _instantiationCache = new Expando("TypeMirror");
diff --git a/sdk/lib/_internal/vm/lib/mirrors_patch.dart b/sdk/lib/_internal/vm/lib/mirrors_patch.dart
index a06d546..703c0d5 100644
--- a/sdk/lib/_internal/vm/lib/mirrors_patch.dart
+++ b/sdk/lib/_internal/vm/lib/mirrors_patch.dart
@@ -88,6 +88,6 @@
     return new internal.Symbol.unvalidated(name);
   }
 
-  static _mangleName(String name, _MirrorReference lib)
-      native "Mirrors_mangleName";
+  @pragma("vm:external-name", "Mirrors_mangleName")
+  external static _mangleName(String name, _MirrorReference lib);
 }
diff --git a/sdk/lib/_internal/vm/lib/object_patch.dart b/sdk/lib/_internal/vm/lib/object_patch.dart
index 545d274..3a7b6bb 100644
--- a/sdk/lib/_internal/vm/lib/object_patch.dart
+++ b/sdk/lib/_internal/vm/lib/object_patch.dart
@@ -6,14 +6,16 @@
 
 @pragma("vm:recognized", "asm-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Smi")
-int _getHash(obj) native "Object_getHash";
+@pragma("vm:external-name", "Object_getHash")
+external int _getHash(obj);
 
 /// Set hash code associated with the object if it is not set yet
 /// and return the current hash code. See [Object._objectHashCode]
 /// for why this function needs to check for already set hash code.
 @pragma("vm:recognized", "asm-intrinsic")
 @pragma("vm:exact-result-type", "dart:core#_Smi")
-int _setHashIfNotSetYet(obj, int hash) native "Object_setHashIfNotSetYet";
+@pragma("vm:external-name", "Object_setHashIfNotSetYet")
+external int _setHashIfNotSetYet(obj, int hash);
 
 @patch
 @pragma("vm:entry-point")
@@ -23,7 +25,8 @@
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
   @pragma("vm:prefer-inline")
-  bool operator ==(Object other) native "Object_equals";
+  @pragma("vm:external-name", "Object_equals")
+  external bool operator ==(Object other);
 
   // Helpers used to implement hashCode. If a hashCode is used, we remember it
   // in a weak table in the VM (32 bit) or in the header of the object (64
@@ -52,9 +55,11 @@
   int get _identityHashCode => _objectHashCode(this);
 
   @patch
-  String toString() native "Object_toString";
+  @pragma("vm:external-name", "Object_toString")
+  external String toString();
   // A statically dispatched version of Object.toString.
-  static String _toString(obj) native "Object_toString";
+  @pragma("vm:external-name", "Object_toString")
+  external static String _toString(obj);
 
   @patch
   @pragma("vm:entry-point", "call")
@@ -66,22 +71,26 @@
   @patch
   @pragma("vm:recognized", "asm-intrinsic")
   // Result type is either "dart:core#_Type" or "dart:core#_FunctionType".
-  Type get runtimeType native "Object_runtimeType";
+  @pragma("vm:external-name", "Object_runtimeType")
+  external Type get runtimeType;
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:entry-point", "call")
   @pragma("vm:exact-result-type", bool)
-  static bool _haveSameRuntimeType(a, b) native "Object_haveSameRuntimeType";
+  @pragma("vm:external-name", "Object_haveSameRuntimeType")
+  external static bool _haveSameRuntimeType(a, b);
 
   // Call this function instead of inlining instanceof, thus collecting
   // type feedback and reducing code size of unoptimized code.
   @pragma("vm:entry-point", "call")
-  bool _instanceOf(instantiatorTypeArguments, functionTypeArguments, type)
-      native "Object_instanceOf";
+  @pragma("vm:external-name", "Object_instanceOf")
+  external bool _instanceOf(
+      instantiatorTypeArguments, functionTypeArguments, type);
 
   // Group of functions for implementing fast simple instance of.
   @pragma("vm:entry-point", "call")
-  bool _simpleInstanceOf(type) native "Object_simpleInstanceOf";
+  @pragma("vm:external-name", "Object_simpleInstanceOf")
+  external bool _simpleInstanceOf(type);
   @pragma("vm:entry-point", "call")
   bool _simpleInstanceOfTrue(type) => true;
   @pragma("vm:entry-point", "call")
diff --git a/sdk/lib/_internal/vm/lib/profiler.dart b/sdk/lib/_internal/vm/lib/profiler.dart
index 722d938..c283930 100644
--- a/sdk/lib/_internal/vm/lib/profiler.dart
+++ b/sdk/lib/_internal/vm/lib/profiler.dart
@@ -16,15 +16,20 @@
 
 @pragma("vm:entry-point")
 class _UserTag implements UserTag {
-  factory _UserTag(String label) native "UserTag_new";
-  String get label native "UserTag_label";
-  UserTag makeCurrent() native "UserTag_makeCurrent";
+  @pragma("vm:external-name", "UserTag_new")
+  external factory _UserTag(String label);
+  @pragma("vm:external-name", "UserTag_label")
+  external String get label;
+  @pragma("vm:external-name", "UserTag_makeCurrent")
+  external UserTag makeCurrent();
 }
 
 @patch
 UserTag getCurrentTag() => _getCurrentTag();
 @pragma("vm:recognized", "asm-intrinsic")
-UserTag _getCurrentTag() native "Profiler_getCurrentTag";
+@pragma("vm:external-name", "Profiler_getCurrentTag")
+external UserTag _getCurrentTag();
 
 @pragma("vm:recognized", "asm-intrinsic")
-UserTag _getDefaultTag() native "UserTag_defaultTag";
+@pragma("vm:external-name", "UserTag_defaultTag")
+external UserTag _getDefaultTag();
diff --git a/sdk/lib/_internal/vm/lib/regexp_patch.dart b/sdk/lib/_internal/vm/lib/regexp_patch.dart
index 73e38a1..a977b67 100644
--- a/sdk/lib/_internal/vm/lib/regexp_patch.dart
+++ b/sdk/lib/_internal/vm/lib/regexp_patch.dart
@@ -210,11 +210,12 @@
 
 @pragma("vm:entry-point")
 class _RegExp implements RegExp {
-  factory _RegExp(String pattern,
+  @pragma("vm:external-name", "RegExp_factory")
+  external factory _RegExp(String pattern,
       {bool multiLine: false,
       bool caseSensitive: true,
       bool unicode: false,
-      bool dotAll: false}) native "RegExp_factory";
+      bool dotAll: false});
 
   RegExpMatch? firstMatch(String input) {
     // TODO: Remove these null checks once all code is opted into strong nonnullable mode.
@@ -265,17 +266,23 @@
     return input._substringUnchecked(match[0], match[1]);
   }
 
-  String get pattern native "RegExp_getPattern";
+  @pragma("vm:external-name", "RegExp_getPattern")
+  external String get pattern;
 
-  bool get isMultiLine native "RegExp_getIsMultiLine";
+  @pragma("vm:external-name", "RegExp_getIsMultiLine")
+  external bool get isMultiLine;
 
-  bool get isCaseSensitive native "RegExp_getIsCaseSensitive";
+  @pragma("vm:external-name", "RegExp_getIsCaseSensitive")
+  external bool get isCaseSensitive;
 
-  bool get isUnicode native "RegExp_getIsUnicode";
+  @pragma("vm:external-name", "RegExp_getIsUnicode")
+  external bool get isUnicode;
 
-  bool get isDotAll native "RegExp_getIsDotAll";
+  @pragma("vm:external-name", "RegExp_getIsDotAll")
+  external bool get isDotAll;
 
-  int get _groupCount native "RegExp_getGroupCount";
+  @pragma("vm:external-name", "RegExp_getGroupCount")
+  external int get _groupCount;
 
   /// The names and indices of named capture group.
   ///
@@ -284,7 +291,8 @@
   /// [String] is the name of a capture group and the following
   /// [int] is that capture group's index.
   /// Returns `null` if there are no group names.
-  List? get _groupNameList native "RegExp_getGroupNameMap";
+  @pragma("vm:external-name", "RegExp_getGroupNameMap")
+  external List? get _groupNameList;
 
   Iterable<String> get _groupNames sync* {
     final nameList = _groupNameList;
@@ -351,12 +359,12 @@
   ];
 
   @pragma("vm:recognized", "asm-intrinsic")
-  List<int>? _ExecuteMatch(String str, int start_index)
-      native "RegExp_ExecuteMatch";
+  @pragma("vm:external-name", "RegExp_ExecuteMatch")
+  external List<int>? _ExecuteMatch(String str, int start_index);
 
   @pragma("vm:recognized", "asm-intrinsic")
-  List<int>? _ExecuteMatchSticky(String str, int start_index)
-      native "RegExp_ExecuteMatchSticky";
+  @pragma("vm:external-name", "RegExp_ExecuteMatchSticky")
+  external List<int>? _ExecuteMatchSticky(String str, int start_index);
 }
 
 class _AllMatchesIterable extends IterableBase<RegExpMatch> {
diff --git a/sdk/lib/_internal/vm/lib/stopwatch_patch.dart b/sdk/lib/_internal/vm/lib/stopwatch_patch.dart
index df29eca..e6c16c9 100644
--- a/sdk/lib/_internal/vm/lib/stopwatch_patch.dart
+++ b/sdk/lib/_internal/vm/lib/stopwatch_patch.dart
@@ -13,10 +13,12 @@
 
   // Returns the current clock tick.
   @patch
-  static int _now() native "Stopwatch_now";
+  @pragma("vm:external-name", "Stopwatch_now")
+  external static int _now();
 
   // Returns the frequency of clock ticks in Hz.
-  static int _computeFrequency() native "Stopwatch_frequency";
+  @pragma("vm:external-name", "Stopwatch_frequency")
+  external static int _computeFrequency();
 
   @patch
   int get elapsedMicroseconds {
diff --git a/sdk/lib/_internal/vm/lib/string_buffer_patch.dart b/sdk/lib/_internal/vm/lib/string_buffer_patch.dart
index 0a1b06d..3991deb 100644
--- a/sdk/lib/_internal/vm/lib/string_buffer_patch.dart
+++ b/sdk/lib/_internal/vm/lib/string_buffer_patch.dart
@@ -197,6 +197,6 @@
   /**
    * Create a [String] from the UFT-16 code units in buffer.
    */
-  static String _create(Uint16List buffer, int length, bool isLatin1)
-      native "StringBuffer_createStringFromUint16Array";
+  @pragma("vm:external-name", "StringBuffer_createStringFromUint16Array")
+  external static String _create(Uint16List buffer, int length, bool isLatin1);
 }
diff --git a/sdk/lib/_internal/vm/lib/string_patch.dart b/sdk/lib/_internal/vm/lib/string_patch.dart
index 91ac495..ff41360 100644
--- a/sdk/lib/_internal/vm/lib/string_patch.dart
+++ b/sdk/lib/_internal/vm/lib/string_patch.dart
@@ -46,8 +46,9 @@
   }
 
   @patch
-  const factory String.fromEnvironment(String name, {String defaultValue = ""})
-      native "String_fromEnvironment";
+  @pragma("vm:external-name", "String_fromEnvironment")
+  external const factory String.fromEnvironment(String name,
+      {String defaultValue = ""});
 
   bool get _isOneByte;
   String _substringUnchecked(int startIndex, int endIndex);
@@ -96,11 +97,13 @@
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int get hashCode native "String_getHashCode";
+  @pragma("vm:external-name", "String_getHashCode")
+  external int get hashCode;
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int get _identityHashCode native "String_getHashCode";
+  @pragma("vm:external-name", "String_getHashCode")
+  external int get _identityHashCode;
 
   bool get _isOneByte {
     // Alternatively return false and override it on one-byte string classes.
@@ -248,18 +251,21 @@
     return s;
   }
 
-  static String _createFromCodePoints(List<int> codePoints, int start, int end)
-      native "StringBase_createFromCodePoints";
+  @pragma("vm:external-name", "StringBase_createFromCodePoints")
+  external static String _createFromCodePoints(
+      List<int> codePoints, int start, int end);
 
   @pragma("vm:recognized", "asm-intrinsic")
-  String operator [](int index) native "String_charAt";
+  @pragma("vm:external-name", "String_charAt")
+  external String operator [](int index);
 
   int codeUnitAt(int index); // Implemented in the subclasses.
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get length native "String_getLength";
+  @pragma("vm:external-name", "String_getLength")
+  external int get length;
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
@@ -269,7 +275,8 @@
 
   bool get isNotEmpty => !isEmpty;
 
-  String operator +(String other) native "String_concat";
+  @pragma("vm:external-name", "String_concat")
+  external String operator +(String other);
 
   String toString() {
     return this;
@@ -412,8 +419,8 @@
     return _substringUncheckedNative(startIndex, endIndex);
   }
 
-  String _substringUncheckedNative(int startIndex, int endIndex)
-      native "StringBase_substringUnchecked";
+  @pragma("vm:external-name", "StringBase_substringUnchecked")
+  external String _substringUncheckedNative(int startIndex, int endIndex);
 
   // Checks for one-byte whitespaces only.
   static bool _isOneByteWhitespace(int codeUnit) {
@@ -716,10 +723,9 @@
    * If they are, then we have to check the base string slices to know
    * whether the result must be a one-byte string.
    */
-  static String
-      _joinReplaceAllResult(String base, List matches, int length,
-          bool replacementStringsAreOneByte)
-      native "StringBase_joinReplaceAllResult";
+  @pragma("vm:external-name", "StringBase_joinReplaceAllResult")
+  external static String _joinReplaceAllResult(
+      String base, List matches, int length, bool replacementStringsAreOneByte);
 
   String replaceAllMapped(Pattern pattern, String replace(Match match)) {
     if (pattern == null) throw new ArgumentError.notNull("pattern");
@@ -929,9 +935,11 @@
 
   Runes get runes => new Runes(this);
 
-  String toUpperCase() native "String_toUpperCase";
+  @pragma("vm:external-name", "String_toUpperCase")
+  external String toUpperCase();
 
-  String toLowerCase() native "String_toLowerCase";
+  @pragma("vm:external-name", "String_toLowerCase")
+  external String toLowerCase();
 
   // Concatenate ['start', 'end'[ elements of 'strings'.
   static String _concatRange(List<String> strings, int start, int end) {
@@ -943,8 +951,8 @@
 
   // Call this method if all elements of [strings] are known to be strings
   // but not all are known to be OneByteString(s).
-  static String _concatRangeNative(List strings, int start, int end)
-      native "String_concatRange";
+  @pragma("vm:external-name", "String_concatRange")
+  external static String _concatRangeNative(List strings, int start, int end);
 }
 
 @pragma("vm:entry-point")
@@ -955,11 +963,13 @@
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int get hashCode native "String_getHashCode";
+  @pragma("vm:external-name", "String_getHashCode")
+  external int get hashCode;
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int codeUnitAt(int index) native "String_codeUnitAt";
+  @pragma("vm:external-name", "String_codeUnitAt")
+  external int codeUnitAt(int index);
 
   bool _isWhitespace(int codeUnit) {
     return _StringBase._isOneByteWhitespace(codeUnit);
@@ -973,8 +983,8 @@
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", _OneByteString)
-  String _substringUncheckedNative(int startIndex, int endIndex)
-      native "OneByteString_substringUnchecked";
+  @pragma("vm:external-name", "OneByteString_substringUnchecked")
+  external String _substringUncheckedNative(int startIndex, int endIndex);
 
   List<String> _splitWithCharCode(int charCode) {
     final parts = <String>[];
@@ -1248,8 +1258,9 @@
     return unsafeCast<_OneByteString>(allocateOneByteString(length));
   }
 
-  static _OneByteString _allocateFromOneByteList(List<int> list, int start,
-      int end) native "OneByteString_allocateFromOneByteList";
+  @pragma("vm:external-name", "OneByteString_allocateFromOneByteList")
+  external static _OneByteString _allocateFromOneByteList(
+      List<int> list, int start, int end);
 
   // This is internal helper method. Code point value must be a valid
   // Latin1 value (0..0xFF), index must be valid.
@@ -1290,8 +1301,9 @@
     return unsafeCast<_TwoByteString>(allocateTwoByteString(length));
   }
 
-  static String _allocateFromTwoByteList(List<int> list, int start, int end)
-      native "TwoByteString_allocateFromTwoByteList";
+  @pragma("vm:external-name", "TwoByteString_allocateFromTwoByteList")
+  external static String _allocateFromTwoByteList(
+      List<int> list, int start, int end);
 
   // This is internal helper method. Code point value must be a valid
   // UTF-16 value (0..0xFFFF), index must be valid.
@@ -1306,7 +1318,8 @@
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int codeUnitAt(int index) native "String_codeUnitAt";
+  @pragma("vm:external-name", "String_codeUnitAt")
+  external int codeUnitAt(int index);
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
@@ -1327,7 +1340,8 @@
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int codeUnitAt(int index) native "String_codeUnitAt";
+  @pragma("vm:external-name", "String_codeUnitAt")
+  external int codeUnitAt(int index);
 
   bool operator ==(Object other) {
     return super == other;
@@ -1346,7 +1360,8 @@
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int codeUnitAt(int index) native "String_codeUnitAt";
+  @pragma("vm:external-name", "String_codeUnitAt")
+  external int codeUnitAt(int index);
 
   bool operator ==(Object other) {
     return super == other;
diff --git a/sdk/lib/_internal/vm/lib/timeline.dart b/sdk/lib/_internal/vm/lib/timeline.dart
index 5e8066b..e3e172c 100644
--- a/sdk/lib/_internal/vm/lib/timeline.dart
+++ b/sdk/lib/_internal/vm/lib/timeline.dart
@@ -5,22 +5,28 @@
 // part of "developer.dart";
 
 @patch
-bool _isDartStreamEnabled() native "Timeline_isDartStreamEnabled";
+@pragma("vm:external-name", "Timeline_isDartStreamEnabled")
+external bool _isDartStreamEnabled();
 
 @patch
-int _getTraceClock() native "Timeline_getTraceClock";
+@pragma("vm:external-name", "Timeline_getTraceClock")
+external int _getTraceClock();
 
 @patch
-int _getNextAsyncId() native "Timeline_getNextAsyncId";
+@pragma("vm:external-name", "Timeline_getNextAsyncId")
+external int _getNextAsyncId();
 
 @patch
-void _reportTaskEvent(int taskId, String phase, String category, String name,
-    String argumentsAsJson) native "Timeline_reportTaskEvent";
+@pragma("vm:external-name", "Timeline_reportTaskEvent")
+external void _reportTaskEvent(int taskId, String phase, String category,
+    String name, String argumentsAsJson);
 
 @patch
-void _reportFlowEvent(String category, String name, int type, int id,
-    String argumentsAsJson) native "Timeline_reportFlowEvent";
+@pragma("vm:external-name", "Timeline_reportFlowEvent")
+external void _reportFlowEvent(
+    String category, String name, int type, int id, String argumentsAsJson);
 
 @patch
-void _reportInstantEvent(String category, String name, String argumentsAsJson)
-    native "Timeline_reportInstantEvent";
+@pragma("vm:external-name", "Timeline_reportInstantEvent")
+external void _reportInstantEvent(
+    String category, String name, String argumentsAsJson);
diff --git a/sdk/lib/_internal/vm/lib/type_patch.dart b/sdk/lib/_internal/vm/lib/type_patch.dart
index c818922..6a0a21b 100644
--- a/sdk/lib/_internal/vm/lib/type_patch.dart
+++ b/sdk/lib/_internal/vm/lib/type_patch.dart
@@ -8,7 +8,8 @@
 
 // Equivalent of AbstractTypeLayout.
 abstract class _AbstractType implements Type {
-  String toString() native "AbstractType_toString";
+  @pragma("vm:external-name", "AbstractType_toString")
+  external String toString();
 }
 
 // Equivalent of TypeLayout.
@@ -20,11 +21,13 @@
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int get hashCode native "Type_getHashCode";
+  @pragma("vm:external-name", "Type_getHashCode")
+  external int get hashCode;
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
-  bool operator ==(other) native "Type_equality";
+  @pragma("vm:external-name", "Type_equality")
+  external bool operator ==(other);
 }
 
 // Equivalent of FunctionTypeLayout.
@@ -36,11 +39,13 @@
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int get hashCode native "FunctionType_getHashCode";
+  @pragma("vm:external-name", "FunctionType_getHashCode")
+  external int get hashCode;
 
   @pragma("vm:recognized", "asm-intrinsic")
   @pragma("vm:exact-result-type", bool)
-  bool operator ==(other) native "FunctionType_equality";
+  @pragma("vm:external-name", "FunctionType_equality")
+  external bool operator ==(other);
 }
 
 // Equivalent of TypeRefLayout.
diff --git a/sdk/lib/_internal/vm/lib/typed_data_patch.dart b/sdk/lib/_internal/vm/lib/typed_data_patch.dart
index 45b1dc9..37587c7 100644
--- a/sdk/lib/_internal/vm/lib/typed_data_patch.dart
+++ b/sdk/lib/_internal/vm/lib/typed_data_patch.dart
@@ -61,7 +61,8 @@
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get length native "TypedDataBase_length";
+  @pragma("vm:external-name", "TypedDataBase_length")
+  external int get length;
 
   int get elementSizeInBytes;
   int get offsetInBytes;
@@ -112,13 +113,9 @@
   // match the cids of 'this' and 'from'.
   // Uses toCid and fromCid to decide if clamping is necessary.
   // Element size of toCid and fromCid must match (test at caller).
-  bool _setRange(
-      int startInBytes,
-      int lengthInBytes,
-      _TypedListBase from,
-      int startFromInBytes,
-      int toCid,
-      int fromCid) native "TypedDataBase_setRange";
+  @pragma("vm:external-name", "TypedDataBase_setRange")
+  external bool _setRange(int startInBytes, int lengthInBytes,
+      _TypedListBase from, int startFromInBytes, int toCid, int fromCid);
 }
 
 mixin _IntListMixin implements List<int> {
@@ -2048,79 +2045,100 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int _getInt8(int offsetInBytes) native "TypedData_GetInt8";
+  @pragma("vm:external-name", "TypedData_GetInt8")
+  external int _getInt8(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setInt8(int offsetInBytes, int value) native "TypedData_SetInt8";
+  @pragma("vm:external-name", "TypedData_SetInt8")
+  external void _setInt8(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int _getUint8(int offsetInBytes) native "TypedData_GetUint8";
+  @pragma("vm:external-name", "TypedData_GetUint8")
+  external int _getUint8(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setUint8(int offsetInBytes, int value) native "TypedData_SetUint8";
+  @pragma("vm:external-name", "TypedData_SetUint8")
+  external void _setUint8(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int _getInt16(int offsetInBytes) native "TypedData_GetInt16";
+  @pragma("vm:external-name", "TypedData_GetInt16")
+  external int _getInt16(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setInt16(int offsetInBytes, int value) native "TypedData_SetInt16";
+  @pragma("vm:external-name", "TypedData_SetInt16")
+  external void _setInt16(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
-  int _getUint16(int offsetInBytes) native "TypedData_GetUint16";
+  @pragma("vm:external-name", "TypedData_GetUint16")
+  external int _getUint16(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setUint16(int offsetInBytes, int value) native "TypedData_SetUint16";
+  @pragma("vm:external-name", "TypedData_SetUint16")
+  external void _setUint16(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
-  int _getInt32(int offsetInBytes) native "TypedData_GetInt32";
+  @pragma("vm:external-name", "TypedData_GetInt32")
+  external int _getInt32(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setInt32(int offsetInBytes, int value) native "TypedData_SetInt32";
+  @pragma("vm:external-name", "TypedData_SetInt32")
+  external void _setInt32(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
-  int _getUint32(int offsetInBytes) native "TypedData_GetUint32";
+  @pragma("vm:external-name", "TypedData_GetUint32")
+  external int _getUint32(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setUint32(int offsetInBytes, int value) native "TypedData_SetUint32";
+  @pragma("vm:external-name", "TypedData_SetUint32")
+  external void _setUint32(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
-  int _getInt64(int offsetInBytes) native "TypedData_GetInt64";
+  @pragma("vm:external-name", "TypedData_GetInt64")
+  external int _getInt64(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setInt64(int offsetInBytes, int value) native "TypedData_SetInt64";
+  @pragma("vm:external-name", "TypedData_SetInt64")
+  external void _setInt64(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
-  int _getUint64(int offsetInBytes) native "TypedData_GetUint64";
+  @pragma("vm:external-name", "TypedData_GetUint64")
+  external int _getUint64(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setUint64(int offsetInBytes, int value) native "TypedData_SetUint64";
+  @pragma("vm:external-name", "TypedData_SetUint64")
+  external void _setUint64(int offsetInBytes, int value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double _getFloat32(int offsetInBytes) native "TypedData_GetFloat32";
+  @pragma("vm:external-name", "TypedData_GetFloat32")
+  external double _getFloat32(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setFloat32(int offsetInBytes, double value)
-      native "TypedData_SetFloat32";
+  @pragma("vm:external-name", "TypedData_SetFloat32")
+  external void _setFloat32(int offsetInBytes, double value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double _getFloat64(int offsetInBytes) native "TypedData_GetFloat64";
+  @pragma("vm:external-name", "TypedData_GetFloat64")
+  external double _getFloat64(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setFloat64(int offsetInBytes, double value)
-      native "TypedData_SetFloat64";
+  @pragma("vm:external-name", "TypedData_SetFloat64")
+  external void _setFloat64(int offsetInBytes, double value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 _getFloat32x4(int offsetInBytes) native "TypedData_GetFloat32x4";
+  @pragma("vm:external-name", "TypedData_GetFloat32x4")
+  external Float32x4 _getFloat32x4(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setFloat32x4(int offsetInBytes, Float32x4 value)
-      native "TypedData_SetFloat32x4";
+  @pragma("vm:external-name", "TypedData_SetFloat32x4")
+  external void _setFloat32x4(int offsetInBytes, Float32x4 value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _getInt32x4(int offsetInBytes) native "TypedData_GetInt32x4";
+  @pragma("vm:external-name", "TypedData_GetInt32x4")
+  external Int32x4 _getInt32x4(int offsetInBytes);
   @pragma("vm:recognized", "other")
-  void _setInt32x4(int offsetInBytes, Int32x4 value)
-      native "TypedData_SetInt32x4";
+  @pragma("vm:external-name", "TypedData_SetInt32x4")
+  external void _setInt32x4(int offsetInBytes, Int32x4 value);
 
-  Float64x2 _getFloat64x2(int offsetInBytes) native "TypedData_GetFloat64x2";
-  void _setFloat64x2(int offsetInBytes, Float64x2 value)
-      native "TypedData_SetFloat64x2";
+  @pragma("vm:external-name", "TypedData_GetFloat64x2")
+  external Float64x2 _getFloat64x2(int offsetInBytes);
+  @pragma("vm:external-name", "TypedData_SetFloat64x2")
+  external void _setFloat64x2(int offsetInBytes, Float64x2 value);
 
   /**
    * Stores the [CodeUnits] as UTF-16 units into this TypedData at
@@ -2146,7 +2164,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int8List)
   @pragma("vm:prefer-inline")
-  factory Int8List(int length) native "TypedData_Int8Array_new";
+  @pragma("vm:external-name", "TypedData_Int8Array_new")
+  external factory Int8List(int length);
 
   @patch
   factory Int8List.fromList(List<int> elements) {
@@ -2198,7 +2217,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint8List)
   @pragma("vm:prefer-inline")
-  factory Uint8List(int length) native "TypedData_Uint8Array_new";
+  @pragma("vm:external-name", "TypedData_Uint8Array_new")
+  external factory Uint8List(int length);
 
   @patch
   factory Uint8List.fromList(List<int> elements) {
@@ -2250,7 +2270,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint8ClampedList)
   @pragma("vm:prefer-inline")
-  factory Uint8ClampedList(int length) native "TypedData_Uint8ClampedArray_new";
+  @pragma("vm:external-name", "TypedData_Uint8ClampedArray_new")
+  external factory Uint8ClampedList(int length);
 
   @patch
   factory Uint8ClampedList.fromList(List<int> elements) {
@@ -2302,7 +2323,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int16List)
   @pragma("vm:prefer-inline")
-  factory Int16List(int length) native "TypedData_Int16Array_new";
+  @pragma("vm:external-name", "TypedData_Int16Array_new")
+  external factory Int16List(int length);
 
   @patch
   factory Int16List.fromList(List<int> elements) {
@@ -2374,7 +2396,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint16List)
   @pragma("vm:prefer-inline")
-  factory Uint16List(int length) native "TypedData_Uint16Array_new";
+  @pragma("vm:external-name", "TypedData_Uint16Array_new")
+  external factory Uint16List(int length);
 
   @patch
   factory Uint16List.fromList(List<int> elements) {
@@ -2446,7 +2469,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32List)
   @pragma("vm:prefer-inline")
-  factory Int32List(int length) native "TypedData_Int32Array_new";
+  @pragma("vm:external-name", "TypedData_Int32Array_new")
+  external factory Int32List(int length);
 
   @patch
   factory Int32List.fromList(List<int> elements) {
@@ -2505,7 +2529,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint32List)
   @pragma("vm:prefer-inline")
-  factory Uint32List(int length) native "TypedData_Uint32Array_new";
+  @pragma("vm:external-name", "TypedData_Uint32Array_new")
+  external factory Uint32List(int length);
 
   @patch
   factory Uint32List.fromList(List<int> elements) {
@@ -2564,7 +2589,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int64List)
   @pragma("vm:prefer-inline")
-  factory Int64List(int length) native "TypedData_Int64Array_new";
+  @pragma("vm:external-name", "TypedData_Int64Array_new")
+  external factory Int64List(int length);
 
   @patch
   factory Int64List.fromList(List<int> elements) {
@@ -2623,7 +2649,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint64List)
   @pragma("vm:prefer-inline")
-  factory Uint64List(int length) native "TypedData_Uint64Array_new";
+  @pragma("vm:external-name", "TypedData_Uint64Array_new")
+  external factory Uint64List(int length);
 
   @patch
   factory Uint64List.fromList(List<int> elements) {
@@ -2682,7 +2709,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32List)
   @pragma("vm:prefer-inline")
-  factory Float32List(int length) native "TypedData_Float32Array_new";
+  @pragma("vm:external-name", "TypedData_Float32Array_new")
+  external factory Float32List(int length);
 
   @patch
   factory Float32List.fromList(List<double> elements) {
@@ -2742,7 +2770,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64List)
   @pragma("vm:prefer-inline")
-  factory Float64List(int length) native "TypedData_Float64Array_new";
+  @pragma("vm:external-name", "TypedData_Float64Array_new")
+  external factory Float64List(int length);
 
   @patch
   factory Float64List.fromList(List<double> elements) {
@@ -2802,7 +2831,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4List)
   @pragma("vm:prefer-inline")
-  factory Float32x4List(int length) native "TypedData_Float32x4Array_new";
+  @pragma("vm:external-name", "TypedData_Float32x4Array_new")
+  external factory Float32x4List(int length);
 
   @patch
   factory Float32x4List.fromList(List<Float32x4> elements) {
@@ -2861,7 +2891,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4List)
   @pragma("vm:prefer-inline")
-  factory Int32x4List(int length) native "TypedData_Int32x4Array_new";
+  @pragma("vm:external-name", "TypedData_Int32x4Array_new")
+  external factory Int32x4List(int length);
 
   @patch
   factory Int32x4List.fromList(List<Int32x4> elements) {
@@ -2920,7 +2951,8 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2List)
   @pragma("vm:prefer-inline")
-  factory Float64x2List(int length) native "TypedData_Float64x2Array_new";
+  @pragma("vm:external-name", "TypedData_Float64x2Array_new")
+  external factory Float64x2List(int length);
 
   @patch
   factory Float64x2List.fromList(List<Float64x2> elements) {
@@ -3557,8 +3589,9 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  static _Float32x4 _Float32x4FromDoubles(
-      double x, double y, double z, double w) native "Float32x4_fromDoubles";
+  @pragma("vm:external-name", "Float32x4_fromDoubles")
+  external static _Float32x4 _Float32x4FromDoubles(
+      double x, double y, double z, double w);
 
   @patch
   @pragma("vm:prefer-inline")
@@ -3569,90 +3602,113 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  static _Float32x4 _Float32x4Splat(double v) native "Float32x4_splat";
+  @pragma("vm:external-name", "Float32x4_splat")
+  external static _Float32x4 _Float32x4Splat(double v);
 
   @patch
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  factory Float32x4.zero() native "Float32x4_zero";
+  @pragma("vm:external-name", "Float32x4_zero")
+  external factory Float32x4.zero();
 
   @patch
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  factory Float32x4.fromInt32x4Bits(Int32x4 x)
-      native "Float32x4_fromInt32x4Bits";
+  @pragma("vm:external-name", "Float32x4_fromInt32x4Bits")
+  external factory Float32x4.fromInt32x4Bits(Int32x4 x);
 
   @patch
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  factory Float32x4.fromFloat64x2(Float64x2 v) native "Float32x4_fromFloat64x2";
+  @pragma("vm:external-name", "Float32x4_fromFloat64x2")
+  external factory Float32x4.fromFloat64x2(Float64x2 v);
 }
 
 @pragma("vm:entry-point")
 class _Float32x4 implements Float32x4 {
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 operator +(Float32x4 other) native "Float32x4_add";
+  @pragma("vm:external-name", "Float32x4_add")
+  external Float32x4 operator +(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 operator -() native "Float32x4_negate";
+  @pragma("vm:external-name", "Float32x4_negate")
+  external Float32x4 operator -();
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 operator -(Float32x4 other) native "Float32x4_sub";
+  @pragma("vm:external-name", "Float32x4_sub")
+  external Float32x4 operator -(Float32x4 other);
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 operator *(Float32x4 other) native "Float32x4_mul";
+  @pragma("vm:external-name", "Float32x4_mul")
+  external Float32x4 operator *(Float32x4 other);
   @pragma("vm:recognized", "graph-intrinsic")
-  Float32x4 operator /(Float32x4 other) native "Float32x4_div";
+  @pragma("vm:external-name", "Float32x4_div")
+  external Float32x4 operator /(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 lessThan(Float32x4 other) native "Float32x4_cmplt";
+  @pragma("vm:external-name", "Float32x4_cmplt")
+  external Int32x4 lessThan(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 lessThanOrEqual(Float32x4 other) native "Float32x4_cmplte";
+  @pragma("vm:external-name", "Float32x4_cmplte")
+  external Int32x4 lessThanOrEqual(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 greaterThan(Float32x4 other) native "Float32x4_cmpgt";
+  @pragma("vm:external-name", "Float32x4_cmpgt")
+  external Int32x4 greaterThan(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 greaterThanOrEqual(Float32x4 other) native "Float32x4_cmpgte";
+  @pragma("vm:external-name", "Float32x4_cmpgte")
+  external Int32x4 greaterThanOrEqual(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 equal(Float32x4 other) native "Float32x4_cmpequal";
+  @pragma("vm:external-name", "Float32x4_cmpequal")
+  external Int32x4 equal(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 notEqual(Float32x4 other) native "Float32x4_cmpnequal";
+  @pragma("vm:external-name", "Float32x4_cmpnequal")
+  external Int32x4 notEqual(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 scale(double s) native "Float32x4_scale";
+  @pragma("vm:external-name", "Float32x4_scale")
+  external Float32x4 scale(double s);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 abs() native "Float32x4_abs";
+  @pragma("vm:external-name", "Float32x4_abs")
+  external Float32x4 abs();
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit)
-      native "Float32x4_clamp";
+  @pragma("vm:external-name", "Float32x4_clamp")
+  external Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit);
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double get x native "Float32x4_getX";
+  @pragma("vm:external-name", "Float32x4_getX")
+  external double get x;
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double get y native "Float32x4_getY";
+  @pragma("vm:external-name", "Float32x4_getY")
+  external double get y;
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double get z native "Float32x4_getZ";
+  @pragma("vm:external-name", "Float32x4_getZ")
+  external double get z;
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double get w native "Float32x4_getW";
+  @pragma("vm:external-name", "Float32x4_getW")
+  external double get w;
   @pragma("vm:recognized", "other")
-  int get signMask native "Float32x4_getSignMask";
+  @pragma("vm:external-name", "Float32x4_getSignMask")
+  external int get signMask;
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 shuffle(int mask) native "Float32x4_shuffle";
+  @pragma("vm:external-name", "Float32x4_shuffle")
+  external Float32x4 shuffle(int mask);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 shuffleMix(Float32x4 zw, int mask) native "Float32x4_shuffleMix";
+  @pragma("vm:external-name", "Float32x4_shuffleMix")
+  external Float32x4 shuffleMix(Float32x4 zw, int mask);
 
   @pragma("vm:prefer-inline")
   Float32x4 withX(double x) {
@@ -3662,7 +3718,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 _withX(double x) native "Float32x4_setX";
+  @pragma("vm:external-name", "Float32x4_setX")
+  external Float32x4 _withX(double x);
 
   @pragma("vm:prefer-inline")
   Float32x4 withY(double y) {
@@ -3672,7 +3729,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 _withY(double y) native "Float32x4_setY";
+  @pragma("vm:external-name", "Float32x4_setY")
+  external Float32x4 _withY(double y);
 
   @pragma("vm:prefer-inline")
   Float32x4 withZ(double z) {
@@ -3682,7 +3740,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 _withZ(double z) native "Float32x4_setZ";
+  @pragma("vm:external-name", "Float32x4_setZ")
+  external Float32x4 _withZ(double z);
 
   @pragma("vm:prefer-inline")
   Float32x4 withW(double w) {
@@ -3692,23 +3751,29 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 _withW(double w) native "Float32x4_setW";
+  @pragma("vm:external-name", "Float32x4_setW")
+  external Float32x4 _withW(double w);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 min(Float32x4 other) native "Float32x4_min";
+  @pragma("vm:external-name", "Float32x4_min")
+  external Float32x4 min(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 max(Float32x4 other) native "Float32x4_max";
+  @pragma("vm:external-name", "Float32x4_max")
+  external Float32x4 max(Float32x4 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 sqrt() native "Float32x4_sqrt";
+  @pragma("vm:external-name", "Float32x4_sqrt")
+  external Float32x4 sqrt();
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 reciprocal() native "Float32x4_reciprocal";
+  @pragma("vm:external-name", "Float32x4_reciprocal")
+  external Float32x4 reciprocal();
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 reciprocalSqrt() native "Float32x4_reciprocalSqrt";
+  @pragma("vm:external-name", "Float32x4_reciprocalSqrt")
+  external Float32x4 reciprocalSqrt();
 }
 
 @patch
@@ -3725,8 +3790,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  static _Int32x4 _Int32x4FromInts(int x, int y, int z, int w)
-      native "Int32x4_fromInts";
+  @pragma("vm:external-name", "Int32x4_fromInts")
+  external static _Int32x4 _Int32x4FromInts(int x, int y, int z, int w);
 
   @patch
   @pragma("vm:prefer-inline")
@@ -3740,35 +3805,47 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  static _Int32x4 _Int32x4FromBools(bool x, bool y, bool z, bool w)
-      native "Int32x4_fromBools";
+  @pragma("vm:external-name", "Int32x4_fromBools")
+  external static _Int32x4 _Int32x4FromBools(bool x, bool y, bool z, bool w);
 
   @patch
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  factory Int32x4.fromFloat32x4Bits(Float32x4 x)
-      native "Int32x4_fromFloat32x4Bits";
+  @pragma("vm:external-name", "Int32x4_fromFloat32x4Bits")
+  external factory Int32x4.fromFloat32x4Bits(Float32x4 x);
 }
 
 @pragma("vm:entry-point")
 class _Int32x4 implements Int32x4 {
-  Int32x4 operator |(Int32x4 other) native "Int32x4_or";
-  Int32x4 operator &(Int32x4 other) native "Int32x4_and";
-  Int32x4 operator ^(Int32x4 other) native "Int32x4_xor";
-  Int32x4 operator +(Int32x4 other) native "Int32x4_add";
-  Int32x4 operator -(Int32x4 other) native "Int32x4_sub";
-  int get x native "Int32x4_getX";
-  int get y native "Int32x4_getY";
-  int get z native "Int32x4_getZ";
-  int get w native "Int32x4_getW";
+  @pragma("vm:external-name", "Int32x4_or")
+  external Int32x4 operator |(Int32x4 other);
+  @pragma("vm:external-name", "Int32x4_and")
+  external Int32x4 operator &(Int32x4 other);
+  @pragma("vm:external-name", "Int32x4_xor")
+  external Int32x4 operator ^(Int32x4 other);
+  @pragma("vm:external-name", "Int32x4_add")
+  external Int32x4 operator +(Int32x4 other);
+  @pragma("vm:external-name", "Int32x4_sub")
+  external Int32x4 operator -(Int32x4 other);
+  @pragma("vm:external-name", "Int32x4_getX")
+  external int get x;
+  @pragma("vm:external-name", "Int32x4_getY")
+  external int get y;
+  @pragma("vm:external-name", "Int32x4_getZ")
+  external int get z;
+  @pragma("vm:external-name", "Int32x4_getW")
+  external int get w;
   @pragma("vm:recognized", "other")
-  int get signMask native "Int32x4_getSignMask";
+  @pragma("vm:external-name", "Int32x4_getSignMask")
+  external int get signMask;
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 shuffle(int mask) native "Int32x4_shuffle";
+  @pragma("vm:external-name", "Int32x4_shuffle")
+  external Int32x4 shuffle(int mask);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 shuffleMix(Int32x4 zw, int mask) native "Int32x4_shuffleMix";
+  @pragma("vm:external-name", "Int32x4_shuffleMix")
+  external Int32x4 shuffleMix(Int32x4 zw, int mask);
 
   @pragma("vm:prefer-inline")
   Int32x4 withX(int x) {
@@ -3777,7 +3854,8 @@
   }
 
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withX(int x) native "Int32x4_setX";
+  @pragma("vm:external-name", "Int32x4_setX")
+  external Int32x4 _withX(int x);
 
   @pragma("vm:prefer-inline")
   Int32x4 withY(int y) {
@@ -3786,7 +3864,8 @@
   }
 
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withY(int y) native "Int32x4_setY";
+  @pragma("vm:external-name", "Int32x4_setY")
+  external Int32x4 _withY(int y);
 
   @pragma("vm:prefer-inline")
   Int32x4 withZ(int z) {
@@ -3795,7 +3874,8 @@
   }
 
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withZ(int z) native "Int32x4_setZ";
+  @pragma("vm:external-name", "Int32x4_setZ")
+  external Int32x4 _withZ(int z);
 
   @pragma("vm:prefer-inline")
   Int32x4 withW(int w) {
@@ -3804,20 +3884,25 @@
   }
 
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withW(int w) native "Int32x4_setW";
+  @pragma("vm:external-name", "Int32x4_setW")
+  external Int32x4 _withW(int w);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", bool)
-  bool get flagX native "Int32x4_getFlagX";
+  @pragma("vm:external-name", "Int32x4_getFlagX")
+  external bool get flagX;
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", bool)
-  bool get flagY native "Int32x4_getFlagY";
+  @pragma("vm:external-name", "Int32x4_getFlagY")
+  external bool get flagY;
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", bool)
-  bool get flagZ native "Int32x4_getFlagZ";
+  @pragma("vm:external-name", "Int32x4_getFlagZ")
+  external bool get flagZ;
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", bool)
-  bool get flagW native "Int32x4_getFlagW";
+  @pragma("vm:external-name", "Int32x4_getFlagW")
+  external bool get flagW;
 
   @pragma("vm:prefer-inline", _Int32x4)
   Int32x4 withFlagX(bool x) {
@@ -3827,7 +3912,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withFlagX(bool x) native "Int32x4_setFlagX";
+  @pragma("vm:external-name", "Int32x4_setFlagX")
+  external Int32x4 _withFlagX(bool x);
 
   @pragma("vm:prefer-inline", _Int32x4)
   Int32x4 withFlagY(bool y) {
@@ -3837,7 +3923,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withFlagY(bool y) native "Int32x4_setFlagY";
+  @pragma("vm:external-name", "Int32x4_setFlagY")
+  external Int32x4 _withFlagY(bool y);
 
   @pragma("vm:prefer-inline", _Int32x4)
   Int32x4 withFlagZ(bool z) {
@@ -3847,7 +3934,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withFlagZ(bool z) native "Int32x4_setFlagZ";
+  @pragma("vm:external-name", "Int32x4_setFlagZ")
+  external Int32x4 _withFlagZ(bool z);
 
   @pragma("vm:prefer-inline", _Int32x4)
   Int32x4 withFlagW(bool w) {
@@ -3857,12 +3945,13 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4)
-  Int32x4 _withFlagW(bool w) native "Int32x4_setFlagW";
+  @pragma("vm:external-name", "Int32x4_setFlagW")
+  external Int32x4 _withFlagW(bool w);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4)
-  Float32x4 select(Float32x4 trueValue, Float32x4 falseValue)
-      native "Int32x4_select";
+  @pragma("vm:external-name", "Int32x4_select")
+  external Float32x4 select(Float32x4 trueValue, Float32x4 falseValue);
 }
 
 @patch
@@ -3877,8 +3966,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  static _Float64x2 _Float64x2FromDoubles(double x, double y)
-      native "Float64x2_fromDoubles";
+  @pragma("vm:external-name", "Float64x2_fromDoubles")
+  external static _Float64x2 _Float64x2FromDoubles(double x, double y);
 
   @patch
   @pragma("vm:prefer-inline")
@@ -3889,48 +3978,61 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  static _Float64x2 _Float64x2Splat(double v) native "Float64x2_splat";
+  @pragma("vm:external-name", "Float64x2_splat")
+  external static _Float64x2 _Float64x2Splat(double v);
 
   @patch
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  factory Float64x2.zero() native "Float64x2_zero";
+  @pragma("vm:external-name", "Float64x2_zero")
+  external factory Float64x2.zero();
 
   @patch
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  factory Float64x2.fromFloat32x4(Float32x4 v) native "Float64x2_fromFloat32x4";
+  @pragma("vm:external-name", "Float64x2_fromFloat32x4")
+  external factory Float64x2.fromFloat32x4(Float32x4 v);
 }
 
 @pragma("vm:entry-point")
 class _Float64x2 implements Float64x2 {
   @pragma("vm:recognized", "graph-intrinsic")
-  Float64x2 operator +(Float64x2 other) native "Float64x2_add";
+  @pragma("vm:external-name", "Float64x2_add")
+  external Float64x2 operator +(Float64x2 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 operator -() native "Float64x2_negate";
+  @pragma("vm:external-name", "Float64x2_negate")
+  external Float64x2 operator -();
   @pragma("vm:recognized", "graph-intrinsic")
-  Float64x2 operator -(Float64x2 other) native "Float64x2_sub";
+  @pragma("vm:external-name", "Float64x2_sub")
+  external Float64x2 operator -(Float64x2 other);
   @pragma("vm:recognized", "graph-intrinsic")
-  Float64x2 operator *(Float64x2 other) native "Float64x2_mul";
+  @pragma("vm:external-name", "Float64x2_mul")
+  external Float64x2 operator *(Float64x2 other);
   @pragma("vm:recognized", "graph-intrinsic")
-  Float64x2 operator /(Float64x2 other) native "Float64x2_div";
+  @pragma("vm:external-name", "Float64x2_div")
+  external Float64x2 operator /(Float64x2 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 scale(double s) native "Float64x2_scale";
+  @pragma("vm:external-name", "Float64x2_scale")
+  external Float64x2 scale(double s);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 abs() native "Float64x2_abs";
-  Float64x2 clamp(Float64x2 lowerLimit, Float64x2 upperLimit)
-      native "Float64x2_clamp";
+  @pragma("vm:external-name", "Float64x2_abs")
+  external Float64x2 abs();
+  @pragma("vm:external-name", "Float64x2_clamp")
+  external Float64x2 clamp(Float64x2 lowerLimit, Float64x2 upperLimit);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double get x native "Float64x2_getX";
+  @pragma("vm:external-name", "Float64x2_getX")
+  external double get x;
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Double")
-  double get y native "Float64x2_getY";
+  @pragma("vm:external-name", "Float64x2_getY")
+  external double get y;
   @pragma("vm:recognized", "other")
-  int get signMask native "Float64x2_getSignMask";
+  @pragma("vm:external-name", "Float64x2_getSignMask")
+  external int get signMask;
 
   @pragma("vm:prefer-inline")
   Float64x2 withX(double x) {
@@ -3940,7 +4042,8 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 _withX(double x) native "Float64x2_setX";
+  @pragma("vm:external-name", "Float64x2_setX")
+  external Float64x2 _withX(double x);
 
   @pragma("vm:prefer-inline")
   Float64x2 withY(double y) {
@@ -3950,17 +4053,21 @@
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 _withY(double y) native "Float64x2_setY";
+  @pragma("vm:external-name", "Float64x2_setY")
+  external Float64x2 _withY(double y);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 min(Float64x2 other) native "Float64x2_min";
+  @pragma("vm:external-name", "Float64x2_min")
+  external Float64x2 min(Float64x2 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 max(Float64x2 other) native "Float64x2_max";
+  @pragma("vm:external-name", "Float64x2_max")
+  external Float64x2 max(Float64x2 other);
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2)
-  Float64x2 sqrt() native "Float64x2_sqrt";
+  @pragma("vm:external-name", "Float64x2_sqrt")
+  external Float64x2 sqrt();
 }
 
 class _TypedListIterator<E> implements Iterator<E> {
@@ -4005,12 +4112,14 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:non-nullable-result-type")
   @pragma("vm:prefer-inline")
-  _TypedList get _typedData native "TypedDataView_typedData";
+  @pragma("vm:external-name", "TypedDataView_typedData")
+  external _TypedList get _typedData;
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get offsetInBytes native "TypedDataView_offsetInBytes";
+  @pragma("vm:external-name", "TypedDataView_offsetInBytes")
+  external int get offsetInBytes;
 }
 
 @pragma("vm:entry-point")
@@ -4020,8 +4129,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int8ArrayView)
-  factory _Int8ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Int8ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Int8ArrayView_new")
+  external factory _Int8ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4060,8 +4170,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint8ArrayView)
-  factory _Uint8ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Uint8ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Uint8ArrayView_new")
+  external factory _Uint8ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4100,8 +4211,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint8ClampedArrayView)
-  factory _Uint8ClampedArrayView._(_TypedList buffer, int offsetInBytes,
-      int length) native "TypedDataView_Uint8ClampedArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Uint8ClampedArrayView_new")
+  external factory _Uint8ClampedArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4140,8 +4252,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int16ArrayView)
-  factory _Int16ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Int16ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Int16ArrayView_new")
+  external factory _Int16ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4193,8 +4306,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint16ArrayView)
-  factory _Uint16ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Uint16ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Uint16ArrayView_new")
+  external factory _Uint16ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4247,8 +4361,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32ArrayView)
-  factory _Int32ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Int32ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Int32ArrayView_new")
+  external factory _Int32ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4287,8 +4402,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint32ArrayView)
-  factory _Uint32ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Uint32ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Uint32ArrayView_new")
+  external factory _Uint32ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4327,8 +4443,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int64ArrayView)
-  factory _Int64ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Int64ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Int64ArrayView_new")
+  external factory _Int64ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4367,8 +4484,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Uint64ArrayView)
-  factory _Uint64ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Uint64ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Uint64ArrayView_new")
+  external factory _Uint64ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4407,8 +4525,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32ArrayView)
-  factory _Float32ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Float32ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Float32ArrayView_new")
+  external factory _Float32ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4447,8 +4566,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64ArrayView)
-  factory _Float64ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Float64ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Float64ArrayView_new")
+  external factory _Float64ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   @pragma("vm:prefer-inline")
@@ -4487,8 +4607,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float32x4ArrayView)
-  factory _Float32x4ArrayView._(_TypedList buffer, int offsetInBytes,
-      int length) native "TypedDataView_Float32x4ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Float32x4ArrayView_new")
+  external factory _Float32x4ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   Float32x4 operator [](int index) {
@@ -4525,8 +4646,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Int32x4ArrayView)
-  factory _Int32x4ArrayView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_Int32x4ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Int32x4ArrayView_new")
+  external factory _Int32x4ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   Int32x4 operator [](int index) {
@@ -4563,8 +4685,9 @@
   // Constructor.
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _Float64x2ArrayView)
-  factory _Float64x2ArrayView._(_TypedList buffer, int offsetInBytes,
-      int length) native "TypedDataView_Float64x2ArrayView_new";
+  @pragma("vm:external-name", "TypedDataView_Float64x2ArrayView_new")
+  external factory _Float64x2ArrayView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing List interface.
   Float64x2 operator [](int index) {
@@ -4598,8 +4721,9 @@
 class _ByteDataView implements ByteData {
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", _ByteDataView)
-  factory _ByteDataView._(_TypedList buffer, int offsetInBytes, int length)
-      native "TypedDataView_ByteDataView_new";
+  @pragma("vm:external-name", "TypedDataView_ByteDataView_new")
+  external factory _ByteDataView._(
+      _TypedList buffer, int offsetInBytes, int length);
 
   // Method(s) implementing TypedData interface.
   _ByteBuffer get buffer {
@@ -4846,17 +4970,20 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:non-nullable-result-type")
   @pragma("vm:prefer-inline")
-  _TypedList get _typedData native "TypedDataView_typedData";
+  @pragma("vm:external-name", "TypedDataView_typedData")
+  external _TypedList get _typedData;
 
   @pragma("vm:recognized", "other")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get offsetInBytes native "TypedDataView_offsetInBytes";
+  @pragma("vm:external-name", "TypedDataView_offsetInBytes")
+  external int get offsetInBytes;
 
   @pragma("vm:recognized", "graph-intrinsic")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   @pragma("vm:prefer-inline")
-  int get length native "TypedDataBase_length";
+  @pragma("vm:external-name", "TypedDataBase_length")
+  external int get length;
 }
 
 @pragma("vm:prefer-inline")
diff --git a/sdk/lib/_internal/vm/lib/uri_patch.dart b/sdk/lib/_internal/vm/lib/uri_patch.dart
index de10c9e..3ce2037 100644
--- a/sdk/lib/_internal/vm/lib/uri_patch.dart
+++ b/sdk/lib/_internal/vm/lib/uri_patch.dart
@@ -26,7 +26,8 @@
 class _Uri {
   static final bool _isWindowsCached = _isWindowsPlatform;
 
-  static bool get _isWindowsPlatform native "Uri_isWindowsPlatform";
+  @pragma("vm:external-name", "Uri_isWindowsPlatform")
+  external static bool get _isWindowsPlatform;
 
   @patch
   static bool get _isWindows => _isWindowsCached;
diff --git a/sdk/lib/_internal/vm/lib/weak_property.dart b/sdk/lib/_internal/vm/lib/weak_property.dart
index defcd40..132a94d 100644
--- a/sdk/lib/_internal/vm/lib/weak_property.dart
+++ b/sdk/lib/_internal/vm/lib/weak_property.dart
@@ -8,15 +8,19 @@
 class _WeakProperty {
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  get key native "WeakProperty_getKey";
+  @pragma("vm:external-name", "WeakProperty_getKey")
+  external get key;
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  set key(k) native "WeakProperty_setKey";
+  @pragma("vm:external-name", "WeakProperty_setKey")
+  external set key(k);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  get value native "WeakProperty_getValue";
+  @pragma("vm:external-name", "WeakProperty_getValue")
+  external get value;
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  set value(v) native "WeakProperty_setValue";
+  @pragma("vm:external-name", "WeakProperty_setValue")
+  external set value(v);
 }
diff --git a/sdk/lib/core/enum.dart b/sdk/lib/core/enum.dart
index c220b42..12c8a07 100644
--- a/sdk/lib/core/enum.dart
+++ b/sdk/lib/core/enum.dart
@@ -20,4 +20,14 @@
   /// This is also the index of the value in the
   /// enumerated type's static `values` list.
   int get index;
+
+  /// Compares two enum values by their [index].
+  ///
+  /// A generic [Comparator] function for enum types which
+  /// orders enum values by their [index] value, which corresponds
+  /// to the source order of the enum element declarations in
+  /// the `enum` declaration.
+  @Since("2.15")
+  static int compareByIndex<T extends Enum>(T value1, T value2) =>
+      value1.index - value2.index;
 }
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index 1e8a9ea..2e3b2bd 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -823,9 +823,9 @@
 
 // Bootstrapping native for getting the FFI native C function pointer to look
 // up the FFI resolver.
-Pointer<NativeFunction<IntPtr Function(Handle, Handle)>>
-    _get_ffi_native_resolver<
-        T extends NativeFunction>() native "Ffi_GetFfiNativeResolver";
+@pragma("vm:external-name", "Ffi_GetFfiNativeResolver")
+external Pointer<NativeFunction<IntPtr Function(Handle, Handle)>>
+    _get_ffi_native_resolver<T extends NativeFunction>();
 
 // Resolver for FFI Native C function pointers.
 @pragma('vm:entry-point')
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e11e430..8d03455 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2980,7 +2980,7 @@
 
 @Native("CharacterData")
 class CharacterData extends Node
-    implements NonDocumentTypeChildNode, ChildNode {
+    implements ChildNode, NonDocumentTypeChildNode {
   // To suppress missing implicit constructor warnings.
   factory CharacterData._() {
     throw new UnsupportedError("Not supported");
@@ -10100,10 +10100,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   void _webkitExitFullscreen() native;
 
-  // From NonElementParentNode
-
-  Element? getElementById(String elementId) native;
-
   // From DocumentOrShadowRoot
 
   Element? get activeElement native;
@@ -10126,6 +10122,10 @@
 
   FontFaceSet? get fonts native;
 
+  // From NonElementParentNode
+
+  Element? getElementById(String elementId) native;
+
   // From ParentNode
 
   @JSName('childElementCount')
@@ -10458,7 +10458,7 @@
 
 @Native("DocumentFragment")
 class DocumentFragment extends Node
-    implements NonElementParentNode, ParentNode {
+    implements ParentNode, NonElementParentNode {
   factory DocumentFragment() => document.createDocumentFragment();
 
   factory DocumentFragment.html(String? html,
@@ -11627,7 +11627,7 @@
 @Native("DOMStringList")
 class DomStringList extends Interceptor
     with ListMixin<String>, ImmutableListMixin<String>
-    implements JavaScriptIndexingBehavior<String>, List<String> {
+    implements List<String>, JavaScriptIndexingBehavior<String> {
   // To suppress missing implicit constructor warnings.
   factory DomStringList._() {
     throw new UnsupportedError("Not supported");
@@ -12704,10 +12704,10 @@
 @Native("Element")
 class Element extends Node
     implements
-        NonDocumentTypeChildNode,
-        GlobalEventHandlers,
         ParentNode,
-        ChildNode {
+        ChildNode,
+        NonDocumentTypeChildNode,
+        GlobalEventHandlers {
   /**
    * Creates an HTML element from a valid fragment of HTML.
    *
@@ -17646,7 +17646,7 @@
 @Native("HTMLCollection")
 class HtmlCollection extends Interceptor
     with ListMixin<Node>, ImmutableListMixin<Node>
-    implements JavaScriptIndexingBehavior<Node>, List<Node> {
+    implements List<Node>, JavaScriptIndexingBehavior<Node> {
   // To suppress missing implicit constructor warnings.
   factory HtmlCollection._() {
     throw new UnsupportedError("Not supported");
@@ -22620,10 +22620,10 @@
 class Navigator extends NavigatorConcurrentHardware
     implements
         NavigatorCookies,
+        NavigatorID,
         NavigatorLanguage,
         NavigatorOnLine,
-        NavigatorAutomationInformation,
-        NavigatorID {
+        NavigatorAutomationInformation {
   List<Gamepad?> getGamepads() {
     var gamepadList = _getGamepads();
 
@@ -23619,7 +23619,7 @@
 @Native("NodeList,RadioNodeList")
 class NodeList extends Interceptor
     with ListMixin<Node>, ImmutableListMixin<Node>
-    implements JavaScriptIndexingBehavior<Node>, List<Node> {
+    implements List<Node>, JavaScriptIndexingBehavior<Node> {
   // To suppress missing implicit constructor warnings.
   factory NodeList._() {
     throw new UnsupportedError("Not supported");
@@ -25591,7 +25591,7 @@
 @Native("PluginArray")
 class PluginArray extends Interceptor
     with ListMixin<Plugin>, ImmutableListMixin<Plugin>
-    implements JavaScriptIndexingBehavior<Plugin>, List<Plugin> {
+    implements List<Plugin>, JavaScriptIndexingBehavior<Plugin> {
   // To suppress missing implicit constructor warnings.
   factory PluginArray._() {
     throw new UnsupportedError("Not supported");
@@ -28255,7 +28255,7 @@
 @Native("SourceBufferList")
 class SourceBufferList extends EventTarget
     with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer>
-    implements JavaScriptIndexingBehavior<SourceBuffer>, List<SourceBuffer> {
+    implements List<SourceBuffer>, JavaScriptIndexingBehavior<SourceBuffer> {
   // To suppress missing implicit constructor warnings.
   factory SourceBufferList._() {
     throw new UnsupportedError("Not supported");
@@ -28406,7 +28406,7 @@
 @Native("SpeechGrammarList")
 class SpeechGrammarList extends Interceptor
     with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar>
-    implements JavaScriptIndexingBehavior<SpeechGrammar>, List<SpeechGrammar> {
+    implements List<SpeechGrammar>, JavaScriptIndexingBehavior<SpeechGrammar> {
   // To suppress missing implicit constructor warnings.
   factory SpeechGrammarList._() {
     throw new UnsupportedError("Not supported");
@@ -30400,7 +30400,7 @@
 @Native("TouchList")
 class TouchList extends Interceptor
     with ListMixin<Touch>, ImmutableListMixin<Touch>
-    implements JavaScriptIndexingBehavior<Touch>, List<Touch> {
+    implements List<Touch>, JavaScriptIndexingBehavior<Touch> {
   // To suppress missing implicit constructor warnings.
   factory TouchList._() {
     throw new UnsupportedError("Not supported");
@@ -32036,11 +32036,11 @@
 @Native("Window,DOMWindow")
 class Window extends EventTarget
     implements
-        WindowEventHandlers,
-        WindowBase,
         GlobalEventHandlers,
+        WindowBase64,
+        WindowEventHandlers,
         _WindowTimers,
-        WindowBase64 {
+        WindowBase {
   /**
    * Returns a Future that completes just before the window is about to
    * repaint so the user can draw an animation frame.
@@ -33944,7 +33944,7 @@
 
 @Native("WorkerGlobalScope")
 class WorkerGlobalScope extends EventTarget
-    implements _WindowTimers, WindowBase64 {
+    implements WindowBase64, _WindowTimers {
   // To suppress missing implicit constructor warnings.
   factory WorkerGlobalScope._() {
     throw new UnsupportedError("Not supported");
@@ -34456,7 +34456,7 @@
 @Native("CSSRuleList")
 class _CssRuleList extends Interceptor
     with ListMixin<CssRule>, ImmutableListMixin<CssRule>
-    implements JavaScriptIndexingBehavior<CssRule>, List<CssRule> {
+    implements List<CssRule>, JavaScriptIndexingBehavior<CssRule> {
   // To suppress missing implicit constructor warnings.
   factory _CssRuleList._() {
     throw new UnsupportedError("Not supported");
@@ -35084,7 +35084,7 @@
 @Native("NamedNodeMap,MozNamedAttrMap")
 class _NamedNodeMap extends Interceptor
     with ListMixin<Node>, ImmutableListMixin<Node>
-    implements JavaScriptIndexingBehavior<Node>, List<Node> {
+    implements List<Node>, JavaScriptIndexingBehavior<Node> {
   // To suppress missing implicit constructor warnings.
   factory _NamedNodeMap._() {
     throw new UnsupportedError("Not supported");
@@ -35277,8 +35277,8 @@
         ListMixin<SpeechRecognitionResult>,
         ImmutableListMixin<SpeechRecognitionResult>
     implements
-        JavaScriptIndexingBehavior<SpeechRecognitionResult>,
-        List<SpeechRecognitionResult> {
+        List<SpeechRecognitionResult>,
+        JavaScriptIndexingBehavior<SpeechRecognitionResult> {
   // To suppress missing implicit constructor warnings.
   factory _SpeechRecognitionResultList._() {
     throw new UnsupportedError("Not supported");
@@ -35718,7 +35718,7 @@
 
 @Native("WorkerNavigator")
 abstract class _WorkerNavigator extends NavigatorConcurrentHardware
-    implements NavigatorOnLine, NavigatorID {
+    implements NavigatorID, NavigatorOnLine {
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() {
     throw new UnsupportedError("Not supported");
diff --git a/sdk/lib/html/dartium/nativewrappers.dart b/sdk/lib/html/dartium/nativewrappers.dart
index 1d7787e..39004b7 100644
--- a/sdk/lib/html/dartium/nativewrappers.dart
+++ b/sdk/lib/html/dartium/nativewrappers.dart
@@ -19,5 +19,5 @@
 /// NOTE: This is function is temporary and will be deprecated in the near
 /// future.
 @pragma("vm:recognized", "other")
-int getNativeField(NativeFieldWrapperClass1 object)
-    native "FullyRecognizedMethod_NoNative";
+@pragma("vm:external-name", "FullyRecognizedMethod_NoNative")
+external int getNativeField(NativeFieldWrapperClass1 object);
diff --git a/sdk/lib/vmservice/asset.dart b/sdk/lib/vmservice/asset.dart
index a29984e..b42df32 100644
--- a/sdk/lib/vmservice/asset.dart
+++ b/sdk/lib/vmservice/asset.dart
@@ -54,7 +54,8 @@
   String toString() => '$name ($mimeType)';
 }
 
-List _decodeAssets(Uint8List data) native 'VMService_DecodeAssets';
+@pragma("vm:external-name", "VMService_DecodeAssets")
+external List _decodeAssets(Uint8List data);
 
 Map<String, Asset>? _assets;
 Map<String, Asset> get assets {
diff --git a/sdk/lib/vmservice/message.dart b/sdk/lib/vmservice/message.dart
index a3a0e61..e1164e5 100644
--- a/sdk/lib/vmservice/message.dart
+++ b/sdk/lib/vmservice/message.dart
@@ -251,10 +251,11 @@
       setResponse(encodeRpcError(this, code, details: '$method: $details'));
 }
 
-bool sendIsolateServiceMessage(SendPort sp, List m)
-    native 'VMService_SendIsolateServiceMessage';
+@pragma("vm:external-name", "VMService_SendIsolateServiceMessage")
+external bool sendIsolateServiceMessage(SendPort sp, List m);
 
-void sendRootServiceMessage(List m) native 'VMService_SendRootServiceMessage';
+@pragma("vm:external-name", "VMService_SendRootServiceMessage")
+external void sendRootServiceMessage(List m);
 
-void sendObjectRootServiceMessage(List m)
-    native 'VMService_SendObjectRootServiceMessage';
+@pragma("vm:external-name", "VMService_SendObjectRootServiceMessage")
+external void sendObjectRootServiceMessage(List m);
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index dacc9d5..ed389a7 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -733,24 +733,29 @@
     VMService().runningIsolates.isolateStartup(port_id, sp, name);
 
 /// Notify the VM that the service is running.
-void _onStart() native 'VMService_OnStart';
+@pragma("vm:external-name", "VMService_OnStart")
+external void _onStart();
 
 /// Notify the VM that the service is no longer running.
-void _onExit() native 'VMService_OnExit';
+@pragma("vm:external-name", "VMService_OnExit")
+external void _onExit();
 
 /// Notify the VM that the server's address has changed.
 void onServerAddressChange(String? address) {
   _onServerAddressChange(address);
 }
 
-void _onServerAddressChange(String? address)
-    native 'VMService_OnServerAddressChange';
+@pragma("vm:external-name", "VMService_OnServerAddressChange")
+external void _onServerAddressChange(String? address);
 
 /// Subscribe to a service stream.
-bool _vmListenStream(String streamId) native 'VMService_ListenStream';
+@pragma("vm:external-name", "VMService_ListenStream")
+external bool _vmListenStream(String streamId);
 
 /// Cancel a subscription to a service stream.
-void _vmCancelStream(String streamId) native 'VMService_CancelStream';
+@pragma("vm:external-name", "VMService_CancelStream")
+external void _vmCancelStream(String streamId);
 
 /// Get the bytes to the tar archive.
-Uint8List _requestAssets() native 'VMService_RequestAssets';
+@pragma("vm:external-name", "VMService_RequestAssets")
+external Uint8List _requestAssets();
diff --git a/tests/language/enum/enum_test.dart b/tests/language/enum/enum_test.dart
index 8b21613..c9df393 100644
--- a/tests/language/enum/enum_test.dart
+++ b/tests/language/enum/enum_test.dart
@@ -93,6 +93,21 @@
   Expect.type<Enum>(Enum1._);
   Enum enumValue = Enum1._;
   Expect.equals(0, enumValue.index);
+
+  // Enum.compareByIndex orders enums correctly.
+  var enumValues = [Enum5.G, Enum5.H, Enum5.F];
+  for (var i = 0; i < 10; i++) {
+    enumValues.sort(Enum.compareByIndex);
+    enumValues.fold<int>(-1, (previousValue, element) {
+      Expect.isTrue(previousValue < element.index, "$enumValues");
+      return element.index;
+    });
+    enumValues.shuffle();
+  }
+  // Can be used at the type `Enum` to compare different enums.
+  Expect.isTrue(Enum.compareByIndex<Enum>(Enum4.D, Enum5.H) < 0);
+  Expect.isTrue(Enum.compareByIndex<Enum>(Enum4.E, Enum5.F) > 0);
+  Expect.isTrue(Enum.compareByIndex<Enum>(Enum4.D, Enum5.F) == 0);
 }
 
 test1(Enum1 e) {
diff --git a/tests/language/setter/setter3_test.dart b/tests/language/setter/setter3_test.dart
index a8212e4..59a6a7e 100644
--- a/tests/language/setter/setter3_test.dart
+++ b/tests/language/setter/setter3_test.dart
@@ -17,8 +17,6 @@
 //^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
 // [cfe] The return type of the setter must be 'void' or absent.
-//         ^^^
-// [analyzer] COMPILE_TIME_ERROR.BODY_MIGHT_COMPLETE_NORMALLY
 }
 
 main() {
diff --git a/tests/language_2/enum/enum_test.dart b/tests/language_2/enum/enum_test.dart
index 8eb762f..6ceecf1 100644
--- a/tests/language_2/enum/enum_test.dart
+++ b/tests/language_2/enum/enum_test.dart
@@ -95,6 +95,21 @@
   Expect.type<Enum>(Enum1._);
   Enum enumValue = Enum1._;
   Expect.equals(0, enumValue.index);
+
+  // Enum.compareByIndex orders enums correctly.
+  var enumValues = [Enum5.G, Enum5.H, Enum5.F];
+  for (var i = 0; i < 10; i++) {
+    enumValues.sort(Enum.compareByIndex);
+    enumValues.fold<int>(-1, (previousValue, element) {
+      Expect.isTrue(previousValue < element.index, "$enumValues");
+      return element.index;
+    });
+    enumValues.shuffle();
+  }
+  // Can be used at the type `Enum` to compare different enums.
+  Expect.isTrue(Enum.compareByIndex<Enum>(Enum4.D, Enum5.H) < 0);
+  Expect.isTrue(Enum.compareByIndex<Enum>(Enum4.E, Enum5.F) > 0);
+  Expect.isTrue(Enum.compareByIndex<Enum>(Enum4.D, Enum5.F) == 0);
 }
 
 test1(Enum1 e) {
diff --git a/tools/VERSION b/tools/VERSION
index b94b4f1..e755c01 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 91
+PRERELEASE 92
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/new_scripts/code_generator_dart.py b/tools/dom/new_scripts/code_generator_dart.py
index 2830e7f..ad9fc3c 100644
--- a/tools/dom/new_scripts/code_generator_dart.py
+++ b/tools/dom/new_scripts/code_generator_dart.py
@@ -43,7 +43,7 @@
 """
 
 import os
-import cPickle as pickle
+import pickle
 import re
 import sys
 
diff --git a/tools/dom/new_scripts/dart_compiler.py b/tools/dom/new_scripts/dart_compiler.py
index 5a17629..7fe9379 100755
--- a/tools/dom/new_scripts/dart_compiler.py
+++ b/tools/dom/new_scripts/dart_compiler.py
@@ -34,7 +34,7 @@
 import abc
 from optparse import OptionParser
 import os
-import cPickle as pickle
+import pickle
 
 from idl_reader import IdlReader
 from utilities import write_file
diff --git a/tools/dom/scripts/css_code_generator.py b/tools/dom/scripts/css_code_generator.py
index 717630b..3510edd 100644
--- a/tools/dom/scripts/css_code_generator.py
+++ b/tools/dom/scripts/css_code_generator.py
@@ -86,12 +86,11 @@
     # TODO(efortuna): do we also want CSSPropertyNames.in?
     data = [d.strip() for d in data if not isCommentLine(d) and not '=' in d]
 
-    browser_props = [readCssProperties(file) for file in BROWSER_PATHS]
-    universal_properties = reduce(lambda a, b: set(a).intersection(b),
-                                  browser_props)
+    browser_props = [set(readCssProperties(file)) for file in BROWSER_PATHS]
+    universal_properties = set.intersection(*browser_props)
     universal_properties = universal_properties.difference(['cssText'])
     universal_properties = universal_properties.intersection(
-        map(camelCaseName, data))
+        list(map(camelCaseName, data)))
 
     class_file = open(TEMPLATE_FILE, 'w')
 
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index a392020..1319e95 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -31,12 +31,11 @@
     third_party_dir = os.path.join(dart_dir, '..', 'third_party')
     assert (os.path.exists(third_party_dir))
 else:
-    # It's Dart we need to make sure that tools in injected in our search path
-    # because this is where idl_parser is located for a Dart enlistment.  Dartium
+    # It's Dart we need to make sure that WebCore is injected in our search path
+    # because this is where idl_parser is located for a Dart enlistment. Dartium
     # can figure out the tools directory because of the location of where the
     # scripts blink scripts are located.
-    tools_dir = os.path.join(dart_dir, 'tools')
-    sys.path.insert(1, tools_dir)
+    sys.path.insert(1, os.path.join(dart_dir, 'third_party/WebCore'))
 
 sys.path.insert(1, third_party_dir)
 
diff --git a/tools/dom/scripts/dartgenerator.py b/tools/dom/scripts/dartgenerator.py
index ceb213e..974cfc3 100755
--- a/tools/dom/scripts/dartgenerator.py
+++ b/tools/dom/scripts/dartgenerator.py
@@ -72,14 +72,12 @@
 
     def LoadAuxiliary(self, auxiliary_dir):
 
-        def Visitor(_, dirname, names):
+        for (dirname, _, names) in os.walk(auxiliary_dir):
             for name in names:
                 if name.endswith('.dart'):
                     name = name[0:-5]  # strip off ".dart"
                 self._auxiliary_files[name] = os.path.join(dirname, name)
 
-        os.path.walk(auxiliary_dir, Visitor, None)
-
     def FilterMembersWithUnidentifiedTypes(self, database):
         """Removes unidentified types.
 
@@ -106,10 +104,13 @@
                     return False
                 return True
 
-            interface.constants = filter(IsIdentified, interface.constants)
-            interface.attributes = filter(IsIdentified, interface.attributes)
-            interface.operations = filter(IsIdentified, interface.operations)
-            interface.parents = filter(IsIdentified, interface.parents)
+            interface.constants = list(filter(IsIdentified,
+                                              interface.constants))
+            interface.attributes = list(
+                filter(IsIdentified, interface.attributes))
+            interface.operations = list(
+                filter(IsIdentified, interface.operations))
+            interface.parents = list(filter(IsIdentified, interface.parents))
 
     def FilterInterfaces(self,
                          database,
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index b997b60..35e770c 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -12,7 +12,6 @@
 import monitored
 import os
 import re
-from generator import ConstantOutputOrder
 from htmlrenamer import renamed_html_members, html_interface_renames
 
 _logger = logging.getLogger('dartmetadata')
@@ -714,7 +713,7 @@
 
         if _monitor_type_metadata:
             monitored_interfaces = {}
-            for interface_id, interface_data in self._types.items():
+            for interface_id, interface_data in list(self._types.items()):
                 monitored_interface = interface_data.copy()
                 monitored_interface['members'] = monitored.Dict(
                     'dartmetadata.%s' % interface_id, interface_data['members'])
diff --git a/tools/dom/scripts/database.py b/tools/dom/scripts/database.py
index 75d8d2e..2ff5dc2 100755
--- a/tools/dom/scripts/database.py
+++ b/tools/dom/scripts/database.py
@@ -149,7 +149,7 @@
 
     def Save(self):
         """Saves all in-memory interfaces into files."""
-        for interface in self._all_interfaces.values():
+        for interface in list(self._all_interfaces.values()):
             self._SaveInterfaceFile(interface)
         for interface_name in self._interfaces_to_delete:
             self._DeleteInterfaceFile(interface_name)
diff --git a/tools/dom/scripts/database_test.py b/tools/dom/scripts/database_test.py
index a82ed24..e75ec9b 100755
--- a/tools/dom/scripts/database_test.py
+++ b/tools/dom/scripts/database_test.py
@@ -51,7 +51,7 @@
     def testListInterfaces(self):
         db = database.Database(self._database_dir)
         db.Load()
-        self.assertEquals(self._ListInterfaces(db), ['I1'])
+        self.assertEqual(self._ListInterfaces(db), ['I1'])
 
     def testHasInterface(self):
         db = database.Database(self._database_dir)
@@ -67,7 +67,7 @@
         db.Save()
         self.assertTrue(
             os.path.exists(os.path.join(self._database_dir, 'I2.idl')))
-        self.assertEquals(self._ListInterfaces(db), ['I1', 'I2'])
+        self.assertEqual(self._ListInterfaces(db), ['I1', 'I2'])
 
     def testDeleteInterface(self):
         db = database.Database(self._database_dir)
@@ -76,13 +76,13 @@
         db.Save()
         self.assertFalse(
             os.path.exists(os.path.join(self._database_dir, 'I1.idl')))
-        self.assertEquals(self._ListInterfaces(db), [])
+        self.assertEqual(self._ListInterfaces(db), [])
 
     def testGetInterface(self):
         db = database.Database(self._database_dir)
         db.Load()
         interface = db.GetInterface('I1')
-        self.assertEquals(interface.id, 'I1')
+        self.assertEqual(interface.id, 'I1')
 
 
 if __name__ == '__main__':
diff --git a/tools/dom/scripts/databasebuilder.py b/tools/dom/scripts/databasebuilder.py
index c5327a7..c618084 100755
--- a/tools/dom/scripts/databasebuilder.py
+++ b/tools/dom/scripts/databasebuilder.py
@@ -236,9 +236,9 @@
                         ext_attrs_node[
                             type_valued_attribute_name] = strip_modules(value)
 
-        map(rename_node, idl_file.all(IDLInterface))
-        map(rename_node, idl_file.all(IDLType))
-        map(rename_ext_attrs, idl_file.all(IDLExtAttrs))
+        list(map(rename_node, idl_file.all(IDLInterface)))
+        list(map(rename_node, idl_file.all(IDLType)))
+        list(map(rename_ext_attrs, idl_file.all(IDLExtAttrs)))
 
     def _annotate(self, interface, import_options):
         """Adds @ annotations based on the source and source_attributes
@@ -259,10 +259,10 @@
 
         add_source_annotation(interface)
 
-        map(add_source_annotation, interface.parents)
-        map(add_source_annotation, interface.constants)
-        map(add_source_annotation, interface.attributes)
-        map(add_source_annotation, interface.operations)
+        list(map(add_source_annotation, interface.parents))
+        list(map(add_source_annotation, interface.constants))
+        list(map(add_source_annotation, interface.attributes))
+        list(map(add_source_annotation, interface.operations))
 
     def _sign(self, node):
         """Computes a unique signature for the node, for merging purposed, by
@@ -480,7 +480,8 @@
                 def has_annotations(idl_node):
                     return len(idl_node.annotations)
 
-                old_interface.__dict__[what] = filter(has_annotations, old_list)
+                old_interface.__dict__[what] = \
+                    list(filter(has_annotations, old_list))
 
             return changed
 
@@ -619,7 +620,7 @@
 
     def _process_ast(self, filename, ast):
         if len(ast) == 1:
-            ast = ast.values()[0]
+            ast = next(iter(ast.values()))
         else:
             print('ERROR: Processing AST: ' + os.path.basename(file_name))
         new_asts[filename] = ast
@@ -664,8 +665,8 @@
                          (interface.id, import_options.source,
                           os.path.basename(idl_file.filename)))
 
-            interface.attributes = filter(enabled, interface.attributes)
-            interface.operations = filter(enabled, interface.operations)
+            interface.attributes = list(filter(enabled, interface.attributes))
+            interface.operations = list(filter(enabled, interface.operations))
             self._imported_interfaces.append((interface, import_options))
 
         # If an IDL dictionary then there is no implementsStatements.
@@ -769,15 +770,15 @@
                     if (source in idl_node.annotations and
                             idl_node.annotations[source]):
                         annotation = idl_node.annotations[source]
-                        for name, value in annotation.items():
+                        for name, value in list(annotation.items()):
                             if (name in top_level_annotation and
                                     value == top_level_annotation[name]):
                                 del annotation[name]
 
-                map(normalize, interface.parents)
-                map(normalize, interface.constants)
-                map(normalize, interface.attributes)
-                map(normalize, interface.operations)
+                list(map(normalize, interface.parents))
+                list(map(normalize, interface.constants))
+                list(map(normalize, interface.attributes))
+                list(map(normalize, interface.operations))
 
     def map_dictionaries(self):
         """Changes the type of operations/constructors arguments from an IDL
@@ -790,12 +791,12 @@
                 type_node.id = 'Dictionary'
 
         def all_types(node):
-            map(dictionary_to_map, node.all(IDLType))
+            list(map(dictionary_to_map, node.all(IDLType)))
 
         for interface in self._database.GetInterfaces():
-            map(all_types, interface.all(IDLExtAttrFunctionValue))
-            map(all_types, interface.attributes)
-            map(all_types, interface.operations)
+            list(map(all_types, interface.all(IDLExtAttrFunctionValue)))
+            list(map(all_types, interface.attributes))
+            list(map(all_types, interface.operations))
 
     def fetch_constructor_data(self, options):
         window_interface = self._database.GetInterface('Window')
@@ -1023,7 +1024,7 @@
             self._no_interfaces_used_types = []
             constructor_function = self._no_interface_constructor_types
 
-        map(constructor_function, interface.all(IDLExtAttrFunctionValue))
+        list(map(constructor_function, interface.all(IDLExtAttrFunctionValue)))
 
         self._mark_usage(interface, check_dictionaries=check_dictionaries)
 
@@ -1040,7 +1041,7 @@
             self._no_interfaces_used_types = []
             used = self._no_interface_used
 
-        map(used, operation_attribute.all(IDLType))
+        list(map(used, operation_attribute.all(IDLType)))
 
         self._remember_usage(
             operation_attribute, check_dictionaries=check_dictionaries)
@@ -1053,14 +1054,14 @@
     # (IDLExtAttrFunctionValue) that have a dictionary reference.
     def _dictionary_constructor_types(self, node):
         self._dictionaries_used_types = []
-        map(self._dictionary_used, node.all(IDLType))
+        list(map(self._dictionary_used, node.all(IDLType)))
         self._remember_usage(node)
 
     # Iterator function for map to iterate over all constructor types
     # (IDLExtAttrFunctionValue) that reference an interface with NoInterfaceObject.
     def _no_interface_constructor_types(self, node):
         self._no_interfaces_used_types = []
-        map(self._no_interface_used, node.all(IDLType))
+        list(map(self._no_interface_used, node.all(IDLType)))
         self._remember_usage(node, check_dictionaries=False)
 
     # Maximum width of each column.
diff --git a/tools/dom/scripts/databasebuilder_test.py b/tools/dom/scripts/databasebuilder_test.py
index 7467b3e..840e6dd 100755
--- a/tools/dom/scripts/databasebuilder_test.py
+++ b/tools/dom/scripts/databasebuilder_test.py
@@ -30,7 +30,8 @@
     def _assert_content_equals(self, path, expected_content):
 
         def clean(content):
-            return ' '.join(filter(len, map(str.strip, content.split('\n'))))
+            return ' '.join(
+                filter(len, list(map(str.strip, content.split('\n')))))
 
         file_path = os.path.join(self._database_dir, path)
         self.assertTrue(os.path.exists(file_path))
diff --git a/tools/dom/scripts/emitter_test.py b/tools/dom/scripts/emitter_test.py
index eb50c2a..1c1021b 100755
--- a/tools/dom/scripts/emitter_test.py
+++ b/tools/dom/scripts/emitter_test.py
@@ -18,7 +18,7 @@
         pass
 
     def check(self, e, expected):
-        self.assertEquals(''.join(e.Fragments()), expected)
+        self.assertEqual(''.join(e.Fragments()), expected)
 
     def testExample(self):
         e = emitter.Emitter()
@@ -34,7 +34,7 @@
         try:
             e = emitter.Emitter()
             b = e.Emit('$(A)$(!B)$(A)$(!B)')  # $(!B) is duplicated
-        except RuntimeError, ex:
+        except RuntimeError as ex:
             return
         raise AssertionError('Expected error')
 
@@ -46,7 +46,7 @@
     def testTemplate2(self):
         e = emitter.Emitter()
         r = e.Emit('1$(A)2$(B)3$(A)4$(B)5', A='x', B='y')
-        self.assertEquals(None, r)
+        self.assertEqual(None, r)
         self.check(e, '1x2y3x4y5')
 
     def testTemplate3(self):
@@ -128,12 +128,12 @@
             e = emitter.Emitter()
             e.Emit('$#A(-)', A='Invalid')
             e.Fragments()
-        except RuntimeError, ex:
+        except RuntimeError as ex:
             return
         raise AssertionError('Expected error')
 
     def testFormat(self):
-        self.assertEquals(emitter.Format('$A$B', A=1, B=2), '12')
+        self.assertEqual(emitter.Format('$A$B', A=1, B=2), '12')
 
 
 if __name__ == '__main__':
diff --git a/tools/dom/scripts/fremontcutbuilder.py b/tools/dom/scripts/fremontcutbuilder.py
index bd5fcad..aa7adfe 100755
--- a/tools/dom/scripts/fremontcutbuilder.py
+++ b/tools/dom/scripts/fremontcutbuilder.py
@@ -58,10 +58,10 @@
                     continue
             return True
 
-        interface.constants = filter(IsIdentified, interface.constants)
-        interface.attributes = filter(IsIdentified, interface.attributes)
-        interface.operations = filter(IsIdentified, interface.operations)
-        interface.parents = filter(IsIdentified, interface.parents)
+        interface.constants = list(filter(IsIdentified, interface.constants))
+        interface.attributes = list(filter(IsIdentified, interface.attributes))
+        interface.operations = list(filter(IsIdentified, interface.operations))
+        interface.parents = list(filter(IsIdentified, interface.parents))
 
 
 def build_database(idl_files,
@@ -183,6 +183,7 @@
         'networkinfo',  # Not yet used in Blink yet
         'vibration',  # Not yet used in Blink yet
         'inspector',
+        'idl_parser',  # idl_parser has test IDL files.
     ]
 
     # TODO(terry): Integrate this into the htmlrenamer's _removed_html_interfaces
@@ -193,16 +194,15 @@
         'WebKitGamepadList.idl',  # GamepadList is the new one.
     ]
 
-    def visitor(arg, dir_name, names):
+    for (dir_name, dirs, files) in os.walk(webcore_dir):
         if os.path.basename(dir_name) in DIRS_TO_IGNORE:
-            names[:] = []  # Do not go underneath
-        for name in names:
-            file_name = os.path.join(dir_name, name)
-            (interface, ext) = os.path.splitext(file_name)
-            if ext == '.idl' and not (name in FILES_TO_IGNORE):
-                idl_files.append(file_name)
-
-    os.path.walk(webcore_dir, visitor, webcore_dir)
+            dirs[:] = []  # Do not go underneath
+        else:
+            for name in files:
+                file_name = os.path.join(dir_name, name)
+                (interface, ext) = os.path.splitext(file_name)
+                if ext == '.idl' and not (name in FILES_TO_IGNORE):
+                    idl_files.append(file_name)
 
     database_dir = os.path.join(current_dir, '..', 'database')
 
diff --git a/tools/dom/scripts/generate_blink_file.py b/tools/dom/scripts/generate_blink_file.py
index 4e9c2a4..48a4612 100644
--- a/tools/dom/scripts/generate_blink_file.py
+++ b/tools/dom/scripts/generate_blink_file.py
@@ -6,14 +6,13 @@
 """Generates sdk/lib/_blink/dartium/_blink_dartium.dart file."""
 
 import os
-from sets import Set
-from generator import AnalyzeOperation, AnalyzeConstructor
+from generator import AnalyzeOperation, AnalyzeConstructor, ConstantOutputOrder
 
 # This is list of all methods with native c++ implementations
 # If performing a dartium merge, the best practice is to comment out this list,
 # ensure everything runs, and then uncomment this list which might possibly
 # introduce breaking changes due to changes to these method signatures.
-_js_custom_members = Set([
+_js_custom_members = set([
     'Document.createElement',
     'Element.id',
     'Element.tagName',
@@ -79,7 +78,7 @@
 # Uncomment out this line  to short circuited native methods and run all of
 # dart:html through JS interop except for createElement which is slightly more
 # tightly natively wired.
-# _js_custom_members = Set([])
+# _js_custom_members = set()
 
 # Expose built-in methods support by an instance that is not shown in the IDL.
 _additional_methods = {
@@ -385,12 +384,6 @@
 
 """
 
-
-def ConstantOutputOrder(a, b):
-    """Canonical output ordering for constants."""
-    return (a.id > b.id) - (a.id < b.id)
-
-
 def generate_parameter_entries(param_infos):
     optional_default_args = 0
     for argument in param_infos:
@@ -524,7 +517,7 @@
 
 def _Process_Attributes(blink_file, interface, attributes):
     # Emit an interface's attributes and operations.
-    for attribute in sorted(attributes, ConstantOutputOrder):
+    for attribute in sorted(attributes, key=ConstantOutputOrder):
         name = attribute.id
         is_native = _Is_Native(interface.id, name)
         if attribute.is_read_only:
@@ -552,7 +545,7 @@
                         primary_interface=False):
     analyzeOperations = []
 
-    for operation in sorted(operations, ConstantOutputOrder):
+    for operation in sorted(operations, key=ConstantOutputOrder):
         if len(analyzeOperations) == 0:
             analyzeOperations.append(operation)
         else:
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index d8ad435..bcc36f3 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -10,6 +10,8 @@
 import monitored
 import os
 import re
+from functools import cmp_to_key
+from itertools import zip_longest
 from htmlrenamer import custom_html_constructors, html_interface_renames, \
     typed_array_renames
 
@@ -216,7 +218,7 @@
     ])
 
 _custom_types = monitored.Set('generator._custom_types',
-                              typed_array_renames.keys())
+                              list(typed_array_renames.keys()))
 
 
 def IsCustomType(interface_name):
@@ -399,6 +401,19 @@
     return 'WebKit' in thing.annotations or 'Dart' in thing.annotations
 
 
+# Legacy Python 2 way to sort lists. Group by type, and then sort by value.
+class MultitypeSortKey:
+
+    def __init__(self, value):
+        self.value = value
+
+    def __lt__(self, other):
+        try:
+            return self.value < other.value
+        except TypeError:
+            return str(type(self)) < str(type(other))
+
+
 class ParamInfo(object):
     """Holder for various information about a parameter of a Dart operation.
 
@@ -497,7 +512,8 @@
 
     # Given a list of overloaded default values, choose a suitable one.
     def OverloadedDefault(args):
-        defaults = sorted(set(arg.default_value for arg in args))
+        defaults = sorted(set(arg.default_value for arg in args),
+                          key=MultitypeSortKey)
         if len(set(DartType(arg.type.id) for arg in args)) == 1:
             null_default = False
             for arg in args:
@@ -509,14 +525,12 @@
     result = []
 
     is_optional = False
-
     # Process overloaded arguments across a set of overloaded operations.
     # Each tuple in args corresponds to overloaded arguments with the same name.
-    for arg_tuple in map(lambda *x: x, *args):
+    for arg_tuple in list(zip_longest(*args)):
         is_optional = is_optional or any(
             arg is None or IsOptional(arg) for arg in arg_tuple)
-
-        filtered = filter(None, arg_tuple)
+        filtered = list(filter(None, arg_tuple))
         (type_id, is_nullable) = OverloadedType(filtered)
         name = OverloadedName(filtered)
         (default_value, default_value_is_null) = OverloadedDefault(filtered)
@@ -608,9 +622,9 @@
             return 'Callback' not in type_id
 
     # Success callback is the first argument (change if this no longer holds).
-    new_info.callback_args = filter(lambda x: not IsNotCallbackType(x),
-                                    new_info.param_infos)
-    new_info.param_infos = filter(IsNotCallbackType, new_info.param_infos)
+    new_info.callback_args = list(
+        filter(lambda x: not IsNotCallbackType(x), new_info.param_infos))
+    new_info.param_infos = list(filter(IsNotCallbackType, new_info.param_infos))
     new_info.type_name = 'Future'
 
     return new_info
@@ -745,9 +759,10 @@
             # TODO(terry): This may have to change for dart2js for code shaking the
             #              return types (unions) needs to be emitted with @create
             #              annotations and/or with JS('type1|type2',...)
-            if hasattr(rename_type,
-                       'im_self') and rename_type.im_self._database.HasTypeDef(
-                           param.type_id):
+            if hasattr(
+                    rename_type,
+                    '__self__') and rename_type.__self__._database.HasTypeDef(
+                        param.type_id):
                 dart_type = 'dynamic'
             else:
                 dart_type = rename_type(
@@ -783,7 +798,7 @@
         def FormatParam(dec):
             return dec[0] + dec[1]
 
-        argtexts = map(FormatParam, required)
+        argtexts = list(map(FormatParam, required))
         if optional:
             left_bracket, right_bracket = '{}' if needs_named else '[]'
             argtexts.append(left_bracket +
@@ -799,7 +814,7 @@
         """ Returns a number of required arguments in Dart declaration of
     the operation.
     """
-        return len(filter(lambda i: not i.is_optional, self.param_infos))
+        return len(list(filter(lambda i: not i.is_optional, self.param_infos)))
 
     def ParametersAsArgumentList(self,
                                  parameter_count=None,
@@ -939,11 +954,14 @@
             return rename_type(self.type_name)
 
 
-def ConstantOutputOrder(a, b):
+def _ConstantOutputOrder(a, b):
     """Canonical output ordering for constants."""
     return (a.id > b.id) - (a.id < b.id)
 
 
+ConstantOutputOrder = cmp_to_key(_ConstantOutputOrder)
+
+
 def _FormatNameList(names):
     """Returns JavaScript array literal expression with one name per line."""
     #names = sorted(names)
diff --git a/tools/dom/scripts/go.sh b/tools/dom/scripts/go.sh
index 71789cf..764fddc 100755
--- a/tools/dom/scripts/go.sh
+++ b/tools/dom/scripts/go.sh
@@ -35,7 +35,5 @@
   fi
 fi
 
-# third_party IDL scripts are not compatible with python3, so use python2.7.
-
 reset && \
-python2.7 ./dartdomgenerator.py --systems="$SYSTEMS" --logging=40 --update-dom-metadata --gen-interop "$ARG_OPTION"
+python3 ./dartdomgenerator.py --systems="$SYSTEMS" --logging=40 --update-dom-metadata --gen-interop "$ARG_OPTION"
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 22890c9..15cc0f9 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -37,7 +37,6 @@
     'EventSource',
 ]
 
-
 class HtmlDartGenerator(object):
 
     def __init__(self, interface, options, dart_use_blink, logger):
@@ -82,10 +81,10 @@
             # one synthesized class (WebGL).
             self._gl_constants.extend(interface.constants)
         else:
-            for const in sorted(interface.constants, ConstantOutputOrder):
+            for const in sorted(interface.constants, key=ConstantOutputOrder):
                 self.AddConstant(const)
 
-        for attr in sorted(interface.attributes, ConstantOutputOrder):
+        for attr in sorted(interface.attributes, key=ConstantOutputOrder):
             if attr.type.id != 'EventHandler' and attr.type.id != 'EventListener':
                 self.AddAttribute(attr, declare_only)
 
@@ -132,12 +131,13 @@
             _logger.warn('Interface %s has duplicate parent interfaces %s - ' \
                          'ignoring duplicates. Please file a bug with the dart:html team.' % (interface.id, parent_list))
 
-        for parent_interface in sorted(secondary_parents):
+        for parent_interface in sorted(secondary_parents,
+                                       key=ConstantOutputOrder):
             if isinstance(parent_interface, str):
                 continue
 
             for attr in sorted(parent_interface.attributes,
-                               ConstantOutputOrder):
+                               key=ConstantOutputOrder):
                 if not FindMatchingAttribute(interface, attr):
                     if attr.type.id != 'EventHandler':
                         self.SecondaryContext(parent_interface)
@@ -172,7 +172,6 @@
         # are pure interfaces (mixins to this interface).
         if (IsPureInterface(parent_name, self._database)):
             return
-
         for operation in parent.operations:
             if operation.id in operationsByName:
                 operations = operationsByName[operation.id]
@@ -242,8 +241,10 @@
 
         if (operation.id in operations_by_name and
                 len(operations_by_name[operation.id]) > 1 and len(
-                    filter(lambda overload: overload.startswith(operation_str),
-                           renamed_overloads.keys())) == 0 and
+                    list(
+                        filter(
+                            lambda overload: overload.startswith(operation_str),
+                            renamed_overloads.keys()))) == 0 and
                 operation_str not in keep_overloaded_members and
                 operation_str not in overloaded_and_renamed and
                 operation_str not in renamed_html_members and
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 40e86e5..8be4796 100644
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -7,6 +7,7 @@
 import sys
 
 import idl_definitions
+from generator import MultitypeSortKey
 from idl_types import IdlType, IdlNullableType, IdlUnionType, IdlArrayOrSequenceType
 import dependency
 
@@ -88,12 +89,18 @@
         """Returns string of extra info for __repr__()."""
         return ''
 
-    def __cmp__(self, other):
-        """Override default compare operation.
+    def __eq__(self, other):
+        """Override default equals operation.
     IDLNodes are equal if all their properties are equal."""
         if other is None or not isinstance(other, IDLNode):
             return 1
-        return self.__dict__.__cmp__(other.__dict__)
+        return self.__dict__.__eq__(other.__dict__)
+
+    def __hash__(self):
+        """Define default hashing behavior.
+    In order to comply with a == b => hash(a) == hash(b), we recursively iterate
+    self.__dict__ and convert all objects to hashable objects."""
+        return self.to_hash()
 
     def reset_id(self, newId):
         """Reset the id of the Node.  This is typically done during a normalization
@@ -152,7 +159,36 @@
             res[k] = v
         return res
 
-    def _find_all(self, ast, label, max_results=sys.maxint):
+    def to_hash(self):
+        return hash(self._to_hashable(self))
+
+    def _to_hashable(self, obj):
+        # By default, lists and dicts are not hashable, and user-defined objects
+        # are unordered. In order to make a consistent hash for a given object,
+        # this converts unhashable types and sorts properties.
+        if isinstance(obj, list):
+            # Convert lists to tuples.
+            new_obj = []
+            for item in obj:
+                new_obj.append(self._to_hashable(item))
+            return tuple(new_obj)
+        elif isinstance(obj, dict):
+            # Convert dicts to frozensets of tuples.
+            new_obj = set()
+            # Sort to ensure fixed order.
+            for (k2, v2) in sorted(obj.items(), key=MultitypeSortKey):
+                new_obj.add((self._to_hashable(k2), self._to_hashable(v2)))
+            return frozenset(new_obj)
+        elif hasattr(obj, '__dict__'):
+            items = []
+            # Sort properties to ensure fixed order.
+            for (k, v) in sorted(obj.__dict__.items(), key=MultitypeSortKey):
+                items.append((k, self._to_hashable(v)))
+            return tuple(items)
+        else:
+            return obj
+
+    def _find_all(self, ast, label, max_results=sys.maxsize):
         """Searches the AST for tuples with a given label. The PegParser
     output is composed of lists and tuples, where the tuple 1st argument
     is a label. If ast root is a list, will search recursively inside each
@@ -452,9 +488,9 @@
                     interface_info = dependency.get_interfaces_info()[interface.
                                                                       id]
 
-                    implements = interface_info[
-                        'implements_interfaces'] if interface_info.has_key(
-                            'implements_interfaces') else []
+                    implements = []
+                    if 'implements_interfaces' in interface_info:
+                        implements = interface_info['implements_interfaces']
                     if not (blink_interface.is_partial) and len(implements) > 0:
                         implementor = new_asts[interface.id].interfaces.get(
                             interface.id)
diff --git a/tools/dom/scripts/idlnode_test.py b/tools/dom/scripts/idlnode_test.py
index 61de65a..5ce9037 100755
--- a/tools/dom/scripts/idlnode_test.py
+++ b/tools/dom/scripts/idlnode_test.py
@@ -37,7 +37,7 @@
             ast = parser.parse(content)
             node = idlnode.IDLFile(ast)
             actual = node.to_dict() if node else None
-        except SyntaxError, e:
+        except SyntaxError as e:
             error = e
             pass
         if actual == expected:
diff --git a/tools/dom/scripts/mdnreader.py b/tools/dom/scripts/mdnreader.py
index b142b7a..50fc227 100644
--- a/tools/dom/scripts/mdnreader.py
+++ b/tools/dom/scripts/mdnreader.py
@@ -46,13 +46,13 @@
         if 'api' in json_dict:
             # Get the interface name
             api_dict = json_dict['api']
-            interface_name = api_dict.keys()[0]
+            interface_name = next(iter(api_dict))
             return (interface_name, api_dict[interface_name])
         elif 'html' in json_dict:
             html_dict = json_dict['html']
             if 'elements' in html_dict:
                 elements_dict = html_dict['elements']
-                element_name = elements_dict.keys()[0]
+                element_name = next(iter(elements_dict))
                 # Convert to WebCore name
                 interface = str('HTML' + element_name + 'Element')
                 return (interface, elements_dict[element_name])
@@ -60,49 +60,12 @@
             svg_dict = json_dict['svg']
             if 'elements' in svg_dict:
                 elements_dict = svg_dict['elements']
-                element_name = elements_dict.keys()[0]
+                element_name = next(iter(elements_dict))
                 # Convert to WebCore name
                 interface = str('SVG' + element_name + 'Element')
                 return (interface, elements_dict[element_name])
         return (None, None)
 
-    def visitor(arg, dir_path, names):
-
-        def should_process_dir(dir_path):
-            if os.path.abspath(dir_path) == browser_compat_folder:
-                return True
-            for dir in INCLUDE_DIRS:
-                if dir_path.startswith(dir):
-                    return True
-            return False
-
-        if should_process_dir(dir_path):
-            for name in names:
-                file_name = os.path.join(dir_path, name)
-                (interface_path, ext) = os.path.splitext(file_name)
-                if ext == '.json':
-                    with open(file_name) as src:
-                        json_dict = json.load(src)
-                        interface, metadata = process_json_dict(json_dict)
-                        if not interface is None:
-                            # Note: interface and member names do not
-                            # necessarily have the same capitalization as
-                            # WebCore, so we keep them all lowercase for easier
-                            # matching later.
-                            interface = interface.lower()
-                            metadata = {
-                                member.lower(): info
-                                for member, info in metadata.items()
-                            }
-
-                            if interface in browser_compat_data:
-                                _unify_metadata(browser_compat_data[interface],
-                                                metadata)
-                            else:
-                                browser_compat_data[interface] = metadata
-        else:
-            names[:] = []  # Do not go underneath
-
     # Attempts to unify two compatibility infos by taking the union of both, and
     # for conflicting information, taking the "stricter" of the two versions.
     # Updates `a` in place to represent the union of `a` and `b`.
@@ -182,7 +145,42 @@
             if not attr in a:
                 a[attr] = b[attr]
 
-    os.path.walk(browser_compat_folder, visitor, browser_compat_folder)
+    for (dir_path, dirs, files) in os.walk(browser_compat_folder):
+
+        def should_process_dir(dir_path):
+            if os.path.abspath(dir_path) == browser_compat_folder:
+                return True
+            for dir in INCLUDE_DIRS:
+                if dir_path.startswith(dir):
+                    return True
+            return False
+
+        if should_process_dir(dir_path):
+            for name in files:
+                file_name = os.path.join(dir_path, name)
+                (interface_path, ext) = os.path.splitext(file_name)
+                if ext == '.json':
+                    with open(file_name) as src:
+                        json_dict = json.load(src)
+                        interface, metadata = process_json_dict(json_dict)
+                        if not interface is None:
+                            # Note: interface and member names do not
+                            # necessarily have the same capitalization as
+                            # WebCore, so we keep them all lowercase for easier
+                            # matching later.
+                            interface = interface.lower()
+                            metadata = {
+                                member.lower(): info
+                                for member, info in metadata.items()
+                            }
+
+                            if interface in browser_compat_data:
+                                _unify_metadata(browser_compat_data[interface],
+                                                metadata)
+                            else:
+                                browser_compat_data[interface] = metadata
+        else:
+            dirs[:] = []  # Do not go underneath
 
     return browser_compat_data
 
@@ -192,8 +190,8 @@
     # Given two valid version strings, compares parts of the version string
     # iteratively.
     def _greater_version(version_a, version_b):
-        version_a_split = map(int, version_a.split('.'))
-        version_b_split = map(int, version_b.split('.'))
+        version_a_split = list(map(int, version_a.split('.')))
+        version_b_split = list(map(int, version_b.split('.')))
         for i in range(min(len(version_a_split), len(version_b_split))):
             if version_a_split[i] > version_b_split[i]:
                 return version_a
@@ -208,7 +206,7 @@
             return False
         if version is True:
             return True
-        if isinstance(version, str) or isinstance(version, unicode):
+        if isinstance(version, str):
             pattern = re.compile('^([0-9]+\.)*[0-9]+$')
             if not pattern.match(version):
                 # It's possible for version strings to look like '<35'. We don't
diff --git a/tools/dom/scripts/multiemitter_test.py b/tools/dom/scripts/multiemitter_test.py
index 17c360d..b1ae27c 100644
--- a/tools/dom/scripts/multiemitter_test.py
+++ b/tools/dom/scripts/multiemitter_test.py
@@ -29,7 +29,7 @@
             files.append((file, ''.join(contents)))
 
         m.Flush(_Collect)
-        self.assertEquals(expected, files)
+        self.assertEqual(expected, files)
 
     def testExample(self):
         m = multiemitter.MultiEmitter()
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 20a25ed..9fa35dc 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -10,6 +10,7 @@
 import monitored
 import os
 import re
+from collections import OrderedDict
 from generator import *
 from htmldartgenerator import *
 from htmlrenamer import generateCallbackInterface
@@ -183,14 +184,14 @@
         info.js_name = None
         info.type_name = interface_name
         # optional parameters are always nullable
-        info.param_infos = map(
-            lambda tXn: ParamInfo(
-                name=tXn[1],
-                type_id=tXn[0],
-                is_optional=True,
-                is_nullable=True,
-                default_value=None,
-                default_value_is_null=False), self.opt_params)
+        info.param_infos = [
+            ParamInfo(name=tXn[1],
+                      type_id=tXn[0],
+                      is_optional=True,
+                      is_nullable=True,
+                      default_value=None,
+                      default_value_is_null=False) for tXn in self.opt_params
+        ]
         info.requires_named_arguments = True
         info.factory_parameters = ['"%s"' % self.tag]
         info.pure_dart_constructor = True
@@ -513,67 +514,69 @@
     'SVGSetElement',
 ]
 
-js_support_checks = dict({
-    'Animation':
-    "JS('bool', '!!(document.body.animate)')",
-    'AudioContext':
-    "JS('bool', '!!(window.AudioContext ||"
-    " window.webkitAudioContext)')",
-    'Crypto':
-    "JS('bool', '!!(window.crypto && window.crypto.getRandomValues)')",
-    'Database':
-    "JS('bool', '!!(window.openDatabase)')",
-    'DOMPoint':
-    "JS('bool', '!!(window.DOMPoint) || !!(window.WebKitPoint)')",
-    'ApplicationCache':
-    "JS('bool', '!!(window.applicationCache)')",
-    'DOMFileSystem':
-    "JS('bool', '!!(window.webkitRequestFileSystem)')",
-    'FormData':
-    "JS('bool', '!!(window.FormData)')",
-    'HashChangeEvent':
-    "Device.isEventTypeSupported('HashChangeEvent')",
-    'HTMLShadowElement':
-    ElemSupportStr('shadow'),
-    'HTMLTemplateElement':
-    ElemSupportStr('template'),
-    'MediaStreamEvent':
-    "Device.isEventTypeSupported('MediaStreamEvent')",
-    'MediaStreamTrackEvent':
-    "Device.isEventTypeSupported('MediaStreamTrackEvent')",
-    'MediaSource':
-    "JS('bool', '!!(window.MediaSource)')",
-    'Notification':
-    "JS('bool', '!!(window.Notification)')",
-    'Performance':
-    "JS('bool', '!!(window.performance)')",
-    'SpeechRecognition':
-    "JS('bool', '!!(window.SpeechRecognition || "
-    "window.webkitSpeechRecognition)')",
-    'SVGExternalResourcesRequired':
-    ('supported(SvgElement element)',
-     "JS('bool', '#.externalResourcesRequired !== undefined && "
-     "#.externalResourcesRequired.animVal !== undefined', "
-     "element, element)"),
-    'SVGLangSpace':
-    ('supported(SvgElement element)',
-     "JS('bool', '#.xmlspace !== undefined && #.xmllang !== undefined', "
-     "element, element)"),
-    'TouchList':
-    "JS('bool', '!!document.createTouchList')",
-    'WebGLRenderingContext':
-    "JS('bool', '!!(window.WebGLRenderingContext)')",
-    'WebSocket':
-    "JS('bool', 'typeof window.WebSocket != \"undefined\"')",
-    'Worker':
-    "JS('bool', '(typeof window.Worker != \"undefined\")')",
-    'XSLTProcessor':
-    "JS('bool', '!!(window.XSLTProcessor)')",
-}.items() + dict(
-    (key, SvgSupportStr(_svg_element_constructors[key]) if key.
-     startswith('SVG') else ElemSupportStr(_html_element_constructors[key]))
-    for key in _js_support_checks_basic_element_with_constructors +
-    _js_support_checks_additional_element).items())
+js_support_checks = dict(
+    list({
+        'Animation':
+        "JS('bool', '!!(document.body.animate)')",
+        'AudioContext':
+        "JS('bool', '!!(window.AudioContext ||"
+        " window.webkitAudioContext)')",
+        'Crypto':
+        "JS('bool', '!!(window.crypto && window.crypto.getRandomValues)')",
+        'Database':
+        "JS('bool', '!!(window.openDatabase)')",
+        'DOMPoint':
+        "JS('bool', '!!(window.DOMPoint) || !!(window.WebKitPoint)')",
+        'ApplicationCache':
+        "JS('bool', '!!(window.applicationCache)')",
+        'DOMFileSystem':
+        "JS('bool', '!!(window.webkitRequestFileSystem)')",
+        'FormData':
+        "JS('bool', '!!(window.FormData)')",
+        'HashChangeEvent':
+        "Device.isEventTypeSupported('HashChangeEvent')",
+        'HTMLShadowElement':
+        ElemSupportStr('shadow'),
+        'HTMLTemplateElement':
+        ElemSupportStr('template'),
+        'MediaStreamEvent':
+        "Device.isEventTypeSupported('MediaStreamEvent')",
+        'MediaStreamTrackEvent':
+        "Device.isEventTypeSupported('MediaStreamTrackEvent')",
+        'MediaSource':
+        "JS('bool', '!!(window.MediaSource)')",
+        'Notification':
+        "JS('bool', '!!(window.Notification)')",
+        'Performance':
+        "JS('bool', '!!(window.performance)')",
+        'SpeechRecognition':
+        "JS('bool', '!!(window.SpeechRecognition || "
+        "window.webkitSpeechRecognition)')",
+        'SVGExternalResourcesRequired':
+        ('supported(SvgElement element)',
+         "JS('bool', '#.externalResourcesRequired !== undefined && "
+         "#.externalResourcesRequired.animVal !== undefined', "
+         "element, element)"),
+        'SVGLangSpace':
+        ('supported(SvgElement element)',
+         "JS('bool', '#.xmlspace !== undefined && #.xmllang !== undefined', "
+         "element, element)"),
+        'TouchList':
+        "JS('bool', '!!document.createTouchList')",
+        'WebGLRenderingContext':
+        "JS('bool', '!!(window.WebGLRenderingContext)')",
+        'WebSocket':
+        "JS('bool', 'typeof window.WebSocket != \"undefined\"')",
+        'Worker':
+        "JS('bool', '(typeof window.Worker != \"undefined\")')",
+        'XSLTProcessor':
+        "JS('bool', '!!(window.XSLTProcessor)')",
+    }.items()) + list(
+        dict((key,
+              SvgSupportStr(_svg_element_constructors[key]) if key.startswith(
+                  'SVG') else ElemSupportStr(_html_element_constructors[key]))
+             for key in _js_support_checks_basic_element_with_constructors +
+             _js_support_checks_additional_element).items()))
 
 # JavaScript element class names of elements for which createElement does not
 # always return exactly the right element, either because it might not be
@@ -719,7 +722,9 @@
 
         implements_str = ''
         if implements:
-            implements_str = ' implements ' + ', '.join(set(implements))
+            # Get rid of duplicates using OrderedDict.
+            implements = list(OrderedDict([(i, None) for i in implements]))
+            implements_str = ' implements ' + ', '.join(implements)
 
         mixins = self._backend.Mixins()
 
@@ -815,6 +820,9 @@
             NULLABLE='?',
             NULLSAFECAST=True,
             NULLASSERT='!')
+        if self._interface.doc_js_name is 'RadioNodeList':
+            print(self._backend.ImplementationTemplate())
+            print(implementation_members_emitter)
         stream_getter_signatures_emitter = None
         element_stream_getters_emitter = None
         class_members_emitter = None
@@ -2195,7 +2203,7 @@
                 return re.search('^@.*Returns', ann) or re.search(
                     '^@.*Creates', ann)
 
-            if not filter(js_type_annotation, anns):
+            if not list(filter(js_type_annotation, anns)):
                 _logger.warn('Member with wildcard native type: %s.%s' %
                              (self._interface.id, idl_member_name))
 
@@ -2317,7 +2325,7 @@
 
         # Emit the $!TYPE_MAP
         if map_emitter:
-            items = self._typeMap.items()
+            items = list(self._typeMap.items())
             items.sort()
             for (idl_name, dart_name) in items:
                 map_emitter.Emit(
diff --git a/tools/dom/scripts/templateloader_test.py b/tools/dom/scripts/templateloader_test.py
index 4b16df7..f6bf597 100755
--- a/tools/dom/scripts/templateloader_test.py
+++ b/tools/dom/scripts/templateloader_test.py
@@ -30,7 +30,7 @@
         threw = False
         try:
             output_text = self._preprocess(input_text, conds)
-        except Exception, e:
+        except Exception as e:
             threw = True
             if str(e).find(expected_message) == -1:
                 self.fail("'%s' does not contain '%s'" % (e, expected_message))
