Version 2.15.0-92.0.dev

Merge commit 'f7e4886ad2e9bf1d12b916b42266f9ea6f2bdf57' into 'dev'
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..bda15ba 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))