Version 2.18.0-198.0.dev

Merge commit '6d923dfd992c7a3805564ad50c7df99e65766072' into 'dev'
diff --git a/DEPS b/DEPS
index a07f262..c048fa6 100644
--- a/DEPS
+++ b/DEPS
@@ -66,8 +66,8 @@
   # The list of revisions for these tools comes from Fuchsia, here:
   # https://fuchsia.googlesource.com/integration/+/HEAD/toolchain
   # If there are problems with the toolchain, contact fuchsia-toolchain@.
-  "clang_revision": "c2592c374e469f343ecea82d6728609650924259",
-  "gn_revision": "d7c2209cebcfe37f46dba7be4e1a7000ffc342fb",
+  "clang_revision": "aaaf8e4c409f080f35ea227b20dc6ac8a45c2fa4",
+  "gn_revision": "e62d4e1938a45babc9afb6db543f388cd1802a52",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "bb994c6f067340c1135eb43eed84f4b33cfa7397",
@@ -163,7 +163,7 @@
   "webkit_inspection_protocol_rev": "e4965778e2837adc62354eec3a19123402997897",
   "yaml_edit_rev": "0b74d85fac10b4fbf7d1a347debcf16c8f7b0e9c",
   "yaml_rev": "0971c06490b9670add644ed62182acd6a5536946",
-  "zlib_rev": "27c2f474b71d0d20764f86f60ef8b00da1a16cda",
+  "zlib_rev": "64bbf988543996eb8df9a86877b32917187eba8f",
 
   # Windows deps
   "crashpad_rev": "bf327d8ceb6a669607b0dbab5a83a275d03f99ed",
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index a72b342..654ab4a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -2645,8 +2645,7 @@
 
   @override
   String toString() {
-    SsaNode self = this; // Work around #44475
-    int id = _debugIds[self] ??= _nextDebugId++;
+    int id = _debugIds[this] ??= _nextDebugId++;
     return 'ssa$id';
   }
 }
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 9e00504..04d9334 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -16,6 +16,18 @@
 
 const jsonEncoder = JsonEncoder.withIndent('    ');
 
+/// Result for a request to resolve the incoming calls for a given
+/// `CallHierarchyItem`.
+///
+/// @since 3.16.0
+typedef CallHierarchyIncomingCallsResult = List<CallHierarchyIncomingCall>?;
+
+/// Result for a request to resolve the outgoing calls for a given
+/// `CallHierarchyItem`.
+///
+/// @since 3.16.0
+typedef CallHierarchyOutgoingCallsResult = List<CallHierarchyOutgoingCall>?;
+
 /// An identifier to refer to a change annotation stored with a workspace edit.
 typedef ChangeAnnotationIdentifier = String;
 
@@ -119,11 +131,61 @@
     = Either3<PlaceholderAndRange, PrepareRenameResult2, Range>;
 typedef ProgressToken = Either2<int, String>;
 
+/// Result for a request to provide commands for the given text document and
+/// range.
+typedef TextDocumentCodeActionResult = List<Either2<CodeAction, Command>>?;
+
+/// Result for a request to provide code lens for the given text document.
+typedef TextDocumentCodeLensResult = List<CodeLens>?;
+
+/// Result for request to request completion at a given text document position.
+/// The request's parameter is of type TextDocumentPosition the response is of
+/// type [CompletionItem[]](#CompletionItem) or CompletionList or a Thenable
+/// that resolves to such.
+///
+/// The request can delay the computation of the `detail` and `documentation`
+/// properties to the `completionItem/resolve` request. However, properties that
+/// are needed for the initial sorting and filtering, like `sortText`,
+/// `filterText`, `insertText`, and `textEdit`, must not be changed during
+/// resolve.
+typedef TextDocumentCompletionResult
+    = Either2<CompletionList, List<CompletionItem>>?;
+
 /// An event describing a change to a text document. If only a text is provided
 /// it is considered to be the full content of the document.
 typedef TextDocumentContentChangeEvent
     = Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>;
 
+/// Result for a request to resolve the type definition locations of a symbol at
+/// a given text document position. The request's parameter is of type
+/// TextDocumentPositionParams the response is of type Declaration or a typed
+/// array of DeclarationLink or a Thenable that resolves to such.
+typedef TextDocumentDeclarationResult
+    = Either2<Declaration, List<DeclarationLink>>?;
+
+/// Result for a request to resolve the definition location of a symbol at a
+/// given text document position. The request's parameter is of type
+/// TextDocumentPosition the response is of either type Definition or a typed
+/// array of DefinitionLink or a Thenable that resolves to such.
+typedef TextDocumentDefinitionResult
+    = Either2<Definition, List<DefinitionLink>>?;
+
+/// Result for request to resolve a DocumentHighlight for a given text document
+/// position. The request's parameter is of type TextDocumentPosition the
+/// request response is of type [DocumentHighlight[]] (#DocumentHighlight) or a
+/// Thenable that resolves to such.
+typedef TextDocumentDocumentHighlightResult = List<DocumentHighlight>?;
+
+/// Result for a request to provide document links
+typedef TextDocumentDocumentLinkResult = List<DocumentLink>?;
+
+/// Result for a request to list all symbols found in a given text document. The
+/// request's parameter is of type TextDocumentIdentifier the response is of
+/// type [SymbolInformation[]](#SymbolInformation) or a Thenable that resolves
+/// to such.
+typedef TextDocumentDocumentSymbolResult
+    = Either2<List<DocumentSymbol>, List<SymbolInformation>>?;
+
 /// A document filter denotes a document by different properties like the
 /// language, the scheme of its resource, or a glob-pattern that is applied to
 /// the path.
@@ -148,6 +210,131 @@
 typedef TextDocumentFilter = Either3<TextDocumentFilter1,
     TextDocumentFilterWithScheme, TextDocumentFilter3>;
 
+/// Result for a request to provide folding ranges in a document. The request's
+/// parameter is of type FoldingRangeParams, the response is of type
+/// FoldingRangeList or a Thenable that resolves to such.
+typedef TextDocumentFoldingRangeResult = List<FoldingRange>?;
+
+/// Result for a request to to format a whole document.
+typedef TextDocumentFormattingResult = List<TextEdit>?;
+
+/// Result for request to request hover information at a given text document
+/// position. The request's parameter is of type TextDocumentPosition the
+/// response is of type Hover or a Thenable that resolves to such.
+typedef TextDocumentHoverResult = Hover?;
+
+/// Result for a request to resolve the implementation locations of a symbol at
+/// a given text document position. The request's parameter is of type
+/// TextDocumentPositionParams the response is of type Definition or a Thenable
+/// that resolves to such.
+typedef TextDocumentImplementationResult
+    = Either2<Definition, List<DefinitionLink>>?;
+
+/// Result for a request to provide inlay hints in a document. The request's
+/// parameter is of type InlayHintsParams, the response is of type
+/// [InlayHint[]](#InlayHint[]) or a Thenable that resolves to such.
+///
+/// @since 3.17.0
+typedef TextDocumentInlayHintResult = List<InlayHint>?;
+
+/// Result for a request to provide inline values in a document. The request's
+/// parameter is of type InlineValueParams, the response is of type
+/// [InlineValue[]](#InlineValue[]) or a Thenable that resolves to such.
+///
+/// @since 3.17.0
+typedef TextDocumentInlineValueResult = List<InlineValue>?;
+
+/// Result for a request to provide ranges that can be edited together.
+///
+/// @since 3.16.0
+typedef TextDocumentLinkedEditingRangeResult = LinkedEditingRanges?;
+
+/// Result for a request to get the moniker of a symbol at a given text document
+/// position. The request parameter is of type TextDocumentPositionParams. The
+/// response is of type [Moniker[]](#Moniker[]) or `null`.
+typedef TextDocumentMonikerResult = List<Moniker>?;
+
+/// Result for a request to format a document on type.
+typedef TextDocumentOnTypeFormattingResult = List<TextEdit>?;
+
+/// Result for a request to result a `CallHierarchyItem` in a document at a
+/// given position. Can be used as an input to an incoming or outgoing call
+/// hierarchy.
+///
+/// @since 3.16.0
+typedef TextDocumentPrepareCallHierarchyResult = List<CallHierarchyItem>?;
+
+/// Result for a request to test and perform the setup necessary for a rename.
+///
+/// @since 3.16 - support for default behavior
+typedef TextDocumentPrepareRenameResult = PrepareRenameResult?;
+
+/// Result for a request to result a `TypeHierarchyItem` in a document at a
+/// given position. Can be used as an input to a subtypes or supertypes type
+/// hierarchy.
+///
+/// @since 3.17.0
+typedef TextDocumentPrepareTypeHierarchyResult = List<TypeHierarchyItem>?;
+
+/// Result for a request to to format a range in a document.
+typedef TextDocumentRangeFormattingResult = List<TextEdit>?;
+
+/// Result for a request to resolve project-wide references for the symbol
+/// denoted by the given text document position. The request's parameter is of
+/// type ReferenceParams the response is of type [Location[]](#Location) or a
+/// Thenable that resolves to such.
+typedef TextDocumentReferencesResult = List<Location>?;
+
+/// Result for a request to rename a symbol.
+typedef TextDocumentRenameResult = WorkspaceEdit?;
+
+/// Result for a request to provide selection ranges in a document. The
+/// request's parameter is of type SelectionRangeParams, the response is of type
+/// [SelectionRange[]](#SelectionRange[]) or a Thenable that resolves to such.
+typedef TextDocumentSelectionRangeResult = List<SelectionRange>?;
+
+/// Result for @since 3.16.0
+typedef TextDocumentSemanticTokensFullDeltaResult
+    = Either2<SemanticTokens, SemanticTokensDelta>?;
+
+/// Result for @since 3.16.0
+typedef TextDocumentSemanticTokensFullResult = SemanticTokens?;
+
+/// Result for @since 3.16.0
+typedef TextDocumentSemanticTokensRangeResult = SemanticTokens?;
+typedef TextDocumentSignatureHelpResult = SignatureHelp?;
+
+/// Result for a request to resolve the type definition locations of a symbol at
+/// a given text document position. The request's parameter is of type
+/// TextDocumentPositioParams the response is of type Definition or a Thenable
+/// that resolves to such.
+typedef TextDocumentTypeDefinitionResult
+    = Either2<Definition, List<DefinitionLink>>?;
+
+/// Result for a document will save request is sent from the client to the
+/// server before the document is actually saved. The request can return an
+/// array of TextEdits which will be applied to the text document before it is
+/// saved. Please note that clients might drop results if computing the text
+/// edits took too long or if a server constantly fails on this request. This is
+/// done to keep the save fast and reliable.
+typedef TextDocumentWillSaveWaitUntilResult = List<TextEdit>?;
+
+/// Result for a request to resolve the subtypes for a given
+/// `TypeHierarchyItem`.
+///
+/// @since 3.17.0
+typedef TypeHierarchySubtypesResult = List<TypeHierarchyItem>?;
+
+/// Result for a request to resolve the supertypes for a given
+/// `TypeHierarchyItem`.
+///
+/// @since 3.17.0
+typedef TypeHierarchySupertypesResult = List<TypeHierarchyItem>?;
+
+/// Result for the show message request is sent from the server to the client to
+/// show a message and a set of options actions to the user.
+typedef WindowShowMessageRequestResult = MessageActionItem?;
+
 /// A workspace diagnostic document report.
 ///
 /// @since 3.17.0
@@ -155,6 +342,46 @@
     WorkspaceFullDocumentDiagnosticReport,
     WorkspaceUnchangedDocumentDiagnosticReport>;
 
+/// Result for a request send from the client to the server to execute a
+/// command. The request might return a workspace edit which the client will
+/// apply to the workspace.
+typedef WorkspaceExecuteCommandResult = LSPAny?;
+
+/// Result for a request to list project-wide symbols matching the query string
+/// given by the WorkspaceSymbolParams. The response is of type
+/// [SymbolInformation[]](#SymbolInformation) or a Thenable that resolves to
+/// such.
+///
+/// @since 3.17.0 - support for WorkspaceSymbol in the returned data. Clients
+///  need to advertise support for WorkspaceSymbols via the client capability
+///  `workspace.symbol.resolveSupport`.
+typedef WorkspaceSymbolResult
+    = Either2<List<SymbolInformation>, List<WorkspaceSymbol>>?;
+
+/// Result for the will create files request is sent from the client to the
+/// server before files are actually created as long as the creation is
+/// triggered from within the client.
+///
+/// @since 3.16.0
+typedef WorkspaceWillCreateFilesResult = WorkspaceEdit?;
+
+/// Result for the did delete files notification is sent from the client to the
+/// server when files were deleted from within the client.
+///
+/// @since 3.16.0
+typedef WorkspaceWillDeleteFilesResult = WorkspaceEdit?;
+
+/// Result for the will rename files request is sent from the client to the
+/// server before files are actually renamed as long as the rename is triggered
+/// from within the client.
+///
+/// @since 3.16.0
+typedef WorkspaceWillRenameFilesResult = WorkspaceEdit?;
+
+/// Result for the `workspace/workspaceFolders` is sent from the server to the
+/// client to fetch the open workspace folders.
+typedef WorkspaceWorkspaceFoldersResult = List<WorkspaceFolder>?;
+
 /// A special text edit with an additional change annotation.
 ///
 /// @since 3.16.0.
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 082f048..f9f9301 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -874,6 +874,10 @@
 
   /// If set, this string will be reported as the protocol version.
   String? reportProtocolVersion;
+
+  /// Experiments which have been enabled (or disabled) via the
+  /// `--enable-experiment` command-line option.
+  List<String> enabledExperiments = [];
 }
 
 class ServerContextManagerCallbacks extends ContextManagerCallbacks {
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 5189728..d199752 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -228,6 +228,7 @@
       resourceProvider,
       sdkManager,
       options.packagesFile,
+      options.enabledExperiments,
       byteStore,
       fileContentCache,
       analysisPerformanceLogger,
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index bf2d198..47748d6 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -7,6 +7,7 @@
 
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_parser.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -206,6 +207,10 @@
   /// clean up when we destroy a context.
   final bazelWatchedPathsPerFolder = <Folder, _BazelWatchedFiles>{};
 
+  /// Experiments which have been enabled (or disabled) via the
+  /// `--enable-experiment` command-line option.
+  final List<String> _enabledExperiments;
+
   /// Information about the current/last queued context rebuild.
   ///
   /// This is used when a new build is requested to cancel any in-progress
@@ -216,6 +221,7 @@
       this.resourceProvider,
       this.sdkManager,
       this.packagesFile,
+      this._enabledExperiments,
       this._byteStore,
       this._fileContentCache,
       this._performanceLog,
@@ -456,6 +462,18 @@
           sdkPath: sdkManager.defaultSdkDirectory,
           packagesFile: packagesFile,
           fileContentCache: _fileContentCache,
+          updateAnalysisOptions2: ({
+            required analysisOptions,
+            required contextRoot,
+            required sdk,
+          }) {
+            if (_enabledExperiments.isNotEmpty) {
+              analysisOptions.contextFeatures = FeatureSet.fromEnableFlags2(
+                sdkLanguageVersion: sdk.languageVersion,
+                flags: _enabledExperiments,
+              );
+            }
+          },
         );
 
         for (var analysisContext in collection.contexts) {
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 7eca97f..20e9aaf 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -65,6 +65,9 @@
   static const String DISABLE_SERVER_FEATURE_SEARCH =
       'disable-server-feature-search';
 
+  /// The name of the multi-option to enable one or more experiments.
+  static const String ENABLE_EXPERIMENT = 'enable-experiment';
+
   /// The name of the option used to print usage information.
   static const String HELP_OPTION = 'help';
 
@@ -170,6 +173,11 @@
     analysisServerOptions.reportProtocolVersion =
         results[REPORT_PROTOCOL_VERSION] as String?;
 
+    analysisServerOptions.enabledExperiments =
+        results.wasParsed(ENABLE_EXPERIMENT)
+            ? results[ENABLE_EXPERIMENT] as List<String>
+            : <String>[];
+
     // Read in any per-SDK overrides specified in <sdk>/config/settings.json.
     var sdkConfig = SdkConfiguration.readFromSdk();
     analysisServerOptions.configurationOverrides = sdkConfig;
@@ -689,6 +697,13 @@
       help: 'The path to the package resolution configuration file, which '
           'supplies a mapping of package names\ninto paths.',
     );
+    parser.addMultiOption(
+      ENABLE_EXPERIMENT,
+      valueHelp: 'experiment',
+      help: 'Enable one or more experimental features '
+          '(see dart.dev/go/experiments).',
+      hide: true,
+    );
 
     parser.addOption(
       SERVER_PROTOCOL,
@@ -784,8 +799,6 @@
     parser.addFlag('dartpad', hide: true);
     // Removed 11/15/2020.
     parser.addFlag('enable-completion-model', hide: true);
-    // Removed 10/30/2020.
-    parser.addMultiOption('enable-experiment', hide: true);
     // Removed 9/23/2020.
     parser.addFlag('enable-instrumentation', hide: true);
     // Removed 11/12/2020.
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index b3f677f..2799810 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -1753,7 +1753,7 @@
   Future<ResponseMessage> sendDidChangeConfiguration() {
     final request = makeRequest(
       Method.workspace_didChangeConfiguration,
-      DidChangeConfigurationParams(settings: {}),
+      DidChangeConfigurationParams(),
     );
     return sendRequestToServer(request);
   }
diff --git a/pkg/analysis_server/tool/lsp_spec/meta_model.dart b/pkg/analysis_server/tool/lsp_spec/meta_model.dart
index 20aadea..8273079 100644
--- a/pkg/analysis_server/tool/lsp_spec/meta_model.dart
+++ b/pkg/analysis_server/tool/lsp_spec/meta_model.dart
@@ -226,6 +226,7 @@
   /// Renames will be followed when generating code, but other aliases may be
   /// created as `typedef`s.
   final bool isRename;
+
   TypeAlias({
     required super.name,
     super.comment,
diff --git a/pkg/analysis_server/tool/lsp_spec/meta_model_reader.dart b/pkg/analysis_server/tool/lsp_spec/meta_model_reader.dart
index 3be39a9..aa11e78 100644
--- a/pkg/analysis_server/tool/lsp_spec/meta_model_reader.dart
+++ b/pkg/analysis_server/tool/lsp_spec/meta_model_reader.dart
@@ -49,6 +49,12 @@
       ...?typeAliases?.map(_readTypeAlias),
     ].forEach(_addType);
 
+    // Requests and notifications may have inline union types as their
+    // params/result. We can create TypeAliases for those using sensible
+    // names to simplify their use in the handlers.
+    requests?.forEach(_readRequest);
+    notifications?.forEach(_readNotification);
+
     final methodsEnum = _createMethodNamesEnum(methodNames);
     if (methodsEnum != null) {
       _addType(methodsEnum);
@@ -94,6 +100,32 @@
     );
   }
 
+  /// Creates a type alias for a top-level union, such as those used for
+  /// request parameters/results that don't have named types in the spec.
+  void _createUnionAlias(String name, dynamic model, String? documentation) {
+    if (model == null) {
+      return;
+    }
+
+    // We don't currently support reading the two top-level intersection types.
+    // These can just be skipped because the types we're generating here are
+    // just for convenience (to produce better names for use in handlers rather
+    // than referencing `EitherX<Y>` everywhere).
+    if (model['kind'] == 'and') {
+      return;
+    }
+
+    final type = _extractType(name, '', model);
+    if (type is UnionType) {
+      _addType(TypeAlias(
+        name: name,
+        comment: documentation,
+        baseType: type,
+        isRename: false,
+      ));
+    }
+  }
+
   Constant _extractEnumValue(TypeBase parentType, dynamic model) {
     final name = model['name'] as String;
     return Constant(
@@ -257,6 +289,35 @@
     );
   }
 
+  void _readNotification(dynamic model) {
+    final method = model['method'] as String;
+    final namePrefix = method.split('/').map(capitalize).join();
+    final documentation = model['documentation'] as String?;
+
+    final paramsDoc = documentation != null
+        ? 'Parameters for ${_camelCase(documentation)}'
+        : null;
+
+    _createUnionAlias('${namePrefix}Params', model['params'], paramsDoc);
+  }
+
+  void _readRequest(dynamic model) {
+    final method = model['method'] as String;
+    final namePrefix = method.split('/').map(capitalize).join();
+    final documentation = model['documentation'] as String?;
+
+    final paramsDoc = documentation != null
+        ? 'Parameters for ${_camelCase(documentation)}'
+        : null;
+
+    final resultDoc = documentation != null
+        ? 'Result for ${_camelCase(documentation)}'
+        : null;
+
+    _createUnionAlias('${namePrefix}Params', model['params'], paramsDoc);
+    _createUnionAlias('${namePrefix}Result', model['result'], resultDoc);
+  }
+
   LspEntity _readStructure(dynamic model) {
     final name = model['name'] as String;
     return Interface(
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index d6d58b7..fd8131d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -6,6 +6,7 @@
     as macro;
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/context_locator.dart';
+import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
@@ -16,6 +17,7 @@
 import 'package:analyzer/src/dart/analysis/file_content_cache.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/summary2/kernel_compilation_service.dart';
 import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/util/sdk.dart';
@@ -53,7 +55,15 @@
     String? sdkSummaryPath,
     AnalysisDriverScheduler? scheduler,
     FileContentCache? fileContentCache,
-    void Function(AnalysisOptionsImpl)? updateAnalysisOptions,
+    @Deprecated('Use updateAnalysisOptions2, which must be a function that '
+        'accepts a second parameter')
+        void Function(AnalysisOptionsImpl)? updateAnalysisOptions,
+    void Function({
+      required AnalysisOptionsImpl analysisOptions,
+      required ContextRoot contextRoot,
+      required DartSdk sdk,
+    })?
+        updateAnalysisOptions2,
   }) : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE {
     sdkPath ??= getSdkPath();
@@ -61,6 +71,12 @@
     _throwIfAnyNotAbsoluteNormalizedPath(includedPaths);
     _throwIfNotAbsoluteNormalizedPath(sdkPath);
 
+    if (updateAnalysisOptions != null && updateAnalysisOptions2 != null) {
+      throw ArgumentError(
+          'Either updateAnalysisOptions or updateAnalysisOptions2 must be '
+          'given, but not both.');
+    }
+
     var contextLocator = ContextLocator(
       resourceProvider: this.resourceProvider,
     );
@@ -86,7 +102,9 @@
         sdkPath: sdkPath,
         sdkSummaryPath: sdkSummaryPath,
         scheduler: scheduler,
+        // ignore: deprecated_member_use_from_same_package
         updateAnalysisOptions: updateAnalysisOptions,
+        updateAnalysisOptions2: updateAnalysisOptions2,
         fileContentCache: fileContentCache,
         macroKernelBuilder: macroKernelBuilder,
         macroExecutor: macroExecutor,
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index 220750e..2c0bac1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -59,7 +59,14 @@
     AnalysisDriverScheduler? scheduler,
     String? sdkPath,
     String? sdkSummaryPath,
-    void Function(AnalysisOptionsImpl)? updateAnalysisOptions,
+    @Deprecated('Use updateAnalysisOptions2')
+        void Function(AnalysisOptionsImpl)? updateAnalysisOptions,
+    void Function({
+      required AnalysisOptionsImpl analysisOptions,
+      required ContextRoot contextRoot,
+      required DartSdk sdk,
+    })?
+        updateAnalysisOptions2,
     FileContentCache? fileContentCache,
     MacroKernelBuilder? macroKernelBuilder,
     macro.MultiMacroExecutor? macroExecutor,
@@ -67,6 +74,11 @@
     // TODO(scheglov) Remove this, and make `sdkPath` required.
     sdkPath ??= getSdkPath();
     ArgumentError.checkNotNull(sdkPath, 'sdkPath');
+    if (updateAnalysisOptions != null && updateAnalysisOptions2 != null) {
+      throw ArgumentError(
+          'Either updateAnalysisOptions or updateAnalysisOptions2 must be '
+          'given, but not both.');
+    }
 
     byteStore ??= MemoryByteStore();
     performanceLog ??= PerformanceLog(StringBuffer());
@@ -104,6 +116,12 @@
     var options = _getAnalysisOptions(contextRoot, sourceFactory);
     if (updateAnalysisOptions != null) {
       updateAnalysisOptions(options);
+    } else if (updateAnalysisOptions2 != null) {
+      updateAnalysisOptions2(
+        analysisOptions: options,
+        contextRoot: contextRoot,
+        sdk: sdk,
+      );
     }
 
     final analysisContext =
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index e11bd6e..2827708 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -116,7 +116,11 @@
       sdkPath: options.dartSdkPath,
       includedPaths:
           files.map((file) => _absoluteNormalizedPath(file.path)).toList(),
-      updateAnalysisOptions: (analysisOptions) {
+      updateAnalysisOptions2: ({
+        required analysisOptions,
+        required contextRoot,
+        required sdk,
+      }) {
         _updateAnalyzerOptions(analysisOptions, options);
       },
     );
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index c2aa845..6c41892 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
@@ -12,6 +13,7 @@
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/summary2/kernel_compilation_service.dart';
 import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -234,7 +236,11 @@
 
   /// Override this method to update [analysisOptions] for every context root,
   /// the default or already updated with `analysis_options.yaml` file.
-  void updateAnalysisOptions(AnalysisOptionsImpl analysisOptions) {}
+  void updateAnalysisOptions({
+    required AnalysisOptionsImpl analysisOptions,
+    required ContextRoot contextRoot,
+    required DartSdk sdk,
+  }) {}
 
   /// Call this method if the test needs to use the empty byte store, without
   /// any information cached.
@@ -267,7 +273,7 @@
       sdkPath: sdkRoot.path,
       sdkSummaryPath: sdkSummaryFile?.path,
       librarySummaryPaths: librarySummaryFiles?.map((e) => e.path).toList(),
-      updateAnalysisOptions: updateAnalysisOptions,
+      updateAnalysisOptions2: updateAnalysisOptions,
     );
 
     verifyCreatedCollection();
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_language_version_override_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_language_version_override_test.dart
index 3076cbb5a..994c09b 100644
--- a/pkg/analyzer/test/src/diagnostics/illegal_language_version_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/illegal_language_version_override_test.dart
@@ -2,8 +2,10 @@
 // for 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/context_root.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:pub_semver/src/version_constraint.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -72,7 +74,11 @@
   }
 
   @override
-  void updateAnalysisOptions(AnalysisOptionsImpl analysisOptions) {
+  void updateAnalysisOptions({
+    required AnalysisOptionsImpl analysisOptions,
+    required ContextRoot contextRoot,
+    required DartSdk sdk,
+  }) {
     analysisOptions.sourceLanguageConstraint =
         VersionConstraint.parse('>= 2.12.0');
   }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index cb8357e..be1bca1 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io' as io;
 
+import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/dart/sdk/build_sdk_summary.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
@@ -17,6 +18,7 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/pub.dart';
@@ -553,7 +555,7 @@
       packagesFile: _commandLineOptions!.defaultPackagesPath,
       resourceProvider: _resourceProvider,
       sdkPath: _commandLineOptions!.dartSdkPath,
-      updateAnalysisOptions: _updateAnalysisOptions,
+      updateAnalysisOptions2: _updateAnalysisOptions,
       fileContentCache: _fileContentCache,
     );
 
@@ -578,7 +580,11 @@
     _analysisContext = _collection!.contextFor(path);
   }
 
-  void _updateAnalysisOptions(AnalysisOptionsImpl analysisOptions) {
+  void _updateAnalysisOptions({
+    required AnalysisOptionsImpl analysisOptions,
+    required ContextRoot contextRoot,
+    required DartSdk sdk,
+  }) {
     _commandLineOptions!.updateAnalysisOptions(analysisOptions);
   }
 }
diff --git a/pkg/dartdev/lib/src/analysis_server.dart b/pkg/dartdev/lib/src/analysis_server.dart
index 7c823da..cc9c182 100644
--- a/pkg/dartdev/lib/src/analysis_server.dart
+++ b/pkg/dartdev/lib/src/analysis_server.dart
@@ -17,6 +17,7 @@
 import 'package:path/path.dart' as path;
 
 import 'core.dart';
+import 'experiments.dart';
 import 'sdk.dart';
 import 'utils.dart';
 
@@ -33,6 +34,7 @@
     this.cacheDirectoryPath,
     required this.commandName,
     required this.argResults,
+    this.enabledExperiments = const [],
   });
 
   final String? cacheDirectoryPath;
@@ -41,6 +43,7 @@
   final List<FileSystemEntity> analysisRoots;
   final String commandName;
   final ArgResults? argResults;
+  final List<String> enabledExperiments;
 
   Process? _process;
 
@@ -103,6 +106,8 @@
       sdkPath.path,
       if (cacheDirectoryPath != null) '--cache=$cacheDirectoryPath',
       if (packagesFile != null) '--packages=${packagesFile!.path}',
+      if (enabledExperiments.isNotEmpty)
+        '--$experimentFlagName=${enabledExperiments.join(',')}'
     ];
 
     final process = await startDartProcess(sdk, command);
diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart
index b5ff3d4..6237a7a 100644
--- a/pkg/dartdev/lib/src/commands/analyze.dart
+++ b/pkg/dartdev/lib/src/commands/analyze.dart
@@ -6,12 +6,14 @@
 import 'dart:convert';
 import 'dart:io' as io;
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:cli_util/cli_logging.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../analysis_server.dart';
 import '../core.dart';
+import '../experiments.dart';
 import '../sdk.dart';
 import '../utils.dart';
 
@@ -80,7 +82,8 @@
         valueHelp: 'path',
         help: 'The path to the Dart SDK.',
         hide: !verbose,
-      );
+      )
+      ..addExperimentalFlags();
   }
 
   @override
@@ -110,12 +113,6 @@
     final machineFormat = args['format'] == 'machine';
     final jsonFormat = args['format'] == 'json';
 
-    final targetsNames =
-        targets.map((entity) => path.basename(entity.path)).join(', ');
-
-    var progress =
-        machineFormat ? null : log.progress('Analyzing $targetsNames');
-
     io.Directory sdkPath;
     if (args.wasParsed('sdk-path')) {
       sdkPath = io.Directory(args['sdk-path'] as String);
@@ -137,6 +134,26 @@
       sdkPath = io.Directory(sdk.sdkPath);
     }
 
+    final experimentNames = {
+      for (var experiment in args.enabledExperiments)
+        if (experiment.startsWith('no-'))
+          experiment.substring(3)
+        else
+          experiment
+    };
+    final unknownExperiments =
+        experimentNames.difference(ExperimentStatus.knownFeatures.keys.toSet());
+    if (unknownExperiments.isNotEmpty) {
+      final unknownExperimentsText =
+          unknownExperiments.map((e) => "'$e'").join(', ');
+      usageException('Unknown experiment(s): $unknownExperimentsText');
+    }
+
+    final targetsNames =
+        targets.map((entity) => path.basename(entity.path)).join(', ');
+    final progress =
+        machineFormat ? null : log.progress('Analyzing $targetsNames');
+
     final AnalysisServer server = AnalysisServer(
       _packagesFile(),
       sdkPath,
@@ -144,6 +161,7 @@
       cacheDirectoryPath: args['cache'],
       commandName: 'analyze',
       argResults: args,
+      enabledExperiments: args.enabledExperiments,
     );
 
     server.onErrors.listen((FileAnalysisErrors fileErrors) {
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 3645c43..0e0d501 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -123,8 +123,8 @@
         help: defineOption.help,
         abbr: defineOption.abbr,
         valueHelp: defineOption.valueHelp,
-      );
-    addExperimentalFlags(argParser, verbose);
+      )
+      ..addExperimentalFlags(verbose: verbose);
   }
 
   @override
@@ -255,9 +255,8 @@
         help: 'Pass additional options to gen_snapshot.',
         hide: true,
         valueHelp: 'opt1,opt2,...',
-      );
-
-    addExperimentalFlags(argParser, verbose);
+      )
+      ..addExperimentalFlags(verbose: verbose);
   }
 
   @override
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index 39e5ea4..48c4291 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -179,15 +179,15 @@
             hide: !verbose,
             help:
                 'Use the Dart Development Service (DDS) for enhanced debugging '
-                'functionality. Note: Disabling DDS may break some functionality '
-                'in IDEs and other tooling.',
+                'functionality. Note: Disabling DDS may break some '
+                'functionality in IDEs and other tooling.',
             defaultsTo: true)
         ..addFlag(
           'debug-dds',
           hide: true,
         );
     }
-    addExperimentalFlags(argParser, verbose);
+    argParser.addExperimentalFlags(verbose: verbose);
   }
 
   @override
diff --git a/pkg/dartdev/lib/src/experiments.dart b/pkg/dartdev/lib/src/experiments.dart
index 70acd2a..392d5f3 100644
--- a/pkg/dartdev/lib/src/experiments.dart
+++ b/pkg/dartdev/lib/src/experiments.dart
@@ -9,53 +9,53 @@
 const experimentFlagName = 'enable-experiment';
 
 /// Return a list of all the non-expired Dart experiments.
-List<ExperimentalFeature> get experimentalFeatures {
-  List<ExperimentalFeature> features = ExperimentStatus.knownFeatures.values
-      .where((feature) => !feature.isExpired)
-      .toList();
-  features.sort((a, b) => a.enableString.compareTo(b.enableString));
-  return features;
-}
+List<ExperimentalFeature> get experimentalFeatures =>
+    ExperimentStatus.knownFeatures.values
+        .where((feature) => !feature.isExpired)
+        .toList()
+      ..sort((a, b) => a.enableString.compareTo(b.enableString));
 
-void addExperimentalFlags(ArgParser argParser, bool verbose) {
-  List<ExperimentalFeature> features = experimentalFeatures;
+extension ArgParserExtensions on ArgParser {
+  void addExperimentalFlags({bool verbose = false}) {
+    List<ExperimentalFeature> features = experimentalFeatures;
 
-  Map<String, String> allowedHelp = {};
-  for (ExperimentalFeature feature in features) {
-    String suffix =
-        feature.isEnabledByDefault ? ' (no-op - enabled by default)' : '';
-    allowedHelp[feature.enableString] = '${feature.documentation}$suffix';
+    Map<String, String> allowedHelp = {};
+    for (ExperimentalFeature feature in features) {
+      String suffix =
+          feature.isEnabledByDefault ? ' (no-op - enabled by default)' : '';
+      allowedHelp[feature.enableString] = '${feature.documentation}$suffix';
+    }
+
+    addMultiOption(
+      experimentFlagName,
+      valueHelp: 'experiment',
+      allowedHelp: verbose ? allowedHelp : null,
+      help: 'Enable one or more experimental features '
+          '(see dart.dev/go/experiments).',
+      hide: !verbose,
+    );
   }
-
-  argParser.addMultiOption(
-    experimentFlagName,
-    valueHelp: 'experiment',
-    allowedHelp: verbose ? allowedHelp : null,
-    help: 'Enable one or more experimental features '
-        '(see dart.dev/go/experiments).',
-    hide: !verbose,
-  );
 }
 
-extension EnabledExperimentsArg on ArgResults {
+extension ArgResultsExtensions on ArgResults {
   List<String> get enabledExperiments {
     List<String> enabledExperiments = [];
     // Check to see if the ArgParser which generated this result accepts
-    // --enable-experiment as an option. If so, return the result if it was
+    // `--enable-experiment` as an option. If so, return the result if it was
     // provided.
     if (options.contains(experimentFlagName)) {
       if (wasParsed(experimentFlagName)) {
-        enabledExperiments = this[experimentFlagName];
+        enabledExperiments = this[experimentFlagName] as List<String>;
       }
     } else {
-      // In the case where a command uses ArgParser.allowAnything() as its
-      // parser the valid set of options for the command isn't specified and
+      // In the case where a command uses `ArgParser.allowAnything()` as its
+      // parser, the valid set of options for the command isn't specified and
       // isn't enforced. Instead, we have to manually parse the arguments to
-      // look for --enable-experiment=. Currently, this path is only taken for
-      // the pub and test commands, as well as when we are trying to send
+      // look for `--enable-experiment=`. Currently, this path is only taken for
+      // the `pub` and `test` commands, as well as when we are trying to send
       // analytics.
-      final String? experiments = arguments.firstWhereOrNull(
-        (e) => e.startsWith('--enable-experiment='),
+      final experiments = arguments.firstWhereOrNull(
+        (e) => e.startsWith('--$experimentFlagName='),
       );
       if (experiments == null) {
         return [];
@@ -63,7 +63,7 @@
       enabledExperiments = experiments.split('=')[1].split(',');
     }
 
-    for (ExperimentalFeature feature in experimentalFeatures) {
+    for (final feature in experimentalFeatures) {
       // We allow default true flags, but complain when they are passed in.
       if (feature.isEnabledByDefault &&
           enabledExperiments.contains(feature.enableString)) {
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index 065d607..4da2ec8 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -421,6 +421,26 @@
     expect(result.stderr, isEmpty);
   });
 
+  test('--enable-experiment', () async {
+    p = project(mainSrc: 'final x = List.filled(growable: true, 7, "");');
+    var result = await p
+        .run(['analyze', '--enable-experiment=no-named-arguments-anywhere']);
+
+    expect(result.exitCode, 3);
+    expect(result.stdout,
+        contains('Positional arguments must occur before named arguments.'));
+    expect(result.stderr, isEmpty);
+  });
+
+  test('--enable-experiment with a bad experiment', () async {
+    p = project();
+    var result = await p.run(['analyze', '--enable-experiment=bad']);
+
+    expect(result.exitCode, 64);
+    expect(result.stdout, isEmpty);
+    expect(result.stderr, contains("Unknown experiment(s): 'bad'"));
+  });
+
   test('--verbose', () async {
     p = project(mainSrc: '''
 int f() {
diff --git a/pkg/test_runner/lib/src/static_error.dart b/pkg/test_runner/lib/src/static_error.dart
index c24e8f8..fdabb44 100644
--- a/pkg/test_runner/lib/src/static_error.dart
+++ b/pkg/test_runner/lib/src/static_error.dart
@@ -312,7 +312,7 @@
         return false;
     }
 
-    throw UnsupportedError("Unsupported source: ${source.name}");
+    throw FallThroughError();
   }
 
   String toString() {
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index fc7bd0e..4ccfe4f 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -291,8 +291,6 @@
   const char* type;
   const char* reason;
 
-  // DEPRECATED: Use [isolate_group_id] instead.
-  const char* isolate_id;
   Dart_IsolateGroupId isolate_group_id;
 
   Dart_GCStats new_space;
@@ -460,44 +458,6 @@
 DART_EXPORT int64_t Dart_VMIsolateCountMetric();  // Counter
 DART_EXPORT int64_t Dart_VMCurrentRSSMetric();    // Byte
 DART_EXPORT int64_t Dart_VMPeakRSSMetric();       // Byte
-
-// DEPRECATED: Use Dart_IsolateGroupHeapOldUsedMetric instead
-DART_EXPORT int64_t
-Dart_IsolateHeapOldUsedMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapOldUsedMaxMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapOldUsedMaxMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapOldCapacityMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapOldCapacityMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapOldCapacityMaxMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapOldCapacityMaxMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapOldExternalMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapOldExternalMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapNewUsedMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapNewUsedMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapNewUsedMaxMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapNewUsedMaxMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapNewCapacityMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapNewCapacityMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapNewCapacityMaxMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapNewCapacityMaxMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapNewExternalMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapNewExternalMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapGlobalUsedMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapGlobalUsedMetric(Dart_Isolate isolate);  // Byte
-// DEPRECATED: Use Dart_IsolateGroupHeapGlobalUsedMaxMetric instead.
-DART_EXPORT int64_t
-Dart_IsolateHeapGlobalUsedMaxMetric(Dart_Isolate isolate);  // Byte
-
 DART_EXPORT int64_t
 Dart_IsolateGroupHeapOldUsedMetric(Dart_IsolateGroup group);  // Byte
 DART_EXPORT int64_t
diff --git a/runtime/vm/compiler/assembler/assembler_ia32_test.cc b/runtime/vm/compiler/assembler/assembler_ia32_test.cc
index 3c6797b..3c1acdd 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32_test.cc
@@ -1801,7 +1801,7 @@
       "mov eax,0x4144cccd\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "xorps xmm0,[0x.......]\n"
+      "xorps xmm0,[0x........]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1832,7 +1832,7 @@
       "mov eax,0xc174cccd\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "andps xmm0,[0x.......]\n"
+      "andps xmm0,[0x........]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1861,7 +1861,7 @@
       "mov eax,0x4144cccd\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "andps xmm0,[0x.......]\n"
+      "andps xmm0,[0x........]\n"
       "shufps xmm0,xmm0 [ff]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1961,8 +1961,8 @@
   uint32_t res = reinterpret_cast<PackedLogicalOrCode>(test->entry())();
   EXPECT_EQ(0xFFFFFFFF, res);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "orps xmm0,xmm1\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1999,8 +1999,8 @@
   uint32_t res = reinterpret_cast<PackedLogicalAndCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0000F000), res);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "andps xmm0,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "andps xmm0,[0x........]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -2030,8 +2030,8 @@
   uint32_t res = reinterpret_cast<PackedLogicalNotCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "xorps xmm0,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "xorps xmm0,[0x........]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -2076,8 +2076,8 @@
   float res = reinterpret_cast<PackedMoveHighLow>(test->entry())();
   EXPECT_FLOAT_EQ(15.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "movhlps xmm0,xmm1\n"
       "xorps xmm1,xmm1\n"
       "movaps xmm1,xmm0\n"
@@ -2128,8 +2128,8 @@
   float res = reinterpret_cast<PackedMoveLowHigh>(test->entry())();
   EXPECT_FLOAT_EQ(11.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "movlhps xmm0,xmm1\n"
       "xorps xmm1,xmm1\n"
       "movaps xmm1,xmm0\n"
@@ -2179,8 +2179,8 @@
   float res = reinterpret_cast<PackedUnpackLow>(test->entry())();
   EXPECT_FLOAT_EQ(11.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "unpcklps xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [55]\n"
@@ -2229,8 +2229,8 @@
   float res = reinterpret_cast<PackedUnpackHigh>(test->entry())();
   EXPECT_FLOAT_EQ(7.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "unpckhps xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -2279,8 +2279,8 @@
   float res = reinterpret_cast<PackedUnpackLowPair>(test->entry())();
   EXPECT_FLOAT_EQ(6.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "unpcklpd xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -2329,8 +2329,8 @@
   float res = reinterpret_cast<PackedUnpackHighPair>(test->entry())();
   EXPECT_FLOAT_EQ(12.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "unpckhpd xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [55]\n"
@@ -2369,8 +2369,8 @@
   double res = reinterpret_cast<PackedDoubleAdd>(test->entry())();
   EXPECT_FLOAT_EQ(4.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "addpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2407,8 +2407,8 @@
   double res = reinterpret_cast<PackedDoubleSub>(test->entry())();
   EXPECT_FLOAT_EQ(-2.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "subpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2440,8 +2440,8 @@
   double res = reinterpret_cast<PackedDoubleNegate>(test->entry())();
   EXPECT_FLOAT_EQ(-1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "xorpd xmm0,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "xorpd xmm0,[0x........]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -2472,8 +2472,8 @@
   double res = reinterpret_cast<PackedDoubleAbsolute>(test->entry())();
   EXPECT_FLOAT_EQ(1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "andpd xmm0,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "andpd xmm0,[0x........]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -2509,8 +2509,8 @@
   double res = reinterpret_cast<PackedDoubleMul>(test->entry())();
   EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "mulpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2547,8 +2547,8 @@
   double res = reinterpret_cast<PackedDoubleDiv>(test->entry())();
   EXPECT_FLOAT_EQ(3.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "divpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2580,7 +2580,7 @@
   double res = reinterpret_cast<PackedDoubleSqrt>(test->entry())();
   EXPECT_FLOAT_EQ(4.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
       "sqrtpd xmm0,xmm0\n"
       "push eax\n"
       "push eax\n"
@@ -2617,8 +2617,8 @@
   double res = reinterpret_cast<PackedDoubleMin>(test->entry())();
   EXPECT_FLOAT_EQ(3.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "minpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2655,8 +2655,8 @@
   double res = reinterpret_cast<PackedDoubleMax>(test->entry())();
   EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
-      "movups xmm1,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
+      "movups xmm1,[0x........]\n"
       "maxpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2692,7 +2692,7 @@
   double res = reinterpret_cast<PackedDoubleShuffle>(test->entry())();
   EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[0x.......]\n"
+      "movups xmm0,[0x........]\n"
       "shufpd xmm0, xmm0 [33]\n"
       "shufpd xmm0, xmm0 [0]\n"
       "push eax\n"
@@ -2723,7 +2723,7 @@
   float res = reinterpret_cast<PackedDoubleToSingle>(test->entry())();
   EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm1,[0x.......]\n"
+      "movups xmm1,[0x........]\n"
       "cvtpd2ps xmm0,xmm1\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -2755,7 +2755,7 @@
   double res = reinterpret_cast<PackedSingleToDouble>(test->entry())();
   EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm1,[0x.......]\n"
+      "movups xmm1,[0x........]\n"
       "cvtps2pd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -3499,7 +3499,7 @@
   double res = reinterpret_cast<GlobalAddressCode>(test->entry())();
   EXPECT_FLOAT_EQ(kDoubleConst, res, 0.000001);
   EXPECT_DISASSEMBLY(
-      "movsd xmm0,[0x.......]\n"
+      "movsd xmm0,[0x........]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -3703,7 +3703,7 @@
   EXPECT_FLOAT_EQ(-kFloatConst, res, 0.0001);
   EXPECT_DISASSEMBLY(
       "movss xmm0,[esp+0x4]\n"
-      "xorps xmm0,[0x.......]\n"
+      "xorps xmm0,[0x........]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -3730,7 +3730,7 @@
   EXPECT_FLOAT_EQ(-kDoubleConst, res, 0.0001);
   EXPECT_DISASSEMBLY(
       "movsd xmm0,[esp+0x4]\n"
-      "xorpd xmm0,[0x.......]\n"
+      "xorpd xmm0,[0x........]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -4214,7 +4214,7 @@
   EXPECT_DISASSEMBLY(
       "movsd xmm0,[esp+0x4]\n"
       "xorpd xmm1,xmm1\n"
-      "xorpd xmm1,[0x.......]\n"
+      "xorpd xmm1,[0x........]\n"
       "orpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -4383,7 +4383,7 @@
   EXPECT_FLOAT_EQ(val, res, 0.001);
   EXPECT_DISASSEMBLY(
       "movsd xmm0,[esp+0x4]\n"
-      "andpd xmm0,[0x.......]\n"
+      "andpd xmm0,[0x........]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index d99afbf..cea3446 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -406,7 +406,7 @@
       if ((rm & 7) == 5) {
 #if defined(TARGET_ARCH_IA32)
         int32_t abs = LoadUnaligned(reinterpret_cast<int32_t*>(modrmp + 1));
-        Print("[%#x]", abs);
+        Print("[0x%08x]", abs);
 #else
         int32_t disp = LoadUnaligned(reinterpret_cast<int32_t*>(modrmp + 1));
         Print("[rip");
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 99be4dd..eb33322 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1234,15 +1234,7 @@
 #undef VM_METRIC_API
 #endif  // !defined(PRODUCT)
 
-// TODO(dartbug.com/49211): Remove definition of deprecated functions.
 #define ISOLATE_GROUP_METRIC_API(type, variable, name, unit)                   \
-  DART_EXPORT int64_t Dart_Isolate##variable##Metric(Dart_Isolate isolate) {   \
-    if (isolate == nullptr) {                                                  \
-      FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);   \
-    }                                                                          \
-    Isolate* iso = reinterpret_cast<Isolate*>(isolate);                        \
-    return iso->group()->Get##variable##Metric()->Value();                     \
-  }                                                                            \
   DART_EXPORT int64_t Dart_IsolateGroup##variable##Metric(                     \
       Dart_IsolateGroup isolate_group) {                                       \
     if (isolate_group == nullptr) {                                            \
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 0c943fa..ed01f6a 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -1035,14 +1035,6 @@
   if (Dart::gc_event_callback() != nullptr) {
     Dart_GCEvent event;
     int64_t isolate_group_uptime_micros = isolate_group_->UptimeMicros();
-
-    // TODO(dartbug.com/49211): Remove use of deprecated [isolate_id] field.
-    auto isolate_id = Utils::CStringUniquePtr(
-        OS::SCreate(nullptr, ISOLATE_GROUP_SERVICE_ID_FORMAT_STRING,
-                    isolate_group_->id()),
-        std::free);
-    event.isolate_id = isolate_id.get();
-
     event.isolate_group_id = isolate_group_->id();
     event.type = GCTypeToString(stats_.type_);
     event.reason = GCReasonToString(stats_.reason_);
diff --git a/runtime/vm/malloc_hooks_ia32.cc b/runtime/vm/malloc_hooks_ia32.cc
index 2b7a371..0572ac0 100644
--- a/runtime/vm/malloc_hooks_ia32.cc
+++ b/runtime/vm/malloc_hooks_ia32.cc
@@ -11,9 +11,9 @@
 namespace dart {
 
 #if defined(DEBUG)
-const intptr_t kSkipCount = 6;
+const intptr_t kSkipCount = 7;
 #elif !(defined(PRODUCT) || defined(DEBUG))
-const intptr_t kSkipCount = 5;
+const intptr_t kSkipCount = 6;
 #endif
 
 }  // namespace dart
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 80e135e..f0fe6a8 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -211,7 +211,7 @@
   V(NoSuchMethod, "noSuchMethod")                                              \
   V(NoSuchMethodError, "NoSuchMethodError")                                    \
   V(Null, "Null")                                                              \
-  V(NullThrownError, "_NullThrownError")                                       \
+  V(NullThrownError, "NullThrownError")                                        \
   V(Number, "num")                                                             \
   V(Object, "Object")                                                          \
   V(ObjectPool, "ObjectPool")                                                  \
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index 49c92c7..1eed466 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -692,7 +692,7 @@
 abstract class JavaScriptIndexingBehavior<E> extends JSMutableIndexable<E> {}
 
 /// Thrown by type assertions that fail.
-class TypeErrorImpl extends Error implements TypeError {
+class TypeErrorImpl extends Error implements TypeError, CastError {
   final String _message;
 
   TypeErrorImpl(this._message);
diff --git a/sdk/lib/_internal/js_shared/lib/rti.dart b/sdk/lib/_internal/js_shared/lib/rti.dart
index ca9ab8f..b7c9881 100644
--- a/sdk/lib/_internal/js_shared/lib/rti.dart
+++ b/sdk/lib/_internal/js_shared/lib/rti.dart
@@ -1073,7 +1073,7 @@
   String toString() => _message;
 }
 
-class _TypeError extends _Error implements TypeError {
+class _TypeError extends _Error implements TypeError, CastError {
   _TypeError.fromMessage(String message) : super('TypeError: $message');
 
   factory _TypeError.forType(object, String type) {
diff --git a/sdk/lib/_internal/vm/lib/errors_patch.dart b/sdk/lib/_internal/vm/lib/errors_patch.dart
index 0c448da..05b0afa 100644
--- a/sdk/lib/_internal/vm/lib/errors_patch.dart
+++ b/sdk/lib/_internal/vm/lib/errors_patch.dart
@@ -95,7 +95,7 @@
   final Object? message;
 }
 
-class _TypeError extends Error implements TypeError {
+class _TypeError extends Error implements TypeError, CastError {
   @pragma("vm:entry-point")
   _TypeError._create(this._url, this._line, this._column, this._message);
 
@@ -112,7 +112,7 @@
   final String _message;
 }
 
-class _CastError extends Error implements TypeError {
+class _CastError extends Error implements CastError, TypeError {
   @pragma("vm:entry-point")
   _CastError._create(this._url, this._line, this._column, this._errorMsg);
 
@@ -128,12 +128,6 @@
   final String _errorMsg;
 }
 
-class _NullThrownError extends Error implements NullThrownError {
-  @pragma("vm:entry-point")
-  _NullThrownError();
-  String toString() => "Throw of null.";
-}
-
 @patch
 class FallThroughError {
   @patch
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 664777c..bdb1a01 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -140,14 +140,17 @@
 
 /// Error thrown by the runtime system when a cast operation fails.
 @Deprecated("Use TypeError instead")
-typedef CastError = TypeError;
+class CastError extends Error {}
 
 /// Error thrown when attempting to throw `null`.
 ///
 /// In null safe code, you are statically disallowed from throwing `null`,
 /// so this error will go away when non-null safe code stops being supported.
-@Deprecated("Use TypeError instead")
-typedef NullThrownError = TypeError;
+class NullThrownError extends Error {
+  @pragma("vm:entry-point")
+  NullThrownError();
+  String toString() => "Throw of null.";
+}
 
 /// Error thrown when a function is passed an unacceptable argument.
 class ArgumentError extends Error {
@@ -450,12 +453,10 @@
 
 /// Error thrown when control reaches the end of a switch case.
 ///
-/// The Dart specification required this error to be thrown when
+/// The Dart specification requires this error to be thrown when
 /// control reaches the end of a switch case (except the last case
 /// of a switch) without meeting a break or similar end of the control
 /// flow.
-/// Fallthrough has been made a compile-time error in Dart 2.0.
-@Deprecated("No longer relevant in Dart 2.0")
 class FallThroughError extends Error {
   FallThroughError();
   @pragma("vm:entry-point")
@@ -607,8 +608,8 @@
 /// Error thrown when a lazily initialized variable cannot be initialized.
 ///
 /// This is no longer used in null safe Dart code and is replaced by late
-/// variables which do not specify the error they throw when misused.
-@Deprecated("Not needed by null safe code")
+/// variables and `LateInitializationError`.
+// TODO: Deprecate?
 class CyclicInitializationError extends Error {
   final String? variableName;
   @pragma("vm:entry-point")
diff --git a/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart b/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
index c94b2ca..8cb6e4a 100644
--- a/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
+++ b/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
@@ -6,8 +6,8 @@
 import 'dart:async';
 
 class C {
-  C operator *(int? other) => this;
-  Object? operator -() => null;
+  C operator*(int? other) => this;
+  Object? operator-() => null;
 }
 
 // Test ambiguous cases of trailing "!" syntax.  Where possible, we verify that
@@ -18,10 +18,11 @@
   // `throw a!` means `throw (a!)`, not `(throw a)!`.  Since it's a compile-time
   // error for a thrown expression to be potentially nullable, this is
   // sufficient to verify that the compiler has resolved the ambiguity
-  // correctly.
+  // correctly.  We check the runtime behavior by verifying that the error that
+  // is thrown is not `NullThrownError`.
   Expect.throws(() {
-    throw a!;
-  });
+      throw a!;
+    }, (error) => error is! NullThrownError);
 
   // `() => a!` means `() => (a!)`, not `(() => a)!`.  We check the compile-time
   // behavior by trying to assign to a function returning non-null.  We check
@@ -30,7 +31,7 @@
   var x1 = () => a!;
   Object Function() x2 = x1;
   Expect.throws(() {
-    x1();
+      x1();
   });
 
   // `x = a!` means `x = (a!)`, not `(x = a)!`.  We check the compile-time
@@ -39,11 +40,11 @@
   // assignment occurs.
   Object x3 = 0;
   Expect.throws(() {
-    x3 = a!;
+      x3 = a!;
   });
   var x4 = 0 as Object?;
   Expect.throws(() {
-    x4 = a!;
+      x4 = a!;
   });
   Expect.equals(x4, 0);
 
@@ -65,7 +66,7 @@
   var x7 = new C();
   i = null;
   Expect.throws(() {
-    x7 * i!;
+      x7 * i!;
   });
 
   // `-x!` means `-(x!)`, not `(-x)!`.  We check the compile-time behavior by
diff --git a/tools/VERSION b/tools/VERSION
index 0bb2ec4..d6a09da 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 197
+PRERELEASE 198
 PRERELEASE_PATCH 0
\ No newline at end of file