diff --git a/DEPS b/DEPS
index d5d5a11..a5498ba 100644
--- a/DEPS
+++ b/DEPS
@@ -151,7 +151,7 @@
   "stream_channel_rev": "3fa3e40c75c210d617b8b943b9b8f580e9866a89",
   "string_scanner_rev": "6579871b528036767b3200b390a3ecef28e4900d",
   "sync_http_rev": "b6bd47965694dddffb6e62fb8a6c12d17c4ae4cd",
-  "term_glyph_rev": "4885b7f8af6931e23d3aa6d1767ee3f9a626923d",
+  "term_glyph_rev": "d0f205c67ea70eea47b9f41c8440129a72a9c86e",
   "test_descriptor_rev": "ead23c1e7df079ac0f6457a35f7a71432892e527",
   "test_process_rev": "7c73ec8a8a6e0e63d0ec27d70c21ca4323fb5e8f",
   "test_reflective_loader_rev": "fcfce37666672edac849d2af6dffc0f8df236a94",
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 6738b31..299fa4e 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -1682,7 +1682,7 @@
     final experimental = experimentalJson;
     final generalJson = json['general'];
     final general = generalJson != null
-        ? ClientCapabilitiesGeneral.fromJson(
+        ? GeneralClientCapabilities.fromJson(
             generalJson as Map<String, Object?>)
         : null;
     final notebookDocumentJson = json['notebookDocument'];
@@ -1719,7 +1719,7 @@
 
   /// General client capabilities.
   ///  @since 3.16.0
-  final ClientCapabilitiesGeneral? general;
+  final GeneralClientCapabilities? general;
 
   /// Capabilities specific to the notebook document support.
   ///  @since 3.17.0
@@ -1763,8 +1763,8 @@
       try {
         final general = obj['general'];
         if (general != null &&
-            !(ClientCapabilitiesGeneral.canParse(general, reporter))) {
-          reporter.reportError('must be of type ClientCapabilitiesGeneral');
+            !(GeneralClientCapabilities.canParse(general, reporter))) {
+          reporter.reportError('must be of type GeneralClientCapabilities');
           return false;
         }
       } finally {
@@ -1854,486 +1854,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class ClientCapabilitiesFileOperations implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    ClientCapabilitiesFileOperations.canParse,
-    ClientCapabilitiesFileOperations.fromJson,
-  );
-
-  ClientCapabilitiesFileOperations({
-    this.didCreate,
-    this.didDelete,
-    this.didRename,
-    this.dynamicRegistration,
-    this.willCreate,
-    this.willDelete,
-    this.willRename,
-  });
-  static ClientCapabilitiesFileOperations fromJson(Map<String, Object?> json) {
-    final didCreateJson = json['didCreate'];
-    final didCreate = didCreateJson as bool?;
-    final didDeleteJson = json['didDelete'];
-    final didDelete = didDeleteJson as bool?;
-    final didRenameJson = json['didRename'];
-    final didRename = didRenameJson as bool?;
-    final dynamicRegistrationJson = json['dynamicRegistration'];
-    final dynamicRegistration = dynamicRegistrationJson as bool?;
-    final willCreateJson = json['willCreate'];
-    final willCreate = willCreateJson as bool?;
-    final willDeleteJson = json['willDelete'];
-    final willDelete = willDeleteJson as bool?;
-    final willRenameJson = json['willRename'];
-    final willRename = willRenameJson as bool?;
-    return ClientCapabilitiesFileOperations(
-      didCreate: didCreate,
-      didDelete: didDelete,
-      didRename: didRename,
-      dynamicRegistration: dynamicRegistration,
-      willCreate: willCreate,
-      willDelete: willDelete,
-      willRename: willRename,
-    );
-  }
-
-  /// The client has support for sending didCreateFiles notifications.
-  final bool? didCreate;
-
-  /// The client has support for sending didDeleteFiles notifications.
-  final bool? didDelete;
-
-  /// The client has support for sending didRenameFiles notifications.
-  final bool? didRename;
-
-  /// Whether the client supports dynamic registration for file
-  /// requests/notifications.
-  final bool? dynamicRegistration;
-
-  /// The client has support for sending willCreateFiles requests.
-  final bool? willCreate;
-
-  /// The client has support for sending willDeleteFiles requests.
-  final bool? willDelete;
-
-  /// The client has support for sending willRenameFiles requests.
-  final bool? willRename;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    if (didCreate != null) {
-      __result['didCreate'] = didCreate;
-    }
-    if (didDelete != null) {
-      __result['didDelete'] = didDelete;
-    }
-    if (didRename != null) {
-      __result['didRename'] = didRename;
-    }
-    if (dynamicRegistration != null) {
-      __result['dynamicRegistration'] = dynamicRegistration;
-    }
-    if (willCreate != null) {
-      __result['willCreate'] = willCreate;
-    }
-    if (willDelete != null) {
-      __result['willDelete'] = willDelete;
-    }
-    if (willRename != null) {
-      __result['willRename'] = willRename;
-    }
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('didCreate');
-      try {
-        final didCreate = obj['didCreate'];
-        if (didCreate != null && !(didCreate is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('didDelete');
-      try {
-        final didDelete = obj['didDelete'];
-        if (didDelete != null && !(didDelete is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('didRename');
-      try {
-        final didRename = obj['didRename'];
-        if (didRename != null && !(didRename is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('dynamicRegistration');
-      try {
-        final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willCreate');
-      try {
-        final willCreate = obj['willCreate'];
-        if (willCreate != null && !(willCreate is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willDelete');
-      try {
-        final willDelete = obj['willDelete'];
-        if (willDelete != null && !(willDelete is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willRename');
-      try {
-        final willRename = obj['willRename'];
-        if (willRename != null && !(willRename is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type ClientCapabilitiesFileOperations');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is ClientCapabilitiesFileOperations &&
-        other.runtimeType == ClientCapabilitiesFileOperations) {
-      return didCreate == other.didCreate &&
-          didDelete == other.didDelete &&
-          didRename == other.didRename &&
-          dynamicRegistration == other.dynamicRegistration &&
-          willCreate == other.willCreate &&
-          willDelete == other.willDelete &&
-          willRename == other.willRename &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        didCreate,
-        didDelete,
-        didRename,
-        dynamicRegistration,
-        willCreate,
-        willDelete,
-        willRename,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class ClientCapabilitiesGeneral implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    ClientCapabilitiesGeneral.canParse,
-    ClientCapabilitiesGeneral.fromJson,
-  );
-
-  ClientCapabilitiesGeneral({
-    this.markdown,
-    this.positionEncodings,
-    this.regularExpressions,
-    this.staleRequestSupport,
-  });
-  static ClientCapabilitiesGeneral fromJson(Map<String, Object?> json) {
-    final markdownJson = json['markdown'];
-    final markdown = markdownJson != null
-        ? MarkdownClientCapabilities.fromJson(
-            markdownJson as Map<String, Object?>)
-        : null;
-    final positionEncodingsJson = json['positionEncodings'];
-    final positionEncodings = (positionEncodingsJson as List<Object?>?)
-        ?.map((item) => PositionEncodingKind.fromJson(item as String))
-        .toList();
-    final regularExpressionsJson = json['regularExpressions'];
-    final regularExpressions = regularExpressionsJson != null
-        ? RegularExpressionsClientCapabilities.fromJson(
-            regularExpressionsJson as Map<String, Object?>)
-        : null;
-    final staleRequestSupportJson = json['staleRequestSupport'];
-    final staleRequestSupport = staleRequestSupportJson != null
-        ? ClientCapabilitiesStaleRequestSupport.fromJson(
-            staleRequestSupportJson as Map<String, Object?>)
-        : null;
-    return ClientCapabilitiesGeneral(
-      markdown: markdown,
-      positionEncodings: positionEncodings,
-      regularExpressions: regularExpressions,
-      staleRequestSupport: staleRequestSupport,
-    );
-  }
-
-  /// Client capabilities specific to the client's markdown parser.
-  ///  @since 3.16.0
-  final MarkdownClientCapabilities? markdown;
-
-  /// The position encodings supported by the client. Client and server have to
-  /// agree on the same position encoding to ensure that offsets (e.g. character
-  /// position in a line) are interpreted the same on both side.
-  ///
-  /// To keep the protocol backwards compatible the following applies: if the
-  /// value 'utf-16' is missing from the array of position encodings servers can
-  /// assume that the client supports UTF-16. UTF-16 is therefore a mandatory
-  /// encoding.
-  ///
-  /// If omitted it defaults to ['utf-16'].
-  ///
-  /// Implementation considerations: since the conversion from one encoding into
-  /// another requires the content of the file / line the conversion is best
-  /// done where the file is read which is usually on the server side.
-  ///  @since 3.17.0
-  final List<PositionEncodingKind>? positionEncodings;
-
-  /// Client capabilities specific to regular expressions.
-  ///  @since 3.16.0
-  final RegularExpressionsClientCapabilities? regularExpressions;
-
-  /// Client capability that signals how the client handles stale requests (e.g.
-  /// a request for which the client will not process the response anymore since
-  /// the information is outdated).
-  ///  @since 3.17.0
-  final ClientCapabilitiesStaleRequestSupport? staleRequestSupport;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    if (markdown != null) {
-      __result['markdown'] = markdown?.toJson();
-    }
-    if (positionEncodings != null) {
-      __result['positionEncodings'] =
-          positionEncodings?.map((item) => item.toJson()).toList();
-    }
-    if (regularExpressions != null) {
-      __result['regularExpressions'] = regularExpressions?.toJson();
-    }
-    if (staleRequestSupport != null) {
-      __result['staleRequestSupport'] = staleRequestSupport?.toJson();
-    }
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('markdown');
-      try {
-        final markdown = obj['markdown'];
-        if (markdown != null &&
-            !(MarkdownClientCapabilities.canParse(markdown, reporter))) {
-          reporter.reportError('must be of type MarkdownClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('positionEncodings');
-      try {
-        final positionEncodings = obj['positionEncodings'];
-        if (positionEncodings != null &&
-            !((positionEncodings is List<Object?> &&
-                (positionEncodings.every((item) =>
-                    PositionEncodingKind.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<PositionEncodingKind>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('regularExpressions');
-      try {
-        final regularExpressions = obj['regularExpressions'];
-        if (regularExpressions != null &&
-            !(RegularExpressionsClientCapabilities.canParse(
-                regularExpressions, reporter))) {
-          reporter.reportError(
-              'must be of type RegularExpressionsClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('staleRequestSupport');
-      try {
-        final staleRequestSupport = obj['staleRequestSupport'];
-        if (staleRequestSupport != null &&
-            !(ClientCapabilitiesStaleRequestSupport.canParse(
-                staleRequestSupport, reporter))) {
-          reporter.reportError(
-              'must be of type ClientCapabilitiesStaleRequestSupport');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type ClientCapabilitiesGeneral');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is ClientCapabilitiesGeneral &&
-        other.runtimeType == ClientCapabilitiesGeneral) {
-      return markdown == other.markdown &&
-          listEqual(positionEncodings, other.positionEncodings,
-              (PositionEncodingKind a, PositionEncodingKind b) => a == b) &&
-          regularExpressions == other.regularExpressions &&
-          staleRequestSupport == other.staleRequestSupport &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        markdown,
-        lspHashCode(positionEncodings),
-        regularExpressions,
-        staleRequestSupport,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class ClientCapabilitiesStaleRequestSupport implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    ClientCapabilitiesStaleRequestSupport.canParse,
-    ClientCapabilitiesStaleRequestSupport.fromJson,
-  );
-
-  ClientCapabilitiesStaleRequestSupport({
-    required this.cancel,
-    required this.retryOnContentModified,
-  });
-  static ClientCapabilitiesStaleRequestSupport fromJson(
-      Map<String, Object?> json) {
-    final cancelJson = json['cancel'];
-    final cancel = cancelJson as bool;
-    final retryOnContentModifiedJson = json['retryOnContentModified'];
-    final retryOnContentModified = (retryOnContentModifiedJson as List<Object?>)
-        .map((item) => item as String)
-        .toList();
-    return ClientCapabilitiesStaleRequestSupport(
-      cancel: cancel,
-      retryOnContentModified: retryOnContentModified,
-    );
-  }
-
-  /// The client will actively cancel the request.
-  final bool cancel;
-
-  /// The list of requests for which the client will retry the request if it
-  /// receives a response with error code `ContentModified``
-  final List<String> retryOnContentModified;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['cancel'] = cancel;
-    __result['retryOnContentModified'] = retryOnContentModified;
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('cancel');
-      try {
-        if (!obj.containsKey('cancel')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final cancel = obj['cancel'];
-        if (cancel == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(cancel is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('retryOnContentModified');
-      try {
-        if (!obj.containsKey('retryOnContentModified')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final retryOnContentModified = obj['retryOnContentModified'];
-        if (retryOnContentModified == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((retryOnContentModified is List<Object?> &&
-            (retryOnContentModified.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter
-          .reportError('must be of type ClientCapabilitiesStaleRequestSupport');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is ClientCapabilitiesStaleRequestSupport &&
-        other.runtimeType == ClientCapabilitiesStaleRequestSupport) {
-      return cancel == other.cancel &&
-          listEqual(retryOnContentModified, other.retryOnContentModified,
-              (String a, String b) => a == b) &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        cancel,
-        lspHashCode(retryOnContentModified),
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 /// A code action represents a change that can be performed in code, e.g. to fix
 /// a problem or to refactor code.
 ///
@@ -2819,85 +2339,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class CodeActionClientCapabilitiesCodeActionKind implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    CodeActionClientCapabilitiesCodeActionKind.canParse,
-    CodeActionClientCapabilitiesCodeActionKind.fromJson,
-  );
-
-  CodeActionClientCapabilitiesCodeActionKind({
-    required this.valueSet,
-  });
-  static CodeActionClientCapabilitiesCodeActionKind fromJson(
-      Map<String, Object?> json) {
-    final valueSetJson = json['valueSet'];
-    final valueSet = (valueSetJson as List<Object?>)
-        .map((item) => CodeActionKind.fromJson(item as String))
-        .toList();
-    return CodeActionClientCapabilitiesCodeActionKind(
-      valueSet: valueSet,
-    );
-  }
-
-  /// The code action kind values the client supports. When this property exists
-  /// the client also guarantees that it will handle values outside its set
-  /// gracefully and falls back to a default value when unknown.
-  final List<CodeActionKind> valueSet;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('valueSet');
-      try {
-        if (!obj.containsKey('valueSet')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final valueSet = obj['valueSet'];
-        if (valueSet == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((valueSet is List<Object?> &&
-            (valueSet
-                .every((item) => CodeActionKind.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<CodeActionKind>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError(
-          'must be of type CodeActionClientCapabilitiesCodeActionKind');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is CodeActionClientCapabilitiesCodeActionKind &&
-        other.runtimeType == CodeActionClientCapabilitiesCodeActionKind) {
-      return listEqual(valueSet, other.valueSet,
-              (CodeActionKind a, CodeActionKind b) => a == b) &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => lspHashCode(valueSet);
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class CodeActionClientCapabilitiesCodeActionLiteralSupport
     implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -2911,7 +2352,7 @@
   static CodeActionClientCapabilitiesCodeActionLiteralSupport fromJson(
       Map<String, Object?> json) {
     final codeActionKindJson = json['codeActionKind'];
-    final codeActionKind = CodeActionClientCapabilitiesCodeActionKind.fromJson(
+    final codeActionKind = CodeActionLiteralSupportCodeActionKind.fromJson(
         codeActionKindJson as Map<String, Object?>);
     return CodeActionClientCapabilitiesCodeActionLiteralSupport(
       codeActionKind: codeActionKind,
@@ -2919,7 +2360,7 @@
   }
 
   /// The code action kind is supported with the following value set.
-  final CodeActionClientCapabilitiesCodeActionKind codeActionKind;
+  final CodeActionLiteralSupportCodeActionKind codeActionKind;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
@@ -2940,10 +2381,10 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CodeActionClientCapabilitiesCodeActionKind.canParse(
+        if (!(CodeActionLiteralSupportCodeActionKind.canParse(
             codeActionKind, reporter))) {
           reporter.reportError(
-              'must be of type CodeActionClientCapabilitiesCodeActionKind');
+              'must be of type CodeActionLiteralSupportCodeActionKind');
           return false;
         }
       } finally {
@@ -3340,6 +2781,85 @@
   bool operator ==(Object o) => o is CodeActionKind && o._value == _value;
 }
 
+class CodeActionLiteralSupportCodeActionKind implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CodeActionLiteralSupportCodeActionKind.canParse,
+    CodeActionLiteralSupportCodeActionKind.fromJson,
+  );
+
+  CodeActionLiteralSupportCodeActionKind({
+    required this.valueSet,
+  });
+  static CodeActionLiteralSupportCodeActionKind fromJson(
+      Map<String, Object?> json) {
+    final valueSetJson = json['valueSet'];
+    final valueSet = (valueSetJson as List<Object?>)
+        .map((item) => CodeActionKind.fromJson(item as String))
+        .toList();
+    return CodeActionLiteralSupportCodeActionKind(
+      valueSet: valueSet,
+    );
+  }
+
+  /// The code action kind values the client supports. When this property exists
+  /// the client also guarantees that it will handle values outside its set
+  /// gracefully and falls back to a default value when unknown.
+  final List<CodeActionKind> valueSet;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('valueSet');
+      try {
+        if (!obj.containsKey('valueSet')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final valueSet = obj['valueSet'];
+        if (valueSet == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((valueSet is List<Object?> &&
+            (valueSet
+                .every((item) => CodeActionKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CodeActionKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type CodeActionLiteralSupportCodeActionKind');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CodeActionLiteralSupportCodeActionKind &&
+        other.runtimeType == CodeActionLiteralSupportCodeActionKind) {
+      return listEqual(valueSet, other.valueSet,
+              (CodeActionKind a, CodeActionKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(valueSet);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class CodeActionOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
     CodeActionOptions.canParse,
@@ -5424,7 +4944,7 @@
     final insertReplaceSupport = insertReplaceSupportJson as bool?;
     final insertTextModeSupportJson = json['insertTextModeSupport'];
     final insertTextModeSupport = insertTextModeSupportJson != null
-        ? CompletionClientCapabilitiesInsertTextModeSupport.fromJson(
+        ? CompletionItemInsertTextModeSupport.fromJson(
             insertTextModeSupportJson as Map<String, Object?>)
         : null;
     final labelDetailsSupportJson = json['labelDetailsSupport'];
@@ -5433,14 +4953,14 @@
     final preselectSupport = preselectSupportJson as bool?;
     final resolveSupportJson = json['resolveSupport'];
     final resolveSupport = resolveSupportJson != null
-        ? CompletionClientCapabilitiesResolveSupport.fromJson(
+        ? CompletionItemResolveSupport.fromJson(
             resolveSupportJson as Map<String, Object?>)
         : null;
     final snippetSupportJson = json['snippetSupport'];
     final snippetSupport = snippetSupportJson as bool?;
     final tagSupportJson = json['tagSupport'];
     final tagSupport = tagSupportJson != null
-        ? CompletionClientCapabilitiesTagSupport.fromJson(
+        ? CompletionItemTagSupport.fromJson(
             tagSupportJson as Map<String, Object?>)
         : null;
     return CompletionClientCapabilitiesCompletionItem(
@@ -5476,8 +4996,7 @@
   /// override the whitespace handling mode as defined by the client (see
   /// `insertTextMode`).
   ///  @since 3.16.0
-  final CompletionClientCapabilitiesInsertTextModeSupport?
-      insertTextModeSupport;
+  final CompletionItemInsertTextModeSupport? insertTextModeSupport;
 
   /// The client has support for completion item label details (see also
   /// `CompletionItemLabelDetails`).
@@ -5491,7 +5010,7 @@
   /// item. Before version 3.16.0 only the predefined properties `documentation`
   /// and `detail` could be resolved lazily.
   ///  @since 3.16.0
-  final CompletionClientCapabilitiesResolveSupport? resolveSupport;
+  final CompletionItemResolveSupport? resolveSupport;
 
   /// Client supports snippets as insert text.
   ///
@@ -5506,7 +5025,7 @@
   /// preserve unknown tags when sending a completion item back to the server in
   /// a resolve call.
   ///  @since 3.15.0
-  final CompletionClientCapabilitiesTagSupport? tagSupport;
+  final CompletionItemTagSupport? tagSupport;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
@@ -5594,10 +5113,10 @@
       try {
         final insertTextModeSupport = obj['insertTextModeSupport'];
         if (insertTextModeSupport != null &&
-            !(CompletionClientCapabilitiesInsertTextModeSupport.canParse(
+            !(CompletionItemInsertTextModeSupport.canParse(
                 insertTextModeSupport, reporter))) {
           reporter.reportError(
-              'must be of type CompletionClientCapabilitiesInsertTextModeSupport');
+              'must be of type CompletionItemInsertTextModeSupport');
           return false;
         }
       } finally {
@@ -5627,10 +5146,9 @@
       try {
         final resolveSupport = obj['resolveSupport'];
         if (resolveSupport != null &&
-            !(CompletionClientCapabilitiesResolveSupport.canParse(
+            !(CompletionItemResolveSupport.canParse(
                 resolveSupport, reporter))) {
-          reporter.reportError(
-              'must be of type CompletionClientCapabilitiesResolveSupport');
+          reporter.reportError('must be of type CompletionItemResolveSupport');
           return false;
         }
       } finally {
@@ -5650,10 +5168,8 @@
       try {
         final tagSupport = obj['tagSupport'];
         if (tagSupport != null &&
-            !(CompletionClientCapabilitiesTagSupport.canParse(
-                tagSupport, reporter))) {
-          reporter.reportError(
-              'must be of type CompletionClientCapabilitiesTagSupport');
+            !(CompletionItemTagSupport.canParse(tagSupport, reporter))) {
+          reporter.reportError('must be of type CompletionItemTagSupport');
           return false;
         }
       } finally {
@@ -5859,236 +5375,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class CompletionClientCapabilitiesInsertTextModeSupport implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    CompletionClientCapabilitiesInsertTextModeSupport.canParse,
-    CompletionClientCapabilitiesInsertTextModeSupport.fromJson,
-  );
-
-  CompletionClientCapabilitiesInsertTextModeSupport({
-    required this.valueSet,
-  });
-  static CompletionClientCapabilitiesInsertTextModeSupport fromJson(
-      Map<String, Object?> json) {
-    final valueSetJson = json['valueSet'];
-    final valueSet = (valueSetJson as List<Object?>)
-        .map((item) => InsertTextMode.fromJson(item as int))
-        .toList();
-    return CompletionClientCapabilitiesInsertTextModeSupport(
-      valueSet: valueSet,
-    );
-  }
-
-  final List<InsertTextMode> valueSet;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('valueSet');
-      try {
-        if (!obj.containsKey('valueSet')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final valueSet = obj['valueSet'];
-        if (valueSet == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((valueSet is List<Object?> &&
-            (valueSet
-                .every((item) => InsertTextMode.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<InsertTextMode>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError(
-          'must be of type CompletionClientCapabilitiesInsertTextModeSupport');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is CompletionClientCapabilitiesInsertTextModeSupport &&
-        other.runtimeType ==
-            CompletionClientCapabilitiesInsertTextModeSupport) {
-      return listEqual(valueSet, other.valueSet,
-              (InsertTextMode a, InsertTextMode b) => a == b) &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => lspHashCode(valueSet);
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class CompletionClientCapabilitiesResolveSupport implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    CompletionClientCapabilitiesResolveSupport.canParse,
-    CompletionClientCapabilitiesResolveSupport.fromJson,
-  );
-
-  CompletionClientCapabilitiesResolveSupport({
-    required this.properties,
-  });
-  static CompletionClientCapabilitiesResolveSupport fromJson(
-      Map<String, Object?> json) {
-    final propertiesJson = json['properties'];
-    final properties = (propertiesJson as List<Object?>)
-        .map((item) => item as String)
-        .toList();
-    return CompletionClientCapabilitiesResolveSupport(
-      properties: properties,
-    );
-  }
-
-  /// The properties that a client can resolve lazily.
-  final List<String> properties;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['properties'] = properties;
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('properties');
-      try {
-        if (!obj.containsKey('properties')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final properties = obj['properties'];
-        if (properties == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((properties is List<Object?> &&
-            (properties.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError(
-          'must be of type CompletionClientCapabilitiesResolveSupport');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is CompletionClientCapabilitiesResolveSupport &&
-        other.runtimeType == CompletionClientCapabilitiesResolveSupport) {
-      return listEqual(
-              properties, other.properties, (String a, String b) => a == b) &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => lspHashCode(properties);
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class CompletionClientCapabilitiesTagSupport implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    CompletionClientCapabilitiesTagSupport.canParse,
-    CompletionClientCapabilitiesTagSupport.fromJson,
-  );
-
-  CompletionClientCapabilitiesTagSupport({
-    required this.valueSet,
-  });
-  static CompletionClientCapabilitiesTagSupport fromJson(
-      Map<String, Object?> json) {
-    final valueSetJson = json['valueSet'];
-    final valueSet = (valueSetJson as List<Object?>)
-        .map((item) => CompletionItemTag.fromJson(item as int))
-        .toList();
-    return CompletionClientCapabilitiesTagSupport(
-      valueSet: valueSet,
-    );
-  }
-
-  /// The tags supported by the client.
-  final List<CompletionItemTag> valueSet;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('valueSet');
-      try {
-        if (!obj.containsKey('valueSet')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final valueSet = obj['valueSet'];
-        if (valueSet == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((valueSet is List<Object?> &&
-            (valueSet.every(
-                (item) => CompletionItemTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<CompletionItemTag>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError(
-          'must be of type CompletionClientCapabilitiesTagSupport');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is CompletionClientCapabilitiesTagSupport &&
-        other.runtimeType == CompletionClientCapabilitiesTagSupport) {
-      return listEqual(valueSet, other.valueSet,
-              (CompletionItemTag a, CompletionItemTag b) => a == b) &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => lspHashCode(valueSet);
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 /// Contains additional information about the context in which a completion
 /// request is triggered.
 class CompletionContext implements ToJsonable {
@@ -6785,6 +6071,82 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CompletionItemInsertTextModeSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionItemInsertTextModeSupport.canParse,
+    CompletionItemInsertTextModeSupport.fromJson,
+  );
+
+  CompletionItemInsertTextModeSupport({
+    required this.valueSet,
+  });
+  static CompletionItemInsertTextModeSupport fromJson(
+      Map<String, Object?> json) {
+    final valueSetJson = json['valueSet'];
+    final valueSet = (valueSetJson as List<Object?>)
+        .map((item) => InsertTextMode.fromJson(item as int))
+        .toList();
+    return CompletionItemInsertTextModeSupport(
+      valueSet: valueSet,
+    );
+  }
+
+  final List<InsertTextMode> valueSet;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('valueSet');
+      try {
+        if (!obj.containsKey('valueSet')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final valueSet = obj['valueSet'];
+        if (valueSet == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((valueSet is List<Object?> &&
+            (valueSet
+                .every((item) => InsertTextMode.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<InsertTextMode>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type CompletionItemInsertTextModeSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionItemInsertTextModeSupport &&
+        other.runtimeType == CompletionItemInsertTextModeSupport) {
+      return listEqual(valueSet, other.valueSet,
+              (InsertTextMode a, InsertTextMode b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(valueSet);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// The kind of a completion entry.
 class CompletionItemKind implements ToJsonable {
   const CompletionItemKind(this._value);
@@ -6925,6 +6287,80 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CompletionItemResolveSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionItemResolveSupport.canParse,
+    CompletionItemResolveSupport.fromJson,
+  );
+
+  CompletionItemResolveSupport({
+    required this.properties,
+  });
+  static CompletionItemResolveSupport fromJson(Map<String, Object?> json) {
+    final propertiesJson = json['properties'];
+    final properties = (propertiesJson as List<Object?>)
+        .map((item) => item as String)
+        .toList();
+    return CompletionItemResolveSupport(
+      properties: properties,
+    );
+  }
+
+  /// The properties that a client can resolve lazily.
+  final List<String> properties;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['properties'] = properties;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('properties');
+      try {
+        if (!obj.containsKey('properties')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final properties = obj['properties'];
+        if (properties == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((properties is List<Object?> &&
+            (properties.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionItemResolveSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionItemResolveSupport &&
+        other.runtimeType == CompletionItemResolveSupport) {
+      return listEqual(
+              properties, other.properties, (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(properties);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Completion item tags are extra annotations that tweak the rendering of a
 /// completion item.
 ///  @since 3.15.0
@@ -6952,6 +6388,81 @@
   bool operator ==(Object o) => o is CompletionItemTag && o._value == _value;
 }
 
+class CompletionItemTagSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionItemTagSupport.canParse,
+    CompletionItemTagSupport.fromJson,
+  );
+
+  CompletionItemTagSupport({
+    required this.valueSet,
+  });
+  static CompletionItemTagSupport fromJson(Map<String, Object?> json) {
+    final valueSetJson = json['valueSet'];
+    final valueSet = (valueSetJson as List<Object?>)
+        .map((item) => CompletionItemTag.fromJson(item as int))
+        .toList();
+    return CompletionItemTagSupport(
+      valueSet: valueSet,
+    );
+  }
+
+  /// The tags supported by the client.
+  final List<CompletionItemTag> valueSet;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['valueSet'] = valueSet.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('valueSet');
+      try {
+        if (!obj.containsKey('valueSet')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final valueSet = obj['valueSet'];
+        if (valueSet == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((valueSet is List<Object?> &&
+            (valueSet.every(
+                (item) => CompletionItemTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CompletionItemTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionItemTagSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionItemTagSupport &&
+        other.runtimeType == CompletionItemTagSupport) {
+      return listEqual(valueSet, other.valueSet,
+              (CompletionItemTag a, CompletionItemTag b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(valueSet);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Represents a collection of completion items ([CompletionItem]) to be
 /// presented in the editor.
 class CompletionList implements ToJsonable {
@@ -15950,12 +15461,12 @@
   static const InvalidParams = ErrorCodes(-32602);
   static const InvalidRequest = ErrorCodes(-32600);
 
-  /// This is the end range of JSON RPC reserved error codes. It doesn't denote
+  /// This is the end range of JSON-RPC reserved error codes. It doesn't denote
   /// a real error code.
   ///  @since 3.16.0
   static const jsonrpcReservedErrorRangeEnd = ErrorCodes(-32000);
 
-  /// This is the start range of JSON RPC reserved error codes. It doesn't
+  /// This is the start range of JSON-RPC reserved error codes. It doesn't
   /// denote a real error code. No LSP error codes should be defined between the
   /// start and end range. For backwards compatibility the
   /// `ServerNotInitialized` and the `UnknownErrorCode` are left in the range.
@@ -15973,7 +15484,7 @@
   static const lspReservedErrorRangeStart = ErrorCodes(-32899);
   static const MethodNotFound = ErrorCodes(-32601);
 
-  /// Defined by JSON RPC
+  /// Defined by JSON-RPC
   static const ParseError = ErrorCodes(-32700);
 
   /// The client has canceled a request and a server as detected the cancel.
@@ -16801,6 +16312,205 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class FileOperationClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    FileOperationClientCapabilities.canParse,
+    FileOperationClientCapabilities.fromJson,
+  );
+
+  FileOperationClientCapabilities({
+    this.didCreate,
+    this.didDelete,
+    this.didRename,
+    this.dynamicRegistration,
+    this.willCreate,
+    this.willDelete,
+    this.willRename,
+  });
+  static FileOperationClientCapabilities fromJson(Map<String, Object?> json) {
+    final didCreateJson = json['didCreate'];
+    final didCreate = didCreateJson as bool?;
+    final didDeleteJson = json['didDelete'];
+    final didDelete = didDeleteJson as bool?;
+    final didRenameJson = json['didRename'];
+    final didRename = didRenameJson as bool?;
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final willCreateJson = json['willCreate'];
+    final willCreate = willCreateJson as bool?;
+    final willDeleteJson = json['willDelete'];
+    final willDelete = willDeleteJson as bool?;
+    final willRenameJson = json['willRename'];
+    final willRename = willRenameJson as bool?;
+    return FileOperationClientCapabilities(
+      didCreate: didCreate,
+      didDelete: didDelete,
+      didRename: didRename,
+      dynamicRegistration: dynamicRegistration,
+      willCreate: willCreate,
+      willDelete: willDelete,
+      willRename: willRename,
+    );
+  }
+
+  /// The client has support for sending didCreateFiles notifications.
+  final bool? didCreate;
+
+  /// The client has support for sending didDeleteFiles notifications.
+  final bool? didDelete;
+
+  /// The client has support for sending didRenameFiles notifications.
+  final bool? didRename;
+
+  /// Whether the client supports dynamic registration for file
+  /// requests/notifications.
+  final bool? dynamicRegistration;
+
+  /// The client has support for sending willCreateFiles requests.
+  final bool? willCreate;
+
+  /// The client has support for sending willDeleteFiles requests.
+  final bool? willDelete;
+
+  /// The client has support for sending willRenameFiles requests.
+  final bool? willRename;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (didCreate != null) {
+      __result['didCreate'] = didCreate;
+    }
+    if (didDelete != null) {
+      __result['didDelete'] = didDelete;
+    }
+    if (didRename != null) {
+      __result['didRename'] = didRename;
+    }
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (willCreate != null) {
+      __result['willCreate'] = willCreate;
+    }
+    if (willDelete != null) {
+      __result['willDelete'] = willDelete;
+    }
+    if (willRename != null) {
+      __result['willRename'] = willRename;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('didCreate');
+      try {
+        final didCreate = obj['didCreate'];
+        if (didCreate != null && !(didCreate is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didDelete');
+      try {
+        final didDelete = obj['didDelete'];
+        if (didDelete != null && !(didDelete is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didRename');
+      try {
+        final didRename = obj['didRename'];
+        if (didRename != null && !(didRename is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('dynamicRegistration');
+      try {
+        final dynamicRegistration = obj['dynamicRegistration'];
+        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('willCreate');
+      try {
+        final willCreate = obj['willCreate'];
+        if (willCreate != null && !(willCreate is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('willDelete');
+      try {
+        final willDelete = obj['willDelete'];
+        if (willDelete != null && !(willDelete is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('willRename');
+      try {
+        final willRename = obj['willRename'];
+        if (willRename != null && !(willRename is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type FileOperationClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is FileOperationClientCapabilities &&
+        other.runtimeType == FileOperationClientCapabilities) {
+      return didCreate == other.didCreate &&
+          didDelete == other.didDelete &&
+          didRename == other.didRename &&
+          dynamicRegistration == other.dynamicRegistration &&
+          willCreate == other.willCreate &&
+          willDelete == other.willDelete &&
+          willRename == other.willRename &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        didCreate,
+        didDelete,
+        didRename,
+        dynamicRegistration,
+        willCreate,
+        willDelete,
+        willRename,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// A filter to describe in which file operation requests or notifications the
 /// server is interested in.
 ///  @since 3.16.0
@@ -16897,6 +16607,215 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class FileOperationOptions implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    FileOperationOptions.canParse,
+    FileOperationOptions.fromJson,
+  );
+
+  FileOperationOptions({
+    this.didCreate,
+    this.didDelete,
+    this.didRename,
+    this.willCreate,
+    this.willDelete,
+    this.willRename,
+  });
+  static FileOperationOptions fromJson(Map<String, Object?> json) {
+    final didCreateJson = json['didCreate'];
+    final didCreate = didCreateJson != null
+        ? FileOperationRegistrationOptions.fromJson(
+            didCreateJson as Map<String, Object?>)
+        : null;
+    final didDeleteJson = json['didDelete'];
+    final didDelete = didDeleteJson != null
+        ? FileOperationRegistrationOptions.fromJson(
+            didDeleteJson as Map<String, Object?>)
+        : null;
+    final didRenameJson = json['didRename'];
+    final didRename = didRenameJson != null
+        ? FileOperationRegistrationOptions.fromJson(
+            didRenameJson as Map<String, Object?>)
+        : null;
+    final willCreateJson = json['willCreate'];
+    final willCreate = willCreateJson != null
+        ? FileOperationRegistrationOptions.fromJson(
+            willCreateJson as Map<String, Object?>)
+        : null;
+    final willDeleteJson = json['willDelete'];
+    final willDelete = willDeleteJson != null
+        ? FileOperationRegistrationOptions.fromJson(
+            willDeleteJson as Map<String, Object?>)
+        : null;
+    final willRenameJson = json['willRename'];
+    final willRename = willRenameJson != null
+        ? FileOperationRegistrationOptions.fromJson(
+            willRenameJson as Map<String, Object?>)
+        : null;
+    return FileOperationOptions(
+      didCreate: didCreate,
+      didDelete: didDelete,
+      didRename: didRename,
+      willCreate: willCreate,
+      willDelete: willDelete,
+      willRename: willRename,
+    );
+  }
+
+  /// The server is interested in receiving didCreateFiles notifications.
+  final FileOperationRegistrationOptions? didCreate;
+
+  /// The server is interested in receiving didDeleteFiles file notifications.
+  final FileOperationRegistrationOptions? didDelete;
+
+  /// The server is interested in receiving didRenameFiles notifications.
+  final FileOperationRegistrationOptions? didRename;
+
+  /// The server is interested in receiving willCreateFiles requests.
+  final FileOperationRegistrationOptions? willCreate;
+
+  /// The server is interested in receiving willDeleteFiles file requests.
+  final FileOperationRegistrationOptions? willDelete;
+
+  /// The server is interested in receiving willRenameFiles requests.
+  final FileOperationRegistrationOptions? willRename;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (didCreate != null) {
+      __result['didCreate'] = didCreate?.toJson();
+    }
+    if (didDelete != null) {
+      __result['didDelete'] = didDelete?.toJson();
+    }
+    if (didRename != null) {
+      __result['didRename'] = didRename?.toJson();
+    }
+    if (willCreate != null) {
+      __result['willCreate'] = willCreate?.toJson();
+    }
+    if (willDelete != null) {
+      __result['willDelete'] = willDelete?.toJson();
+    }
+    if (willRename != null) {
+      __result['willRename'] = willRename?.toJson();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('didCreate');
+      try {
+        final didCreate = obj['didCreate'];
+        if (didCreate != null &&
+            !(FileOperationRegistrationOptions.canParse(didCreate, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didDelete');
+      try {
+        final didDelete = obj['didDelete'];
+        if (didDelete != null &&
+            !(FileOperationRegistrationOptions.canParse(didDelete, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didRename');
+      try {
+        final didRename = obj['didRename'];
+        if (didRename != null &&
+            !(FileOperationRegistrationOptions.canParse(didRename, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('willCreate');
+      try {
+        final willCreate = obj['willCreate'];
+        if (willCreate != null &&
+            !(FileOperationRegistrationOptions.canParse(
+                willCreate, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('willDelete');
+      try {
+        final willDelete = obj['willDelete'];
+        if (willDelete != null &&
+            !(FileOperationRegistrationOptions.canParse(
+                willDelete, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('willRename');
+      try {
+        final willRename = obj['willRename'];
+        if (willRename != null &&
+            !(FileOperationRegistrationOptions.canParse(
+                willRename, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type FileOperationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is FileOperationOptions &&
+        other.runtimeType == FileOperationOptions) {
+      return didCreate == other.didCreate &&
+          didDelete == other.didDelete &&
+          didRename == other.didRename &&
+          willCreate == other.willCreate &&
+          willDelete == other.willDelete &&
+          willRename == other.willRename &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        didCreate,
+        didDelete,
+        didRename,
+        willCreate,
+        willDelete,
+        willRename,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// A pattern to describe in which file operation requests or notifications the
 /// server is interested in.
 ///  @since 3.16.0
@@ -18590,6 +18509,287 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class GeneralClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    GeneralClientCapabilities.canParse,
+    GeneralClientCapabilities.fromJson,
+  );
+
+  GeneralClientCapabilities({
+    this.markdown,
+    this.positionEncodings,
+    this.regularExpressions,
+    this.staleRequestSupport,
+  });
+  static GeneralClientCapabilities fromJson(Map<String, Object?> json) {
+    final markdownJson = json['markdown'];
+    final markdown = markdownJson != null
+        ? MarkdownClientCapabilities.fromJson(
+            markdownJson as Map<String, Object?>)
+        : null;
+    final positionEncodingsJson = json['positionEncodings'];
+    final positionEncodings = (positionEncodingsJson as List<Object?>?)
+        ?.map((item) => PositionEncodingKind.fromJson(item as String))
+        .toList();
+    final regularExpressionsJson = json['regularExpressions'];
+    final regularExpressions = regularExpressionsJson != null
+        ? RegularExpressionsClientCapabilities.fromJson(
+            regularExpressionsJson as Map<String, Object?>)
+        : null;
+    final staleRequestSupportJson = json['staleRequestSupport'];
+    final staleRequestSupport = staleRequestSupportJson != null
+        ? GeneralClientCapabilitiesStaleRequestSupport.fromJson(
+            staleRequestSupportJson as Map<String, Object?>)
+        : null;
+    return GeneralClientCapabilities(
+      markdown: markdown,
+      positionEncodings: positionEncodings,
+      regularExpressions: regularExpressions,
+      staleRequestSupport: staleRequestSupport,
+    );
+  }
+
+  /// Client capabilities specific to the client's markdown parser.
+  ///  @since 3.16.0
+  final MarkdownClientCapabilities? markdown;
+
+  /// The position encodings supported by the client. Client and server have to
+  /// agree on the same position encoding to ensure that offsets (e.g. character
+  /// position in a line) are interpreted the same on both side.
+  ///
+  /// To keep the protocol backwards compatible the following applies: if the
+  /// value 'utf-16' is missing from the array of position encodings servers can
+  /// assume that the client supports UTF-16. UTF-16 is therefore a mandatory
+  /// encoding.
+  ///
+  /// If omitted it defaults to ['utf-16'].
+  ///
+  /// Implementation considerations: since the conversion from one encoding into
+  /// another requires the content of the file / line the conversion is best
+  /// done where the file is read which is usually on the server side.
+  ///  @since 3.17.0
+  final List<PositionEncodingKind>? positionEncodings;
+
+  /// Client capabilities specific to regular expressions.
+  ///  @since 3.16.0
+  final RegularExpressionsClientCapabilities? regularExpressions;
+
+  /// Client capability that signals how the client handles stale requests (e.g.
+  /// a request for which the client will not process the response anymore since
+  /// the information is outdated).
+  ///  @since 3.17.0
+  final GeneralClientCapabilitiesStaleRequestSupport? staleRequestSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (markdown != null) {
+      __result['markdown'] = markdown?.toJson();
+    }
+    if (positionEncodings != null) {
+      __result['positionEncodings'] =
+          positionEncodings?.map((item) => item.toJson()).toList();
+    }
+    if (regularExpressions != null) {
+      __result['regularExpressions'] = regularExpressions?.toJson();
+    }
+    if (staleRequestSupport != null) {
+      __result['staleRequestSupport'] = staleRequestSupport?.toJson();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('markdown');
+      try {
+        final markdown = obj['markdown'];
+        if (markdown != null &&
+            !(MarkdownClientCapabilities.canParse(markdown, reporter))) {
+          reporter.reportError('must be of type MarkdownClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('positionEncodings');
+      try {
+        final positionEncodings = obj['positionEncodings'];
+        if (positionEncodings != null &&
+            !((positionEncodings is List<Object?> &&
+                (positionEncodings.every((item) =>
+                    PositionEncodingKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<PositionEncodingKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('regularExpressions');
+      try {
+        final regularExpressions = obj['regularExpressions'];
+        if (regularExpressions != null &&
+            !(RegularExpressionsClientCapabilities.canParse(
+                regularExpressions, reporter))) {
+          reporter.reportError(
+              'must be of type RegularExpressionsClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('staleRequestSupport');
+      try {
+        final staleRequestSupport = obj['staleRequestSupport'];
+        if (staleRequestSupport != null &&
+            !(GeneralClientCapabilitiesStaleRequestSupport.canParse(
+                staleRequestSupport, reporter))) {
+          reporter.reportError(
+              'must be of type GeneralClientCapabilitiesStaleRequestSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type GeneralClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is GeneralClientCapabilities &&
+        other.runtimeType == GeneralClientCapabilities) {
+      return markdown == other.markdown &&
+          listEqual(positionEncodings, other.positionEncodings,
+              (PositionEncodingKind a, PositionEncodingKind b) => a == b) &&
+          regularExpressions == other.regularExpressions &&
+          staleRequestSupport == other.staleRequestSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        markdown,
+        lspHashCode(positionEncodings),
+        regularExpressions,
+        staleRequestSupport,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class GeneralClientCapabilitiesStaleRequestSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    GeneralClientCapabilitiesStaleRequestSupport.canParse,
+    GeneralClientCapabilitiesStaleRequestSupport.fromJson,
+  );
+
+  GeneralClientCapabilitiesStaleRequestSupport({
+    required this.cancel,
+    required this.retryOnContentModified,
+  });
+  static GeneralClientCapabilitiesStaleRequestSupport fromJson(
+      Map<String, Object?> json) {
+    final cancelJson = json['cancel'];
+    final cancel = cancelJson as bool;
+    final retryOnContentModifiedJson = json['retryOnContentModified'];
+    final retryOnContentModified = (retryOnContentModifiedJson as List<Object?>)
+        .map((item) => item as String)
+        .toList();
+    return GeneralClientCapabilitiesStaleRequestSupport(
+      cancel: cancel,
+      retryOnContentModified: retryOnContentModified,
+    );
+  }
+
+  /// The client will actively cancel the request.
+  final bool cancel;
+
+  /// The list of requests for which the client will retry the request if it
+  /// receives a response with error code `ContentModified``
+  final List<String> retryOnContentModified;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['cancel'] = cancel;
+    __result['retryOnContentModified'] = retryOnContentModified;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('cancel');
+      try {
+        if (!obj.containsKey('cancel')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final cancel = obj['cancel'];
+        if (cancel == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(cancel is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('retryOnContentModified');
+      try {
+        if (!obj.containsKey('retryOnContentModified')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final retryOnContentModified = obj['retryOnContentModified'];
+        if (retryOnContentModified == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((retryOnContentModified is List<Object?> &&
+            (retryOnContentModified.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type GeneralClientCapabilitiesStaleRequestSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is GeneralClientCapabilitiesStaleRequestSupport &&
+        other.runtimeType == GeneralClientCapabilitiesStaleRequestSupport) {
+      return cancel == other.cancel &&
+          listEqual(retryOnContentModified, other.retryOnContentModified,
+              (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        cancel,
+        lspHashCode(retryOnContentModified),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// The result of a hover request.
 class Hover implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -18983,101 +19183,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class HoverParamsPosition implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    HoverParamsPosition.canParse,
-    HoverParamsPosition.fromJson,
-  );
-
-  HoverParamsPosition({
-    required this.character,
-    required this.line,
-  });
-  static HoverParamsPosition fromJson(Map<String, Object?> json) {
-    final characterJson = json['character'];
-    final character = characterJson as int;
-    final lineJson = json['line'];
-    final line = lineJson as int;
-    return HoverParamsPosition(
-      character: character,
-      line: line,
-    );
-  }
-
-  final int character;
-  final int line;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['character'] = character;
-    __result['line'] = line;
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('character');
-      try {
-        if (!obj.containsKey('character')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final character = obj['character'];
-        if (character == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(character is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('line');
-      try {
-        if (!obj.containsKey('line')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final line = obj['line'];
-        if (line == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(line is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type HoverParamsPosition');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is HoverParamsPosition &&
-        other.runtimeType == HoverParamsPosition) {
-      return character == other.character && line == other.line && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        character,
-        line,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class HoverRegistrationOptions
     implements HoverOptions, TextDocumentRegistrationOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -19175,73 +19280,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class HoverResult implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    HoverResult.canParse,
-    HoverResult.fromJson,
-  );
-
-  HoverResult({
-    required this.value,
-  });
-  static HoverResult fromJson(Map<String, Object?> json) {
-    final valueJson = json['value'];
-    final value = valueJson as String;
-    return HoverResult(
-      value: value,
-    );
-  }
-
-  final String value;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['value'] = value;
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('value');
-      try {
-        if (!obj.containsKey('value')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final value = obj['value'];
-        if (value == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(value is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type HoverResult');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is HoverResult && other.runtimeType == HoverResult) {
-      return value == other.value && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => value.hashCode;
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class ImplementationClientCapabilities implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     ImplementationClientCapabilities.canParse,
@@ -19687,28 +19725,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Known error codes for an `InitializeErrorCodes`;
-class InitializeErrorCodes implements ToJsonable {
-  const InitializeErrorCodes(this._value);
-  const InitializeErrorCodes.fromJson(this._value);
-
-  final int _value;
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    return obj is int;
-  }
-
-  Object toJson() => _value;
-
-  @override
-  String toString() => _value.toString();
-
-  @override
-  int get hashCode => _value.hashCode;
-
-  bool operator ==(Object o) => o is InitializeErrorCodes && o._value == _value;
-}
-
 class InitializeParams implements WorkDoneProgressParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
     InitializeParams.canParse,
@@ -21497,29 +21513,55 @@
   );
 
   InlineValueContext({
+    required this.frameId,
     required this.stoppedLocation,
   });
   static InlineValueContext fromJson(Map<String, Object?> json) {
+    final frameIdJson = json['frameId'];
+    final frameId = frameIdJson as int;
     final stoppedLocationJson = json['stoppedLocation'];
     final stoppedLocation =
         Range.fromJson(stoppedLocationJson as Map<String, Object?>);
     return InlineValueContext(
+      frameId: frameId,
       stoppedLocation: stoppedLocation,
     );
   }
 
+  /// The stack frame (as a DAP Id) where the execution has stopped.
+  final int frameId;
+
   /// The document range where execution has stopped. Typically the end position
   /// of the range denotes the line where the inline values are shown.
   final Range stoppedLocation;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['frameId'] = frameId;
     __result['stoppedLocation'] = stoppedLocation.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('frameId');
+      try {
+        if (!obj.containsKey('frameId')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final frameId = obj['frameId'];
+        if (frameId == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(frameId is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('stoppedLocation');
       try {
         if (!obj.containsKey('stoppedLocation')) {
@@ -21549,13 +21591,18 @@
   bool operator ==(Object other) {
     if (other is InlineValueContext &&
         other.runtimeType == InlineValueContext) {
-      return stoppedLocation == other.stoppedLocation && true;
+      return frameId == other.frameId &&
+          stoppedLocation == other.stoppedLocation &&
+          true;
     }
     return false;
   }
 
   @override
-  int get hashCode => stoppedLocation.hashCode;
+  int get hashCode => Object.hash(
+        frameId,
+        stoppedLocation,
+      );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -24036,6 +24083,9 @@
   /// Constant for the 'textDocument/definition' method.
   static const textDocument_definition = Method('textDocument/definition');
 
+  /// Constant for the 'textDocument/diagnostic' method.
+  static const textDocument_diagnostic = Method('textDocument/diagnostic');
+
   /// Constant for the 'textDocument/didChange' method.
   static const textDocument_didChange = Method('textDocument/didChange');
 
@@ -24186,6 +24236,9 @@
   /// Constant for the 'workspace/configuration' method.
   static const workspace_configuration = Method('workspace/configuration');
 
+  /// Constant for the 'workspace/diagnostic' method.
+  static const workspace_diagnostic = Method('workspace/diagnostic');
+
   /// Constant for the 'workspace/diagnostic/refresh' method.
   static const workspace_diagnostic_refresh =
       Method('workspace/diagnostic/refresh');
@@ -25529,7 +25582,7 @@
         .toList();
     final structureJson = json['structure'];
     final structure = structureJson != null
-        ? NotebookDocumentChangeEventStructure.fromJson(
+        ? NotebookDocumentChangeEventCellsStructure.fromJson(
             structureJson as Map<String, Object?>)
         : null;
     final textContentJson = json['textContent'];
@@ -25549,7 +25602,7 @@
   final List<NotebookCell>? data;
 
   /// Changes to the cell structure to add or remove cells.
-  final NotebookDocumentChangeEventStructure? structure;
+  final NotebookDocumentChangeEventCellsStructure? structure;
 
   /// Changes to the text content of notebook cells.
   final List<NotebookDocumentChangeEventTextContent>? textContent;
@@ -25588,10 +25641,10 @@
       try {
         final structure = obj['structure'];
         if (structure != null &&
-            !(NotebookDocumentChangeEventStructure.canParse(
+            !(NotebookDocumentChangeEventCellsStructure.canParse(
                 structure, reporter))) {
           reporter.reportError(
-              'must be of type NotebookDocumentChangeEventStructure');
+              'must be of type NotebookDocumentChangeEventCellsStructure');
           return false;
         }
       } finally {
@@ -25648,18 +25701,18 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class NotebookDocumentChangeEventStructure implements ToJsonable {
+class NotebookDocumentChangeEventCellsStructure implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
-    NotebookDocumentChangeEventStructure.canParse,
-    NotebookDocumentChangeEventStructure.fromJson,
+    NotebookDocumentChangeEventCellsStructure.canParse,
+    NotebookDocumentChangeEventCellsStructure.fromJson,
   );
 
-  NotebookDocumentChangeEventStructure({
+  NotebookDocumentChangeEventCellsStructure({
     required this.array,
     this.didClose,
     this.didOpen,
   });
-  static NotebookDocumentChangeEventStructure fromJson(
+  static NotebookDocumentChangeEventCellsStructure fromJson(
       Map<String, Object?> json) {
     final arrayJson = json['array'];
     final array =
@@ -25673,7 +25726,7 @@
     final didOpen = (didOpenJson as List<Object?>?)
         ?.map((item) => TextDocumentItem.fromJson(item as Map<String, Object?>))
         .toList();
-    return NotebookDocumentChangeEventStructure(
+    return NotebookDocumentChangeEventCellsStructure(
       array: array,
       didClose: didClose,
       didOpen: didOpen,
@@ -25749,16 +25802,16 @@
       }
       return true;
     } else {
-      reporter
-          .reportError('must be of type NotebookDocumentChangeEventStructure');
+      reporter.reportError(
+          'must be of type NotebookDocumentChangeEventCellsStructure');
       return false;
     }
   }
 
   @override
   bool operator ==(Object other) {
-    if (other is NotebookDocumentChangeEventStructure &&
-        other.runtimeType == NotebookDocumentChangeEventStructure) {
+    if (other is NotebookDocumentChangeEventCellsStructure &&
+        other.runtimeType == NotebookDocumentChangeEventCellsStructure) {
       return array == other.array &&
           listEqual(didClose, other.didClose,
               (TextDocumentIdentifier a, TextDocumentIdentifier b) => a == b) &&
@@ -35133,215 +35186,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class ServerCapabilitiesFileOperations implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    ServerCapabilitiesFileOperations.canParse,
-    ServerCapabilitiesFileOperations.fromJson,
-  );
-
-  ServerCapabilitiesFileOperations({
-    this.didCreate,
-    this.didDelete,
-    this.didRename,
-    this.willCreate,
-    this.willDelete,
-    this.willRename,
-  });
-  static ServerCapabilitiesFileOperations fromJson(Map<String, Object?> json) {
-    final didCreateJson = json['didCreate'];
-    final didCreate = didCreateJson != null
-        ? FileOperationRegistrationOptions.fromJson(
-            didCreateJson as Map<String, Object?>)
-        : null;
-    final didDeleteJson = json['didDelete'];
-    final didDelete = didDeleteJson != null
-        ? FileOperationRegistrationOptions.fromJson(
-            didDeleteJson as Map<String, Object?>)
-        : null;
-    final didRenameJson = json['didRename'];
-    final didRename = didRenameJson != null
-        ? FileOperationRegistrationOptions.fromJson(
-            didRenameJson as Map<String, Object?>)
-        : null;
-    final willCreateJson = json['willCreate'];
-    final willCreate = willCreateJson != null
-        ? FileOperationRegistrationOptions.fromJson(
-            willCreateJson as Map<String, Object?>)
-        : null;
-    final willDeleteJson = json['willDelete'];
-    final willDelete = willDeleteJson != null
-        ? FileOperationRegistrationOptions.fromJson(
-            willDeleteJson as Map<String, Object?>)
-        : null;
-    final willRenameJson = json['willRename'];
-    final willRename = willRenameJson != null
-        ? FileOperationRegistrationOptions.fromJson(
-            willRenameJson as Map<String, Object?>)
-        : null;
-    return ServerCapabilitiesFileOperations(
-      didCreate: didCreate,
-      didDelete: didDelete,
-      didRename: didRename,
-      willCreate: willCreate,
-      willDelete: willDelete,
-      willRename: willRename,
-    );
-  }
-
-  /// The server is interested in receiving didCreateFiles notifications.
-  final FileOperationRegistrationOptions? didCreate;
-
-  /// The server is interested in receiving didDeleteFiles file notifications.
-  final FileOperationRegistrationOptions? didDelete;
-
-  /// The server is interested in receiving didRenameFiles notifications.
-  final FileOperationRegistrationOptions? didRename;
-
-  /// The server is interested in receiving willCreateFiles requests.
-  final FileOperationRegistrationOptions? willCreate;
-
-  /// The server is interested in receiving willDeleteFiles file requests.
-  final FileOperationRegistrationOptions? willDelete;
-
-  /// The server is interested in receiving willRenameFiles requests.
-  final FileOperationRegistrationOptions? willRename;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    if (didCreate != null) {
-      __result['didCreate'] = didCreate?.toJson();
-    }
-    if (didDelete != null) {
-      __result['didDelete'] = didDelete?.toJson();
-    }
-    if (didRename != null) {
-      __result['didRename'] = didRename?.toJson();
-    }
-    if (willCreate != null) {
-      __result['willCreate'] = willCreate?.toJson();
-    }
-    if (willDelete != null) {
-      __result['willDelete'] = willDelete?.toJson();
-    }
-    if (willRename != null) {
-      __result['willRename'] = willRename?.toJson();
-    }
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('didCreate');
-      try {
-        final didCreate = obj['didCreate'];
-        if (didCreate != null &&
-            !(FileOperationRegistrationOptions.canParse(didCreate, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('didDelete');
-      try {
-        final didDelete = obj['didDelete'];
-        if (didDelete != null &&
-            !(FileOperationRegistrationOptions.canParse(didDelete, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('didRename');
-      try {
-        final didRename = obj['didRename'];
-        if (didRename != null &&
-            !(FileOperationRegistrationOptions.canParse(didRename, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willCreate');
-      try {
-        final willCreate = obj['willCreate'];
-        if (willCreate != null &&
-            !(FileOperationRegistrationOptions.canParse(
-                willCreate, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willDelete');
-      try {
-        final willDelete = obj['willDelete'];
-        if (willDelete != null &&
-            !(FileOperationRegistrationOptions.canParse(
-                willDelete, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willRename');
-      try {
-        final willRename = obj['willRename'];
-        if (willRename != null &&
-            !(FileOperationRegistrationOptions.canParse(
-                willRename, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type ServerCapabilitiesFileOperations');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is ServerCapabilitiesFileOperations &&
-        other.runtimeType == ServerCapabilitiesFileOperations) {
-      return didCreate == other.didCreate &&
-          didDelete == other.didDelete &&
-          didRename == other.didRename &&
-          willCreate == other.willCreate &&
-          willDelete == other.willDelete &&
-          willRename == other.willRename &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        didCreate,
-        didDelete,
-        didRename,
-        willCreate,
-        willDelete,
-        willRename,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class ServerCapabilitiesWorkspace implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     ServerCapabilitiesWorkspace.canParse,
@@ -35355,7 +35199,7 @@
   static ServerCapabilitiesWorkspace fromJson(Map<String, Object?> json) {
     final fileOperationsJson = json['fileOperations'];
     final fileOperations = fileOperationsJson != null
-        ? ServerCapabilitiesFileOperations.fromJson(
+        ? FileOperationOptions.fromJson(
             fileOperationsJson as Map<String, Object?>)
         : null;
     final workspaceFoldersJson = json['workspaceFolders'];
@@ -35371,7 +35215,7 @@
 
   /// The server is interested in file notifications/requests.
   ///  @since 3.16.0
-  final ServerCapabilitiesFileOperations? fileOperations;
+  final FileOperationOptions? fileOperations;
 
   /// The server supports workspace folder.
   ///  @since 3.6.0
@@ -35394,10 +35238,8 @@
       try {
         final fileOperations = obj['fileOperations'];
         if (fileOperations != null &&
-            !(ServerCapabilitiesFileOperations.canParse(
-                fileOperations, reporter))) {
-          reporter
-              .reportError('must be of type ServerCapabilitiesFileOperations');
+            !(FileOperationOptions.canParse(fileOperations, reporter))) {
+          reporter.reportError('must be of type FileOperationOptions');
           return false;
         }
       } finally {
@@ -36434,75 +36276,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class SignatureHelpClientCapabilitiesParameterInformation
-    implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    SignatureHelpClientCapabilitiesParameterInformation.canParse,
-    SignatureHelpClientCapabilitiesParameterInformation.fromJson,
-  );
-
-  SignatureHelpClientCapabilitiesParameterInformation({
-    this.labelOffsetSupport,
-  });
-  static SignatureHelpClientCapabilitiesParameterInformation fromJson(
-      Map<String, Object?> json) {
-    final labelOffsetSupportJson = json['labelOffsetSupport'];
-    final labelOffsetSupport = labelOffsetSupportJson as bool?;
-    return SignatureHelpClientCapabilitiesParameterInformation(
-      labelOffsetSupport: labelOffsetSupport,
-    );
-  }
-
-  /// The client supports processing label offsets instead of a simple label
-  /// string.
-  ///  @since 3.14.0
-  final bool? labelOffsetSupport;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    if (labelOffsetSupport != null) {
-      __result['labelOffsetSupport'] = labelOffsetSupport;
-    }
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('labelOffsetSupport');
-      try {
-        final labelOffsetSupport = obj['labelOffsetSupport'];
-        if (labelOffsetSupport != null && !(labelOffsetSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError(
-          'must be of type SignatureHelpClientCapabilitiesParameterInformation');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is SignatureHelpClientCapabilitiesParameterInformation &&
-        other.runtimeType ==
-            SignatureHelpClientCapabilitiesParameterInformation) {
-      return labelOffsetSupport == other.labelOffsetSupport && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => labelOffsetSupport.hashCode;
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class SignatureHelpClientCapabilitiesSignatureInformation
     implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -36525,7 +36298,7 @@
         .toList();
     final parameterInformationJson = json['parameterInformation'];
     final parameterInformation = parameterInformationJson != null
-        ? SignatureHelpClientCapabilitiesParameterInformation.fromJson(
+        ? SignatureInformationParameterInformation.fromJson(
             parameterInformationJson as Map<String, Object?>)
         : null;
     return SignatureHelpClientCapabilitiesSignatureInformation(
@@ -36545,8 +36318,7 @@
   final List<MarkupKind>? documentationFormat;
 
   /// Client capabilities specific to parameter information.
-  final SignatureHelpClientCapabilitiesParameterInformation?
-      parameterInformation;
+  final SignatureInformationParameterInformation? parameterInformation;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
@@ -36593,10 +36365,10 @@
       try {
         final parameterInformation = obj['parameterInformation'];
         if (parameterInformation != null &&
-            !(SignatureHelpClientCapabilitiesParameterInformation.canParse(
+            !(SignatureInformationParameterInformation.canParse(
                 parameterInformation, reporter))) {
           reporter.reportError(
-              'must be of type SignatureHelpClientCapabilitiesParameterInformation');
+              'must be of type SignatureInformationParameterInformation');
           return false;
         }
       } finally {
@@ -37435,6 +37207,73 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class SignatureInformationParameterInformation implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    SignatureInformationParameterInformation.canParse,
+    SignatureInformationParameterInformation.fromJson,
+  );
+
+  SignatureInformationParameterInformation({
+    this.labelOffsetSupport,
+  });
+  static SignatureInformationParameterInformation fromJson(
+      Map<String, Object?> json) {
+    final labelOffsetSupportJson = json['labelOffsetSupport'];
+    final labelOffsetSupport = labelOffsetSupportJson as bool?;
+    return SignatureInformationParameterInformation(
+      labelOffsetSupport: labelOffsetSupport,
+    );
+  }
+
+  /// The client supports processing label offsets instead of a simple label
+  /// string.
+  ///  @since 3.14.0
+  final bool? labelOffsetSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (labelOffsetSupport != null) {
+      __result['labelOffsetSupport'] = labelOffsetSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('labelOffsetSupport');
+      try {
+        final labelOffsetSupport = obj['labelOffsetSupport'];
+        if (labelOffsetSupport != null && !(labelOffsetSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type SignatureInformationParameterInformation');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is SignatureInformationParameterInformation &&
+        other.runtimeType == SignatureInformationParameterInformation) {
+      return labelOffsetSupport == other.labelOffsetSupport && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => labelOffsetSupport.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Static registration options to be returned in the initialize request.
 class StaticRegistrationOptions implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -43510,7 +43349,7 @@
         : null;
     final fileOperationsJson = json['fileOperations'];
     final fileOperations = fileOperationsJson != null
-        ? ClientCapabilitiesFileOperations.fromJson(
+        ? FileOperationClientCapabilities.fromJson(
             fileOperationsJson as Map<String, Object?>)
         : null;
     final inlayHintJson = json['inlayHint'];
@@ -43587,7 +43426,7 @@
 
   /// The client has support for file requests/notifications.
   ///  @since 3.16.0
-  final ClientCapabilitiesFileOperations? fileOperations;
+  final FileOperationClientCapabilities? fileOperations;
 
   /// Client workspace capabilities specific to inlay hints.
   ///  @since 3.17.0
@@ -43750,10 +43589,10 @@
       try {
         final fileOperations = obj['fileOperations'];
         if (fileOperations != null &&
-            !(ClientCapabilitiesFileOperations.canParse(
+            !(FileOperationClientCapabilities.canParse(
                 fileOperations, reporter))) {
           reporter
-              .reportError('must be of type ClientCapabilitiesFileOperations');
+              .reportError('must be of type FileOperationClientCapabilities');
           return false;
         }
       } finally {
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index 7147ebd..5b47d0a 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -283,7 +283,7 @@
         ),
         fileOperations: dynamicRegistrations.fileOperations
             ? null
-            : ServerCapabilitiesFileOperations(
+            : FileOperationOptions(
                 willRename: fileOperationRegistrationOptions,
               ),
       ),
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
index 41b97d1..f2046c1 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
@@ -39,7 +39,7 @@
       if (enumElement.isEnum) {
         enumName = enumElement.name;
         for (var field in enumElement.fields) {
-          if (!field.isSynthetic) {
+          if (field.isEnumConstant) {
             enumConstantNames.add(field.name);
           }
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart
index 5cf8e0f..17327b7 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_initializing_formal.dart
@@ -106,6 +106,9 @@
     var parameterElement = expression.staticElement;
     for (var parameter in constructor.parameters.parameters) {
       if (parameter.declaredElement == parameterElement) {
+        if (parameter is DefaultFormalParameter) {
+          parameter = parameter.parameter;
+        }
         return parameter is SimpleFormalParameter ? parameter : null;
       }
     }
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index eaa1e0a..a397b81 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -583,18 +583,51 @@
     // don't check regions, but there should be no exceptions
   }
 
-  Future<void> test_class_fieldFormalParameter() async {
+  Future<void> test_class_fieldFormalParameter_requiredNamed() async {
     addTestFile('''
-class AAA {
-  int fff = 123;
-  AAA(this.fff);
+class A {
+  final int f;
+  A({required this.f}) : assert(f > 0);
 }
 ''');
     await prepareNavigation();
-    assertHasRegionTarget('fff);', 'fff = 123');
+    assertHasRegionTarget('this.f', 'f;');
+    assertHasRegionTarget('f}) :', 'f;');
+    assertHasRegionTarget('f > 0', 'f}) :');
   }
 
-  Future<void> test_class_fieldFormalParameter_unresolved() async {
+  Future<void> test_class_fieldFormalParameter_requiredPositional() async {
+    addTestFile('''
+class A {
+  final int f;
+  A(this.f) : assert(f > 0);
+}
+''');
+    await prepareNavigation();
+    assertHasRegionTarget('this.f', 'f;');
+    assertHasRegionTarget('f) :', 'f;');
+    assertHasRegionTarget('f > 0', 'f) :');
+  }
+
+  Future<void>
+      test_class_fieldFormalParameter_requiredPositional_functionTyped() async {
+    addTestFile('''
+class B {
+  final Object f;
+  B(int this.f<T>(T a)) : assert(f is Object);
+}
+''');
+    await prepareNavigation();
+    assertHasRegionTarget('f<T>', 'f;');
+    assertHasRegion('int ');
+    assertHasRegionTarget('T>', 'T>');
+    assertHasRegionTarget('T a', 'T>');
+    assertHasRegionTarget('a))', 'a))');
+    assertHasRegionTarget('f is', 'f<T>');
+  }
+
+  Future<void>
+      test_class_fieldFormalParameter_requiredPositional_unresolved() async {
     addTestFile('''
 class AAA {
   AAA(this.fff);
@@ -1343,28 +1376,30 @@
   Future<void> test_superFormalParameter_requiredNamed() async {
     addTestFile('''
 class A {
-  A({required int a}); // 0
+  A({required int a});
 }
 class B extends A {
-  B({required super.a}); // 1
+  B({required super.a}) : assert(a > 0);
 }
 ''');
     await prepareNavigation();
-    assertHasRegionTarget('a}); // 1', 'a}); // 0');
+    assertHasRegionTarget('a}) :', 'a});');
+    assertHasRegionTarget('a > 0', 'a}) :');
   }
 
   Future<void> test_superFormalParameter_requiredPositional() async {
     addTestFile('''
 class A {
-  A(int a); // 0
+  A(int a);
 }
 class B extends A {
-  B(super.a); // 1
+  B(super.a) : assert(a > 0);
 }
 ''');
     await prepareNavigation();
-    assertHasRegionTarget('super.a', 'a); // 0');
-    assertHasRegionTarget('a); // 1', 'a); // 0');
+    assertHasRegionTarget('super.a', 'a);');
+    assertHasRegionTarget('a) :', 'a);');
+    assertHasRegionTarget('a > 0', 'a) :');
   }
 
   Future<void>
@@ -1374,7 +1409,7 @@
   A(Object a); // 0
 }
 class B extends A {
-  B(int super.a<T>(T b)); // 1
+  B(int super.a<T>(T b)) : assert(a is Object);
 }
 ''');
     await prepareNavigation();
@@ -1383,6 +1418,8 @@
     assertHasRegionTarget('T>', 'T>');
     assertHasRegionTarget('T b', 'T>');
     assertHasRegionTarget('b))', 'b))');
+    assertHasRegionTarget('b))', 'b))');
+    assertHasRegionTarget('a is', 'a<T>');
   }
 
   Future<void> test_superFormalParameter_requiredPositional_unresolved() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
index 2d950bd..8c6eaea 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
@@ -89,6 +89,43 @@
 ''');
   }
 
+  Future<void> test_final() async {
+    await resolveTestCode('''
+enum E {
+  a(0),
+  b(1);
+
+  final int f;
+  const E(this.f);
+}
+
+void f(E e) {
+  switch (e) {
+  }
+}
+''');
+    await assertHasFixWithFilter('''
+enum E {
+  a(0),
+  b(1);
+
+  final int f;
+  const E(this.f);
+}
+
+void f(E e) {
+  switch (e) {
+    case E.a:
+      // TODO: Handle this case.
+      break;
+    case E.b:
+      // TODO: Handle this case.
+      break;
+  }
+}
+''');
+  }
+
   Future<void> test_incomplete_switchStatement() async {
     await resolveTestCode(r'''
 enum E {a, b, c}
@@ -125,4 +162,74 @@
 }
 ''');
   }
+
+  Future<void> test_static() async {
+    await resolveTestCode('''
+enum E {
+  a,
+  b;
+
+  static int s = 1;
+}
+
+void f(E e) {
+  switch (e) {
+  }
+}
+''');
+    await assertHasFixWithFilter('''
+enum E {
+  a,
+  b;
+
+  static int s = 1;
+}
+
+void f(E e) {
+  switch (e) {
+    case E.a:
+      // TODO: Handle this case.
+      break;
+    case E.b:
+      // TODO: Handle this case.
+      break;
+  }
+}
+''');
+  }
+
+  Future<void> test_static_const() async {
+    await resolveTestCode('''
+enum E {
+  a,
+  b;
+
+  static const int s = 1;
+}
+
+void f(E e) {
+  switch (e) {
+  }
+}
+''');
+    await assertHasFixWithFilter('''
+enum E {
+  a,
+  b;
+
+  static const int s = 1;
+}
+
+void f(E e) {
+  switch (e) {
+    case E.a:
+      // TODO: Handle this case.
+      break;
+    case E.b:
+      // TODO: Handle this case.
+      break;
+  }
+}
+''');
+  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_initializing_formal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_initializing_formal_test.dart
index e082d34..d926b29 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_initializing_formal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_initializing_formal_test.dart
@@ -23,7 +23,7 @@
   @override
   String get lintCode => LintNames.prefer_initializing_formals;
 
-  Future<void> test_assignment_different_type() async {
+  Future<void> test_assignment_differentType() async {
     await resolveTestCode('''
 class C {
   Object a = '';
@@ -59,6 +59,23 @@
 ''');
   }
 
+  Future<void> test_assignment_named() async {
+    await resolveTestCode('''
+class C {
+  int? a;
+  C({int? a = 1}) {
+    this.a = a;
+  }
+}
+''');
+    await assertHasFix('''
+class C {
+  int? a;
+  C({this.a = 1});
+}
+''');
+  }
+
   Future<void> test_assignment_notEmptyAfterRemoval() async {
     await resolveTestCode('''
 class C {
@@ -79,7 +96,24 @@
 ''');
   }
 
-  Future<void> test_initializer_different_type() async {
+  Future<void> test_assignment_positional_differentType() async {
+    await resolveTestCode('''
+class C {
+  Object? a;
+  C([String? a]) {
+    this.a = a;
+  }
+}
+''');
+    await assertHasFix('''
+class C {
+  Object? a;
+  C([String? this.a]);
+}
+''');
+  }
+
+  Future<void> test_initializer_differentType() async {
     await resolveTestCode('''
 class C {
   final Object name;
@@ -109,6 +143,21 @@
 ''');
   }
 
+  Future<void> test_initializer_named_differentType() async {
+    await resolveTestCode('''
+class C {
+  Object? a;
+  C({String? a}) : a = a;
+}
+''');
+    await assertHasFix('''
+class C {
+  Object? a;
+  C({String? this.a});
+}
+''');
+  }
+
   Future<void> test_initializer_notEmptyAfterRemoval() async {
     await resolveTestCode('''
 class C {
@@ -125,4 +174,19 @@
 }
 ''');
   }
+
+  Future<void> test_initializer_positional() async {
+    await resolveTestCode('''
+class C {
+  int? a;
+  C([int? a = 1]): a = a;
+}
+''');
+    await assertHasFix('''
+class C {
+  int? a;
+  C([this.a = 1]);
+}
+''');
+  }
 }
diff --git a/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart b/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
index 4661b5c..f10b8ce 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
@@ -16,10 +16,10 @@
     });
 
     test('with list fields can be checked for equality', () {
-      final a = CodeActionClientCapabilitiesCodeActionKind(
+      final a = CodeActionLiteralSupportCodeActionKind(
         valueSet: [CodeActionKind.QuickFix],
       );
-      final b = CodeActionClientCapabilitiesCodeActionKind(
+      final b = CodeActionLiteralSupportCodeActionKind(
         valueSet: [CodeActionKind.QuickFix],
       );
 
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 13931a9..d01feea 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -73,7 +73,23 @@
     //   the migration to JSON meta_model.
     'ClientCapabilitiesWindow': 'WindowClientCapabilities',
     'ClientCapabilitiesWorkspace': 'WorkspaceClientCapabilities',
+    'ClientCapabilitiesFileOperations': 'FileOperationClientCapabilities',
+    'ServerCapabilitiesFileOperations': 'FileOperationOptions',
+    'ClientCapabilitiesGeneral': 'GeneralClientCapabilities',
+    'CompletionClientCapabilitiesInsertTextModeSupport':
+        'CompletionItemInsertTextModeSupport',
+    'CompletionClientCapabilitiesResolveSupport':
+        'CompletionItemResolveSupport',
+    'CompletionClientCapabilitiesTagSupport': 'CompletionItemTagSupport',
+    'CodeActionClientCapabilitiesCodeActionKind':
+        'CodeActionLiteralSupportCodeActionKind',
     'DocumentFilter': 'TextDocumentFilter',
+    'ClientCapabilitiesStaleRequestSupport':
+        'GeneralClientCapabilitiesStaleRequestSupport',
+    'SignatureHelpClientCapabilitiesParameterInformation':
+        'SignatureInformationParameterInformation',
+    'NotebookDocumentChangeEventStructure':
+        'NotebookDocumentChangeEventCellsStructure',
   };
 
   for (final type in types) {
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 86764dc..57b545b 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -386,7 +386,11 @@
   // of the LSP spec.
   if (input.trim() == r"export const EOL: string[] = ['\n', '\r\n', '\r'];" ||
       input.startsWith('textDocument.codeAction.resolveSupport =') ||
-      input.startsWith('textDocument.inlayHint.resolveSupport =')) {
+      input.startsWith('textDocument.inlayHint.resolveSupport =') ||
+      // These two are example definitions, the real definitions start "export"
+      // and contain some base classes.
+      input.startsWith('interface HoverParams {') ||
+      input.startsWith('interface HoverResult {')) {
     return false;
   }
 
diff --git a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
index fb1e6d3..55fd7f4 100644
--- a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
+++ b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
@@ -29,11 +29,13 @@
 fullTitle: Language Server Protocol Specification - 3.17
 index: 2
 redirect_from:
-  - /specification
-  - /specifications/specification-current
+  - specification
+  - specification/
+  - specifications/specification-current
+  - specifications/specification-current/
 ---
 
-This document describes the upcoming 3.17.x version of the language server protocol. An implementation for node of the 3.17.x version of the protocol can be found [here](https://github.com/Microsoft/vscode-languageserver-node).
+This document describes the 3.17.x version of the language server protocol. An implementation for node of the 3.17.x version of the protocol can be found [here](https://github.com/Microsoft/vscode-languageserver-node).
 
 **Note:** edits to this specification can be made via a pull request against this markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.17/specification.md).
 
@@ -194,7 +196,7 @@
 
 #### <a href="#responseMessage" name="responseMessage" class="anchor"> Response Message </a>
 
-A Response Message sent as a result of a request. If a request doesn't provide a result value the receiver of a request still needs to return a response message to conform to the JSON RPC specification. The result property of the ResponseMessage should be set to `null` in this case to signal a successful request.
+A Response Message sent as a result of a request. If a request doesn't provide a result value the receiver of a request still needs to return a response message to conform to the JSON-RPC specification. The result property of the ResponseMessage should be set to `null` in this case to signal a successful request.
 
 ```typescript
 interface ResponseMessage extends Message {
@@ -242,7 +244,7 @@
 
 ```typescript
 export namespace ErrorCodes {
-	// Defined by JSON RPC
+	// Defined by JSON-RPC
 	export const ParseError: integer = -32700;
 	export const InvalidRequest: integer = -32600;
 	export const MethodNotFound: integer = -32601;
@@ -250,7 +252,7 @@
 	export const InternalError: integer = -32603;
 
 	/**
-	 * This is the start range of JSON RPC reserved error codes.
+	 * This is the start range of JSON-RPC reserved error codes.
 	 * It doesn't denote a real error code. No LSP error codes should
 	 * be defined between the start and end range. For backwards
 	 * compatibility the `ServerNotInitialized` and the `UnknownErrorCode`
@@ -270,7 +272,7 @@
 	export const UnknownErrorCode: integer = -32001;
 
 	/**
-	 * This is the end range of JSON RPC reserved error codes.
+	 * This is the end range of JSON-RPC reserved error codes.
 	 * It doesn't denote a real error code.
 	 *
 	 * @since 3.16.0
@@ -372,7 +374,7 @@
 }
 ```
 
-A request that got canceled still needs to return from the server and send a response back. It can not be left open / hanging. This is in line with the JSON RPC protocol that requires that every request sends a response back. In addition it allows for returning partial results on cancel. If the request returns an error response on cancellation it is advised to set the error code to `ErrorCodes.RequestCancelled`.
+A request that got canceled still needs to return from the server and send a response back. It can not be left open / hanging. This is in line with the JSON-RPC protocol that requires that every request sends a response back. In addition it allows for returning partial results on cancel. If the request returns an error response on cancellation it is advised to set the error code to `ErrorCodes.RequestCancelled`.
 
 #### <a href="#progress" name="progress" class="anchor"> Progress Support (:arrow_right: :arrow_left:)</a>
 
@@ -2884,7 +2886,7 @@
 
 Since most of the registration options require to specify a document selector there is a base interface that can be used. See `TextDocumentRegistrationOptions`.
 
-An example JSON RPC message to register dynamically for the `textDocument/willSaveWaitUntil` feature on the client side is as follows (only details shown):
+An example JSON-RPC message to register dynamically for the `textDocument/willSaveWaitUntil` feature on the client side is as follows (only details shown):
 
 ```json
 {
@@ -2985,7 +2987,7 @@
 }
 ```
 
-An example JSON RPC message to unregister the above registered `textDocument/willSaveWaitUntil` feature looks like this:
+An example JSON-RPC message to unregister the above registered `textDocument/willSaveWaitUntil` feature looks like this:
 
 ```json
 {
@@ -6902,6 +6904,11 @@
  */
 export interface InlineValueContext {
 	/**
+	 * The stack frame (as a DAP Id) where the execution has stopped.
+	 */
+	frameId: integer;
+
+	/**
 	 * The document range where execution has stopped.
 	 * Typically the end position of the range denotes the line where the
 	 * inline values are shown.
diff --git a/pkg/analysis_server/tool/lsp_spec/markdown.dart b/pkg/analysis_server/tool/lsp_spec/markdown.dart
index 530ee49..2a245f0 100644
--- a/pkg/analysis_server/tool/lsp_spec/markdown.dart
+++ b/pkg/analysis_server/tool/lsp_spec/markdown.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 final _methodNamesPattern =
-    RegExp(r'''\* method: ['`](.*?)[`'],?\r?\n''', multiLine: true);
+    RegExp(r'''\* method: ['`](.*?)[`'][,.]?\r?\n''', multiLine: true);
 final _typeScriptBlockPattern =
     RegExp(r'\B```typescript([\S\s]*?)\n\s*```', multiLine: true);
 
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript.dart b/pkg/analysis_server/tool/lsp_spec/typescript.dart
index 44e6f02..0027724 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript.dart
@@ -149,6 +149,9 @@
   // have to handle any cases where both a namespace and interfaces are declared
   // with the same name.
   return node.name != 'InitializeError' &&
+      // We don't use `InitializeErrorCodes` as it contains only one error code
+      // that has been deprecated and we've never used.
+      node.name != 'InitializeErrorCodes' &&
       // We don't emit MarkedString because it gets mapped to a simple String
       // when getting the .dartType for it.
       // .startsWith() because there are inline types that will be generated.
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 7e6d842..c28b106 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -190,7 +190,8 @@
     enableString: EnableString.inference_update_1,
     isEnabledByDefault: IsEnabledByDefault.inference_update_1,
     isExpired: IsExpired.inference_update_1,
-    documentation: 'Enhanced type inference',
+    documentation:
+        'Horizontal type inference for function expressions passed to generic invocations.',
     experimentalReleaseVersion: null,
     releaseVersion: null,
   );
diff --git a/pkg/analyzer/lib/src/error/use_result_verifier.dart b/pkg/analyzer/lib/src/error/use_result_verifier.dart
index 3a0fd4f..0fec4a1 100644
--- a/pkg/analyzer/lib/src/error/use_result_verifier.dart
+++ b/pkg/analyzer/lib/src/error/use_result_verifier.dart
@@ -223,6 +223,7 @@
         parent is ListLiteral ||
         parent is MapLiteralEntry ||
         parent is MethodInvocation ||
+        parent is NamedExpression ||
         parent is PropertyAccess ||
         parent is ReturnStatement ||
         parent is SetOrMapLiteral ||
diff --git a/pkg/analyzer/test/src/diagnostics/unused_result_test.dart b/pkg/analyzer/test/src/diagnostics/unused_result_test.dart
index df5b5d2..f45f182 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_result_test.dart
@@ -1117,6 +1117,23 @@
 ''');
   }
 
+  test_namedExpression() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+class A {
+  @useResult
+  int m() => 1;
+}
+
+void g({int? i}) {}
+
+void f() {
+  g(i: A().m());
+}
+''');
+  }
+
   test_topLevelFunction_result_assigned() async {
     await assertNoErrorsInCode(r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index 56ec6a3..38053a2 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -71,9 +71,6 @@
 
   void _addRegion(int offset, int length, Element? element) {
     element = element?.nonSynthetic;
-    if (element is FieldFormalParameterElement) {
-      element = element.field;
-    }
     if (element == null || element == DynamicElementImpl.instance) {
       return;
     }
@@ -346,6 +343,19 @@
   }
 
   @override
+  void visitFieldFormalParameter(FieldFormalParameter node) {
+    final element = node.declaredElement;
+    if (element is FieldFormalParameterElementImpl) {
+      computer._addRegionForToken(node.thisKeyword, element.field);
+      computer._addRegionForNode(node.identifier, element.field);
+    }
+
+    node.type?.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+  }
+
+  @override
   void visitImportDirective(ImportDirective node) {
     var importElement = node.element;
     if (importElement != null) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index e737994..bce15d9 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -272,10 +272,10 @@
                                  ->object_store()
                                  ->build_nongeneric_method_extractor_code());
 
-  const intptr_t stub_index = __ object_pool_builder().AddObject(
-      build_method_extractor, ObjectPool::Patchability::kNotPatchable);
-  const intptr_t function_index = __ object_pool_builder().AddObject(
-      extracted_method, ObjectPool::Patchability::kNotPatchable);
+  const intptr_t stub_index =
+      __ object_pool_builder().FindObject(build_method_extractor);
+  const intptr_t function_index =
+      __ object_pool_builder().FindObject(extracted_method);
 
   // We use a custom pool register to preserve caller PP.
   Register kPoolReg = R0;
@@ -728,11 +728,15 @@
     __ Push(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      // No breakpoints in optimized code.
+      __ BranchLink(StubCode::OptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kOther, deopt_id, source);
     } else {
+      // Patchable to support breakpoints.
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id,
+                           source);
     }
-    AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id, source);
     // Stub returns result in flags (result of a cmp, we need Z computed).
     __ Drop(1);   // Discard constant.
     __ Pop(reg);  // Restore 'reg'.
@@ -752,7 +756,7 @@
     __ Push(left);
     __ Push(right);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      __ BranchLink(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index d7a6ff6..7f86e88 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -263,10 +263,10 @@
                                  ->object_store()
                                  ->build_nongeneric_method_extractor_code());
 
-  const intptr_t stub_index = __ object_pool_builder().AddObject(
-      build_method_extractor, ObjectPool::Patchability::kNotPatchable);
-  const intptr_t function_index = __ object_pool_builder().AddObject(
-      extracted_method, ObjectPool::Patchability::kNotPatchable);
+  const intptr_t stub_index =
+      __ object_pool_builder().FindObject(build_method_extractor);
+  const intptr_t function_index =
+      __ object_pool_builder().FindObject(extracted_method);
 
   // We use a custom pool register to preserve caller PP.
   Register kPoolReg = R0;
@@ -717,11 +717,15 @@
     __ LoadObject(TMP, obj);
     __ PushPair(TMP, reg);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      // No breakpoints in optimized code.
+      __ BranchLink(StubCode::OptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kOther, deopt_id, source);
     } else {
+      // Patchable to support breakpoints.
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id,
+                           source);
     }
-    AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id, source);
     // Stub returns result in flags (result of a cmp, we need Z computed).
     // Discard constant.
     // Restore 'reg'.
@@ -741,7 +745,7 @@
   if (needs_number_check) {
     __ PushPair(right, left);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      __ BranchLink(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
       __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc b/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc
index 6e0172d..7a3215d 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc
@@ -252,10 +252,10 @@
                                  ->object_store()
                                  ->build_nongeneric_method_extractor_code());
 
-  const intptr_t stub_index = __ object_pool_builder().AddObject(
-      build_method_extractor, ObjectPool::Patchability::kNotPatchable);
-  const intptr_t function_index = __ object_pool_builder().AddObject(
-      extracted_method, ObjectPool::Patchability::kNotPatchable);
+  const intptr_t stub_index =
+      __ object_pool_builder().FindObject(build_method_extractor);
+  const intptr_t function_index =
+      __ object_pool_builder().FindObject(extracted_method);
 
   // We use a custom pool register to preserve caller PP.
   Register kPoolReg = A1;
@@ -693,11 +693,15 @@
     __ LoadObject(TMP, obj);
     __ PushRegisterPair(TMP, reg);
     if (is_optimizing()) {
-      __ JumpAndLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      // No breakpoints in optimized code.
+      __ JumpAndLink(StubCode::OptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kOther, deopt_id, source);
     } else {
+      // Patchable to support breakpoints.
       __ JumpAndLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id,
+                           source);
     }
-    AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id, source);
     __ PopRegisterPair(ZR, reg);
     // RISC-V has no condition flags, so the result is instead returned as
     // TMP zero if equal, non-zero if non-equal.
@@ -718,7 +722,7 @@
   if (needs_number_check) {
     __ PushRegisterPair(right, left);
     if (is_optimizing()) {
-      __ JumpAndLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      __ JumpAndLink(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
       __ JumpAndLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index fe8bf0d..1c87031 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -268,10 +268,10 @@
                                  ->build_nongeneric_method_extractor_code());
   ASSERT(!build_method_extractor.IsNull());
 
-  const intptr_t stub_index = __ object_pool_builder().AddObject(
-      build_method_extractor, compiler::ObjectPoolBuilderEntry::kNotPatchable);
-  const intptr_t function_index = __ object_pool_builder().AddObject(
-      extracted_method, compiler::ObjectPoolBuilderEntry::kNotPatchable);
+  const intptr_t stub_index =
+      __ object_pool_builder().FindObject(build_method_extractor);
+  const intptr_t function_index =
+      __ object_pool_builder().FindObject(extracted_method);
 
   // We use a custom pool register to preserve caller PP.
   Register kPoolReg = RAX;
@@ -705,11 +705,15 @@
     __ pushq(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
-      __ CallPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      // No breakpoints in optimized code.
+      __ Call(StubCode::OptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kOther, deopt_id, source);
     } else {
+      // Patchable to support breakpoints.
       __ CallPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
+      AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id,
+                           source);
     }
-    AddCurrentDescriptor(UntaggedPcDescriptors::kRuntimeCall, deopt_id, source);
     // Stub returns result in flags (result of a cmpq, we need ZF computed).
     __ popq(reg);  // Discard constant.
     __ popq(reg);  // Restore 'reg'.
@@ -729,7 +733,7 @@
     __ pushq(left);
     __ pushq(right);
     if (is_optimizing()) {
-      __ CallPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
+      __ Call(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
       __ CallPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index a7a7eda..ff3d890 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -43,7 +43,7 @@
 /// Can be used internally in platform library implementations of
 /// data structures, where a value is known to have a type different
 /// from its static type (like knowing that a string is definitely
-/// a "_OneByteString" or that the value stored into a heterogenous
+/// a "_OneByteString" or that the value stored into a heterogeneous
 /// list is really a value of the surrounding map).
 ///
 /// Must only be used for casts which would definitely *succeed*
@@ -53,7 +53,7 @@
 external T unsafeCast<T>(dynamic value);
 
 // Powers of 10 up to 10^22 are representable as doubles.
-// Powers of 10 above that are only approximate due to lack of precission.
+// Powers of 10 above that are only approximate due to lack of precision.
 // Used by double-parsing.
 const POWERS_OF_TEN = const [
   1.0, // 0
@@ -136,7 +136,7 @@
   return digit1 * 16 + digit2 - (digit2 & 256);
 }
 
-/// A resusable `null`-valued future used by `dart:async`.
+/// A reusable `null`-valued future used by `dart:async`.
 ///
 /// **DO NOT USE.**
 ///
@@ -723,7 +723,7 @@
 /// If applied to a class method, or parameter of such,
 /// any method implementing that interface method is also annotated.
 /// If multiple `Since` annotations apply to the same declaration or
-/// parameter, the latest version takes precendence.
+/// parameter, the latest version takes precedence.
 ///
 /// Any use of a marked API may trigger a warning if the using code
 /// does not require an SDK version guaranteeing that the API is available,
diff --git a/tools/VERSION b/tools/VERSION
index 8b0a251..8f16444 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 119
+PRERELEASE 120
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index fbaa9d7..c1b6308 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -126,7 +126,7 @@
     help: "Static meta-programming"
 
   inference-update-1:
-    help: "Enhanced type inference"
+    help: "Horizontal type inference for function expressions passed to generic invocations."
 
 # Experiment flag only used for testing.
   test-experiment:
