diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 8cfc497..0eb4484 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -22,7 +22,7 @@
 const jsonEncoder = JsonEncoder.withIndent('    ');
 
 /// A special text edit with an additional change annotation.
-///  @since 3.16.0
+///  @since 3.16.0.
 class AnnotatedTextEdit implements TextEdit, ToJsonable {
   static const jsonHandler = LspJsonHandler(
     AnnotatedTextEdit.canParse,
@@ -244,25 +244,25 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class ApplyWorkspaceEditResponse implements ToJsonable {
+class ApplyWorkspaceEditResult implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
-    ApplyWorkspaceEditResponse.canParse,
-    ApplyWorkspaceEditResponse.fromJson,
+    ApplyWorkspaceEditResult.canParse,
+    ApplyWorkspaceEditResult.fromJson,
   );
 
-  ApplyWorkspaceEditResponse({
+  ApplyWorkspaceEditResult({
     required this.applied,
     this.failureReason,
     this.failedChange,
   });
-  static ApplyWorkspaceEditResponse fromJson(Map<String, Object?> json) {
+  static ApplyWorkspaceEditResult fromJson(Map<String, Object?> json) {
     final appliedJson = json['applied'];
     final applied = appliedJson as bool;
     final failureReasonJson = json['failureReason'];
     final failureReason = failureReasonJson as String?;
     final failedChangeJson = json['failedChange'];
     final failedChange = failedChangeJson as int?;
-    return ApplyWorkspaceEditResponse(
+    return ApplyWorkspaceEditResult(
       applied: applied,
       failureReason: failureReason,
       failedChange: failedChange,
@@ -337,15 +337,15 @@
       }
       return true;
     } else {
-      reporter.reportError('must be of type ApplyWorkspaceEditResponse');
+      reporter.reportError('must be of type ApplyWorkspaceEditResult');
       return false;
     }
   }
 
   @override
   bool operator ==(Object other) {
-    if (other is ApplyWorkspaceEditResponse &&
-        other.runtimeType == ApplyWorkspaceEditResponse) {
+    if (other is ApplyWorkspaceEditResult &&
+        other.runtimeType == ApplyWorkspaceEditResult) {
       return applied == other.applied &&
           failureReason == other.failureReason &&
           failedChange == other.failedChange &&
@@ -1671,6 +1671,7 @@
   ClientCapabilities({
     this.workspace,
     this.textDocument,
+    this.notebookDocument,
     this.window,
     this.general,
     this.experimental,
@@ -1686,6 +1687,11 @@
         ? TextDocumentClientCapabilities.fromJson(
             textDocumentJson as Map<String, Object?>)
         : null;
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = notebookDocumentJson != null
+        ? NotebookDocumentClientCapabilities.fromJson(
+            notebookDocumentJson as Map<String, Object?>)
+        : null;
     final windowJson = json['window'];
     final window = windowJson != null
         ? ClientCapabilitiesWindow.fromJson(windowJson as Map<String, Object?>)
@@ -1700,6 +1706,7 @@
     return ClientCapabilities(
       workspace: workspace,
       textDocument: textDocument,
+      notebookDocument: notebookDocument,
       window: window,
       general: general,
       experimental: experimental,
@@ -1713,6 +1720,10 @@
   ///  @since 3.16.0
   final ClientCapabilitiesGeneral? general;
 
+  /// Capabilities specific to the notebook document support.
+  ///  @since 3.17.0
+  final NotebookDocumentClientCapabilities? notebookDocument;
+
   /// Text document specific client capabilities.
   final TextDocumentClientCapabilities? textDocument;
 
@@ -1730,6 +1741,9 @@
     if (textDocument != null) {
       __result['textDocument'] = textDocument?.toJson();
     }
+    if (notebookDocument != null) {
+      __result['notebookDocument'] = notebookDocument?.toJson();
+    }
     if (window != null) {
       __result['window'] = window?.toJson();
     }
@@ -1768,6 +1782,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('notebookDocument');
+      try {
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument != null &&
+            !(NotebookDocumentClientCapabilities.canParse(
+                notebookDocument, reporter))) {
+          reporter.reportError(
+              'must be of type NotebookDocumentClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('window');
       try {
         final window = obj['window'];
@@ -1803,6 +1830,7 @@
         other.runtimeType == ClientCapabilities) {
       return workspace == other.workspace &&
           textDocument == other.textDocument &&
+          notebookDocument == other.notebookDocument &&
           window == other.window &&
           general == other.general &&
           experimental == other.experimental &&
@@ -1815,6 +1843,7 @@
   int get hashCode => Object.hash(
         workspace,
         textDocument,
+        notebookDocument,
         window,
         general,
         experimental,
@@ -2030,10 +2059,17 @@
   );
 
   ClientCapabilitiesGeneral({
+    this.staleRequestSupport,
     this.regularExpressions,
     this.markdown,
+    this.positionEncodings,
   });
   static ClientCapabilitiesGeneral fromJson(Map<String, Object?> json) {
+    final staleRequestSupportJson = json['staleRequestSupport'];
+    final staleRequestSupport = staleRequestSupportJson != null
+        ? ClientCapabilitiesStaleRequestSupport.fromJson(
+            staleRequestSupportJson as Map<String, Object?>)
+        : null;
     final regularExpressionsJson = json['regularExpressions'];
     final regularExpressions = regularExpressionsJson != null
         ? RegularExpressionsClientCapabilities.fromJson(
@@ -2044,9 +2080,15 @@
         ? 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();
     return ClientCapabilitiesGeneral(
+      staleRequestSupport: staleRequestSupport,
       regularExpressions: regularExpressions,
       markdown: markdown,
+      positionEncodings: positionEncodings,
     );
   }
 
@@ -2054,23 +2096,66 @@
   ///  @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 (staleRequestSupport != null) {
+      __result['staleRequestSupport'] = staleRequestSupport?.toJson();
+    }
     if (regularExpressions != null) {
       __result['regularExpressions'] = regularExpressions?.toJson();
     }
     if (markdown != null) {
       __result['markdown'] = markdown?.toJson();
     }
+    if (positionEncodings != null) {
+      __result['positionEncodings'] =
+          positionEncodings?.map((item) => item.toJson()).toList();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      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();
+      }
       reporter.push('regularExpressions');
       try {
         final regularExpressions = obj['regularExpressions'];
@@ -2095,6 +2180,19 @@
       } 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();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ClientCapabilitiesGeneral');
@@ -2106,8 +2204,11 @@
   bool operator ==(Object other) {
     if (other is ClientCapabilitiesGeneral &&
         other.runtimeType == ClientCapabilitiesGeneral) {
-      return regularExpressions == other.regularExpressions &&
+      return staleRequestSupport == other.staleRequestSupport &&
+          regularExpressions == other.regularExpressions &&
           markdown == other.markdown &&
+          listEqual(positionEncodings, other.positionEncodings,
+              (PositionEncodingKind a, PositionEncodingKind b) => a == b) &&
           true;
     }
     return false;
@@ -2115,8 +2216,117 @@
 
   @override
   int get hashCode => Object.hash(
+        staleRequestSupport,
         regularExpressions,
         markdown,
+        lspHashCode(positionEncodings),
+      );
+
+  @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
@@ -2162,9 +2372,12 @@
   ///  @since 3.16.0
   final ShowMessageRequestClientCapabilities? showMessage;
 
-  /// Whether client supports handling progress notifications. If set servers
-  /// are allowed to report in `workDoneProgress` property in the request
-  /// specific server capabilities.
+  /// It indicates whether the client supports server initiated progress using
+  /// the `window/workDoneProgress/create` request.
+  ///
+  /// The capability also controls Whether client supports handling of progress
+  /// notifications. If set servers are allowed to report a `workDoneProgress`
+  /// property in the request specific server capabilities.
   ///  @since 3.15.0
   final bool? workDoneProgress;
 
@@ -2268,6 +2481,9 @@
     this.semanticTokens,
     this.codeLens,
     this.fileOperations,
+    this.inlineValue,
+    this.inlayHint,
+    this.diagnostics,
   });
   static ClientCapabilitiesWorkspace fromJson(Map<String, Object?> json) {
     final applyEditJson = json['applyEdit'];
@@ -2316,6 +2532,21 @@
         ? ClientCapabilitiesFileOperations.fromJson(
             fileOperationsJson as Map<String, Object?>)
         : null;
+    final inlineValueJson = json['inlineValue'];
+    final inlineValue = inlineValueJson != null
+        ? InlineValueWorkspaceClientCapabilities.fromJson(
+            inlineValueJson as Map<String, Object?>)
+        : null;
+    final inlayHintJson = json['inlayHint'];
+    final inlayHint = inlayHintJson != null
+        ? InlayHintWorkspaceClientCapabilities.fromJson(
+            inlayHintJson as Map<String, Object?>)
+        : null;
+    final diagnosticsJson = json['diagnostics'];
+    final diagnostics = diagnosticsJson != null
+        ? DiagnosticWorkspaceClientCapabilities.fromJson(
+            diagnosticsJson as Map<String, Object?>)
+        : null;
     return ClientCapabilitiesWorkspace(
       applyEdit: applyEdit,
       workspaceEdit: workspaceEdit,
@@ -2328,6 +2559,9 @@
       semanticTokens: semanticTokens,
       codeLens: codeLens,
       fileOperations: fileOperations,
+      inlineValue: inlineValue,
+      inlayHint: inlayHint,
+      diagnostics: diagnostics,
     );
   }
 
@@ -2343,6 +2577,10 @@
   ///  @since 3.6.0
   final bool? configuration;
 
+  /// Client workspace capabilities specific to diagnostics.
+  ///  @since 3.17.0.
+  final DiagnosticWorkspaceClientCapabilities? diagnostics;
+
   /// Capabilities specific to the `workspace/didChangeConfiguration`
   /// notification.
   final DidChangeConfigurationClientCapabilities? didChangeConfiguration;
@@ -2358,6 +2596,14 @@
   ///  @since 3.16.0
   final ClientCapabilitiesFileOperations? fileOperations;
 
+  /// Client workspace capabilities specific to inlay hints.
+  ///  @since 3.17.0
+  final InlayHintWorkspaceClientCapabilities? inlayHint;
+
+  /// Client workspace capabilities specific to inline values.
+  ///  @since 3.17.0
+  final InlineValueWorkspaceClientCapabilities? inlineValue;
+
   /// Capabilities specific to the semantic token requests scoped to the
   /// workspace.
   ///  @since 3.16.0
@@ -2408,6 +2654,15 @@
     if (fileOperations != null) {
       __result['fileOperations'] = fileOperations?.toJson();
     }
+    if (inlineValue != null) {
+      __result['inlineValue'] = inlineValue?.toJson();
+    }
+    if (inlayHint != null) {
+      __result['inlayHint'] = inlayHint?.toJson();
+    }
+    if (diagnostics != null) {
+      __result['diagnostics'] = diagnostics?.toJson();
+    }
     return __result;
   }
 
@@ -2546,6 +2801,45 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('inlineValue');
+      try {
+        final inlineValue = obj['inlineValue'];
+        if (inlineValue != null &&
+            !(InlineValueWorkspaceClientCapabilities.canParse(
+                inlineValue, reporter))) {
+          reporter.reportError(
+              'must be of type InlineValueWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlayHint');
+      try {
+        final inlayHint = obj['inlayHint'];
+        if (inlayHint != null &&
+            !(InlayHintWorkspaceClientCapabilities.canParse(
+                inlayHint, reporter))) {
+          reporter.reportError(
+              'must be of type InlayHintWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('diagnostics');
+      try {
+        final diagnostics = obj['diagnostics'];
+        if (diagnostics != null &&
+            !(DiagnosticWorkspaceClientCapabilities.canParse(
+                diagnostics, reporter))) {
+          reporter.reportError(
+              'must be of type DiagnosticWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ClientCapabilitiesWorkspace');
@@ -2568,6 +2862,9 @@
           semanticTokens == other.semanticTokens &&
           codeLens == other.codeLens &&
           fileOperations == other.fileOperations &&
+          inlineValue == other.inlineValue &&
+          inlayHint == other.inlayHint &&
+          diagnostics == other.diagnostics &&
           true;
     }
     return false;
@@ -2586,6 +2883,9 @@
         semanticTokens,
         codeLens,
         fileOperations,
+        inlineValue,
+        inlayHint,
+        diagnostics,
       );
 
   @override
@@ -3319,6 +3619,7 @@
   CodeActionContext({
     required this.diagnostics,
     this.only,
+    this.triggerKind,
   });
   static CodeActionContext fromJson(Map<String, Object?> json) {
     final diagnosticsJson = json['diagnostics'];
@@ -3329,9 +3630,14 @@
     final only = (onlyJson as List<Object?>?)
         ?.map((item) => CodeActionKind.fromJson(item as String))
         .toList();
+    final triggerKindJson = json['triggerKind'];
+    final triggerKind = triggerKindJson != null
+        ? CodeActionTriggerKind.fromJson(triggerKindJson as int)
+        : null;
     return CodeActionContext(
       diagnostics: diagnostics,
       only: only,
+      triggerKind: triggerKind,
     );
   }
 
@@ -3349,12 +3655,19 @@
   /// shown. So servers can omit computing them.
   final List<CodeActionKind>? only;
 
+  /// The reason why code actions were requested.
+  ///  @since 3.17.0
+  final CodeActionTriggerKind? triggerKind;
+
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['diagnostics'] = diagnostics.map((item) => item.toJson()).toList();
     if (only != null) {
       __result['only'] = only?.map((item) => item.toJson()).toList();
     }
+    if (triggerKind != null) {
+      __result['triggerKind'] = triggerKind?.toJson();
+    }
     return __result;
   }
 
@@ -3393,6 +3706,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('triggerKind');
+      try {
+        final triggerKind = obj['triggerKind'];
+        if (triggerKind != null &&
+            !(CodeActionTriggerKind.canParse(triggerKind, reporter))) {
+          reporter.reportError('must be of type CodeActionTriggerKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CodeActionContext');
@@ -3407,6 +3731,7 @@
               (Diagnostic a, Diagnostic b) => a == b) &&
           listEqual(only, other.only,
               (CodeActionKind a, CodeActionKind b) => a == b) &&
+          triggerKind == other.triggerKind &&
           true;
     }
     return false;
@@ -3416,6 +3741,7 @@
   int get hashCode => Object.hash(
         lspHashCode(diagnostics),
         lspHashCode(only),
+        triggerKind,
       );
 
   @override
@@ -3554,6 +3880,13 @@
   /// Base kind for an organize imports source action: `source.organizeImports`.
   static const SourceOrganizeImports = CodeActionKind('source.organizeImports');
 
+  /// Base kind for a 'fix all' source action: `source.fixAll`.
+  ///  'Fix all' actions automatically fix errors that have a clear fix that do
+  /// not require user input. They should not suppress errors or perform unsafe
+  /// fixes such as generating new types or classes.
+  ///  @since 3.17.0
+  static const SourceFixAll = CodeActionKind('source.fixAll');
+
   Object toJson() => _value;
 
   @override
@@ -4029,6 +4362,39 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// The reason why code actions were requested.
+///  @since 3.17.0
+class CodeActionTriggerKind {
+  const CodeActionTriggerKind(this._value);
+  const CodeActionTriggerKind.fromJson(this._value);
+
+  final int _value;
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    return obj is int;
+  }
+
+  /// Code actions were explicitly requested by the user or by an extension.
+  static const Invoked = CodeActionTriggerKind(1);
+
+  /// Code actions were requested automatically.
+  ///
+  /// This typically happens when current selection in a file changes, but can
+  /// also be triggered when file content changes.
+  static const Automatic = CodeActionTriggerKind(2);
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  int get hashCode => _value.hashCode;
+
+  bool operator ==(Object o) =>
+      o is CodeActionTriggerKind && o._value == _value;
+}
+
 /// Structure to capture a description for an error code.
 ///  @since 3.16.0
 class CodeDescription implements ToJsonable {
@@ -5394,6 +5760,8 @@
     this.completionItem,
     this.completionItemKind,
     this.contextSupport,
+    this.insertTextMode,
+    this.completionList,
   });
   static CompletionClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
@@ -5410,11 +5778,22 @@
         : null;
     final contextSupportJson = json['contextSupport'];
     final contextSupport = contextSupportJson as bool?;
+    final insertTextModeJson = json['insertTextMode'];
+    final insertTextMode = insertTextModeJson != null
+        ? InsertTextMode.fromJson(insertTextModeJson as int)
+        : null;
+    final completionListJson = json['completionList'];
+    final completionList = completionListJson != null
+        ? CompletionClientCapabilitiesCompletionList.fromJson(
+            completionListJson as Map<String, Object?>)
+        : null;
     return CompletionClientCapabilities(
       dynamicRegistration: dynamicRegistration,
       completionItem: completionItem,
       completionItemKind: completionItemKind,
       contextSupport: contextSupport,
+      insertTextMode: insertTextMode,
+      completionList: completionList,
     );
   }
 
@@ -5422,6 +5801,10 @@
   final CompletionClientCapabilitiesCompletionItem? completionItem;
   final CompletionClientCapabilitiesCompletionItemKind? completionItemKind;
 
+  /// The client supports the following `CompletionList` specific capabilities.
+  ///  @since 3.17.0
+  final CompletionClientCapabilitiesCompletionList? completionList;
+
   /// The client supports to send additional context information for a
   /// `textDocument/completion` request.
   final bool? contextSupport;
@@ -5429,6 +5812,11 @@
   /// Whether completion supports dynamic registration.
   final bool? dynamicRegistration;
 
+  /// The client's default when the completion item doesn't provide a
+  /// `insertTextMode` property.
+  ///  @since 3.17.0
+  final InsertTextMode? insertTextMode;
+
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     if (dynamicRegistration != null) {
@@ -5443,6 +5831,12 @@
     if (contextSupport != null) {
       __result['contextSupport'] = contextSupport;
     }
+    if (insertTextMode != null) {
+      __result['insertTextMode'] = insertTextMode?.toJson();
+    }
+    if (completionList != null) {
+      __result['completionList'] = completionList?.toJson();
+    }
     return __result;
   }
 
@@ -5494,6 +5888,30 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('insertTextMode');
+      try {
+        final insertTextMode = obj['insertTextMode'];
+        if (insertTextMode != null &&
+            !(InsertTextMode.canParse(insertTextMode, reporter))) {
+          reporter.reportError('must be of type InsertTextMode');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('completionList');
+      try {
+        final completionList = obj['completionList'];
+        if (completionList != null &&
+            !(CompletionClientCapabilitiesCompletionList.canParse(
+                completionList, reporter))) {
+          reporter.reportError(
+              'must be of type CompletionClientCapabilitiesCompletionList');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CompletionClientCapabilities');
@@ -5509,6 +5927,8 @@
           completionItem == other.completionItem &&
           completionItemKind == other.completionItemKind &&
           contextSupport == other.contextSupport &&
+          insertTextMode == other.insertTextMode &&
+          completionList == other.completionList &&
           true;
     }
     return false;
@@ -5520,6 +5940,8 @@
         completionItem,
         completionItemKind,
         contextSupport,
+        insertTextMode,
+        completionList,
       );
 
   @override
@@ -5542,6 +5964,7 @@
     this.insertReplaceSupport,
     this.resolveSupport,
     this.insertTextModeSupport,
+    this.labelDetailsSupport,
   });
   static CompletionClientCapabilitiesCompletionItem fromJson(
       Map<String, Object?> json) {
@@ -5574,6 +5997,8 @@
         ? CompletionClientCapabilitiesInsertTextModeSupport.fromJson(
             insertTextModeSupportJson as Map<String, Object?>)
         : null;
+    final labelDetailsSupportJson = json['labelDetailsSupport'];
+    final labelDetailsSupport = labelDetailsSupportJson as bool?;
     return CompletionClientCapabilitiesCompletionItem(
       snippetSupport: snippetSupport,
       commitCharactersSupport: commitCharactersSupport,
@@ -5584,6 +6009,7 @@
       insertReplaceSupport: insertReplaceSupport,
       resolveSupport: resolveSupport,
       insertTextModeSupport: insertTextModeSupport,
+      labelDetailsSupport: labelDetailsSupport,
     );
   }
 
@@ -5593,8 +6019,8 @@
   /// Client supports the deprecated property on a completion item.
   final bool? deprecatedSupport;
 
-  /// Client supports the following content formats for the documentation
-  /// property. The order describes the preferred format of the client.
+  /// Client supports the follow content formats for the documentation property.
+  /// The order describes the preferred format of the client.
   final List<MarkupKind>? documentationFormat;
 
   /// Client supports insert replace edit to control different behavior if a
@@ -5603,11 +6029,17 @@
   final bool? insertReplaceSupport;
 
   /// The client supports the `insertTextMode` property on a completion item to
-  /// override the whitespace handling mode as defined by the client.
+  /// override the whitespace handling mode as defined by the client (see
+  /// `insertTextMode`).
   ///  @since 3.16.0
   final CompletionClientCapabilitiesInsertTextModeSupport?
       insertTextModeSupport;
 
+  /// The client has support for completion item label details (see also
+  /// `CompletionItemLabelDetails`).
+  ///  @since 3.17.0
+  final bool? labelDetailsSupport;
+
   /// Client supports the preselect property on a completion item.
   final bool? preselectSupport;
 
@@ -5662,6 +6094,9 @@
     if (insertTextModeSupport != null) {
       __result['insertTextModeSupport'] = insertTextModeSupport?.toJson();
     }
+    if (labelDetailsSupport != null) {
+      __result['labelDetailsSupport'] = labelDetailsSupport;
+    }
     return __result;
   }
 
@@ -5770,6 +6205,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('labelDetailsSupport');
+      try {
+        final labelDetailsSupport = obj['labelDetailsSupport'];
+        if (labelDetailsSupport != null && !(labelDetailsSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -5792,6 +6237,7 @@
           insertReplaceSupport == other.insertReplaceSupport &&
           resolveSupport == other.resolveSupport &&
           insertTextModeSupport == other.insertTextModeSupport &&
+          labelDetailsSupport == other.labelDetailsSupport &&
           true;
     }
     return false;
@@ -5808,6 +6254,7 @@
         insertReplaceSupport,
         resolveSupport,
         insertTextModeSupport,
+        labelDetailsSupport,
       );
 
   @override
@@ -5892,6 +6339,82 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CompletionClientCapabilitiesCompletionList implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionClientCapabilitiesCompletionList.canParse,
+    CompletionClientCapabilitiesCompletionList.fromJson,
+  );
+
+  CompletionClientCapabilitiesCompletionList({
+    this.itemDefaults,
+  });
+  static CompletionClientCapabilitiesCompletionList fromJson(
+      Map<String, Object?> json) {
+    final itemDefaultsJson = json['itemDefaults'];
+    final itemDefaults = (itemDefaultsJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
+    return CompletionClientCapabilitiesCompletionList(
+      itemDefaults: itemDefaults,
+    );
+  }
+
+  /// The client supports the the following itemDefaults on a completion list.
+  ///
+  /// The value lists the supported property names of the
+  /// `CompletionList.itemDefaults` object. If omitted no properties are
+  /// supported.
+  ///  @since 3.17.0
+  final List<String>? itemDefaults;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (itemDefaults != null) {
+      __result['itemDefaults'] = itemDefaults;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('itemDefaults');
+      try {
+        final itemDefaults = obj['itemDefaults'];
+        if (itemDefaults != null &&
+            !((itemDefaults is List<Object?> &&
+                (itemDefaults.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 CompletionClientCapabilitiesCompletionList');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionClientCapabilitiesCompletionList &&
+        other.runtimeType == CompletionClientCapabilitiesCompletionList) {
+      return listEqual(itemDefaults, other.itemDefaults,
+              (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(itemDefaults);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class CompletionClientCapabilitiesInsertTextModeSupport implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     CompletionClientCapabilitiesInsertTextModeSupport.canParse,
@@ -6226,6 +6749,7 @@
 
   CompletionItem({
     required this.label,
+    this.labelDetails,
     this.kind,
     this.tags,
     this.detail,
@@ -6238,6 +6762,7 @@
     this.insertTextFormat,
     this.insertTextMode,
     this.textEdit,
+    this.textEditText,
     this.additionalTextEdits,
     this.commitCharacters,
     this.command,
@@ -6246,6 +6771,11 @@
   static CompletionItem fromJson(Map<String, Object?> json) {
     final labelJson = json['label'];
     final label = labelJson as String;
+    final labelDetailsJson = json['labelDetails'];
+    final labelDetails = labelDetailsJson != null
+        ? CompletionItemLabelDetails.fromJson(
+            labelDetailsJson as Map<String, Object?>)
+        : null;
     final kindJson = json['kind'];
     final kind =
         kindJson != null ? CompletionItemKind.fromJson(kindJson as int) : null;
@@ -6293,6 +6823,8 @@
                     InsertReplaceEdit.fromJson(
                         textEditJson as Map<String, Object?>))
                 : (throw '''$textEditJson was not one of (TextEdit, InsertReplaceEdit)''')));
+    final textEditTextJson = json['textEditText'];
+    final textEditText = textEditTextJson as String?;
     final additionalTextEditsJson = json['additionalTextEdits'];
     final additionalTextEdits = (additionalTextEditsJson as List<Object?>?)
         ?.map((item) => TextEdit.fromJson(item as Map<String, Object?>))
@@ -6312,6 +6844,7 @@
         : null;
     return CompletionItem(
       label: label,
+      labelDetails: labelDetails,
       kind: kind,
       tags: tags,
       detail: detail,
@@ -6324,6 +6857,7 @@
       insertTextFormat: insertTextFormat,
       insertTextMode: insertTextMode,
       textEdit: textEdit,
+      textEditText: textEditText,
       additionalTextEdits: additionalTextEdits,
       commitCharacters: commitCharacters,
       command: command,
@@ -6385,11 +6919,16 @@
   /// The format of the insert text. The format applies to both the `insertText`
   /// property and the `newText` property of a provided `textEdit`. If omitted
   /// defaults to `InsertTextFormat.PlainText`.
+  ///
+  /// Please note that the insertTextFormat doesn't apply to
+  /// `additionalTextEdits`.
   final InsertTextFormat? insertTextFormat;
 
   /// How whitespace and indentation is handled during completion item
-  /// insertion. If not provided the client's default value is used.
-  ///  @since 3.16.0
+  /// insertion. If not provided the client's default value depends on the
+  /// `textDocument.completion.insertTextMode` client capability.
+  ///  @since 3.16.0 @since 3.17.0 - support for
+  /// `textDocument.completion.insertTextMode`
   final InsertTextMode? insertTextMode;
 
   /// The kind of this completion item. Based of the kind an icon is chosen by
@@ -6397,10 +6936,19 @@
   /// `CompletionItemKind`.
   final CompletionItemKind? kind;
 
-  /// The label of this completion item. By default also the text that is
-  /// inserted when selecting this completion.
+  /// The label of this completion item.
+  ///
+  /// The label property is also by default the text that is inserted when
+  /// selecting this completion.
+  ///
+  /// If label details are provided the label itself should be an unqualified
+  /// name of the completion item.
   final String label;
 
+  /// Additional details for the label
+  ///  @since 3.17.0
+  final CompletionItemLabelDetails? labelDetails;
+
   /// Select this item when showing.
   ///
   /// *Note* that only one completion item can be selected and that the tool /
@@ -6427,7 +6975,8 @@
   /// existing text with a completion text. Since this can usually not be
   /// predetermined by a server it can report both ranges. Clients need to
   /// signal support for `InsertReplaceEdit`s via the
-  /// `textDocument.completion.insertReplaceSupport` client capability property.
+  /// `textDocument.completion.completionItem.insertReplaceSupport` client
+  /// capability property.
   ///
   /// *Note 1:* The text edit's range as well as both ranges from an insert
   /// replace edit must be a [single line] and they must contain the position at
@@ -6438,9 +6987,23 @@
   ///  @since 3.16.0 additional type `InsertReplaceEdit`
   final Either2<TextEdit, InsertReplaceEdit>? textEdit;
 
+  /// The edit text used if the completion item is part of a CompletionList and
+  /// CompletionList defines an item default for the text edit range.
+  ///
+  /// Clients will only honor this property if they opt into completion list
+  /// item defaults using the capability `completionList.itemDefaults`.
+  ///
+  /// If not provided and a list's default range is provided the label property
+  /// is used as a text.
+  ///  @since 3.17.0
+  final String? textEditText;
+
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['label'] = label;
+    if (labelDetails != null) {
+      __result['labelDetails'] = labelDetails?.toJson();
+    }
     if (kind != null) {
       __result['kind'] = kind?.toJson();
     }
@@ -6477,6 +7040,9 @@
     if (textEdit != null) {
       __result['textEdit'] = textEdit;
     }
+    if (textEditText != null) {
+      __result['textEditText'] = textEditText;
+    }
     if (additionalTextEdits != null) {
       __result['additionalTextEdits'] =
           additionalTextEdits?.map((item) => item.toJson()).toList();
@@ -6513,6 +7079,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('labelDetails');
+      try {
+        final labelDetails = obj['labelDetails'];
+        if (labelDetails != null &&
+            !(CompletionItemLabelDetails.canParse(labelDetails, reporter))) {
+          reporter.reportError('must be of type CompletionItemLabelDetails');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         final kind = obj['kind'];
@@ -6644,6 +7221,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textEditText');
+      try {
+        final textEditText = obj['textEditText'];
+        if (textEditText != null && !(textEditText is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('additionalTextEdits');
       try {
         final additionalTextEdits = obj['additionalTextEdits'];
@@ -6701,6 +7288,7 @@
   bool operator ==(Object other) {
     if (other is CompletionItem && other.runtimeType == CompletionItem) {
       return label == other.label &&
+          labelDetails == other.labelDetails &&
           kind == other.kind &&
           listEqual(tags, other.tags,
               (CompletionItemTag a, CompletionItemTag b) => a == b) &&
@@ -6714,6 +7302,7 @@
           insertTextFormat == other.insertTextFormat &&
           insertTextMode == other.insertTextMode &&
           textEdit == other.textEdit &&
+          textEditText == other.textEditText &&
           listEqual(additionalTextEdits, other.additionalTextEdits,
               (TextEdit a, TextEdit b) => a == b) &&
           listEqual(commitCharacters, other.commitCharacters,
@@ -6728,6 +7317,7 @@
   @override
   int get hashCode => Object.hash(
         label,
+        labelDetails,
         kind,
         lspHashCode(tags),
         detail,
@@ -6740,6 +7330,7 @@
         insertTextFormat,
         insertTextMode,
         textEdit,
+        textEditText,
         lspHashCode(additionalTextEdits),
         lspHashCode(commitCharacters),
         command,
@@ -6798,6 +7389,98 @@
   bool operator ==(Object o) => o is CompletionItemKind && o._value == _value;
 }
 
+/// Additional details for a completion item label.
+///  @since 3.17.0
+class CompletionItemLabelDetails implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionItemLabelDetails.canParse,
+    CompletionItemLabelDetails.fromJson,
+  );
+
+  CompletionItemLabelDetails({
+    this.detail,
+    this.description,
+  });
+  static CompletionItemLabelDetails fromJson(Map<String, Object?> json) {
+    final detailJson = json['detail'];
+    final detail = detailJson as String?;
+    final descriptionJson = json['description'];
+    final description = descriptionJson as String?;
+    return CompletionItemLabelDetails(
+      detail: detail,
+      description: description,
+    );
+  }
+
+  /// An optional string which is rendered less prominently after {@link
+  /// CompletionItemLabelDetails.detail}. Should be used for fully qualified
+  /// names or file path.
+  final String? description;
+
+  /// An optional string which is rendered less prominently directly after
+  /// {@link CompletionItem.label label}, without any spacing. Should be used
+  /// for function signatures or type annotations.
+  final String? detail;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (detail != null) {
+      __result['detail'] = detail;
+    }
+    if (description != null) {
+      __result['description'] = description;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('detail');
+      try {
+        final detail = obj['detail'];
+        if (detail != null && !(detail is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('description');
+      try {
+        final description = obj['description'];
+        if (description != null && !(description is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionItemLabelDetails');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionItemLabelDetails &&
+        other.runtimeType == CompletionItemLabelDetails) {
+      return detail == other.detail && description == other.description && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        detail,
+        description,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Completion item tags are extra annotations that tweak the rendering of a
 /// completion item.
 ///  @since 3.15.0
@@ -6835,17 +7518,24 @@
 
   CompletionList({
     required this.isIncomplete,
+    this.itemDefaults,
     required this.items,
   });
   static CompletionList fromJson(Map<String, Object?> json) {
     final isIncompleteJson = json['isIncomplete'];
     final isIncomplete = isIncompleteJson as bool;
+    final itemDefaultsJson = json['itemDefaults'];
+    final itemDefaults = itemDefaultsJson != null
+        ? CompletionListItemDefaults.fromJson(
+            itemDefaultsJson as Map<String, Object?>)
+        : null;
     final itemsJson = json['items'];
     final items = (itemsJson as List<Object?>)
         .map((item) => CompletionItem.fromJson(item as Map<String, Object?>))
         .toList();
     return CompletionList(
       isIncomplete: isIncomplete,
+      itemDefaults: itemDefaults,
       items: items,
     );
   }
@@ -6857,12 +7547,28 @@
   /// incomplete completion sessions.
   final bool isIncomplete;
 
+  /// In many cases the items of an actual completion result share the same
+  /// value for properties like `commitCharacters` or the range of a text edit.
+  /// A completion list can therefore define item defaults which will be used if
+  /// a completion item itself doesn't specify the value.
+  ///
+  /// If a completion list specifies a default value and a completion item also
+  /// specifies a corresponding value the one from the item is used.
+  ///
+  /// Servers are only allowed to return default values if the client signals
+  /// support for this via the `completionList.itemDefaults` capability.
+  ///  @since 3.17.0
+  final CompletionListItemDefaults? itemDefaults;
+
   /// The completion items.
   final List<CompletionItem> items;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['isIncomplete'] = isIncomplete;
+    if (itemDefaults != null) {
+      __result['itemDefaults'] = itemDefaults?.toJson();
+    }
     __result['items'] = items.map((item) => item.toJson()).toList();
     return __result;
   }
@@ -6887,6 +7593,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('itemDefaults');
+      try {
+        final itemDefaults = obj['itemDefaults'];
+        if (itemDefaults != null &&
+            !(CompletionListItemDefaults.canParse(itemDefaults, reporter))) {
+          reporter.reportError('must be of type CompletionListItemDefaults');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('items');
       try {
         if (!obj.containsKey('items')) {
@@ -6918,6 +7635,7 @@
   bool operator ==(Object other) {
     if (other is CompletionList && other.runtimeType == CompletionList) {
       return isIncomplete == other.isIncomplete &&
+          itemDefaults == other.itemDefaults &&
           listEqual(items, other.items,
               (CompletionItem a, CompletionItem b) => a == b) &&
           true;
@@ -6928,6 +7646,7 @@
   @override
   int get hashCode => Object.hash(
         isIncomplete,
+        itemDefaults,
         lspHashCode(items),
       );
 
@@ -6935,6 +7654,261 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CompletionListEditRange implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionListEditRange.canParse,
+    CompletionListEditRange.fromJson,
+  );
+
+  CompletionListEditRange({
+    required this.insert,
+    required this.replace,
+  });
+  static CompletionListEditRange fromJson(Map<String, Object?> json) {
+    final insertJson = json['insert'];
+    final insert = Range.fromJson(insertJson as Map<String, Object?>);
+    final replaceJson = json['replace'];
+    final replace = Range.fromJson(replaceJson as Map<String, Object?>);
+    return CompletionListEditRange(
+      insert: insert,
+      replace: replace,
+    );
+  }
+
+  final Range insert;
+  final Range replace;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['insert'] = insert.toJson();
+    __result['replace'] = replace.toJson();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('insert');
+      try {
+        if (!obj.containsKey('insert')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final insert = obj['insert'];
+        if (insert == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(insert, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('replace');
+      try {
+        if (!obj.containsKey('replace')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final replace = obj['replace'];
+        if (replace == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(replace, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionListEditRange');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionListEditRange &&
+        other.runtimeType == CompletionListEditRange) {
+      return insert == other.insert && replace == other.replace && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        insert,
+        replace,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class CompletionListItemDefaults implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionListItemDefaults.canParse,
+    CompletionListItemDefaults.fromJson,
+  );
+
+  CompletionListItemDefaults({
+    this.commitCharacters,
+    this.editRange,
+    this.insertTextFormat,
+    this.insertTextMode,
+  });
+  static CompletionListItemDefaults fromJson(Map<String, Object?> json) {
+    final commitCharactersJson = json['commitCharacters'];
+    final commitCharacters = (commitCharactersJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
+    final editRangeJson = json['editRange'];
+    final editRange = editRangeJson == null
+        ? null
+        : (Range.canParse(editRangeJson, nullLspJsonReporter)
+            ? Either2<Range, CompletionListEditRange>.t1(
+                Range.fromJson(editRangeJson as Map<String, Object?>))
+            : (CompletionListEditRange.canParse(
+                    editRangeJson, nullLspJsonReporter)
+                ? Either2<Range, CompletionListEditRange>.t2(
+                    CompletionListEditRange.fromJson(
+                        editRangeJson as Map<String, Object?>))
+                : (throw '''$editRangeJson was not one of (Range, CompletionListEditRange)''')));
+    final insertTextFormatJson = json['insertTextFormat'];
+    final insertTextFormat = insertTextFormatJson != null
+        ? InsertTextFormat.fromJson(insertTextFormatJson as int)
+        : null;
+    final insertTextModeJson = json['insertTextMode'];
+    final insertTextMode = insertTextModeJson != null
+        ? InsertTextMode.fromJson(insertTextModeJson as int)
+        : null;
+    return CompletionListItemDefaults(
+      commitCharacters: commitCharacters,
+      editRange: editRange,
+      insertTextFormat: insertTextFormat,
+      insertTextMode: insertTextMode,
+    );
+  }
+
+  /// A default commit character set.
+  ///  @since 3.17.0
+  final List<String>? commitCharacters;
+
+  /// A default edit range
+  ///  @since 3.17.0
+  final Either2<Range, CompletionListEditRange>? editRange;
+
+  /// A default insert text format
+  ///  @since 3.17.0
+  final InsertTextFormat? insertTextFormat;
+
+  /// A default insert text mode
+  ///  @since 3.17.0
+  final InsertTextMode? insertTextMode;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (commitCharacters != null) {
+      __result['commitCharacters'] = commitCharacters;
+    }
+    if (editRange != null) {
+      __result['editRange'] = editRange;
+    }
+    if (insertTextFormat != null) {
+      __result['insertTextFormat'] = insertTextFormat?.toJson();
+    }
+    if (insertTextMode != null) {
+      __result['insertTextMode'] = insertTextMode?.toJson();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('commitCharacters');
+      try {
+        final commitCharacters = obj['commitCharacters'];
+        if (commitCharacters != null &&
+            !((commitCharacters is List<Object?> &&
+                (commitCharacters.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('editRange');
+      try {
+        final editRange = obj['editRange'];
+        if (editRange != null &&
+            !((Range.canParse(editRange, reporter) ||
+                CompletionListEditRange.canParse(editRange, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<Range, CompletionListEditRange>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('insertTextFormat');
+      try {
+        final insertTextFormat = obj['insertTextFormat'];
+        if (insertTextFormat != null &&
+            !(InsertTextFormat.canParse(insertTextFormat, reporter))) {
+          reporter.reportError('must be of type InsertTextFormat');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('insertTextMode');
+      try {
+        final insertTextMode = obj['insertTextMode'];
+        if (insertTextMode != null &&
+            !(InsertTextMode.canParse(insertTextMode, reporter))) {
+          reporter.reportError('must be of type InsertTextMode');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionListItemDefaults');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionListItemDefaults &&
+        other.runtimeType == CompletionListItemDefaults) {
+      return listEqual(commitCharacters, other.commitCharacters,
+              (String a, String b) => a == b) &&
+          editRange == other.editRange &&
+          insertTextFormat == other.insertTextFormat &&
+          insertTextMode == other.insertTextMode &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(commitCharacters),
+        editRange,
+        insertTextFormat,
+        insertTextMode,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Completion options.
 class CompletionOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -6946,6 +7920,7 @@
     this.triggerCharacters,
     this.allCommitCharacters,
     this.resolveProvider,
+    this.completionItem,
     this.workDoneProgress,
   });
   static CompletionOptions fromJson(Map<String, Object?> json) {
@@ -6962,12 +7937,18 @@
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
+    final completionItemJson = json['completionItem'];
+    final completionItem = completionItemJson != null
+        ? CompletionOptionsCompletionItem.fromJson(
+            completionItemJson as Map<String, Object?>)
+        : null;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return CompletionOptions(
       triggerCharacters: triggerCharacters,
       allCommitCharacters: allCommitCharacters,
       resolveProvider: resolveProvider,
+      completionItem: completionItem,
       workDoneProgress: workDoneProgress,
     );
   }
@@ -6982,6 +7963,10 @@
   ///  @since 3.2.0
   final List<String>? allCommitCharacters;
 
+  /// The server supports the following `CompletionItem` specific capabilities.
+  ///  @since 3.17.0
+  final CompletionOptionsCompletionItem? completionItem;
+
   /// The server provides support to resolve additional information for a
   /// completion item.
   final bool? resolveProvider;
@@ -7010,6 +7995,9 @@
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
+    if (completionItem != null) {
+      __result['completionItem'] = completionItem?.toJson();
+    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
@@ -7052,6 +8040,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('completionItem');
+      try {
+        final completionItem = obj['completionItem'];
+        if (completionItem != null &&
+            !(CompletionOptionsCompletionItem.canParse(
+                completionItem, reporter))) {
+          reporter
+              .reportError('must be of type CompletionOptionsCompletionItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -7077,6 +8078,7 @@
           listEqual(allCommitCharacters, other.allCommitCharacters,
               (String a, String b) => a == b) &&
           resolveProvider == other.resolveProvider &&
+          completionItem == other.completionItem &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -7088,6 +8090,7 @@
         lspHashCode(triggerCharacters),
         lspHashCode(allCommitCharacters),
         resolveProvider,
+        completionItem,
         workDoneProgress,
       );
 
@@ -7095,6 +8098,72 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CompletionOptionsCompletionItem implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    CompletionOptionsCompletionItem.canParse,
+    CompletionOptionsCompletionItem.fromJson,
+  );
+
+  CompletionOptionsCompletionItem({
+    this.labelDetailsSupport,
+  });
+  static CompletionOptionsCompletionItem fromJson(Map<String, Object?> json) {
+    final labelDetailsSupportJson = json['labelDetailsSupport'];
+    final labelDetailsSupport = labelDetailsSupportJson as bool?;
+    return CompletionOptionsCompletionItem(
+      labelDetailsSupport: labelDetailsSupport,
+    );
+  }
+
+  /// The server has support for completion item label details (see also
+  /// `CompletionItemLabelDetails`) when receiving a completion item in a
+  /// resolve call.
+  ///  @since 3.17.0
+  final bool? labelDetailsSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (labelDetailsSupport != null) {
+      __result['labelDetailsSupport'] = labelDetailsSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('labelDetailsSupport');
+      try {
+        final labelDetailsSupport = obj['labelDetailsSupport'];
+        if (labelDetailsSupport != null && !(labelDetailsSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionOptionsCompletionItem');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionOptionsCompletionItem &&
+        other.runtimeType == CompletionOptionsCompletionItem) {
+      return labelDetailsSupport == other.labelDetailsSupport && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => labelDetailsSupport.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class CompletionParams
     implements
         TextDocumentPositionParams,
@@ -7297,6 +8366,7 @@
     this.triggerCharacters,
     this.allCommitCharacters,
     this.resolveProvider,
+    this.completionItem,
     this.workDoneProgress,
   });
   static CompletionRegistrationOptions fromJson(Map<String, Object?> json) {
@@ -7314,6 +8384,11 @@
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
+    final completionItemJson = json['completionItem'];
+    final completionItem = completionItemJson != null
+        ? CompletionOptionsCompletionItem.fromJson(
+            completionItemJson as Map<String, Object?>)
+        : null;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return CompletionRegistrationOptions(
@@ -7321,6 +8396,7 @@
       triggerCharacters: triggerCharacters,
       allCommitCharacters: allCommitCharacters,
       resolveProvider: resolveProvider,
+      completionItem: completionItem,
       workDoneProgress: workDoneProgress,
     );
   }
@@ -7335,6 +8411,10 @@
   ///  @since 3.2.0
   final List<String>? allCommitCharacters;
 
+  /// The server supports the following `CompletionItem` specific capabilities.
+  ///  @since 3.17.0
+  final CompletionOptionsCompletionItem? completionItem;
+
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
   final List<DocumentFilter>? documentSelector;
@@ -7368,6 +8448,9 @@
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
+    if (completionItem != null) {
+      __result['completionItem'] = completionItem?.toJson();
+    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
@@ -7427,6 +8510,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('completionItem');
+      try {
+        final completionItem = obj['completionItem'];
+        if (completionItem != null &&
+            !(CompletionOptionsCompletionItem.canParse(
+                completionItem, reporter))) {
+          reporter
+              .reportError('must be of type CompletionOptionsCompletionItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -7455,6 +8551,7 @@
           listEqual(allCommitCharacters, other.allCommitCharacters,
               (String a, String b) => a == b) &&
           resolveProvider == other.resolveProvider &&
+          completionItem == other.completionItem &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -7467,6 +8564,7 @@
         lspHashCode(triggerCharacters),
         lspHashCode(allCommitCharacters),
         resolveProvider,
+        completionItem,
         workDoneProgress,
       );
 
@@ -7709,7 +8807,7 @@
     );
   }
 
-  /// An optional annotation identifer describing the operation.
+  /// An optional annotation identifier describing the operation.
   ///  @since 3.16.0
   final String? annotationId;
 
@@ -8880,7 +9978,7 @@
     );
   }
 
-  /// An optional annotation identifer describing the operation.
+  /// An optional annotation identifier describing the operation.
   ///  @since 3.16.0
   final String? annotationId;
 
@@ -9436,6 +10534,458 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// Client capabilities specific to diagnostic pull requests.
+///  @since 3.17.0
+class DiagnosticClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DiagnosticClientCapabilities.canParse,
+    DiagnosticClientCapabilities.fromJson,
+  );
+
+  DiagnosticClientCapabilities({
+    this.dynamicRegistration,
+    this.relatedDocumentSupport,
+  });
+  static DiagnosticClientCapabilities fromJson(Map<String, Object?> json) {
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final relatedDocumentSupportJson = json['relatedDocumentSupport'];
+    final relatedDocumentSupport = relatedDocumentSupportJson as bool?;
+    return DiagnosticClientCapabilities(
+      dynamicRegistration: dynamicRegistration,
+      relatedDocumentSupport: relatedDocumentSupport,
+    );
+  }
+
+  /// Whether implementation supports dynamic registration. If this is set to
+  /// `true` the client supports the new `(TextDocumentRegistrationOptions &
+  /// StaticRegistrationOptions)` return value for the corresponding server
+  /// capability as well.
+  final bool? dynamicRegistration;
+
+  /// Whether the clients supports related documents for document diagnostic
+  /// pulls.
+  final bool? relatedDocumentSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (relatedDocumentSupport != null) {
+      __result['relatedDocumentSupport'] = relatedDocumentSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      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('relatedDocumentSupport');
+      try {
+        final relatedDocumentSupport = obj['relatedDocumentSupport'];
+        if (relatedDocumentSupport != null &&
+            !(relatedDocumentSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DiagnosticClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DiagnosticClientCapabilities &&
+        other.runtimeType == DiagnosticClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          relatedDocumentSupport == other.relatedDocumentSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        dynamicRegistration,
+        relatedDocumentSupport,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Diagnostic options.
+///  @since 3.17.0
+class DiagnosticOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DiagnosticOptions.canParse,
+    DiagnosticOptions.fromJson,
+  );
+
+  DiagnosticOptions({
+    this.identifier,
+    required this.interFileDependencies,
+    required this.workspaceDiagnostics,
+    this.workDoneProgress,
+  });
+  static DiagnosticOptions fromJson(Map<String, Object?> json) {
+    if (DiagnosticRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DiagnosticRegistrationOptions.fromJson(json);
+    }
+    final identifierJson = json['identifier'];
+    final identifier = identifierJson as String?;
+    final interFileDependenciesJson = json['interFileDependencies'];
+    final interFileDependencies = interFileDependenciesJson as bool;
+    final workspaceDiagnosticsJson = json['workspaceDiagnostics'];
+    final workspaceDiagnostics = workspaceDiagnosticsJson as bool;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    return DiagnosticOptions(
+      identifier: identifier,
+      interFileDependencies: interFileDependencies,
+      workspaceDiagnostics: workspaceDiagnostics,
+      workDoneProgress: workDoneProgress,
+    );
+  }
+
+  /// An optional identifier under which the diagnostics are managed by the
+  /// client.
+  final String? identifier;
+
+  /// Whether the language has inter file dependencies meaning that editing code
+  /// in one file can result in a different diagnostic set in another file.
+  /// Inter file dependencies are common for most programming languages and
+  /// typically uncommon for linters.
+  final bool interFileDependencies;
+  final bool? workDoneProgress;
+
+  /// The server provides support for workspace diagnostics as well.
+  final bool workspaceDiagnostics;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (identifier != null) {
+      __result['identifier'] = identifier;
+    }
+    __result['interFileDependencies'] = interFileDependencies;
+    __result['workspaceDiagnostics'] = workspaceDiagnostics;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('identifier');
+      try {
+        final identifier = obj['identifier'];
+        if (identifier != null && !(identifier is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('interFileDependencies');
+      try {
+        if (!obj.containsKey('interFileDependencies')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final interFileDependencies = obj['interFileDependencies'];
+        if (interFileDependencies == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(interFileDependencies is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workspaceDiagnostics');
+      try {
+        if (!obj.containsKey('workspaceDiagnostics')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final workspaceDiagnostics = obj['workspaceDiagnostics'];
+        if (workspaceDiagnostics == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(workspaceDiagnostics is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DiagnosticOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DiagnosticOptions && other.runtimeType == DiagnosticOptions) {
+      return identifier == other.identifier &&
+          interFileDependencies == other.interFileDependencies &&
+          workspaceDiagnostics == other.workspaceDiagnostics &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        identifier,
+        interFileDependencies,
+        workspaceDiagnostics,
+        workDoneProgress,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Diagnostic registration options.
+///  @since 3.17.0
+class DiagnosticRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        DiagnosticOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DiagnosticRegistrationOptions.canParse,
+    DiagnosticRegistrationOptions.fromJson,
+  );
+
+  DiagnosticRegistrationOptions({
+    this.documentSelector,
+    this.identifier,
+    required this.interFileDependencies,
+    required this.workspaceDiagnostics,
+    this.workDoneProgress,
+    this.id,
+  });
+  static DiagnosticRegistrationOptions fromJson(Map<String, Object?> json) {
+    final documentSelectorJson = json['documentSelector'];
+    final documentSelector = (documentSelectorJson as List<Object?>?)
+        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        .toList();
+    final identifierJson = json['identifier'];
+    final identifier = identifierJson as String?;
+    final interFileDependenciesJson = json['interFileDependencies'];
+    final interFileDependencies = interFileDependenciesJson as bool;
+    final workspaceDiagnosticsJson = json['workspaceDiagnostics'];
+    final workspaceDiagnostics = workspaceDiagnosticsJson as bool;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    final idJson = json['id'];
+    final id = idJson as String?;
+    return DiagnosticRegistrationOptions(
+      documentSelector: documentSelector,
+      identifier: identifier,
+      interFileDependencies: interFileDependencies,
+      workspaceDiagnostics: workspaceDiagnostics,
+      workDoneProgress: workDoneProgress,
+      id: id,
+    );
+  }
+
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
+  final List<DocumentFilter>? documentSelector;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String? id;
+
+  /// An optional identifier under which the diagnostics are managed by the
+  /// client.
+  final String? identifier;
+
+  /// Whether the language has inter file dependencies meaning that editing code
+  /// in one file can result in a different diagnostic set in another file.
+  /// Inter file dependencies are common for most programming languages and
+  /// typically uncommon for linters.
+  final bool interFileDependencies;
+  final bool? workDoneProgress;
+
+  /// The server provides support for workspace diagnostics as well.
+  final bool workspaceDiagnostics;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['documentSelector'] = documentSelector;
+    if (identifier != null) {
+      __result['identifier'] = identifier;
+    }
+    __result['interFileDependencies'] = interFileDependencies;
+    __result['workspaceDiagnostics'] = workspaceDiagnostics;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    if (id != null) {
+      __result['id'] = id;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final documentSelector = obj['documentSelector'];
+        if (documentSelector != null &&
+            !((documentSelector is List<Object?> &&
+                (documentSelector.every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('identifier');
+      try {
+        final identifier = obj['identifier'];
+        if (identifier != null && !(identifier is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('interFileDependencies');
+      try {
+        if (!obj.containsKey('interFileDependencies')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final interFileDependencies = obj['interFileDependencies'];
+        if (interFileDependencies == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(interFileDependencies is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workspaceDiagnostics');
+      try {
+        if (!obj.containsKey('workspaceDiagnostics')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final workspaceDiagnostics = obj['workspaceDiagnostics'];
+        if (workspaceDiagnostics == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(workspaceDiagnostics is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DiagnosticRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DiagnosticRegistrationOptions &&
+        other.runtimeType == DiagnosticRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          identifier == other.identifier &&
+          interFileDependencies == other.interFileDependencies &&
+          workspaceDiagnostics == other.workspaceDiagnostics &&
+          workDoneProgress == other.workDoneProgress &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(documentSelector),
+        identifier,
+        interFileDependencies,
+        workspaceDiagnostics,
+        workDoneProgress,
+        id,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Represents a related message and source code location for a diagnostic. This
 /// should be used to point to code locations that cause or are related to a
 /// diagnostics, e.g when duplicating a symbol in a scope.
@@ -9537,6 +11087,76 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// Cancellation data returned from a diagnostic request.
+///  @since 3.17.0
+class DiagnosticServerCancellationData implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DiagnosticServerCancellationData.canParse,
+    DiagnosticServerCancellationData.fromJson,
+  );
+
+  DiagnosticServerCancellationData({
+    required this.retriggerRequest,
+  });
+  static DiagnosticServerCancellationData fromJson(Map<String, Object?> json) {
+    final retriggerRequestJson = json['retriggerRequest'];
+    final retriggerRequest = retriggerRequestJson as bool;
+    return DiagnosticServerCancellationData(
+      retriggerRequest: retriggerRequest,
+    );
+  }
+
+  final bool retriggerRequest;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['retriggerRequest'] = retriggerRequest;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('retriggerRequest');
+      try {
+        if (!obj.containsKey('retriggerRequest')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final retriggerRequest = obj['retriggerRequest'];
+        if (retriggerRequest == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(retriggerRequest is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DiagnosticServerCancellationData');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DiagnosticServerCancellationData &&
+        other.runtimeType == DiagnosticServerCancellationData) {
+      return retriggerRequest == other.retriggerRequest && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => retriggerRequest.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DiagnosticSeverity {
   const DiagnosticSeverity(this._value);
   const DiagnosticSeverity.fromJson(this._value);
@@ -9604,6 +11224,79 @@
   bool operator ==(Object o) => o is DiagnosticTag && o._value == _value;
 }
 
+/// Workspace client capabilities specific to diagnostic pull requests.
+///  @since 3.17.0
+class DiagnosticWorkspaceClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DiagnosticWorkspaceClientCapabilities.canParse,
+    DiagnosticWorkspaceClientCapabilities.fromJson,
+  );
+
+  DiagnosticWorkspaceClientCapabilities({
+    this.refreshSupport,
+  });
+  static DiagnosticWorkspaceClientCapabilities fromJson(
+      Map<String, Object?> json) {
+    final refreshSupportJson = json['refreshSupport'];
+    final refreshSupport = refreshSupportJson as bool?;
+    return DiagnosticWorkspaceClientCapabilities(
+      refreshSupport: refreshSupport,
+    );
+  }
+
+  /// Whether the client implementation supports a refresh request sent from the
+  /// server to the client.
+  ///
+  /// Note that this event is global and will force the client to refresh all
+  /// pulled diagnostics currently shown. It should be used with absolute care
+  /// and is useful for situation where a server for example detects a project
+  /// wide change that requires such a calculation.
+  final bool? refreshSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (refreshSupport != null) {
+      __result['refreshSupport'] = refreshSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('refreshSupport');
+      try {
+        final refreshSupport = obj['refreshSupport'];
+        if (refreshSupport != null && !(refreshSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type DiagnosticWorkspaceClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DiagnosticWorkspaceClientCapabilities &&
+        other.runtimeType == DiagnosticWorkspaceClientCapabilities) {
+      return refreshSupport == other.refreshSupport && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => refreshSupport.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DidChangeConfigurationClientCapabilities implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DidChangeConfigurationClientCapabilities.canParse,
@@ -9720,6 +11413,123 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// The params sent in a change notebook document notification.
+///  @since 3.17.0
+class DidChangeNotebookDocumentParams implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DidChangeNotebookDocumentParams.canParse,
+    DidChangeNotebookDocumentParams.fromJson,
+  );
+
+  DidChangeNotebookDocumentParams({
+    required this.notebookDocument,
+    required this.change,
+  });
+  static DidChangeNotebookDocumentParams fromJson(Map<String, Object?> json) {
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = VersionedNotebookDocumentIdentifier.fromJson(
+        notebookDocumentJson as Map<String, Object?>);
+    final changeJson = json['change'];
+    final change = NotebookDocumentChangeEvent.fromJson(
+        changeJson as Map<String, Object?>);
+    return DidChangeNotebookDocumentParams(
+      notebookDocument: notebookDocument,
+      change: change,
+    );
+  }
+
+  /// The actual changes to the notebook document.
+  ///
+  /// The change describes single state change to the notebook document. So it
+  /// moves a notebook document, its cells and its cell text document contents
+  /// from state S to S'.
+  ///
+  /// To mirror the content of a notebook using change events use the following
+  /// approach:
+  /// - start with the same initial content
+  /// - apply the 'notebookDocument/didChange' notifications in the order
+  ///   you receive them.
+  final NotebookDocumentChangeEvent change;
+
+  /// The notebook document that did change. The version number points to the
+  /// version after all provided changes have been applied.
+  final VersionedNotebookDocumentIdentifier notebookDocument;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebookDocument'] = notebookDocument.toJson();
+    __result['change'] = change.toJson();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookDocument');
+      try {
+        if (!obj.containsKey('notebookDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(VersionedNotebookDocumentIdentifier.canParse(
+            notebookDocument, reporter))) {
+          reporter.reportError(
+              'must be of type VersionedNotebookDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('change');
+      try {
+        if (!obj.containsKey('change')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final change = obj['change'];
+        if (change == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocumentChangeEvent.canParse(change, reporter))) {
+          reporter.reportError('must be of type NotebookDocumentChangeEvent');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DidChangeNotebookDocumentParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DidChangeNotebookDocumentParams &&
+        other.runtimeType == DidChangeNotebookDocumentParams) {
+      return notebookDocument == other.notebookDocument &&
+          change == other.change &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebookDocument,
+        change,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DidChangeTextDocumentParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DidChangeTextDocumentParams.canParse,
@@ -9871,13 +11681,17 @@
 
   DidChangeWatchedFilesClientCapabilities({
     this.dynamicRegistration,
+    this.relativePatternSupport,
   });
   static DidChangeWatchedFilesClientCapabilities fromJson(
       Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final relativePatternSupportJson = json['relativePatternSupport'];
+    final relativePatternSupport = relativePatternSupportJson as bool?;
     return DidChangeWatchedFilesClientCapabilities(
       dynamicRegistration: dynamicRegistration,
+      relativePatternSupport: relativePatternSupport,
     );
   }
 
@@ -9886,11 +11700,18 @@
   /// for file changes from the server side.
   final bool? dynamicRegistration;
 
+  /// Whether the client has support for relative patterns or not.
+  ///  @since 3.17.0
+  final bool? relativePatternSupport;
+
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     if (dynamicRegistration != null) {
       __result['dynamicRegistration'] = dynamicRegistration;
     }
+    if (relativePatternSupport != null) {
+      __result['relativePatternSupport'] = relativePatternSupport;
+    }
     return __result;
   }
 
@@ -9906,6 +11727,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('relativePatternSupport');
+      try {
+        final relativePatternSupport = obj['relativePatternSupport'];
+        if (relativePatternSupport != null &&
+            !(relativePatternSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -9918,13 +11750,18 @@
   bool operator ==(Object other) {
     if (other is DidChangeWatchedFilesClientCapabilities &&
         other.runtimeType == DidChangeWatchedFilesClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration && true;
+      return dynamicRegistration == other.dynamicRegistration &&
+          relativePatternSupport == other.relativePatternSupport &&
+          true;
     }
     return false;
   }
 
   @override
-  int get hashCode => dynamicRegistration.hashCode;
+  int get hashCode => Object.hash(
+        dynamicRegistration,
+        relativePatternSupport,
+      );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -10152,6 +11989,118 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// The params sent in a close notebook document notification.
+///  @since 3.17.0
+class DidCloseNotebookDocumentParams implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DidCloseNotebookDocumentParams.canParse,
+    DidCloseNotebookDocumentParams.fromJson,
+  );
+
+  DidCloseNotebookDocumentParams({
+    required this.notebookDocument,
+    required this.cellTextDocuments,
+  });
+  static DidCloseNotebookDocumentParams fromJson(Map<String, Object?> json) {
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = NotebookDocumentIdentifier.fromJson(
+        notebookDocumentJson as Map<String, Object?>);
+    final cellTextDocumentsJson = json['cellTextDocuments'];
+    final cellTextDocuments = (cellTextDocumentsJson as List<Object?>)
+        .map((item) =>
+            TextDocumentIdentifier.fromJson(item as Map<String, Object?>))
+        .toList();
+    return DidCloseNotebookDocumentParams(
+      notebookDocument: notebookDocument,
+      cellTextDocuments: cellTextDocuments,
+    );
+  }
+
+  /// The text documents that represent the content of a notebook cell that got
+  /// closed.
+  final List<TextDocumentIdentifier> cellTextDocuments;
+
+  /// The notebook document that got closed.
+  final NotebookDocumentIdentifier notebookDocument;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebookDocument'] = notebookDocument.toJson();
+    __result['cellTextDocuments'] =
+        cellTextDocuments.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookDocument');
+      try {
+        if (!obj.containsKey('notebookDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocumentIdentifier.canParse(
+            notebookDocument, reporter))) {
+          reporter.reportError('must be of type NotebookDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('cellTextDocuments');
+      try {
+        if (!obj.containsKey('cellTextDocuments')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final cellTextDocuments = obj['cellTextDocuments'];
+        if (cellTextDocuments == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((cellTextDocuments is List<Object?> &&
+            (cellTextDocuments.every(
+                (item) => TextDocumentIdentifier.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentIdentifier>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DidCloseNotebookDocumentParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DidCloseNotebookDocumentParams &&
+        other.runtimeType == DidCloseNotebookDocumentParams) {
+      return notebookDocument == other.notebookDocument &&
+          listEqual(cellTextDocuments, other.cellTextDocuments,
+              (TextDocumentIdentifier a, TextDocumentIdentifier b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebookDocument,
+        lspHashCode(cellTextDocuments),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DidCloseTextDocumentParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DidCloseTextDocumentParams.canParse,
@@ -10222,6 +12171,115 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// The params sent in a open notebook document notification.
+///  @since 3.17.0
+class DidOpenNotebookDocumentParams implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DidOpenNotebookDocumentParams.canParse,
+    DidOpenNotebookDocumentParams.fromJson,
+  );
+
+  DidOpenNotebookDocumentParams({
+    required this.notebookDocument,
+    required this.cellTextDocuments,
+  });
+  static DidOpenNotebookDocumentParams fromJson(Map<String, Object?> json) {
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument =
+        NotebookDocument.fromJson(notebookDocumentJson as Map<String, Object?>);
+    final cellTextDocumentsJson = json['cellTextDocuments'];
+    final cellTextDocuments = (cellTextDocumentsJson as List<Object?>)
+        .map((item) => TextDocumentItem.fromJson(item as Map<String, Object?>))
+        .toList();
+    return DidOpenNotebookDocumentParams(
+      notebookDocument: notebookDocument,
+      cellTextDocuments: cellTextDocuments,
+    );
+  }
+
+  /// The text documents that represent the content of a notebook cell.
+  final List<TextDocumentItem> cellTextDocuments;
+
+  /// The notebook document that got opened.
+  final NotebookDocument notebookDocument;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebookDocument'] = notebookDocument.toJson();
+    __result['cellTextDocuments'] =
+        cellTextDocuments.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookDocument');
+      try {
+        if (!obj.containsKey('notebookDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocument.canParse(notebookDocument, reporter))) {
+          reporter.reportError('must be of type NotebookDocument');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('cellTextDocuments');
+      try {
+        if (!obj.containsKey('cellTextDocuments')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final cellTextDocuments = obj['cellTextDocuments'];
+        if (cellTextDocuments == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((cellTextDocuments is List<Object?> &&
+            (cellTextDocuments.every(
+                (item) => TextDocumentItem.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentItem>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DidOpenNotebookDocumentParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DidOpenNotebookDocumentParams &&
+        other.runtimeType == DidOpenNotebookDocumentParams) {
+      return notebookDocument == other.notebookDocument &&
+          listEqual(cellTextDocuments, other.cellTextDocuments,
+              (TextDocumentItem a, TextDocumentItem b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebookDocument,
+        lspHashCode(cellTextDocuments),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DidOpenTextDocumentParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DidOpenTextDocumentParams.canParse,
@@ -10292,6 +12350,79 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// The params sent in a save notebook document notification.
+///  @since 3.17.0
+class DidSaveNotebookDocumentParams implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DidSaveNotebookDocumentParams.canParse,
+    DidSaveNotebookDocumentParams.fromJson,
+  );
+
+  DidSaveNotebookDocumentParams({
+    required this.notebookDocument,
+  });
+  static DidSaveNotebookDocumentParams fromJson(Map<String, Object?> json) {
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = NotebookDocumentIdentifier.fromJson(
+        notebookDocumentJson as Map<String, Object?>);
+    return DidSaveNotebookDocumentParams(
+      notebookDocument: notebookDocument,
+    );
+  }
+
+  /// The notebook document that got saved.
+  final NotebookDocumentIdentifier notebookDocument;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebookDocument'] = notebookDocument.toJson();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookDocument');
+      try {
+        if (!obj.containsKey('notebookDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocumentIdentifier.canParse(
+            notebookDocument, reporter))) {
+          reporter.reportError('must be of type NotebookDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DidSaveNotebookDocumentParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DidSaveNotebookDocumentParams &&
+        other.runtimeType == DidSaveNotebookDocumentParams) {
+      return notebookDocument == other.notebookDocument && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => notebookDocument.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DidSaveTextDocumentParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DidSaveTextDocumentParams.canParse,
@@ -10770,6 +12901,319 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// Parameters of the document diagnostic request.
+///  @since 3.17.0
+class DocumentDiagnosticParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DocumentDiagnosticParams.canParse,
+    DocumentDiagnosticParams.fromJson,
+  );
+
+  DocumentDiagnosticParams({
+    required this.textDocument,
+    this.identifier,
+    this.previousResultId,
+    this.workDoneToken,
+    this.partialResultToken,
+  });
+  static DocumentDiagnosticParams fromJson(Map<String, Object?> json) {
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final identifierJson = json['identifier'];
+    final identifier = identifierJson as String?;
+    final previousResultIdJson = json['previousResultId'];
+    final previousResultId = previousResultIdJson as String?;
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    return DocumentDiagnosticParams(
+      textDocument: textDocument,
+      identifier: identifier,
+      previousResultId: previousResultId,
+      workDoneToken: workDoneToken,
+      partialResultToken: partialResultToken,
+    );
+  }
+
+  /// The additional identifier  provided during registration.
+  final String? identifier;
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<int, String>? partialResultToken;
+
+  /// The result id of a previous response if provided.
+  final String? previousResultId;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<int, String>? workDoneToken;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['textDocument'] = textDocument.toJson();
+    if (identifier != null) {
+      __result['identifier'] = identifier;
+    }
+    if (previousResultId != null) {
+      __result['previousResultId'] = previousResultId;
+    }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('identifier');
+      try {
+        final identifier = obj['identifier'];
+        if (identifier != null && !(identifier is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('previousResultId');
+      try {
+        final previousResultId = obj['previousResultId'];
+        if (previousResultId != null && !(previousResultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentDiagnosticParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentDiagnosticParams &&
+        other.runtimeType == DocumentDiagnosticParams) {
+      return textDocument == other.textDocument &&
+          identifier == other.identifier &&
+          previousResultId == other.previousResultId &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        textDocument,
+        identifier,
+        previousResultId,
+        workDoneToken,
+        partialResultToken,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// The document diagnostic report kinds.
+///  @since 3.17.0
+class DocumentDiagnosticReportKind {
+  const DocumentDiagnosticReportKind(this._value);
+  const DocumentDiagnosticReportKind.fromJson(this._value);
+
+  final String _value;
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    return obj is String;
+  }
+
+  /// A diagnostic report with a full set of problems.
+  static const Full = DocumentDiagnosticReportKind('full');
+
+  /// A report indicating that the last returned report is still accurate.
+  static const Unchanged = DocumentDiagnosticReportKind('unchanged');
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  int get hashCode => _value.hashCode;
+
+  bool operator ==(Object o) =>
+      o is DocumentDiagnosticReportKind && o._value == _value;
+}
+
+/// A partial result for a document diagnostic report.
+///  @since 3.17.0
+class DocumentDiagnosticReportPartialResult implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    DocumentDiagnosticReportPartialResult.canParse,
+    DocumentDiagnosticReportPartialResult.fromJson,
+  );
+
+  DocumentDiagnosticReportPartialResult({
+    required this.relatedDocuments,
+  });
+  static DocumentDiagnosticReportPartialResult fromJson(
+      Map<String, Object?> json) {
+    final relatedDocumentsJson = json['relatedDocuments'];
+    final relatedDocuments = (relatedDocumentsJson as Map<Object, Object?>).map(
+        (key, value) => MapEntry(
+            key as String,
+            FullDocumentDiagnosticReport.canParse(value, nullLspJsonReporter)
+                ? Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>.t1(
+                    FullDocumentDiagnosticReport.fromJson(
+                        value as Map<String, Object?>))
+                : (UnchangedDocumentDiagnosticReport.canParse(
+                        value, nullLspJsonReporter)
+                    ? Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>.t2(
+                        UnchangedDocumentDiagnosticReport.fromJson(
+                            value as Map<String, Object?>))
+                    : (throw '''$value was not one of (FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport)'''))));
+    return DocumentDiagnosticReportPartialResult(
+      relatedDocuments: relatedDocuments,
+    );
+  }
+
+  final Map<
+      String,
+      Either2<FullDocumentDiagnosticReport,
+          UnchangedDocumentDiagnosticReport>> relatedDocuments;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['relatedDocuments'] = relatedDocuments;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('relatedDocuments');
+      try {
+        if (!obj.containsKey('relatedDocuments')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final relatedDocuments = obj['relatedDocuments'];
+        if (relatedDocuments == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((relatedDocuments is Map &&
+            (relatedDocuments.keys.every((item) =>
+                item is String &&
+                relatedDocuments.values.every((item) =>
+                    (FullDocumentDiagnosticReport.canParse(item, reporter) ||
+                        UnchangedDocumentDiagnosticReport.canParse(
+                            item, reporter)))))))) {
+          reporter.reportError(
+              'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type DocumentDiagnosticReportPartialResult');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentDiagnosticReportPartialResult &&
+        other.runtimeType == DocumentDiagnosticReportPartialResult) {
+      return mapEqual(
+              relatedDocuments,
+              other.relatedDocuments,
+              (Either2<FullDocumentDiagnosticReport,
+                              UnchangedDocumentDiagnosticReport>
+                          a,
+                      Either2<FullDocumentDiagnosticReport,
+                              UnchangedDocumentDiagnosticReport>
+                          b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(relatedDocuments);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DocumentFilter implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DocumentFilter.canParse,
@@ -12439,7 +14883,7 @@
     );
   }
 
-  /// A character on which formatting should be triggered, like `}`.
+  /// A character on which formatting should be triggered, like `{`.
   final String firstTriggerCharacter;
 
   /// More trigger characters.
@@ -12515,97 +14959,65 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class DocumentOnTypeFormattingParams
-    implements TextDocumentPositionParams, ToJsonable {
+class DocumentOnTypeFormattingParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DocumentOnTypeFormattingParams.canParse,
     DocumentOnTypeFormattingParams.fromJson,
   );
 
   DocumentOnTypeFormattingParams({
-    required this.ch,
-    required this.options,
     required this.textDocument,
     required this.position,
+    required this.ch,
+    required this.options,
   });
   static DocumentOnTypeFormattingParams fromJson(Map<String, Object?> json) {
-    final chJson = json['ch'];
-    final ch = chJson as String;
-    final optionsJson = json['options'];
-    final options =
-        FormattingOptions.fromJson(optionsJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
     final positionJson = json['position'];
     final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final chJson = json['ch'];
+    final ch = chJson as String;
+    final optionsJson = json['options'];
+    final options =
+        FormattingOptions.fromJson(optionsJson as Map<String, Object?>);
     return DocumentOnTypeFormattingParams(
-      ch: ch,
-      options: options,
       textDocument: textDocument,
       position: position,
+      ch: ch,
+      options: options,
     );
   }
 
-  /// The character that has been typed.
+  /// The character that has been typed that triggered the formatting on type
+  /// request. That is not necessarily the last character that got inserted into
+  /// the document since the client could auto insert characters as well (e.g.
+  /// like automatic brace completion).
   final String ch;
 
-  /// The format options.
+  /// The formatting options.
   final FormattingOptions options;
 
-  /// The position inside the text document.
+  /// The position around which the on type formatting should happen. This is
+  /// not necessarily the exact position where the character denoted by the
+  /// property `ch` got typed.
   final Position position;
 
-  /// The text document.
+  /// The document to format.
   final TextDocumentIdentifier textDocument;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['ch'] = ch;
-    __result['options'] = options.toJson();
     __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['ch'] = ch;
+    __result['options'] = options.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('ch');
-      try {
-        if (!obj.containsKey('ch')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final ch = obj['ch'];
-        if (ch == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(ch is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('options');
-      try {
-        if (!obj.containsKey('options')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final options = obj['options'];
-        if (options == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(FormattingOptions.canParse(options, reporter))) {
-          reporter.reportError('must be of type FormattingOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -12642,6 +15054,42 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('ch');
+      try {
+        if (!obj.containsKey('ch')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final ch = obj['ch'];
+        if (ch == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(ch is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('options');
+      try {
+        if (!obj.containsKey('options')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final options = obj['options'];
+        if (options == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(FormattingOptions.canParse(options, reporter))) {
+          reporter.reportError('must be of type FormattingOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentOnTypeFormattingParams');
@@ -12653,10 +15101,10 @@
   bool operator ==(Object other) {
     if (other is DocumentOnTypeFormattingParams &&
         other.runtimeType == DocumentOnTypeFormattingParams) {
-      return ch == other.ch &&
-          options == other.options &&
-          textDocument == other.textDocument &&
+      return textDocument == other.textDocument &&
           position == other.position &&
+          ch == other.ch &&
+          options == other.options &&
           true;
     }
     return false;
@@ -12664,10 +15112,10 @@
 
   @override
   int get hashCode => Object.hash(
-        ch,
-        options,
         textDocument,
         position,
+        ch,
+        options,
       );
 
   @override
@@ -12712,7 +15160,7 @@
   /// null the document selector provided on the client side will be used.
   final List<DocumentFilter>? documentSelector;
 
-  /// A character on which formatting should be triggered, like `}`.
+  /// A character on which formatting should be triggered, like `{`.
   final String firstTriggerCharacter;
 
   /// More trigger characters.
@@ -14185,7 +16633,28 @@
   /// real error code.
   ///  @since 3.16.0
   static const lspReservedErrorRangeStart = ErrorCodes(-32899);
+
+  /// A request failed but it was syntactically correct, e.g the method name was
+  /// known and the parameters were valid. The error message should contain
+  /// human readable information about why the request failed.
+  ///  @since 3.17.0
+  static const RequestFailed = ErrorCodes(-32803);
+
+  /// The server cancelled the request. This error code should only be used for
+  /// requests that explicitly support being server cancellable.
+  ///  @since 3.17.0
+  static const ServerCancelled = ErrorCodes(-32802);
+
+  /// The server detected that the content of a document got modified outside
+  /// normal conditions. A server should NOT send this error code if it detects
+  /// a content change in it unprocessed messages. The result even computed on
+  /// an older state might still be useful for the client.
+  ///
+  /// If a client decides that a result is not of any use anymore the client
+  /// should cancel the request.
   static const ContentModified = ErrorCodes(-32801);
+
+  /// The client has canceled a request and a server as detected the cancel.
   static const RequestCancelled = ErrorCodes(-32800);
 
   /// This is the end range of LSP reserved error codes. It doesn't denote a
@@ -14589,6 +17058,100 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class ExecutionSummary implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    ExecutionSummary.canParse,
+    ExecutionSummary.fromJson,
+  );
+
+  ExecutionSummary({
+    required this.executionOrder,
+    this.success,
+  });
+  static ExecutionSummary fromJson(Map<String, Object?> json) {
+    final executionOrderJson = json['executionOrder'];
+    final executionOrder = executionOrderJson as int;
+    final successJson = json['success'];
+    final success = successJson as bool?;
+    return ExecutionSummary(
+      executionOrder: executionOrder,
+      success: success,
+    );
+  }
+
+  /// A strict monotonically increasing value indicating the execution order of
+  /// a cell inside a notebook.
+  final int executionOrder;
+
+  /// Whether the execution was successful or not if known by the client.
+  final bool? success;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['executionOrder'] = executionOrder;
+    if (success != null) {
+      __result['success'] = success;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('executionOrder');
+      try {
+        if (!obj.containsKey('executionOrder')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final executionOrder = obj['executionOrder'];
+        if (executionOrder == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(executionOrder is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('success');
+      try {
+        final success = obj['success'];
+        if (success != null && !(success is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ExecutionSummary');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ExecutionSummary && other.runtimeType == ExecutionSummary) {
+      return executionOrder == other.executionOrder &&
+          success == other.success &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        executionOrder,
+        success,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class FailureHandlingKind {
   const FailureHandlingKind._(this._value);
   const FailureHandlingKind.fromJson(this._value);
@@ -15423,7 +17986,12 @@
   });
   static FileSystemWatcher fromJson(Map<String, Object?> json) {
     final globPatternJson = json['globPattern'];
-    final globPattern = globPatternJson as String;
+    final globPattern = globPatternJson is String
+        ? Either2<String, RelativePattern>.t1(globPatternJson)
+        : (RelativePattern.canParse(globPatternJson, nullLspJsonReporter)
+            ? Either2<String, RelativePattern>.t2(RelativePattern.fromJson(
+                globPatternJson as Map<String, Object?>))
+            : (throw '''$globPatternJson was not one of (String, RelativePattern)'''));
     final kindJson = json['kind'];
     final kind = kindJson != null ? WatchKind.fromJson(kindJson as int) : null;
     return FileSystemWatcher(
@@ -15432,20 +18000,10 @@
     );
   }
 
-  /// The glob pattern to watch.
-  ///
-  /// Glob patterns can have the following syntax:
-  /// - `*` to match one or more characters in a path segment
-  /// - `?` to match on one character in a path segment
-  /// - `**` to match any number of path segments, including none
-  /// - `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}`
-  ///   matches all TypeScript and JavaScript files)
-  /// - `[]` to declare a range of characters to match in a path segment
-  ///   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
-  /// - `[!...]` to negate a range of characters to match in a path segment
-  ///   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not
-  ///   `example.0`)
-  final String globPattern;
+  /// The glob pattern to watch. See {@link GlobPattern glob pattern} for more
+  /// detail.
+  ///  @since 3.17.0 support for relative patterns.
+  final Either2<String, RelativePattern> globPattern;
 
   /// The kind of events of interest. If omitted it defaults to WatchKind.Create
   /// | WatchKind.Change | WatchKind.Delete which is 7.
@@ -15473,8 +18031,10 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(globPattern is String)) {
-          reporter.reportError('must be of type String');
+        if (!((globPattern is String ||
+            RelativePattern.canParse(globPattern, reporter)))) {
+          reporter
+              .reportError('must be of type Either2<String, RelativePattern>');
           return false;
         }
       } finally {
@@ -15530,6 +18090,7 @@
     required this.endLine,
     this.endCharacter,
     this.kind,
+    this.collapsedText,
   });
   static FoldingRange fromJson(Map<String, Object?> json) {
     final startLineJson = json['startLine'];
@@ -15543,15 +18104,24 @@
     final kindJson = json['kind'];
     final kind =
         kindJson != null ? FoldingRangeKind.fromJson(kindJson as String) : null;
+    final collapsedTextJson = json['collapsedText'];
+    final collapsedText = collapsedTextJson as String?;
     return FoldingRange(
       startLine: startLine,
       startCharacter: startCharacter,
       endLine: endLine,
       endCharacter: endCharacter,
       kind: kind,
+      collapsedText: collapsedText,
     );
   }
 
+  /// The text that the client should show when the specified range is
+  /// collapsed. If not defined or not supported by the client, a default will
+  /// be chosen by the client.
+  ///  @since 3.17.0 - proposed
+  final String? collapsedText;
+
   /// The zero-based character offset before the folded range ends. If not
   /// defined, defaults to the length of the end line.
   final int? endCharacter;
@@ -15589,6 +18159,9 @@
     if (kind != null) {
       __result['kind'] = kind?.toJson();
     }
+    if (collapsedText != null) {
+      __result['collapsedText'] = collapsedText;
+    }
     return __result;
   }
 
@@ -15660,6 +18233,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('collapsedText');
+      try {
+        final collapsedText = obj['collapsedText'];
+        if (collapsedText != null && !(collapsedText is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FoldingRange');
@@ -15675,6 +18258,7 @@
           endLine == other.endLine &&
           endCharacter == other.endCharacter &&
           kind == other.kind &&
+          collapsedText == other.collapsedText &&
           true;
     }
     return false;
@@ -15687,6 +18271,7 @@
         endLine,
         endCharacter,
         kind,
+        collapsedText,
       );
 
   @override
@@ -15703,6 +18288,8 @@
     this.dynamicRegistration,
     this.rangeLimit,
     this.lineFoldingOnly,
+    this.foldingRangeKind,
+    this.foldingRange,
   });
   static FoldingRangeClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
@@ -15711,10 +18298,22 @@
     final rangeLimit = rangeLimitJson as int?;
     final lineFoldingOnlyJson = json['lineFoldingOnly'];
     final lineFoldingOnly = lineFoldingOnlyJson as bool?;
+    final foldingRangeKindJson = json['foldingRangeKind'];
+    final foldingRangeKind = foldingRangeKindJson != null
+        ? FoldingRangeClientCapabilitiesFoldingRangeKind.fromJson(
+            foldingRangeKindJson as Map<String, Object?>)
+        : null;
+    final foldingRangeJson = json['foldingRange'];
+    final foldingRange = foldingRangeJson != null
+        ? FoldingRangeClientCapabilitiesFoldingRange.fromJson(
+            foldingRangeJson as Map<String, Object?>)
+        : null;
     return FoldingRangeClientCapabilities(
       dynamicRegistration: dynamicRegistration,
       rangeLimit: rangeLimit,
       lineFoldingOnly: lineFoldingOnly,
+      foldingRangeKind: foldingRangeKind,
+      foldingRange: foldingRange,
     );
   }
 
@@ -15724,6 +18323,13 @@
   /// server capability as well.
   final bool? dynamicRegistration;
 
+  /// Specific options for the folding range. @since 3.17.0
+  final FoldingRangeClientCapabilitiesFoldingRange? foldingRange;
+
+  /// Specific options for the folding range kind.
+  ///  @since 3.17.0
+  final FoldingRangeClientCapabilitiesFoldingRangeKind? foldingRangeKind;
+
   /// If set, the client signals that it only supports folding complete lines.
   /// If set, client will ignore specified `startCharacter` and `endCharacter`
   /// properties in a FoldingRange.
@@ -15745,6 +18351,12 @@
     if (lineFoldingOnly != null) {
       __result['lineFoldingOnly'] = lineFoldingOnly;
     }
+    if (foldingRangeKind != null) {
+      __result['foldingRangeKind'] = foldingRangeKind?.toJson();
+    }
+    if (foldingRange != null) {
+      __result['foldingRange'] = foldingRange?.toJson();
+    }
     return __result;
   }
 
@@ -15780,6 +18392,32 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('foldingRangeKind');
+      try {
+        final foldingRangeKind = obj['foldingRangeKind'];
+        if (foldingRangeKind != null &&
+            !(FoldingRangeClientCapabilitiesFoldingRangeKind.canParse(
+                foldingRangeKind, reporter))) {
+          reporter.reportError(
+              'must be of type FoldingRangeClientCapabilitiesFoldingRangeKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('foldingRange');
+      try {
+        final foldingRange = obj['foldingRange'];
+        if (foldingRange != null &&
+            !(FoldingRangeClientCapabilitiesFoldingRange.canParse(
+                foldingRange, reporter))) {
+          reporter.reportError(
+              'must be of type FoldingRangeClientCapabilitiesFoldingRange');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FoldingRangeClientCapabilities');
@@ -15794,6 +18432,8 @@
       return dynamicRegistration == other.dynamicRegistration &&
           rangeLimit == other.rangeLimit &&
           lineFoldingOnly == other.lineFoldingOnly &&
+          foldingRangeKind == other.foldingRangeKind &&
+          foldingRange == other.foldingRange &&
           true;
     }
     return false;
@@ -15804,13 +18444,156 @@
         dynamicRegistration,
         rangeLimit,
         lineFoldingOnly,
+        foldingRangeKind,
+        foldingRange,
       );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Enum of known range kinds
+class FoldingRangeClientCapabilitiesFoldingRange implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    FoldingRangeClientCapabilitiesFoldingRange.canParse,
+    FoldingRangeClientCapabilitiesFoldingRange.fromJson,
+  );
+
+  FoldingRangeClientCapabilitiesFoldingRange({
+    this.collapsedText,
+  });
+  static FoldingRangeClientCapabilitiesFoldingRange fromJson(
+      Map<String, Object?> json) {
+    final collapsedTextJson = json['collapsedText'];
+    final collapsedText = collapsedTextJson as bool?;
+    return FoldingRangeClientCapabilitiesFoldingRange(
+      collapsedText: collapsedText,
+    );
+  }
+
+  /// If set, the client signals that it supports setting collapsedText on
+  /// folding ranges to display custom labels instead of the default text.
+  ///  @since 3.17.0
+  final bool? collapsedText;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (collapsedText != null) {
+      __result['collapsedText'] = collapsedText;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('collapsedText');
+      try {
+        final collapsedText = obj['collapsedText'];
+        if (collapsedText != null && !(collapsedText is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type FoldingRangeClientCapabilitiesFoldingRange');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is FoldingRangeClientCapabilitiesFoldingRange &&
+        other.runtimeType == FoldingRangeClientCapabilitiesFoldingRange) {
+      return collapsedText == other.collapsedText && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => collapsedText.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class FoldingRangeClientCapabilitiesFoldingRangeKind implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    FoldingRangeClientCapabilitiesFoldingRangeKind.canParse,
+    FoldingRangeClientCapabilitiesFoldingRangeKind.fromJson,
+  );
+
+  FoldingRangeClientCapabilitiesFoldingRangeKind({
+    this.valueSet,
+  });
+  static FoldingRangeClientCapabilitiesFoldingRangeKind fromJson(
+      Map<String, Object?> json) {
+    final valueSetJson = json['valueSet'];
+    final valueSet = (valueSetJson as List<Object?>?)
+        ?.map((item) => FoldingRangeKind.fromJson(item as String))
+        .toList();
+    return FoldingRangeClientCapabilitiesFoldingRangeKind(
+      valueSet: valueSet,
+    );
+  }
+
+  /// The folding range 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<FoldingRangeKind>? valueSet;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (valueSet != null) {
+      __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 {
+        final valueSet = obj['valueSet'];
+        if (valueSet != null &&
+            !((valueSet is List<Object?> &&
+                (valueSet.every(
+                    (item) => FoldingRangeKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<FoldingRangeKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type FoldingRangeClientCapabilitiesFoldingRangeKind');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is FoldingRangeClientCapabilitiesFoldingRangeKind &&
+        other.runtimeType == FoldingRangeClientCapabilitiesFoldingRangeKind) {
+      return listEqual(valueSet, other.valueSet,
+              (FoldingRangeKind a, FoldingRangeKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(valueSet);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A set of predefined range kinds.
 class FoldingRangeKind {
   const FoldingRangeKind(this._value);
   const FoldingRangeKind.fromJson(this._value);
@@ -16332,6 +19115,147 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// A diagnostic report with a full set of problems.
+///  @since 3.17.0
+class FullDocumentDiagnosticReport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    FullDocumentDiagnosticReport.canParse,
+    FullDocumentDiagnosticReport.fromJson,
+  );
+
+  FullDocumentDiagnosticReport({
+    this.kind = 'full',
+    this.resultId,
+    required this.items,
+  }) {
+    if (kind != 'full') {
+      throw 'kind may only be the literal \'full\'';
+    }
+  }
+  static FullDocumentDiagnosticReport fromJson(Map<String, Object?> json) {
+    if (RelatedFullDocumentDiagnosticReport.canParse(
+        json, nullLspJsonReporter)) {
+      return RelatedFullDocumentDiagnosticReport.fromJson(json);
+    }
+    if (WorkspaceFullDocumentDiagnosticReport.canParse(
+        json, nullLspJsonReporter)) {
+      return WorkspaceFullDocumentDiagnosticReport.fromJson(json);
+    }
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String?;
+    final itemsJson = json['items'];
+    final items = (itemsJson as List<Object?>)
+        .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
+        .toList();
+    return FullDocumentDiagnosticReport(
+      kind: kind,
+      resultId: resultId,
+      items: items,
+    );
+  }
+
+  /// The actual items.
+  final List<Diagnostic> items;
+
+  /// A full document diagnostic report.
+  final String kind;
+
+  /// An optional result id. If provided it will be sent on the next diagnostic
+  /// request for the same document.
+  final String? resultId;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['kind'] = kind;
+    if (resultId != null) {
+      __result['resultId'] = resultId;
+    }
+    __result['items'] = items.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind == 'full')) {
+          reporter.reportError('must be the literal \'full\'');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('resultId');
+      try {
+        final resultId = obj['resultId'];
+        if (resultId != null && !(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('items');
+      try {
+        if (!obj.containsKey('items')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final items = obj['items'];
+        if (items == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((items is List<Object?> &&
+            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Diagnostic>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type FullDocumentDiagnosticReport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is FullDocumentDiagnosticReport &&
+        other.runtimeType == FullDocumentDiagnosticReport) {
+      return kind == other.kind &&
+          resultId == other.resultId &&
+          listEqual(
+              items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        kind,
+        resultId,
+        lspHashCode(items),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// The result of a hover request.
 class Hover implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -16457,9 +19381,9 @@
     );
   }
 
-  /// Client supports the following content formats if the content property
-  /// refers to a `literal of type MarkupContent`. The order describes the
-  /// preferred format of the client.
+  /// Client supports the follow content formats if the content property refers
+  /// to a `literal of type MarkupContent`. The order describes the preferred
+  /// format of the client.
   final List<MarkupKind>? contentFormat;
 
   /// Whether hover supports dynamic registration.
@@ -16725,6 +19649,101 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class HoverParamsPosition implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    HoverParamsPosition.canParse,
+    HoverParamsPosition.fromJson,
+  );
+
+  HoverParamsPosition({
+    required this.line,
+    required this.character,
+  });
+  static HoverParamsPosition fromJson(Map<String, Object?> json) {
+    final lineJson = json['line'];
+    final line = lineJson as int;
+    final characterJson = json['character'];
+    final character = characterJson as int;
+    return HoverParamsPosition(
+      line: line,
+      character: character,
+    );
+  }
+
+  final int character;
+  final int line;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['line'] = line;
+    __result['character'] = character;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      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();
+      }
+      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();
+      }
+      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 line == other.line && character == other.character && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        line,
+        character,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class HoverRegistrationOptions
     implements TextDocumentRegistrationOptions, HoverOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -16821,6 +19840,73 @@
   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,
@@ -17265,6 +20351,28 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// Known error codes for an `InitializeErrorCodes`;
+class InitializeErrorCodes {
+  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,
@@ -17889,6 +20997,1988 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// Inlay hint information.
+///  @since 3.17.0
+class InlayHint implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHint.canParse,
+    InlayHint.fromJson,
+  );
+
+  InlayHint({
+    required this.position,
+    required this.label,
+    this.kind,
+    this.textEdits,
+    this.tooltip,
+    this.paddingLeft,
+    this.paddingRight,
+    this.data,
+  });
+  static InlayHint fromJson(Map<String, Object?> json) {
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final labelJson = json['label'];
+    final label = labelJson is String
+        ? Either2<String, List<InlayHintLabelPart>>.t1(labelJson)
+        : ((labelJson is List<Object?> &&
+                (labelJson.every((item) =>
+                    InlayHintLabelPart.canParse(item, nullLspJsonReporter))))
+            ? Either2<String, List<InlayHintLabelPart>>.t2((labelJson)
+                .map((item) =>
+                    InlayHintLabelPart.fromJson(item as Map<String, Object?>))
+                .toList())
+            : (throw '''$labelJson was not one of (String, List<InlayHintLabelPart>)'''));
+    final kindJson = json['kind'];
+    final kind =
+        kindJson != null ? InlayHintKind.fromJson(kindJson as int) : null;
+    final textEditsJson = json['textEdits'];
+    final textEdits = (textEditsJson as List<Object?>?)
+        ?.map((item) => TextEdit.fromJson(item as Map<String, Object?>))
+        .toList();
+    final tooltipJson = json['tooltip'];
+    final tooltip = tooltipJson == null
+        ? null
+        : (tooltipJson is String
+            ? Either2<String, MarkupContent>.t1(tooltipJson)
+            : (MarkupContent.canParse(tooltipJson, nullLspJsonReporter)
+                ? Either2<String, MarkupContent>.t2(
+                    MarkupContent.fromJson(tooltipJson as Map<String, Object?>))
+                : (throw '''$tooltipJson was not one of (String, MarkupContent)''')));
+    final paddingLeftJson = json['paddingLeft'];
+    final paddingLeft = paddingLeftJson as bool?;
+    final paddingRightJson = json['paddingRight'];
+    final paddingRight = paddingRightJson as bool?;
+    final dataJson = json['data'];
+    final data = dataJson;
+    return InlayHint(
+      position: position,
+      label: label,
+      kind: kind,
+      textEdits: textEdits,
+      tooltip: tooltip,
+      paddingLeft: paddingLeft,
+      paddingRight: paddingRight,
+      data: data,
+    );
+  }
+
+  /// A data entry field that is preserved on a inlay hint between a
+  /// `textDocument/inlayHint` and a `inlayHint/resolve` request.
+  final Object? data;
+
+  /// The kind of this hint. Can be omitted in which case the client should fall
+  /// back to a reasonable default.
+  final InlayHintKind? kind;
+
+  /// The label of this hint. A human readable string or an array of
+  /// InlayHintLabelPart label parts.
+  ///
+  /// *Note* that neither the string nor the label part can be empty.
+  final Either2<String, List<InlayHintLabelPart>> label;
+
+  /// Render padding before the hint.
+  ///
+  /// Note: Padding should use the editor's background color, not the background
+  /// color of the hint itself. That means padding can be used to visually
+  /// align/separate an inlay hint.
+  final bool? paddingLeft;
+
+  /// Render padding after the hint.
+  ///
+  /// Note: Padding should use the editor's background color, not the background
+  /// color of the hint itself. That means padding can be used to visually
+  /// align/separate an inlay hint.
+  final bool? paddingRight;
+
+  /// The position of this hint.
+  final Position position;
+
+  /// Optional text edits that are performed when accepting this inlay hint.
+  ///
+  /// *Note* that edits are expected to change the document so that the inlay
+  /// hint (or its nearest variant) is now part of the document and the inlay
+  /// hint itself is now obsolete.
+  ///
+  /// Depending on the client capability `inlayHint.resolveSupport` clients
+  /// might resolve this property late using the resolve request.
+  final List<TextEdit>? textEdits;
+
+  /// The tooltip text when you hover over this item.
+  ///
+  /// Depending on the client capability `inlayHint.resolveSupport` clients
+  /// might resolve this property late using the resolve request.
+  final Either2<String, MarkupContent>? tooltip;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['position'] = position.toJson();
+    __result['label'] = label;
+    if (kind != null) {
+      __result['kind'] = kind?.toJson();
+    }
+    if (textEdits != null) {
+      __result['textEdits'] = textEdits?.map((item) => item.toJson()).toList();
+    }
+    if (tooltip != null) {
+      __result['tooltip'] = tooltip;
+    }
+    if (paddingLeft != null) {
+      __result['paddingLeft'] = paddingLeft;
+    }
+    if (paddingRight != null) {
+      __result['paddingRight'] = paddingRight;
+    }
+    if (data != null) {
+      __result['data'] = data;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('position');
+      try {
+        if (!obj.containsKey('position')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final position = obj['position'];
+        if (position == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(position, reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('label');
+      try {
+        if (!obj.containsKey('label')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final label = obj['label'];
+        if (label == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((label is String ||
+            (label is List<Object?> &&
+                (label.every((item) =>
+                    InlayHintLabelPart.canParse(item, reporter))))))) {
+          reporter.reportError(
+              'must be of type Either2<String, List<InlayHintLabelPart>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        final kind = obj['kind'];
+        if (kind != null && !(InlayHintKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type InlayHintKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('textEdits');
+      try {
+        final textEdits = obj['textEdits'];
+        if (textEdits != null &&
+            !((textEdits is List<Object?> &&
+                (textEdits
+                    .every((item) => TextEdit.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextEdit>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tooltip');
+      try {
+        final tooltip = obj['tooltip'];
+        if (tooltip != null &&
+            !((tooltip is String ||
+                MarkupContent.canParse(tooltip, reporter)))) {
+          reporter
+              .reportError('must be of type Either2<String, MarkupContent>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('paddingLeft');
+      try {
+        final paddingLeft = obj['paddingLeft'];
+        if (paddingLeft != null && !(paddingLeft is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('paddingRight');
+      try {
+        final paddingRight = obj['paddingRight'];
+        if (paddingRight != null && !(paddingRight is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlayHint');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHint && other.runtimeType == InlayHint) {
+      return position == other.position &&
+          label == other.label &&
+          kind == other.kind &&
+          listEqual(
+              textEdits, other.textEdits, (TextEdit a, TextEdit b) => a == b) &&
+          tooltip == other.tooltip &&
+          paddingLeft == other.paddingLeft &&
+          paddingRight == other.paddingRight &&
+          data == other.data &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        position,
+        label,
+        kind,
+        lspHashCode(textEdits),
+        tooltip,
+        paddingLeft,
+        paddingRight,
+        data,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Inlay hint client capabilities.
+///  @since 3.17.0
+class InlayHintClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHintClientCapabilities.canParse,
+    InlayHintClientCapabilities.fromJson,
+  );
+
+  InlayHintClientCapabilities({
+    this.dynamicRegistration,
+    this.resolveSupport,
+  });
+  static InlayHintClientCapabilities fromJson(Map<String, Object?> json) {
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final resolveSupportJson = json['resolveSupport'];
+    final resolveSupport = resolveSupportJson != null
+        ? InlayHintClientCapabilitiesResolveSupport.fromJson(
+            resolveSupportJson as Map<String, Object?>)
+        : null;
+    return InlayHintClientCapabilities(
+      dynamicRegistration: dynamicRegistration,
+      resolveSupport: resolveSupport,
+    );
+  }
+
+  /// Whether inlay hints support dynamic registration.
+  final bool? dynamicRegistration;
+
+  /// Indicates which properties a client can resolve lazily on a inlay hint.
+  final InlayHintClientCapabilitiesResolveSupport? resolveSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (resolveSupport != null) {
+      __result['resolveSupport'] = resolveSupport?.toJson();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      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('resolveSupport');
+      try {
+        final resolveSupport = obj['resolveSupport'];
+        if (resolveSupport != null &&
+            !(InlayHintClientCapabilitiesResolveSupport.canParse(
+                resolveSupport, reporter))) {
+          reporter.reportError(
+              'must be of type InlayHintClientCapabilitiesResolveSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlayHintClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHintClientCapabilities &&
+        other.runtimeType == InlayHintClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          resolveSupport == other.resolveSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        dynamicRegistration,
+        resolveSupport,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class InlayHintClientCapabilitiesResolveSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHintClientCapabilitiesResolveSupport.canParse,
+    InlayHintClientCapabilitiesResolveSupport.fromJson,
+  );
+
+  InlayHintClientCapabilitiesResolveSupport({
+    required this.properties,
+  });
+  static InlayHintClientCapabilitiesResolveSupport fromJson(
+      Map<String, Object?> json) {
+    final propertiesJson = json['properties'];
+    final properties = (propertiesJson as List<Object?>)
+        .map((item) => item as String)
+        .toList();
+    return InlayHintClientCapabilitiesResolveSupport(
+      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 InlayHintClientCapabilitiesResolveSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHintClientCapabilitiesResolveSupport &&
+        other.runtimeType == InlayHintClientCapabilitiesResolveSupport) {
+      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());
+}
+
+/// Inlay hint kinds.
+///  @since 3.17.0
+class InlayHintKind {
+  const InlayHintKind(this._value);
+  const InlayHintKind.fromJson(this._value);
+
+  final int _value;
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    return obj is int;
+  }
+
+  /// An inlay hint that for a type annotation.
+  static const Type = InlayHintKind(1);
+
+  /// An inlay hint that is for a parameter.
+  static const Parameter = InlayHintKind(2);
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  int get hashCode => _value.hashCode;
+
+  bool operator ==(Object o) => o is InlayHintKind && o._value == _value;
+}
+
+/// An inlay hint label part allows for interactive and composite labels of
+/// inlay hints.
+///  @since 3.17.0
+class InlayHintLabelPart implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHintLabelPart.canParse,
+    InlayHintLabelPart.fromJson,
+  );
+
+  InlayHintLabelPart({
+    required this.value,
+    this.tooltip,
+    this.location,
+    this.command,
+  });
+  static InlayHintLabelPart fromJson(Map<String, Object?> json) {
+    final valueJson = json['value'];
+    final value = valueJson as String;
+    final tooltipJson = json['tooltip'];
+    final tooltip = tooltipJson == null
+        ? null
+        : (tooltipJson is String
+            ? Either2<String, MarkupContent>.t1(tooltipJson)
+            : (MarkupContent.canParse(tooltipJson, nullLspJsonReporter)
+                ? Either2<String, MarkupContent>.t2(
+                    MarkupContent.fromJson(tooltipJson as Map<String, Object?>))
+                : (throw '''$tooltipJson was not one of (String, MarkupContent)''')));
+    final locationJson = json['location'];
+    final location = locationJson != null
+        ? Location.fromJson(locationJson as Map<String, Object?>)
+        : null;
+    final commandJson = json['command'];
+    final command = commandJson != null
+        ? Command.fromJson(commandJson as Map<String, Object?>)
+        : null;
+    return InlayHintLabelPart(
+      value: value,
+      tooltip: tooltip,
+      location: location,
+      command: command,
+    );
+  }
+
+  /// An optional command for this label part.
+  ///
+  /// Depending on the client capability `inlayHint.resolveSupport` clients
+  /// might resolve this property late using the resolve request.
+  final Command? command;
+
+  /// An optional source code location that represents this label part.
+  ///
+  /// The editor will use this location for the hover and for code navigation
+  /// features: This part will become a clickable link that resolves to the
+  /// definition of the symbol at the given location (not necessarily the
+  /// location itself), it shows the hover that shows at the given location, and
+  /// it shows a context menu with further code navigation commands.
+  ///
+  /// Depending on the client capability `inlayHint.resolveSupport` clients
+  /// might resolve this property late using the resolve request.
+  final Location? location;
+
+  /// The tooltip text when you hover over this label part. Depending on the
+  /// client capability `inlayHint.resolveSupport` clients might resolve this
+  /// property late using the resolve request.
+  final Either2<String, MarkupContent>? tooltip;
+
+  /// The value of this label part.
+  final String value;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['value'] = value;
+    if (tooltip != null) {
+      __result['tooltip'] = tooltip;
+    }
+    if (location != null) {
+      __result['location'] = location?.toJson();
+    }
+    if (command != null) {
+      __result['command'] = command?.toJson();
+    }
+    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();
+      }
+      reporter.push('tooltip');
+      try {
+        final tooltip = obj['tooltip'];
+        if (tooltip != null &&
+            !((tooltip is String ||
+                MarkupContent.canParse(tooltip, reporter)))) {
+          reporter
+              .reportError('must be of type Either2<String, MarkupContent>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('location');
+      try {
+        final location = obj['location'];
+        if (location != null && !(Location.canParse(location, reporter))) {
+          reporter.reportError('must be of type Location');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('command');
+      try {
+        final command = obj['command'];
+        if (command != null && !(Command.canParse(command, reporter))) {
+          reporter.reportError('must be of type Command');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlayHintLabelPart');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHintLabelPart &&
+        other.runtimeType == InlayHintLabelPart) {
+      return value == other.value &&
+          tooltip == other.tooltip &&
+          location == other.location &&
+          command == other.command &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        value,
+        tooltip,
+        location,
+        command,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Inlay hint options used during static registration.
+///  @since 3.17.0
+class InlayHintOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHintOptions.canParse,
+    InlayHintOptions.fromJson,
+  );
+
+  InlayHintOptions({
+    this.resolveProvider,
+    this.workDoneProgress,
+  });
+  static InlayHintOptions fromJson(Map<String, Object?> json) {
+    if (InlayHintRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return InlayHintRegistrationOptions.fromJson(json);
+    }
+    final resolveProviderJson = json['resolveProvider'];
+    final resolveProvider = resolveProviderJson as bool?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    return InlayHintOptions(
+      resolveProvider: resolveProvider,
+      workDoneProgress: workDoneProgress,
+    );
+  }
+
+  /// The server provides support to resolve additional information for an inlay
+  /// hint item.
+  final bool? resolveProvider;
+  final bool? workDoneProgress;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (resolveProvider != null) {
+      __result['resolveProvider'] = resolveProvider;
+    }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('resolveProvider');
+      try {
+        final resolveProvider = obj['resolveProvider'];
+        if (resolveProvider != null && !(resolveProvider is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlayHintOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHintOptions && other.runtimeType == InlayHintOptions) {
+      return resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        resolveProvider,
+        workDoneProgress,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A parameter literal used in inlay hint requests.
+///  @since 3.17.0
+class InlayHintParams implements WorkDoneProgressParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHintParams.canParse,
+    InlayHintParams.fromJson,
+  );
+
+  InlayHintParams({
+    required this.textDocument,
+    required this.range,
+    this.workDoneToken,
+  });
+  static InlayHintParams fromJson(Map<String, Object?> json) {
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    return InlayHintParams(
+      textDocument: textDocument,
+      range: range,
+      workDoneToken: workDoneToken,
+    );
+  }
+
+  /// The visible document range for which inlay hints should be computed.
+  final Range range;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<int, String>? workDoneToken;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['textDocument'] = textDocument.toJson();
+    __result['range'] = range.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlayHintParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHintParams && other.runtimeType == InlayHintParams) {
+      return textDocument == other.textDocument &&
+          range == other.range &&
+          workDoneToken == other.workDoneToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        textDocument,
+        range,
+        workDoneToken,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Inlay hint options used during static or dynamic registration.
+///  @since 3.17.0
+class InlayHintRegistrationOptions
+    implements
+        InlayHintOptions,
+        TextDocumentRegistrationOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHintRegistrationOptions.canParse,
+    InlayHintRegistrationOptions.fromJson,
+  );
+
+  InlayHintRegistrationOptions({
+    this.resolveProvider,
+    this.workDoneProgress,
+    this.documentSelector,
+    this.id,
+  });
+  static InlayHintRegistrationOptions fromJson(Map<String, Object?> json) {
+    final resolveProviderJson = json['resolveProvider'];
+    final resolveProvider = resolveProviderJson as bool?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    final documentSelectorJson = json['documentSelector'];
+    final documentSelector = (documentSelectorJson as List<Object?>?)
+        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        .toList();
+    final idJson = json['id'];
+    final id = idJson as String?;
+    return InlayHintRegistrationOptions(
+      resolveProvider: resolveProvider,
+      workDoneProgress: workDoneProgress,
+      documentSelector: documentSelector,
+      id: id,
+    );
+  }
+
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
+  final List<DocumentFilter>? documentSelector;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String? id;
+
+  /// The server provides support to resolve additional information for an inlay
+  /// hint item.
+  final bool? resolveProvider;
+  final bool? workDoneProgress;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (resolveProvider != null) {
+      __result['resolveProvider'] = resolveProvider;
+    }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    __result['documentSelector'] = documentSelector;
+    if (id != null) {
+      __result['id'] = id;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('resolveProvider');
+      try {
+        final resolveProvider = obj['resolveProvider'];
+        if (resolveProvider != null && !(resolveProvider is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final documentSelector = obj['documentSelector'];
+        if (documentSelector != null &&
+            !((documentSelector is List<Object?> &&
+                (documentSelector.every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlayHintRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHintRegistrationOptions &&
+        other.runtimeType == InlayHintRegistrationOptions) {
+      return resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
+          listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        resolveProvider,
+        workDoneProgress,
+        lspHashCode(documentSelector),
+        id,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Client workspace capabilities specific to inlay hints.
+///  @since 3.17.0
+class InlayHintWorkspaceClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlayHintWorkspaceClientCapabilities.canParse,
+    InlayHintWorkspaceClientCapabilities.fromJson,
+  );
+
+  InlayHintWorkspaceClientCapabilities({
+    this.refreshSupport,
+  });
+  static InlayHintWorkspaceClientCapabilities fromJson(
+      Map<String, Object?> json) {
+    final refreshSupportJson = json['refreshSupport'];
+    final refreshSupport = refreshSupportJson as bool?;
+    return InlayHintWorkspaceClientCapabilities(
+      refreshSupport: refreshSupport,
+    );
+  }
+
+  /// Whether the client implementation supports a refresh request sent from the
+  /// server to the client.
+  ///
+  /// Note that this event is global and will force the client to refresh all
+  /// inlay hints currently shown. It should be used with absolute care and is
+  /// useful for situation where a server for example detects a project wide
+  /// change that requires such a calculation.
+  final bool? refreshSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (refreshSupport != null) {
+      __result['refreshSupport'] = refreshSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('refreshSupport');
+      try {
+        final refreshSupport = obj['refreshSupport'];
+        if (refreshSupport != null && !(refreshSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type InlayHintWorkspaceClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlayHintWorkspaceClientCapabilities &&
+        other.runtimeType == InlayHintWorkspaceClientCapabilities) {
+      return refreshSupport == other.refreshSupport && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => refreshSupport.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Client capabilities specific to inline values.
+///  @since 3.17.0
+class InlineValueClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueClientCapabilities.canParse,
+    InlineValueClientCapabilities.fromJson,
+  );
+
+  InlineValueClientCapabilities({
+    this.dynamicRegistration,
+  });
+  static InlineValueClientCapabilities fromJson(Map<String, Object?> json) {
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    return InlineValueClientCapabilities(
+      dynamicRegistration: dynamicRegistration,
+    );
+  }
+
+  /// Whether implementation supports dynamic registration for inline value
+  /// providers.
+  final bool? dynamicRegistration;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      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();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueClientCapabilities &&
+        other.runtimeType == InlineValueClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => dynamicRegistration.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// @since 3.17.0
+class InlineValueContext implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueContext.canParse,
+    InlineValueContext.fromJson,
+  );
+
+  InlineValueContext({
+    required this.stoppedLocation,
+  });
+  static InlineValueContext fromJson(Map<String, Object?> json) {
+    final stoppedLocationJson = json['stoppedLocation'];
+    final stoppedLocation =
+        Range.fromJson(stoppedLocationJson as Map<String, Object?>);
+    return InlineValueContext(
+      stoppedLocation: stoppedLocation,
+    );
+  }
+
+  /// 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['stoppedLocation'] = stoppedLocation.toJson();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('stoppedLocation');
+      try {
+        if (!obj.containsKey('stoppedLocation')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final stoppedLocation = obj['stoppedLocation'];
+        if (stoppedLocation == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(stoppedLocation, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueContext');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueContext &&
+        other.runtimeType == InlineValueContext) {
+      return stoppedLocation == other.stoppedLocation && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => stoppedLocation.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Provide an inline value through an expression evaluation.
+///
+/// If only a range is specified, the expression will be extracted from the
+/// underlying document.
+///
+/// An optional expression can be used to override the extracted expression.
+///  @since 3.17.0
+class InlineValueEvaluatableExpression implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueEvaluatableExpression.canParse,
+    InlineValueEvaluatableExpression.fromJson,
+  );
+
+  InlineValueEvaluatableExpression({
+    required this.range,
+    this.expression,
+  });
+  static InlineValueEvaluatableExpression fromJson(Map<String, Object?> json) {
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final expressionJson = json['expression'];
+    final expression = expressionJson as String?;
+    return InlineValueEvaluatableExpression(
+      range: range,
+      expression: expression,
+    );
+  }
+
+  /// If specified the expression overrides the extracted expression.
+  final String? expression;
+
+  /// The document range for which the inline value applies. The range is used
+  /// to extract the evaluatable expression from the underlying document.
+  final Range range;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['range'] = range.toJson();
+    if (expression != null) {
+      __result['expression'] = expression;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('expression');
+      try {
+        final expression = obj['expression'];
+        if (expression != null && !(expression is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueEvaluatableExpression');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueEvaluatableExpression &&
+        other.runtimeType == InlineValueEvaluatableExpression) {
+      return range == other.range && expression == other.expression && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        range,
+        expression,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Inline value options used during static registration.
+///  @since 3.17.0
+class InlineValueOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueOptions.canParse,
+    InlineValueOptions.fromJson,
+  );
+
+  InlineValueOptions({
+    this.workDoneProgress,
+  });
+  static InlineValueOptions fromJson(Map<String, Object?> json) {
+    if (InlineValueRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return InlineValueRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    return InlineValueOptions(
+      workDoneProgress: workDoneProgress,
+    );
+  }
+
+  final bool? workDoneProgress;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueOptions &&
+        other.runtimeType == InlineValueOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => workDoneProgress.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A parameter literal used in inline value requests.
+///  @since 3.17.0
+class InlineValueParams implements WorkDoneProgressParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueParams.canParse,
+    InlineValueParams.fromJson,
+  );
+
+  InlineValueParams({
+    required this.textDocument,
+    required this.range,
+    required this.context,
+    this.workDoneToken,
+  });
+  static InlineValueParams fromJson(Map<String, Object?> json) {
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final contextJson = json['context'];
+    final context =
+        InlineValueContext.fromJson(contextJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    return InlineValueParams(
+      textDocument: textDocument,
+      range: range,
+      context: context,
+      workDoneToken: workDoneToken,
+    );
+  }
+
+  /// Additional information about the context in which inline values were
+  /// requested.
+  final InlineValueContext context;
+
+  /// The document range for which inline values should be computed.
+  final Range range;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<int, String>? workDoneToken;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['textDocument'] = textDocument.toJson();
+    __result['range'] = range.toJson();
+    __result['context'] = context.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('context');
+      try {
+        if (!obj.containsKey('context')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final context = obj['context'];
+        if (context == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(InlineValueContext.canParse(context, reporter))) {
+          reporter.reportError('must be of type InlineValueContext');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueParams && other.runtimeType == InlineValueParams) {
+      return textDocument == other.textDocument &&
+          range == other.range &&
+          context == other.context &&
+          workDoneToken == other.workDoneToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        textDocument,
+        range,
+        context,
+        workDoneToken,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Inline value options used during static or dynamic registration.
+///  @since 3.17.0
+class InlineValueRegistrationOptions
+    implements
+        InlineValueOptions,
+        TextDocumentRegistrationOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueRegistrationOptions.canParse,
+    InlineValueRegistrationOptions.fromJson,
+  );
+
+  InlineValueRegistrationOptions({
+    this.workDoneProgress,
+    this.documentSelector,
+    this.id,
+  });
+  static InlineValueRegistrationOptions fromJson(Map<String, Object?> json) {
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    final documentSelectorJson = json['documentSelector'];
+    final documentSelector = (documentSelectorJson as List<Object?>?)
+        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        .toList();
+    final idJson = json['id'];
+    final id = idJson as String?;
+    return InlineValueRegistrationOptions(
+      workDoneProgress: workDoneProgress,
+      documentSelector: documentSelector,
+      id: id,
+    );
+  }
+
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
+  final List<DocumentFilter>? documentSelector;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String? id;
+  final bool? workDoneProgress;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    __result['documentSelector'] = documentSelector;
+    if (id != null) {
+      __result['id'] = id;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final documentSelector = obj['documentSelector'];
+        if (documentSelector != null &&
+            !((documentSelector is List<Object?> &&
+                (documentSelector.every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueRegistrationOptions &&
+        other.runtimeType == InlineValueRegistrationOptions) {
+      return workDoneProgress == other.workDoneProgress &&
+          listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        workDoneProgress,
+        lspHashCode(documentSelector),
+        id,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Provide inline value as text.
+///  @since 3.17.0
+class InlineValueText implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueText.canParse,
+    InlineValueText.fromJson,
+  );
+
+  InlineValueText({
+    required this.range,
+    required this.text,
+  });
+  static InlineValueText fromJson(Map<String, Object?> json) {
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final textJson = json['text'];
+    final text = textJson as String;
+    return InlineValueText(
+      range: range,
+      text: text,
+    );
+  }
+
+  /// The document range for which the inline value applies.
+  final Range range;
+
+  /// The text of the inline value.
+  final String text;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['range'] = range.toJson();
+    __result['text'] = text;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('text');
+      try {
+        if (!obj.containsKey('text')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final text = obj['text'];
+        if (text == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(text is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueText');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueText && other.runtimeType == InlineValueText) {
+      return range == other.range && text == other.text && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        range,
+        text,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Provide inline value through a variable lookup.
+///
+/// If only a range is specified, the variable name will be extracted from the
+/// underlying document.
+///
+/// An optional variable name can be used to override the extracted name.
+///  @since 3.17.0
+class InlineValueVariableLookup implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueVariableLookup.canParse,
+    InlineValueVariableLookup.fromJson,
+  );
+
+  InlineValueVariableLookup({
+    required this.range,
+    this.variableName,
+    required this.caseSensitiveLookup,
+  });
+  static InlineValueVariableLookup fromJson(Map<String, Object?> json) {
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final variableNameJson = json['variableName'];
+    final variableName = variableNameJson as String?;
+    final caseSensitiveLookupJson = json['caseSensitiveLookup'];
+    final caseSensitiveLookup = caseSensitiveLookupJson as bool;
+    return InlineValueVariableLookup(
+      range: range,
+      variableName: variableName,
+      caseSensitiveLookup: caseSensitiveLookup,
+    );
+  }
+
+  /// How to perform the lookup.
+  final bool caseSensitiveLookup;
+
+  /// The document range for which the inline value applies. The range is used
+  /// to extract the variable name from the underlying document.
+  final Range range;
+
+  /// If specified the name of the variable to look up.
+  final String? variableName;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['range'] = range.toJson();
+    if (variableName != null) {
+      __result['variableName'] = variableName;
+    }
+    __result['caseSensitiveLookup'] = caseSensitiveLookup;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('variableName');
+      try {
+        final variableName = obj['variableName'];
+        if (variableName != null && !(variableName is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('caseSensitiveLookup');
+      try {
+        if (!obj.containsKey('caseSensitiveLookup')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final caseSensitiveLookup = obj['caseSensitiveLookup'];
+        if (caseSensitiveLookup == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(caseSensitiveLookup is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InlineValueVariableLookup');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueVariableLookup &&
+        other.runtimeType == InlineValueVariableLookup) {
+      return range == other.range &&
+          variableName == other.variableName &&
+          caseSensitiveLookup == other.caseSensitiveLookup &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        range,
+        variableName,
+        caseSensitiveLookup,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Client workspace capabilities specific to inline values.
+///  @since 3.17.0
+class InlineValueWorkspaceClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    InlineValueWorkspaceClientCapabilities.canParse,
+    InlineValueWorkspaceClientCapabilities.fromJson,
+  );
+
+  InlineValueWorkspaceClientCapabilities({
+    this.refreshSupport,
+  });
+  static InlineValueWorkspaceClientCapabilities fromJson(
+      Map<String, Object?> json) {
+    final refreshSupportJson = json['refreshSupport'];
+    final refreshSupport = refreshSupportJson as bool?;
+    return InlineValueWorkspaceClientCapabilities(
+      refreshSupport: refreshSupport,
+    );
+  }
+
+  /// Whether the client implementation supports a refresh request sent from the
+  /// server to the client.
+  ///
+  /// Note that this event is global and will force the client to refresh all
+  /// inline values currently shown. It should be used with absolute care and is
+  /// useful for situation where a server for example detect a project wide
+  /// change that requires such a calculation.
+  final bool? refreshSupport;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (refreshSupport != null) {
+      __result['refreshSupport'] = refreshSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('refreshSupport');
+      try {
+        final refreshSupport = obj['refreshSupport'];
+        if (refreshSupport != null && !(refreshSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type InlineValueWorkspaceClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InlineValueWorkspaceClientCapabilities &&
+        other.runtimeType == InlineValueWorkspaceClientCapabilities) {
+      return refreshSupport == other.refreshSupport && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => refreshSupport.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// A special text edit to provide an insert and a replace operation.
 ///  @since 3.16.0
 class InsertReplaceEdit implements ToJsonable {
@@ -19040,18 +24130,28 @@
   MarkdownClientCapabilities({
     required this.parser,
     this.version,
+    this.allowedTags,
   });
   static MarkdownClientCapabilities fromJson(Map<String, Object?> json) {
     final parserJson = json['parser'];
     final parser = parserJson as String;
     final versionJson = json['version'];
     final version = versionJson as String?;
+    final allowedTagsJson = json['allowedTags'];
+    final allowedTags = (allowedTagsJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
     return MarkdownClientCapabilities(
       parser: parser,
       version: version,
+      allowedTags: allowedTags,
     );
   }
 
+  /// A list of HTML tags that the client allows / supports in Markdown.
+  ///  @since 3.17.0
+  final List<String>? allowedTags;
+
   /// The name of the parser.
   final String parser;
 
@@ -19064,6 +24164,9 @@
     if (version != null) {
       __result['version'] = version;
     }
+    if (allowedTags != null) {
+      __result['allowedTags'] = allowedTags;
+    }
     return __result;
   }
 
@@ -19097,6 +24200,18 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('allowedTags');
+      try {
+        final allowedTags = obj['allowedTags'];
+        if (allowedTags != null &&
+            !((allowedTags is List<Object?> &&
+                (allowedTags.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 MarkdownClientCapabilities');
@@ -19108,7 +24223,11 @@
   bool operator ==(Object other) {
     if (other is MarkdownClientCapabilities &&
         other.runtimeType == MarkdownClientCapabilities) {
-      return parser == other.parser && version == other.version && true;
+      return parser == other.parser &&
+          version == other.version &&
+          listEqual(
+              allowedTags, other.allowedTags, (String a, String b) => a == b) &&
+          true;
     }
     return false;
   }
@@ -19117,6 +24236,7 @@
   int get hashCode => Object.hash(
         parser,
         version,
+        lspHashCode(allowedTags),
       );
 
   @override
@@ -19500,41 +24620,6 @@
   /// Constant for the 'initialized' method.
   static const initialized = Method('initialized');
 
-  /// Constant for the 'shutdown' method.
-  static const shutdown = Method('shutdown');
-
-  /// Constant for the 'exit' method.
-  static const exit = Method('exit');
-
-  /// Constant for the '$/logTrace' method.
-  static const logTrace = Method(r'$/logTrace');
-
-  /// Constant for the '$/setTrace' method.
-  static const setTrace = Method(r'$/setTrace');
-
-  /// Constant for the 'window/showMessage' method.
-  static const window_showMessage = Method('window/showMessage');
-
-  /// Constant for the 'window/showMessageRequest' method.
-  static const window_showMessageRequest = Method('window/showMessageRequest');
-
-  /// Constant for the 'window/showDocument' method.
-  static const window_showDocument = Method('window/showDocument');
-
-  /// Constant for the 'window/logMessage' method.
-  static const window_logMessage = Method('window/logMessage');
-
-  /// Constant for the 'window/workDoneProgress/create' method.
-  static const window_workDoneProgress_create =
-      Method('window/workDoneProgress/create');
-
-  /// Constant for the 'window/workDoneProgress/cancel' method.
-  static const window_workDoneProgress_cancel =
-      Method('window/workDoneProgress/cancel');
-
-  /// Constant for the 'telemetry/event' method.
-  static const telemetry_event = Method('telemetry/event');
-
   /// Constant for the 'client/registerCapability' method.
   static const client_registerCapability = Method('client/registerCapability');
 
@@ -19542,51 +24627,17 @@
   static const client_unregisterCapability =
       Method('client/unregisterCapability');
 
-  /// Constant for the 'workspace/workspaceFolders' method.
-  static const workspace_workspaceFolders =
-      Method('workspace/workspaceFolders');
+  /// Constant for the '$/setTrace' method.
+  static const setTrace = Method(r'$/setTrace');
 
-  /// Constant for the 'workspace/didChangeWorkspaceFolders' method.
-  static const workspace_didChangeWorkspaceFolders =
-      Method('workspace/didChangeWorkspaceFolders');
+  /// Constant for the '$/logTrace' method.
+  static const logTrace = Method(r'$/logTrace');
 
-  /// Constant for the 'workspace/didChangeConfiguration' method.
-  static const workspace_didChangeConfiguration =
-      Method('workspace/didChangeConfiguration');
+  /// Constant for the 'shutdown' method.
+  static const shutdown = Method('shutdown');
 
-  /// Constant for the 'workspace/configuration' method.
-  static const workspace_configuration = Method('workspace/configuration');
-
-  /// Constant for the 'workspace/didChangeWatchedFiles' method.
-  static const workspace_didChangeWatchedFiles =
-      Method('workspace/didChangeWatchedFiles');
-
-  /// Constant for the 'workspace/symbol' method.
-  static const workspace_symbol = Method('workspace/symbol');
-
-  /// Constant for the 'workspace/executeCommand' method.
-  static const workspace_executeCommand = Method('workspace/executeCommand');
-
-  /// Constant for the 'workspace/applyEdit' method.
-  static const workspace_applyEdit = Method('workspace/applyEdit');
-
-  /// Constant for the 'workspace/willCreateFiles' method.
-  static const workspace_willCreateFiles = Method('workspace/willCreateFiles');
-
-  /// Constant for the 'workspace/didCreateFiles' method.
-  static const workspace_didCreateFiles = Method('workspace/didCreateFiles');
-
-  /// Constant for the 'workspace/willRenameFiles' method.
-  static const workspace_willRenameFiles = Method('workspace/willRenameFiles');
-
-  /// Constant for the 'workspace/didRenameFiles' method.
-  static const workspace_didRenameFiles = Method('workspace/didRenameFiles');
-
-  /// Constant for the 'workspace/willDeleteFiles' method.
-  static const workspace_willDeleteFiles = Method('workspace/willDeleteFiles');
-
-  /// Constant for the 'workspace/didDeleteFiles' method.
-  static const workspace_didDeleteFiles = Method('workspace/didDeleteFiles');
+  /// Constant for the 'exit' method.
+  static const exit = Method('exit');
 
   /// Constant for the 'textDocument/didOpen' method.
   static const textDocument_didOpen = Method('textDocument/didOpen');
@@ -19607,22 +24658,18 @@
   /// Constant for the 'textDocument/didClose' method.
   static const textDocument_didClose = Method('textDocument/didClose');
 
-  /// Constant for the 'textDocument/publishDiagnostics' method.
-  static const textDocument_publishDiagnostics =
-      Method('textDocument/publishDiagnostics');
+  /// Constant for the 'notebookDocument/didOpen' method.
+  static const notebookDocument_didOpen = Method('notebookDocument/didOpen');
 
-  /// Constant for the 'textDocument/completion' method.
-  static const textDocument_completion = Method('textDocument/completion');
+  /// Constant for the 'notebookDocument/didChange' method.
+  static const notebookDocument_didChange =
+      Method('notebookDocument/didChange');
 
-  /// Constant for the 'completionItem/resolve' method.
-  static const completionItem_resolve = Method('completionItem/resolve');
+  /// Constant for the 'notebookDocument/didSave' method.
+  static const notebookDocument_didSave = Method('notebookDocument/didSave');
 
-  /// Constant for the 'textDocument/hover' method.
-  static const textDocument_hover = Method('textDocument/hover');
-
-  /// Constant for the 'textDocument/signatureHelp' method.
-  static const textDocument_signatureHelp =
-      Method('textDocument/signatureHelp');
+  /// Constant for the 'notebookDocument/didClose' method.
+  static const notebookDocument_didClose = Method('notebookDocument/didClose');
 
   /// Constant for the 'textDocument/declaration' method.
   static const textDocument_declaration = Method('textDocument/declaration');
@@ -19641,19 +24688,40 @@
   /// Constant for the 'textDocument/references' method.
   static const textDocument_references = Method('textDocument/references');
 
+  /// Constant for the 'textDocument/prepareCallHierarchy' method.
+  static const textDocument_prepareCallHierarchy =
+      Method('textDocument/prepareCallHierarchy');
+
+  /// Constant for the 'callHierarchy/incomingCalls' method.
+  static const callHierarchy_incomingCalls =
+      Method('callHierarchy/incomingCalls');
+
+  /// Constant for the 'callHierarchy/outgoingCalls' method.
+  static const callHierarchy_outgoingCalls =
+      Method('callHierarchy/outgoingCalls');
+
+  /// Constant for the 'textDocument/prepareTypeHierarchy' method.
+  static const textDocument_prepareTypeHierarchy =
+      Method('textDocument/prepareTypeHierarchy');
+
+  /// Constant for the 'typeHierarchy/supertypes' method.
+  static const typeHierarchy_supertypes = Method('typeHierarchy/supertypes');
+
+  /// Constant for the 'typeHierarchy/subtypes' method.
+  static const typeHierarchy_subtypes = Method('typeHierarchy/subtypes');
+
   /// Constant for the 'textDocument/documentHighlight' method.
   static const textDocument_documentHighlight =
       Method('textDocument/documentHighlight');
 
-  /// Constant for the 'textDocument/documentSymbol' method.
-  static const textDocument_documentSymbol =
-      Method('textDocument/documentSymbol');
+  /// Constant for the 'textDocument/documentLink' method.
+  static const textDocument_documentLink = Method('textDocument/documentLink');
 
-  /// Constant for the 'textDocument/codeAction' method.
-  static const textDocument_codeAction = Method('textDocument/codeAction');
+  /// Constant for the 'documentLink/resolve' method.
+  static const documentLink_resolve = Method('documentLink/resolve');
 
-  /// Constant for the 'codeAction/resolve' method.
-  static const codeAction_resolve = Method('codeAction/resolve');
+  /// Constant for the 'textDocument/hover' method.
+  static const textDocument_hover = Method('textDocument/hover');
 
   /// Constant for the 'textDocument/codeLens' method.
   static const textDocument_codeLens = Method('textDocument/codeLens');
@@ -19665,11 +24733,76 @@
   static const workspace_codeLens_refresh =
       Method('workspace/codeLens/refresh');
 
-  /// Constant for the 'textDocument/documentLink' method.
-  static const textDocument_documentLink = Method('textDocument/documentLink');
+  /// Constant for the 'textDocument/foldingRange' method.
+  static const textDocument_foldingRange = Method('textDocument/foldingRange');
 
-  /// Constant for the 'documentLink/resolve' method.
-  static const documentLink_resolve = Method('documentLink/resolve');
+  /// Constant for the 'textDocument/selectionRange' method.
+  static const textDocument_selectionRange =
+      Method('textDocument/selectionRange');
+
+  /// Constant for the 'textDocument/documentSymbol' method.
+  static const textDocument_documentSymbol =
+      Method('textDocument/documentSymbol');
+
+  /// Constant for the 'textDocument/semanticTokens/full' method.
+  static const textDocument_semanticTokens_full =
+      Method('textDocument/semanticTokens/full');
+
+  /// Constant for the 'textDocument/semanticTokens/full/delta' method.
+  static const textDocument_semanticTokens_full_delta =
+      Method('textDocument/semanticTokens/full/delta');
+
+  /// Constant for the 'textDocument/semanticTokens/range' method.
+  static const textDocument_semanticTokens_range =
+      Method('textDocument/semanticTokens/range');
+
+  /// Constant for the 'workspace/semanticTokens/refresh' method.
+  static const workspace_semanticTokens_refresh =
+      Method('workspace/semanticTokens/refresh');
+
+  /// Constant for the 'textDocument/inlayHint' method.
+  static const textDocument_inlayHint = Method('textDocument/inlayHint');
+
+  /// Constant for the 'inlayHint/resolve' method.
+  static const inlayHint_resolve = Method('inlayHint/resolve');
+
+  /// Constant for the 'workspace/inlayHint/refresh' method.
+  static const workspace_inlayHint_refresh =
+      Method('workspace/inlayHint/refresh');
+
+  /// Constant for the 'textDocument/inlineValue' method.
+  static const textDocument_inlineValue = Method('textDocument/inlineValue');
+
+  /// Constant for the 'workspace/inlineValue/refresh' method.
+  static const workspace_inlineValue_refresh =
+      Method('workspace/inlineValue/refresh');
+
+  /// Constant for the 'textDocument/moniker' method.
+  static const textDocument_moniker = Method('textDocument/moniker');
+
+  /// Constant for the 'textDocument/completion' method.
+  static const textDocument_completion = Method('textDocument/completion');
+
+  /// Constant for the 'completionItem/resolve' method.
+  static const completionItem_resolve = Method('completionItem/resolve');
+
+  /// Constant for the 'textDocument/publishDiagnostics' method.
+  static const textDocument_publishDiagnostics =
+      Method('textDocument/publishDiagnostics');
+
+  /// Constant for the 'workspace/diagnostic/refresh' method.
+  static const workspace_diagnostic_refresh =
+      Method('workspace/diagnostic/refresh');
+
+  /// Constant for the 'textDocument/signatureHelp' method.
+  static const textDocument_signatureHelp =
+      Method('textDocument/signatureHelp');
+
+  /// Constant for the 'textDocument/codeAction' method.
+  static const textDocument_codeAction = Method('textDocument/codeAction');
+
+  /// Constant for the 'codeAction/resolve' method.
+  static const codeAction_resolve = Method('codeAction/resolve');
 
   /// Constant for the 'textDocument/documentColor' method.
   static const textDocument_documentColor =
@@ -19697,47 +24830,81 @@
   static const textDocument_prepareRename =
       Method('textDocument/prepareRename');
 
-  /// Constant for the 'textDocument/foldingRange' method.
-  static const textDocument_foldingRange = Method('textDocument/foldingRange');
-
-  /// Constant for the 'textDocument/selectionRange' method.
-  static const textDocument_selectionRange =
-      Method('textDocument/selectionRange');
-
-  /// Constant for the 'textDocument/prepareCallHierarchy' method.
-  static const textDocument_prepareCallHierarchy =
-      Method('textDocument/prepareCallHierarchy');
-
-  /// Constant for the 'callHierarchy/incomingCalls' method.
-  static const callHierarchy_incomingCalls =
-      Method('callHierarchy/incomingCalls');
-
-  /// Constant for the 'callHierarchy/outgoingCalls' method.
-  static const callHierarchy_outgoingCalls =
-      Method('callHierarchy/outgoingCalls');
-
-  /// Constant for the 'textDocument/semanticTokens/full' method.
-  static const textDocument_semanticTokens_full =
-      Method('textDocument/semanticTokens/full');
-
-  /// Constant for the 'textDocument/semanticTokens/full/delta' method.
-  static const textDocument_semanticTokens_full_delta =
-      Method('textDocument/semanticTokens/full/delta');
-
-  /// Constant for the 'textDocument/semanticTokens/range' method.
-  static const textDocument_semanticTokens_range =
-      Method('textDocument/semanticTokens/range');
-
-  /// Constant for the 'workspace/semanticTokens/refresh' method.
-  static const workspace_semanticTokens_refresh =
-      Method('workspace/semanticTokens/refresh');
-
   /// Constant for the 'textDocument/linkedEditingRange' method.
   static const textDocument_linkedEditingRange =
       Method('textDocument/linkedEditingRange');
 
-  /// Constant for the 'textDocument/moniker' method.
-  static const textDocument_moniker = Method('textDocument/moniker');
+  /// Constant for the 'workspace/symbol' method.
+  static const workspace_symbol = Method('workspace/symbol');
+
+  /// Constant for the 'workspaceSymbol/resolve' method.
+  static const workspaceSymbol_resolve = Method('workspaceSymbol/resolve');
+
+  /// Constant for the 'workspace/configuration' method.
+  static const workspace_configuration = Method('workspace/configuration');
+
+  /// Constant for the 'workspace/didChangeConfiguration' method.
+  static const workspace_didChangeConfiguration =
+      Method('workspace/didChangeConfiguration');
+
+  /// Constant for the 'workspace/workspaceFolders' method.
+  static const workspace_workspaceFolders =
+      Method('workspace/workspaceFolders');
+
+  /// Constant for the 'workspace/didChangeWorkspaceFolders' method.
+  static const workspace_didChangeWorkspaceFolders =
+      Method('workspace/didChangeWorkspaceFolders');
+
+  /// Constant for the 'workspace/willCreateFiles' method.
+  static const workspace_willCreateFiles = Method('workspace/willCreateFiles');
+
+  /// Constant for the 'workspace/didCreateFiles' method.
+  static const workspace_didCreateFiles = Method('workspace/didCreateFiles');
+
+  /// Constant for the 'workspace/willRenameFiles' method.
+  static const workspace_willRenameFiles = Method('workspace/willRenameFiles');
+
+  /// Constant for the 'workspace/didRenameFiles' method.
+  static const workspace_didRenameFiles = Method('workspace/didRenameFiles');
+
+  /// Constant for the 'workspace/willDeleteFiles' method.
+  static const workspace_willDeleteFiles = Method('workspace/willDeleteFiles');
+
+  /// Constant for the 'workspace/didDeleteFiles' method.
+  static const workspace_didDeleteFiles = Method('workspace/didDeleteFiles');
+
+  /// Constant for the 'workspace/didChangeWatchedFiles' method.
+  static const workspace_didChangeWatchedFiles =
+      Method('workspace/didChangeWatchedFiles');
+
+  /// Constant for the 'workspace/executeCommand' method.
+  static const workspace_executeCommand = Method('workspace/executeCommand');
+
+  /// Constant for the 'workspace/applyEdit' method.
+  static const workspace_applyEdit = Method('workspace/applyEdit');
+
+  /// Constant for the 'window/showMessage' method.
+  static const window_showMessage = Method('window/showMessage');
+
+  /// Constant for the 'window/showMessageRequest' method.
+  static const window_showMessageRequest = Method('window/showMessageRequest');
+
+  /// Constant for the 'window/showDocument' method.
+  static const window_showDocument = Method('window/showDocument');
+
+  /// Constant for the 'window/logMessage' method.
+  static const window_logMessage = Method('window/logMessage');
+
+  /// Constant for the 'window/workDoneProgress/create' method.
+  static const window_workDoneProgress_create =
+      Method('window/workDoneProgress/create');
+
+  /// Constant for the 'window/workDoneProgress/cancel' method.
+  static const window_workDoneProgress_cancel =
+      Method('window/workDoneProgress/cancel');
+
+  /// Constant for the 'telemetry/event' method.
+  static const telemetry_event = Method('telemetry/event');
 
   Object toJson() => _value;
 
@@ -20324,6 +25491,2116 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// A notebook cell.
+///
+/// A cell's document URI must be unique across ALL notebook cells and can
+/// therefore be used to uniquely identify a notebook cell or the cell's text
+/// document.
+///  @since 3.17.0
+class NotebookCell implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookCell.canParse,
+    NotebookCell.fromJson,
+  );
+
+  NotebookCell({
+    required this.kind,
+    required this.document,
+    this.metadata,
+    this.executionSummary,
+  });
+  static NotebookCell fromJson(Map<String, Object?> json) {
+    final kindJson = json['kind'];
+    final kind = NotebookCellKind.fromJson(kindJson as int);
+    final documentJson = json['document'];
+    final document = documentJson as String;
+    final metadataJson = json['metadata'];
+    final metadata = metadataJson;
+    final executionSummaryJson = json['executionSummary'];
+    final executionSummary = executionSummaryJson != null
+        ? ExecutionSummary.fromJson(
+            executionSummaryJson as Map<String, Object?>)
+        : null;
+    return NotebookCell(
+      kind: kind,
+      document: document,
+      metadata: metadata,
+      executionSummary: executionSummary,
+    );
+  }
+
+  /// The URI of the cell's text document content.
+  final String document;
+
+  /// Additional execution summary information if supported by the client.
+  final ExecutionSummary? executionSummary;
+
+  /// The cell's kind
+  final NotebookCellKind kind;
+
+  /// Additional metadata stored with the cell.
+  final Object? metadata;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['kind'] = kind.toJson();
+    __result['document'] = document;
+    if (metadata != null) {
+      __result['metadata'] = metadata;
+    }
+    if (executionSummary != null) {
+      __result['executionSummary'] = executionSummary?.toJson();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookCellKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type NotebookCellKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('document');
+      try {
+        if (!obj.containsKey('document')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final document = obj['document'];
+        if (document == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(document is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('executionSummary');
+      try {
+        final executionSummary = obj['executionSummary'];
+        if (executionSummary != null &&
+            !(ExecutionSummary.canParse(executionSummary, reporter))) {
+          reporter.reportError('must be of type ExecutionSummary');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookCell');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookCell && other.runtimeType == NotebookCell) {
+      return kind == other.kind &&
+          document == other.document &&
+          metadata == other.metadata &&
+          executionSummary == other.executionSummary &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        kind,
+        document,
+        metadata,
+        executionSummary,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A change describing how to move a `NotebookCell` array from state S to S'.
+///  @since 3.17.0
+class NotebookCellArrayChange implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookCellArrayChange.canParse,
+    NotebookCellArrayChange.fromJson,
+  );
+
+  NotebookCellArrayChange({
+    required this.start,
+    required this.deleteCount,
+    this.cells,
+  });
+  static NotebookCellArrayChange fromJson(Map<String, Object?> json) {
+    final startJson = json['start'];
+    final start = startJson as int;
+    final deleteCountJson = json['deleteCount'];
+    final deleteCount = deleteCountJson as int;
+    final cellsJson = json['cells'];
+    final cells = (cellsJson as List<Object?>?)
+        ?.map((item) => NotebookCell.fromJson(item as Map<String, Object?>))
+        .toList();
+    return NotebookCellArrayChange(
+      start: start,
+      deleteCount: deleteCount,
+      cells: cells,
+    );
+  }
+
+  /// The new cells, if any
+  final List<NotebookCell>? cells;
+
+  /// The deleted cells
+  final int deleteCount;
+
+  /// The start oftest of the cell that changed.
+  final int start;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['start'] = start;
+    __result['deleteCount'] = deleteCount;
+    if (cells != null) {
+      __result['cells'] = cells?.map((item) => item.toJson()).toList();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('start');
+      try {
+        if (!obj.containsKey('start')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final start = obj['start'];
+        if (start == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(start is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('deleteCount');
+      try {
+        if (!obj.containsKey('deleteCount')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final deleteCount = obj['deleteCount'];
+        if (deleteCount == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(deleteCount is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('cells');
+      try {
+        final cells = obj['cells'];
+        if (cells != null &&
+            !((cells is List<Object?> &&
+                (cells.every(
+                    (item) => NotebookCell.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<NotebookCell>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookCellArrayChange');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookCellArrayChange &&
+        other.runtimeType == NotebookCellArrayChange) {
+      return start == other.start &&
+          deleteCount == other.deleteCount &&
+          listEqual(
+              cells, other.cells, (NotebookCell a, NotebookCell b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        start,
+        deleteCount,
+        lspHashCode(cells),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A notebook cell kind.
+///  @since 3.17.0
+class NotebookCellKind {
+  const NotebookCellKind(this._value);
+  const NotebookCellKind.fromJson(this._value);
+
+  final int _value;
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    return obj is int;
+  }
+
+  /// A markup-cell is formatted source that is used for display.
+  static const Markup = NotebookCellKind(1);
+
+  /// A code-cell is source code.
+  static const Code = NotebookCellKind(2);
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  int get hashCode => _value.hashCode;
+
+  bool operator ==(Object o) => o is NotebookCellKind && o._value == _value;
+}
+
+/// A notebook cell text document filter denotes a cell text document by
+/// different properties.
+///  @since 3.17.0
+class NotebookCellTextDocumentFilter implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookCellTextDocumentFilter.canParse,
+    NotebookCellTextDocumentFilter.fromJson,
+  );
+
+  NotebookCellTextDocumentFilter({
+    required this.notebook,
+    this.language,
+  });
+  static NotebookCellTextDocumentFilter fromJson(Map<String, Object?> json) {
+    final notebookJson = json['notebook'];
+    final notebook = notebookJson is String
+        ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t1(
+            notebookJson)
+        : ((NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter) ||
+                NotebookDocumentFilter2.canParse(
+                    notebookJson, nullLspJsonReporter) ||
+                NotebookDocumentFilter3.canParse(
+                    notebookJson, nullLspJsonReporter))
+            ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t2(
+                NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter)
+                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
+                        NotebookDocumentFilter1.fromJson(
+                            notebookJson as Map<String, Object?>))
+                    : (NotebookDocumentFilter2.canParse(notebookJson, nullLspJsonReporter)
+                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
+                            NotebookDocumentFilter2.fromJson(notebookJson as Map<String, Object?>))
+                        : (NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookJson as Map<String, Object?>)) : (throw '''$notebookJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+            : (throw '''$notebookJson was not one of (String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>)'''));
+    final languageJson = json['language'];
+    final language = languageJson as String?;
+    return NotebookCellTextDocumentFilter(
+      notebook: notebook,
+      language: language,
+    );
+  }
+
+  /// A language id like `python`.
+  ///
+  /// Will be matched against the language id of the notebook cell document. '*'
+  /// matches every language.
+  final String? language;
+
+  /// A filter that matches against the notebook containing the notebook cell.
+  /// If a string value is provided it matches against the notebook type. '*'
+  /// matches every notebook.
+  final Either2<
+      String,
+      Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
+          NotebookDocumentFilter3>> notebook;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebook'] = notebook;
+    if (language != null) {
+      __result['language'] = language;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebook');
+      try {
+        if (!obj.containsKey('notebook')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebook = obj['notebook'];
+        if (notebook == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((notebook is String ||
+            (NotebookDocumentFilter1.canParse(notebook, reporter) ||
+                NotebookDocumentFilter2.canParse(notebook, reporter) ||
+                NotebookDocumentFilter3.canParse(notebook, reporter))))) {
+          reporter.reportError(
+              'must be of type Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('language');
+      try {
+        final language = obj['language'];
+        if (language != null && !(language is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookCellTextDocumentFilter');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookCellTextDocumentFilter &&
+        other.runtimeType == NotebookCellTextDocumentFilter) {
+      return notebook == other.notebook && language == other.language && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebook,
+        language,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A notebook document.
+///  @since 3.17.0
+class NotebookDocument implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocument.canParse,
+    NotebookDocument.fromJson,
+  );
+
+  NotebookDocument({
+    required this.uri,
+    required this.notebookType,
+    required this.version,
+    this.metadata,
+    required this.cells,
+  });
+  static NotebookDocument fromJson(Map<String, Object?> json) {
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final notebookTypeJson = json['notebookType'];
+    final notebookType = notebookTypeJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int;
+    final metadataJson = json['metadata'];
+    final metadata = metadataJson;
+    final cellsJson = json['cells'];
+    final cells = (cellsJson as List<Object?>)
+        .map((item) => NotebookCell.fromJson(item as Map<String, Object?>))
+        .toList();
+    return NotebookDocument(
+      uri: uri,
+      notebookType: notebookType,
+      version: version,
+      metadata: metadata,
+      cells: cells,
+    );
+  }
+
+  /// The cells of a notebook.
+  final List<NotebookCell> cells;
+
+  /// Additional metadata stored with the notebook document.
+  final Object? metadata;
+
+  /// The type of the notebook.
+  final String notebookType;
+
+  /// The notebook document's uri.
+  final String uri;
+
+  /// The version number of this document (it will increase after each change,
+  /// including undo/redo).
+  final int version;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['uri'] = uri;
+    __result['notebookType'] = notebookType;
+    __result['version'] = version;
+    if (metadata != null) {
+      __result['metadata'] = metadata;
+    }
+    __result['cells'] = cells.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('notebookType');
+      try {
+        if (!obj.containsKey('notebookType')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookType = obj['notebookType'];
+        if (notebookType == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(notebookType is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('cells');
+      try {
+        if (!obj.containsKey('cells')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final cells = obj['cells'];
+        if (cells == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((cells is List<Object?> &&
+            (cells.every((item) => NotebookCell.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<NotebookCell>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocument');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocument && other.runtimeType == NotebookDocument) {
+      return uri == other.uri &&
+          notebookType == other.notebookType &&
+          version == other.version &&
+          metadata == other.metadata &&
+          listEqual(
+              cells, other.cells, (NotebookCell a, NotebookCell b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        uri,
+        notebookType,
+        version,
+        metadata,
+        lspHashCode(cells),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A change event for a notebook document.
+///  @since 3.17.0
+class NotebookDocumentChangeEvent implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentChangeEvent.canParse,
+    NotebookDocumentChangeEvent.fromJson,
+  );
+
+  NotebookDocumentChangeEvent({
+    this.metadata,
+    this.cells,
+  });
+  static NotebookDocumentChangeEvent fromJson(Map<String, Object?> json) {
+    final metadataJson = json['metadata'];
+    final metadata = metadataJson;
+    final cellsJson = json['cells'];
+    final cells = cellsJson != null
+        ? NotebookDocumentChangeEventCells.fromJson(
+            cellsJson as Map<String, Object?>)
+        : null;
+    return NotebookDocumentChangeEvent(
+      metadata: metadata,
+      cells: cells,
+    );
+  }
+
+  /// Changes to cells
+  final NotebookDocumentChangeEventCells? cells;
+
+  /// The changed meta data if any.
+  final Object? metadata;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (metadata != null) {
+      __result['metadata'] = metadata;
+    }
+    if (cells != null) {
+      __result['cells'] = cells?.toJson();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('cells');
+      try {
+        final cells = obj['cells'];
+        if (cells != null &&
+            !(NotebookDocumentChangeEventCells.canParse(cells, reporter))) {
+          reporter
+              .reportError('must be of type NotebookDocumentChangeEventCells');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentChangeEvent');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentChangeEvent &&
+        other.runtimeType == NotebookDocumentChangeEvent) {
+      return metadata == other.metadata && cells == other.cells && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        metadata,
+        cells,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentChangeEventCells implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentChangeEventCells.canParse,
+    NotebookDocumentChangeEventCells.fromJson,
+  );
+
+  NotebookDocumentChangeEventCells({
+    this.structure,
+    this.data,
+    this.textContent,
+  });
+  static NotebookDocumentChangeEventCells fromJson(Map<String, Object?> json) {
+    final structureJson = json['structure'];
+    final structure = structureJson != null
+        ? NotebookDocumentChangeEventStructure.fromJson(
+            structureJson as Map<String, Object?>)
+        : null;
+    final dataJson = json['data'];
+    final data = (dataJson as List<Object?>?)
+        ?.map((item) => NotebookCell.fromJson(item as Map<String, Object?>))
+        .toList();
+    final textContentJson = json['textContent'];
+    final textContent = (textContentJson as List<Object?>?)
+        ?.map((item) => NotebookDocumentChangeEventTextContent.fromJson(
+            item as Map<String, Object?>))
+        .toList();
+    return NotebookDocumentChangeEventCells(
+      structure: structure,
+      data: data,
+      textContent: textContent,
+    );
+  }
+
+  /// Changes to notebook cells properties like its kind, execution summary or
+  /// metadata.
+  final List<NotebookCell>? data;
+
+  /// Changes to the cell structure to add or remove cells.
+  final NotebookDocumentChangeEventStructure? structure;
+
+  /// Changes to the text content of notebook cells.
+  final List<NotebookDocumentChangeEventTextContent>? textContent;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (structure != null) {
+      __result['structure'] = structure?.toJson();
+    }
+    if (data != null) {
+      __result['data'] = data?.map((item) => item.toJson()).toList();
+    }
+    if (textContent != null) {
+      __result['textContent'] =
+          textContent?.map((item) => item.toJson()).toList();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('structure');
+      try {
+        final structure = obj['structure'];
+        if (structure != null &&
+            !(NotebookDocumentChangeEventStructure.canParse(
+                structure, reporter))) {
+          reporter.reportError(
+              'must be of type NotebookDocumentChangeEventStructure');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('data');
+      try {
+        final data = obj['data'];
+        if (data != null &&
+            !((data is List<Object?> &&
+                (data.every(
+                    (item) => NotebookCell.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<NotebookCell>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('textContent');
+      try {
+        final textContent = obj['textContent'];
+        if (textContent != null &&
+            !((textContent is List<Object?> &&
+                (textContent.every((item) =>
+                    NotebookDocumentChangeEventTextContent.canParse(
+                        item, reporter)))))) {
+          reporter.reportError(
+              'must be of type List<NotebookDocumentChangeEventTextContent>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentChangeEventCells');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentChangeEventCells &&
+        other.runtimeType == NotebookDocumentChangeEventCells) {
+      return structure == other.structure &&
+          listEqual(
+              data, other.data, (NotebookCell a, NotebookCell b) => a == b) &&
+          listEqual(
+              textContent,
+              other.textContent,
+              (NotebookDocumentChangeEventTextContent a,
+                      NotebookDocumentChangeEventTextContent b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        structure,
+        lspHashCode(data),
+        lspHashCode(textContent),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentChangeEventStructure implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentChangeEventStructure.canParse,
+    NotebookDocumentChangeEventStructure.fromJson,
+  );
+
+  NotebookDocumentChangeEventStructure({
+    required this.array,
+    this.didOpen,
+    this.didClose,
+  });
+  static NotebookDocumentChangeEventStructure fromJson(
+      Map<String, Object?> json) {
+    final arrayJson = json['array'];
+    final array =
+        NotebookCellArrayChange.fromJson(arrayJson as Map<String, Object?>);
+    final didOpenJson = json['didOpen'];
+    final didOpen = (didOpenJson as List<Object?>?)
+        ?.map((item) => TextDocumentItem.fromJson(item as Map<String, Object?>))
+        .toList();
+    final didCloseJson = json['didClose'];
+    final didClose = (didCloseJson as List<Object?>?)
+        ?.map((item) =>
+            TextDocumentIdentifier.fromJson(item as Map<String, Object?>))
+        .toList();
+    return NotebookDocumentChangeEventStructure(
+      array: array,
+      didOpen: didOpen,
+      didClose: didClose,
+    );
+  }
+
+  /// The change to the cell array.
+  final NotebookCellArrayChange array;
+
+  /// Additional closed cell text documents.
+  final List<TextDocumentIdentifier>? didClose;
+
+  /// Additional opened cell text documents.
+  final List<TextDocumentItem>? didOpen;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['array'] = array.toJson();
+    if (didOpen != null) {
+      __result['didOpen'] = didOpen?.map((item) => item.toJson()).toList();
+    }
+    if (didClose != null) {
+      __result['didClose'] = didClose?.map((item) => item.toJson()).toList();
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('array');
+      try {
+        if (!obj.containsKey('array')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final array = obj['array'];
+        if (array == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookCellArrayChange.canParse(array, reporter))) {
+          reporter.reportError('must be of type NotebookCellArrayChange');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didOpen');
+      try {
+        final didOpen = obj['didOpen'];
+        if (didOpen != null &&
+            !((didOpen is List<Object?> &&
+                (didOpen.every(
+                    (item) => TextDocumentItem.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentItem>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didClose');
+      try {
+        final didClose = obj['didClose'];
+        if (didClose != null &&
+            !((didClose is List<Object?> &&
+                (didClose.every((item) =>
+                    TextDocumentIdentifier.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentIdentifier>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type NotebookDocumentChangeEventStructure');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentChangeEventStructure &&
+        other.runtimeType == NotebookDocumentChangeEventStructure) {
+      return array == other.array &&
+          listEqual(didOpen, other.didOpen,
+              (TextDocumentItem a, TextDocumentItem b) => a == b) &&
+          listEqual(didClose, other.didClose,
+              (TextDocumentIdentifier a, TextDocumentIdentifier b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        array,
+        lspHashCode(didOpen),
+        lspHashCode(didClose),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentChangeEventTextContent implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentChangeEventTextContent.canParse,
+    NotebookDocumentChangeEventTextContent.fromJson,
+  );
+
+  NotebookDocumentChangeEventTextContent({
+    required this.document,
+    required this.changes,
+  });
+  static NotebookDocumentChangeEventTextContent fromJson(
+      Map<String, Object?> json) {
+    final documentJson = json['document'];
+    final document = VersionedTextDocumentIdentifier.fromJson(
+        documentJson as Map<String, Object?>);
+    final changesJson = json['changes'];
+    final changes = (changesJson as List<Object?>)
+        .map((item) => TextDocumentContentChangeEvent1.canParse(
+                item, nullLspJsonReporter)
+            ? Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>.t1(
+                TextDocumentContentChangeEvent1.fromJson(
+                    item as Map<String, Object?>))
+            : (TextDocumentContentChangeEvent2.canParse(item, nullLspJsonReporter)
+                ? Either2<TextDocumentContentChangeEvent1,
+                        TextDocumentContentChangeEvent2>.t2(
+                    TextDocumentContentChangeEvent2.fromJson(item as Map<String, Object?>))
+                : (throw '''$item was not one of (TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2)''')))
+        .toList();
+    return NotebookDocumentChangeEventTextContent(
+      document: document,
+      changes: changes,
+    );
+  }
+
+  final List<
+      Either2<TextDocumentContentChangeEvent1,
+          TextDocumentContentChangeEvent2>> changes;
+  final VersionedTextDocumentIdentifier document;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['document'] = document.toJson();
+    __result['changes'] = changes;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('document');
+      try {
+        if (!obj.containsKey('document')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final document = obj['document'];
+        if (document == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(VersionedTextDocumentIdentifier.canParse(document, reporter))) {
+          reporter
+              .reportError('must be of type VersionedTextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('changes');
+      try {
+        if (!obj.containsKey('changes')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final changes = obj['changes'];
+        if (changes == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((changes is List<Object?> &&
+            (changes.every((item) => (TextDocumentContentChangeEvent1.canParse(
+                    item, reporter) ||
+                TextDocumentContentChangeEvent2.canParse(item, reporter))))))) {
+          reporter.reportError(
+              'must be of type List<Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type NotebookDocumentChangeEventTextContent');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentChangeEventTextContent &&
+        other.runtimeType == NotebookDocumentChangeEventTextContent) {
+      return document == other.document &&
+          listEqual(
+              changes,
+              other.changes,
+              (Either2<TextDocumentContentChangeEvent1,
+                              TextDocumentContentChangeEvent2>
+                          a,
+                      Either2<TextDocumentContentChangeEvent1,
+                              TextDocumentContentChangeEvent2>
+                          b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        document,
+        lspHashCode(changes),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Capabilities specific to the notebook document support.
+///  @since 3.17.0
+class NotebookDocumentClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentClientCapabilities.canParse,
+    NotebookDocumentClientCapabilities.fromJson,
+  );
+
+  NotebookDocumentClientCapabilities({
+    required this.synchronization,
+  });
+  static NotebookDocumentClientCapabilities fromJson(
+      Map<String, Object?> json) {
+    final synchronizationJson = json['synchronization'];
+    final synchronization = NotebookDocumentSyncClientCapabilities.fromJson(
+        synchronizationJson as Map<String, Object?>);
+    return NotebookDocumentClientCapabilities(
+      synchronization: synchronization,
+    );
+  }
+
+  /// Capabilities specific to notebook document synchronization
+  ///  @since 3.17.0
+  final NotebookDocumentSyncClientCapabilities synchronization;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['synchronization'] = synchronization.toJson();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('synchronization');
+      try {
+        if (!obj.containsKey('synchronization')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final synchronization = obj['synchronization'];
+        if (synchronization == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocumentSyncClientCapabilities.canParse(
+            synchronization, reporter))) {
+          reporter.reportError(
+              'must be of type NotebookDocumentSyncClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type NotebookDocumentClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentClientCapabilities &&
+        other.runtimeType == NotebookDocumentClientCapabilities) {
+      return synchronization == other.synchronization && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => synchronization.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentFilter1 implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentFilter1.canParse,
+    NotebookDocumentFilter1.fromJson,
+  );
+
+  NotebookDocumentFilter1({
+    required this.notebookType,
+    this.scheme,
+    this.pattern,
+  });
+  static NotebookDocumentFilter1 fromJson(Map<String, Object?> json) {
+    final notebookTypeJson = json['notebookType'];
+    final notebookType = notebookTypeJson as String;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String?;
+    final patternJson = json['pattern'];
+    final pattern = patternJson as String?;
+    return NotebookDocumentFilter1(
+      notebookType: notebookType,
+      scheme: scheme,
+      pattern: pattern,
+    );
+  }
+
+  /// The type of the enclosing notebook.
+  final String notebookType;
+
+  /// A glob pattern.
+  final String? pattern;
+
+  /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+  final String? scheme;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebookType'] = notebookType;
+    if (scheme != null) {
+      __result['scheme'] = scheme;
+    }
+    if (pattern != null) {
+      __result['pattern'] = pattern;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookType');
+      try {
+        if (!obj.containsKey('notebookType')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookType = obj['notebookType'];
+        if (notebookType == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(notebookType is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('scheme');
+      try {
+        final scheme = obj['scheme'];
+        if (scheme != null && !(scheme is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('pattern');
+      try {
+        final pattern = obj['pattern'];
+        if (pattern != null && !(pattern is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentFilter1');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentFilter1 &&
+        other.runtimeType == NotebookDocumentFilter1) {
+      return notebookType == other.notebookType &&
+          scheme == other.scheme &&
+          pattern == other.pattern &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebookType,
+        scheme,
+        pattern,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentFilter2 implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentFilter2.canParse,
+    NotebookDocumentFilter2.fromJson,
+  );
+
+  NotebookDocumentFilter2({
+    this.notebookType,
+    required this.scheme,
+    this.pattern,
+  });
+  static NotebookDocumentFilter2 fromJson(Map<String, Object?> json) {
+    final notebookTypeJson = json['notebookType'];
+    final notebookType = notebookTypeJson as String?;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String;
+    final patternJson = json['pattern'];
+    final pattern = patternJson as String?;
+    return NotebookDocumentFilter2(
+      notebookType: notebookType,
+      scheme: scheme,
+      pattern: pattern,
+    );
+  }
+
+  /// The type of the enclosing notebook.
+  final String? notebookType;
+
+  /// A glob pattern.
+  final String? pattern;
+
+  /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+  final String scheme;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (notebookType != null) {
+      __result['notebookType'] = notebookType;
+    }
+    __result['scheme'] = scheme;
+    if (pattern != null) {
+      __result['pattern'] = pattern;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookType');
+      try {
+        final notebookType = obj['notebookType'];
+        if (notebookType != null && !(notebookType is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('scheme');
+      try {
+        if (!obj.containsKey('scheme')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final scheme = obj['scheme'];
+        if (scheme == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(scheme is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('pattern');
+      try {
+        final pattern = obj['pattern'];
+        if (pattern != null && !(pattern is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentFilter2');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentFilter2 &&
+        other.runtimeType == NotebookDocumentFilter2) {
+      return notebookType == other.notebookType &&
+          scheme == other.scheme &&
+          pattern == other.pattern &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebookType,
+        scheme,
+        pattern,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentFilter3 implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentFilter3.canParse,
+    NotebookDocumentFilter3.fromJson,
+  );
+
+  NotebookDocumentFilter3({
+    this.notebookType,
+    this.scheme,
+    required this.pattern,
+  });
+  static NotebookDocumentFilter3 fromJson(Map<String, Object?> json) {
+    final notebookTypeJson = json['notebookType'];
+    final notebookType = notebookTypeJson as String?;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String?;
+    final patternJson = json['pattern'];
+    final pattern = patternJson as String;
+    return NotebookDocumentFilter3(
+      notebookType: notebookType,
+      scheme: scheme,
+      pattern: pattern,
+    );
+  }
+
+  /// The type of the enclosing notebook.
+  final String? notebookType;
+
+  /// A glob pattern.
+  final String pattern;
+
+  /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+  final String? scheme;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (notebookType != null) {
+      __result['notebookType'] = notebookType;
+    }
+    if (scheme != null) {
+      __result['scheme'] = scheme;
+    }
+    __result['pattern'] = pattern;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookType');
+      try {
+        final notebookType = obj['notebookType'];
+        if (notebookType != null && !(notebookType is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('scheme');
+      try {
+        final scheme = obj['scheme'];
+        if (scheme != null && !(scheme is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('pattern');
+      try {
+        if (!obj.containsKey('pattern')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final pattern = obj['pattern'];
+        if (pattern == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(pattern is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentFilter3');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentFilter3 &&
+        other.runtimeType == NotebookDocumentFilter3) {
+      return notebookType == other.notebookType &&
+          scheme == other.scheme &&
+          pattern == other.pattern &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebookType,
+        scheme,
+        pattern,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A literal to identify a notebook document in the client.
+///  @since 3.17.0
+class NotebookDocumentIdentifier implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentIdentifier.canParse,
+    NotebookDocumentIdentifier.fromJson,
+  );
+
+  NotebookDocumentIdentifier({
+    required this.uri,
+  });
+  static NotebookDocumentIdentifier fromJson(Map<String, Object?> json) {
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    return NotebookDocumentIdentifier(
+      uri: uri,
+    );
+  }
+
+  /// The notebook document's uri.
+  final String uri;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['uri'] = uri;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentIdentifier');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentIdentifier &&
+        other.runtimeType == NotebookDocumentIdentifier) {
+      return uri == other.uri && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => uri.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Notebook specific client capabilities.
+///  @since 3.17.0
+class NotebookDocumentSyncClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncClientCapabilities.canParse,
+    NotebookDocumentSyncClientCapabilities.fromJson,
+  );
+
+  NotebookDocumentSyncClientCapabilities({
+    this.dynamicRegistration,
+  });
+  static NotebookDocumentSyncClientCapabilities fromJson(
+      Map<String, Object?> json) {
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    return NotebookDocumentSyncClientCapabilities(
+      dynamicRegistration: dynamicRegistration,
+    );
+  }
+
+  /// Whether implementation supports dynamic registration. If this is set to
+  /// `true` the client supports the new `(TextDocumentRegistrationOptions &
+  /// StaticRegistrationOptions)` return value for the corresponding server
+  /// capability as well.
+  final bool? dynamicRegistration;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      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();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type NotebookDocumentSyncClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncClientCapabilities &&
+        other.runtimeType == NotebookDocumentSyncClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => dynamicRegistration.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Options specific to a notebook plus its cells to be synced to the server.
+///
+/// If a selector provider a notebook document filter but no cell selector all
+/// cells of a matching notebook document will be synced.
+///
+/// If a selector provides no notebook document filter but only a cell selector
+/// all notebook document that contain at least one matching cell will be
+/// synced.
+///  @since 3.17.0
+class NotebookDocumentSyncOptions implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncOptions.canParse,
+    NotebookDocumentSyncOptions.fromJson,
+  );
+
+  NotebookDocumentSyncOptions({
+    required this.notebookSelector,
+    this.save,
+  });
+  static NotebookDocumentSyncOptions fromJson(Map<String, Object?> json) {
+    if (NotebookDocumentSyncRegistrationOptions.canParse(
+        json, nullLspJsonReporter)) {
+      return NotebookDocumentSyncRegistrationOptions.fromJson(json);
+    }
+    final notebookSelectorJson = json['notebookSelector'];
+    final notebookSelector = (notebookSelectorJson as List<Object?>)
+        .map((item) => NotebookDocumentSyncOptionsNotebookSelector.fromJson(
+            item as Map<String, Object?>))
+        .toList();
+    final saveJson = json['save'];
+    final save = saveJson as bool?;
+    return NotebookDocumentSyncOptions(
+      notebookSelector: notebookSelector,
+      save: save,
+    );
+  }
+
+  /// The notebooks to be synced
+  final List<NotebookDocumentSyncOptionsNotebookSelector> notebookSelector;
+
+  /// Whether save notification should be forwarded to the server. Will only be
+  /// honored if mode === `notebook`.
+  final bool? save;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebookSelector'] =
+        notebookSelector.map((item) => item.toJson()).toList();
+    if (save != null) {
+      __result['save'] = save;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookSelector');
+      try {
+        if (!obj.containsKey('notebookSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookSelector = obj['notebookSelector'];
+        if (notebookSelector == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((notebookSelector is List<Object?> &&
+            (notebookSelector.every((item) =>
+                NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                    item, reporter)))))) {
+          reporter.reportError(
+              'must be of type List<NotebookDocumentSyncOptionsNotebookSelector>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('save');
+      try {
+        final save = obj['save'];
+        if (save != null && !(save is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentSyncOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncOptions &&
+        other.runtimeType == NotebookDocumentSyncOptions) {
+      return listEqual(
+              notebookSelector,
+              other.notebookSelector,
+              (NotebookDocumentSyncOptionsNotebookSelector a,
+                      NotebookDocumentSyncOptionsNotebookSelector b) =>
+                  a == b) &&
+          save == other.save &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(notebookSelector),
+        save,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentSyncOptionsCells implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncOptionsCells.canParse,
+    NotebookDocumentSyncOptionsCells.fromJson,
+  );
+
+  NotebookDocumentSyncOptionsCells({
+    required this.language,
+  });
+  static NotebookDocumentSyncOptionsCells fromJson(Map<String, Object?> json) {
+    final languageJson = json['language'];
+    final language = languageJson as String;
+    return NotebookDocumentSyncOptionsCells(
+      language: language,
+    );
+  }
+
+  final String language;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['language'] = language;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('language');
+      try {
+        if (!obj.containsKey('language')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final language = obj['language'];
+        if (language == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(language is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type NotebookDocumentSyncOptionsCells');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncOptionsCells &&
+        other.runtimeType == NotebookDocumentSyncOptionsCells) {
+      return language == other.language && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => language.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class NotebookDocumentSyncOptionsNotebookSelector implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncOptionsNotebookSelector.canParse,
+    NotebookDocumentSyncOptionsNotebookSelector.fromJson,
+  );
+
+  NotebookDocumentSyncOptionsNotebookSelector({
+    this.notebookDocument,
+    required this.cells,
+  });
+  static NotebookDocumentSyncOptionsNotebookSelector fromJson(
+      Map<String, Object?> json) {
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = notebookDocumentJson == null
+        ? null
+        : (notebookDocumentJson is String
+            ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t1(
+                notebookDocumentJson)
+            : ((NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter) ||
+                    NotebookDocumentFilter2.canParse(
+                        notebookDocumentJson, nullLspJsonReporter) ||
+                    NotebookDocumentFilter3.canParse(
+                        notebookDocumentJson, nullLspJsonReporter))
+                ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t2(
+                    NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
+                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
+                            NotebookDocumentFilter1.fromJson(
+                                notebookDocumentJson as Map<String, Object?>))
+                        : (NotebookDocumentFilter2.canParse(
+                                notebookDocumentJson, nullLspJsonReporter)
+                            ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
+                            : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+                : (throw '''$notebookDocumentJson was not one of (String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>)''')));
+    final cellsJson = json['cells'];
+    final cells = (cellsJson as List<Object?>)
+        .map((item) => NotebookDocumentSyncOptionsCells.fromJson(
+            item as Map<String, Object?>))
+        .toList();
+    return NotebookDocumentSyncOptionsNotebookSelector(
+      notebookDocument: notebookDocument,
+      cells: cells,
+    );
+  }
+
+  /// The cells of the matching notebook to be synced.
+  final List<NotebookDocumentSyncOptionsCells> cells;
+
+  /// The notebook to be synced If a string value is provided it matches against
+  /// the notebook type. '*' matches every notebook.
+  final Either2<
+      String,
+      Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
+          NotebookDocumentFilter3>>? notebookDocument;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (notebookDocument != null) {
+      __result['notebookDocument'] = notebookDocument;
+    }
+    __result['cells'] = cells.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookDocument');
+      try {
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument != null &&
+            !((notebookDocument is String ||
+                (NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
+                    NotebookDocumentFilter2.canParse(
+                        notebookDocument, reporter) ||
+                    NotebookDocumentFilter3.canParse(
+                        notebookDocument, reporter))))) {
+          reporter.reportError(
+              'must be of type Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('cells');
+      try {
+        if (!obj.containsKey('cells')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final cells = obj['cells'];
+        if (cells == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((cells is List<Object?> &&
+            (cells.every((item) =>
+                NotebookDocumentSyncOptionsCells.canParse(item, reporter)))))) {
+          reporter.reportError(
+              'must be of type List<NotebookDocumentSyncOptionsCells>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type NotebookDocumentSyncOptionsNotebookSelector');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncOptionsNotebookSelector &&
+        other.runtimeType == NotebookDocumentSyncOptionsNotebookSelector) {
+      return notebookDocument == other.notebookDocument &&
+          listEqual(
+              cells,
+              other.cells,
+              (NotebookDocumentSyncOptionsCells a,
+                      NotebookDocumentSyncOptionsCells b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        notebookDocument,
+        lspHashCode(cells),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// Registration options specific to a notebook.
+///  @since 3.17.0
+class NotebookDocumentSyncRegistrationOptions
+    implements
+        NotebookDocumentSyncOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    NotebookDocumentSyncRegistrationOptions.canParse,
+    NotebookDocumentSyncRegistrationOptions.fromJson,
+  );
+
+  NotebookDocumentSyncRegistrationOptions({
+    required this.notebookSelector,
+    this.save,
+    this.id,
+  });
+  static NotebookDocumentSyncRegistrationOptions fromJson(
+      Map<String, Object?> json) {
+    final notebookSelectorJson = json['notebookSelector'];
+    final notebookSelector = (notebookSelectorJson as List<Object?>)
+        .map((item) => NotebookDocumentSyncOptionsNotebookSelector.fromJson(
+            item as Map<String, Object?>))
+        .toList();
+    final saveJson = json['save'];
+    final save = saveJson as bool?;
+    final idJson = json['id'];
+    final id = idJson as String?;
+    return NotebookDocumentSyncRegistrationOptions(
+      notebookSelector: notebookSelector,
+      save: save,
+      id: id,
+    );
+  }
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String? id;
+
+  /// The notebooks to be synced
+  final List<NotebookDocumentSyncOptionsNotebookSelector> notebookSelector;
+
+  /// Whether save notification should be forwarded to the server. Will only be
+  /// honored if mode === `notebook`.
+  final bool? save;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['notebookSelector'] =
+        notebookSelector.map((item) => item.toJson()).toList();
+    if (save != null) {
+      __result['save'] = save;
+    }
+    if (id != null) {
+      __result['id'] = id;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('notebookSelector');
+      try {
+        if (!obj.containsKey('notebookSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookSelector = obj['notebookSelector'];
+        if (notebookSelector == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((notebookSelector is List<Object?> &&
+            (notebookSelector.every((item) =>
+                NotebookDocumentSyncOptionsNotebookSelector.canParse(
+                    item, reporter)))))) {
+          reporter.reportError(
+              'must be of type List<NotebookDocumentSyncOptionsNotebookSelector>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('save');
+      try {
+        final save = obj['save'];
+        if (save != null && !(save is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type NotebookDocumentSyncRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NotebookDocumentSyncRegistrationOptions &&
+        other.runtimeType == NotebookDocumentSyncRegistrationOptions) {
+      return listEqual(
+              notebookSelector,
+              other.notebookSelector,
+              (NotebookDocumentSyncOptionsNotebookSelector a,
+                      NotebookDocumentSyncOptionsNotebookSelector b) =>
+                  a == b) &&
+          save == other.save &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(notebookSelector),
+        save,
+        id,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class NotificationMessage implements Message, IncomingMessage, ToJsonable {
   static const jsonHandler = LspJsonHandler(
     NotificationMessage.canParse,
@@ -20686,12 +27963,6 @@
     this.partialResultToken,
   });
   static PartialResultParams fromJson(Map<String, Object?> json) {
-    if (WorkspaceSymbolParams.canParse(json, nullLspJsonReporter)) {
-      return WorkspaceSymbolParams.fromJson(json);
-    }
-    if (CompletionParams.canParse(json, nullLspJsonReporter)) {
-      return CompletionParams.fromJson(json);
-    }
     if (DeclarationParams.canParse(json, nullLspJsonReporter)) {
       return DeclarationParams.fromJson(json);
     }
@@ -20707,26 +27978,26 @@
     if (ReferenceParams.canParse(json, nullLspJsonReporter)) {
       return ReferenceParams.fromJson(json);
     }
+    if (CallHierarchyIncomingCallsParams.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyIncomingCallsParams.fromJson(json);
+    }
+    if (CallHierarchyOutgoingCallsParams.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyOutgoingCallsParams.fromJson(json);
+    }
+    if (TypeHierarchySupertypesParams.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchySupertypesParams.fromJson(json);
+    }
+    if (TypeHierarchySubtypesParams.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchySubtypesParams.fromJson(json);
+    }
     if (DocumentHighlightParams.canParse(json, nullLspJsonReporter)) {
       return DocumentHighlightParams.fromJson(json);
     }
-    if (DocumentSymbolParams.canParse(json, nullLspJsonReporter)) {
-      return DocumentSymbolParams.fromJson(json);
-    }
-    if (CodeActionParams.canParse(json, nullLspJsonReporter)) {
-      return CodeActionParams.fromJson(json);
-    }
-    if (CodeLensParams.canParse(json, nullLspJsonReporter)) {
-      return CodeLensParams.fromJson(json);
-    }
     if (DocumentLinkParams.canParse(json, nullLspJsonReporter)) {
       return DocumentLinkParams.fromJson(json);
     }
-    if (DocumentColorParams.canParse(json, nullLspJsonReporter)) {
-      return DocumentColorParams.fromJson(json);
-    }
-    if (ColorPresentationParams.canParse(json, nullLspJsonReporter)) {
-      return ColorPresentationParams.fromJson(json);
+    if (CodeLensParams.canParse(json, nullLspJsonReporter)) {
+      return CodeLensParams.fromJson(json);
     }
     if (FoldingRangeParams.canParse(json, nullLspJsonReporter)) {
       return FoldingRangeParams.fromJson(json);
@@ -20734,11 +28005,8 @@
     if (SelectionRangeParams.canParse(json, nullLspJsonReporter)) {
       return SelectionRangeParams.fromJson(json);
     }
-    if (CallHierarchyIncomingCallsParams.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyIncomingCallsParams.fromJson(json);
-    }
-    if (CallHierarchyOutgoingCallsParams.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyOutgoingCallsParams.fromJson(json);
+    if (DocumentSymbolParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentSymbolParams.fromJson(json);
     }
     if (SemanticTokensParams.canParse(json, nullLspJsonReporter)) {
       return SemanticTokensParams.fromJson(json);
@@ -20752,6 +28020,27 @@
     if (MonikerParams.canParse(json, nullLspJsonReporter)) {
       return MonikerParams.fromJson(json);
     }
+    if (CompletionParams.canParse(json, nullLspJsonReporter)) {
+      return CompletionParams.fromJson(json);
+    }
+    if (DocumentDiagnosticParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentDiagnosticParams.fromJson(json);
+    }
+    if (WorkspaceDiagnosticParams.canParse(json, nullLspJsonReporter)) {
+      return WorkspaceDiagnosticParams.fromJson(json);
+    }
+    if (CodeActionParams.canParse(json, nullLspJsonReporter)) {
+      return CodeActionParams.fromJson(json);
+    }
+    if (DocumentColorParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentColorParams.fromJson(json);
+    }
+    if (ColorPresentationParams.canParse(json, nullLspJsonReporter)) {
+      return ColorPresentationParams.fromJson(json);
+    }
+    if (WorkspaceSymbolParams.canParse(json, nullLspJsonReporter)) {
+      return WorkspaceSymbolParams.fromJson(json);
+    }
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -20834,9 +28123,8 @@
     );
   }
 
-  /// Character offset on a line in a document (zero-based). Assuming that the
-  /// line is represented as a string, the `character` value represents the gap
-  /// between the `character` and `character + 1`.
+  /// Character offset on a line in a document (zero-based). The meaning of this
+  /// offset is determined by the negotiated `PositionEncodingKind`.
   ///
   /// If the character value is greater than the line length it defaults back to
   /// the line length.
@@ -20915,6 +28203,44 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// A set of predefined position encoding kinds.
+///  @since 3.17.0
+class PositionEncodingKind {
+  const PositionEncodingKind(this._value);
+  const PositionEncodingKind.fromJson(this._value);
+
+  final String _value;
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    return obj is String;
+  }
+
+  /// Character offsets count UTF-8 code units.
+  static const UTF8 = PositionEncodingKind('utf-8');
+
+  /// Character offsets count UTF-16 code units.
+  ///
+  /// This is the default and must always be supported by servers
+  static const UTF16 = PositionEncodingKind('utf-16');
+
+  /// Character offsets count UTF-32 code units.
+  ///
+  /// Implementation note: these are the same as Unicode code points, so this
+  /// `PositionEncodingKind` may also be used for an encoding-agnostic
+  /// representation of character offsets.
+  static const UTF32 = PositionEncodingKind('utf-32');
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  int get hashCode => _value.hashCode;
+
+  bool operator ==(Object o) => o is PositionEncodingKind && o._value == _value;
+}
+
 class PrepareRenameParams implements TextDocumentPositionParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
     PrepareRenameParams.canParse,
@@ -21042,6 +28368,105 @@
       o is PrepareSupportDefaultBehavior && o._value == _value;
 }
 
+/// A previous result id in a workspace pull request.
+///  @since 3.17.0
+class PreviousResultId implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    PreviousResultId.canParse,
+    PreviousResultId.fromJson,
+  );
+
+  PreviousResultId({
+    required this.uri,
+    required this.value,
+  });
+  static PreviousResultId fromJson(Map<String, Object?> json) {
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final valueJson = json['value'];
+    final value = valueJson as String;
+    return PreviousResultId(
+      uri: uri,
+      value: value,
+    );
+  }
+
+  /// The URI for which the client knowns a result id.
+  final String uri;
+
+  /// The value of the previous result id.
+  final String value;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['uri'] = uri;
+    __result['value'] = value;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      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 PreviousResultId');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is PreviousResultId && other.runtimeType == PreviousResultId) {
+      return uri == other.uri && value == other.value && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        uri,
+        value,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class ProgressParams<T> implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     ProgressParams.canParse,
@@ -22460,6 +29885,482 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// A full diagnostic report with a set of related documents.
+///  @since 3.17.0
+class RelatedFullDocumentDiagnosticReport
+    implements FullDocumentDiagnosticReport, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    RelatedFullDocumentDiagnosticReport.canParse,
+    RelatedFullDocumentDiagnosticReport.fromJson,
+  );
+
+  RelatedFullDocumentDiagnosticReport({
+    this.relatedDocuments,
+    this.kind = 'full',
+    this.resultId,
+    required this.items,
+  }) {
+    if (kind != 'full') {
+      throw 'kind may only be the literal \'full\'';
+    }
+  }
+  static RelatedFullDocumentDiagnosticReport fromJson(
+      Map<String, Object?> json) {
+    final relatedDocumentsJson = json['relatedDocuments'];
+    final relatedDocuments = (relatedDocumentsJson as Map<Object, Object?>?)
+        ?.map((key, value) => MapEntry(
+            key as String,
+            FullDocumentDiagnosticReport.canParse(value, nullLspJsonReporter)
+                ? Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>.t1(
+                    FullDocumentDiagnosticReport.fromJson(
+                        value as Map<String, Object?>))
+                : (UnchangedDocumentDiagnosticReport.canParse(
+                        value, nullLspJsonReporter)
+                    ? Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>.t2(
+                        UnchangedDocumentDiagnosticReport.fromJson(
+                            value as Map<String, Object?>))
+                    : (throw '''$value was not one of (FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport)'''))));
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String?;
+    final itemsJson = json['items'];
+    final items = (itemsJson as List<Object?>)
+        .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
+        .toList();
+    return RelatedFullDocumentDiagnosticReport(
+      relatedDocuments: relatedDocuments,
+      kind: kind,
+      resultId: resultId,
+      items: items,
+    );
+  }
+
+  /// The actual items.
+  final List<Diagnostic> items;
+
+  /// A full document diagnostic report.
+  final String kind;
+
+  /// Diagnostics of related documents. This information is useful in
+  /// programming languages where code in a file A can generate diagnostics in a
+  /// file B which A depends on. An example of such a language is C/C++ where
+  /// marco definitions in a file a.cpp and result in errors in a header file
+  /// b.hpp.
+  ///  @since 3.17.0
+  final Map<
+      String,
+      Either2<FullDocumentDiagnosticReport,
+          UnchangedDocumentDiagnosticReport>>? relatedDocuments;
+
+  /// An optional result id. If provided it will be sent on the next diagnostic
+  /// request for the same document.
+  final String? resultId;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (relatedDocuments != null) {
+      __result['relatedDocuments'] = relatedDocuments;
+    }
+    __result['kind'] = kind;
+    if (resultId != null) {
+      __result['resultId'] = resultId;
+    }
+    __result['items'] = items.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('relatedDocuments');
+      try {
+        final relatedDocuments = obj['relatedDocuments'];
+        if (relatedDocuments != null &&
+            !((relatedDocuments is Map &&
+                (relatedDocuments.keys.every((item) =>
+                    item is String &&
+                    relatedDocuments.values.every((item) =>
+                        (FullDocumentDiagnosticReport.canParse(
+                                item, reporter) ||
+                            UnchangedDocumentDiagnosticReport.canParse(
+                                item, reporter)))))))) {
+          reporter.reportError(
+              'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind == 'full')) {
+          reporter.reportError('must be the literal \'full\'');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('resultId');
+      try {
+        final resultId = obj['resultId'];
+        if (resultId != null && !(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('items');
+      try {
+        if (!obj.containsKey('items')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final items = obj['items'];
+        if (items == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((items is List<Object?> &&
+            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Diagnostic>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type RelatedFullDocumentDiagnosticReport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is RelatedFullDocumentDiagnosticReport &&
+        other.runtimeType == RelatedFullDocumentDiagnosticReport) {
+      return mapEqual(
+              relatedDocuments,
+              other.relatedDocuments,
+              (Either2<FullDocumentDiagnosticReport,
+                              UnchangedDocumentDiagnosticReport>
+                          a,
+                      Either2<FullDocumentDiagnosticReport,
+                              UnchangedDocumentDiagnosticReport>
+                          b) =>
+                  a == b) &&
+          kind == other.kind &&
+          resultId == other.resultId &&
+          listEqual(
+              items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(relatedDocuments),
+        kind,
+        resultId,
+        lspHashCode(items),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// An unchanged diagnostic report with a set of related documents.
+///  @since 3.17.0
+class RelatedUnchangedDocumentDiagnosticReport
+    implements UnchangedDocumentDiagnosticReport, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    RelatedUnchangedDocumentDiagnosticReport.canParse,
+    RelatedUnchangedDocumentDiagnosticReport.fromJson,
+  );
+
+  RelatedUnchangedDocumentDiagnosticReport({
+    this.relatedDocuments,
+    this.kind = 'unchanged',
+    required this.resultId,
+  }) {
+    if (kind != 'unchanged') {
+      throw 'kind may only be the literal \'unchanged\'';
+    }
+  }
+  static RelatedUnchangedDocumentDiagnosticReport fromJson(
+      Map<String, Object?> json) {
+    final relatedDocumentsJson = json['relatedDocuments'];
+    final relatedDocuments = (relatedDocumentsJson as Map<Object, Object?>?)
+        ?.map((key, value) => MapEntry(
+            key as String,
+            FullDocumentDiagnosticReport.canParse(value, nullLspJsonReporter)
+                ? Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>.t1(
+                    FullDocumentDiagnosticReport.fromJson(
+                        value as Map<String, Object?>))
+                : (UnchangedDocumentDiagnosticReport.canParse(
+                        value, nullLspJsonReporter)
+                    ? Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>.t2(
+                        UnchangedDocumentDiagnosticReport.fromJson(
+                            value as Map<String, Object?>))
+                    : (throw '''$value was not one of (FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport)'''))));
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String;
+    return RelatedUnchangedDocumentDiagnosticReport(
+      relatedDocuments: relatedDocuments,
+      kind: kind,
+      resultId: resultId,
+    );
+  }
+
+  /// A document diagnostic report indicating no changes to the last result. A
+  /// server can only return `unchanged` if result ids are provided.
+  final String kind;
+
+  /// Diagnostics of related documents. This information is useful in
+  /// programming languages where code in a file A can generate diagnostics in a
+  /// file B which A depends on. An example of such a language is C/C++ where
+  /// marco definitions in a file a.cpp and result in errors in a header file
+  /// b.hpp.
+  ///  @since 3.17.0
+  final Map<
+      String,
+      Either2<FullDocumentDiagnosticReport,
+          UnchangedDocumentDiagnosticReport>>? relatedDocuments;
+
+  /// A result id which will be sent on the next diagnostic request for the same
+  /// document.
+  final String resultId;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (relatedDocuments != null) {
+      __result['relatedDocuments'] = relatedDocuments;
+    }
+    __result['kind'] = kind;
+    __result['resultId'] = resultId;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('relatedDocuments');
+      try {
+        final relatedDocuments = obj['relatedDocuments'];
+        if (relatedDocuments != null &&
+            !((relatedDocuments is Map &&
+                (relatedDocuments.keys.every((item) =>
+                    item is String &&
+                    relatedDocuments.values.every((item) =>
+                        (FullDocumentDiagnosticReport.canParse(
+                                item, reporter) ||
+                            UnchangedDocumentDiagnosticReport.canParse(
+                                item, reporter)))))))) {
+          reporter.reportError(
+              'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind == 'unchanged')) {
+          reporter.reportError('must be the literal \'unchanged\'');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('resultId');
+      try {
+        if (!obj.containsKey('resultId')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final resultId = obj['resultId'];
+        if (resultId == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type RelatedUnchangedDocumentDiagnosticReport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is RelatedUnchangedDocumentDiagnosticReport &&
+        other.runtimeType == RelatedUnchangedDocumentDiagnosticReport) {
+      return mapEqual(
+              relatedDocuments,
+              other.relatedDocuments,
+              (Either2<FullDocumentDiagnosticReport,
+                              UnchangedDocumentDiagnosticReport>
+                          a,
+                      Either2<FullDocumentDiagnosticReport,
+                              UnchangedDocumentDiagnosticReport>
+                          b) =>
+                  a == b) &&
+          kind == other.kind &&
+          resultId == other.resultId &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(relatedDocuments),
+        kind,
+        resultId,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A relative pattern is a helper to construct glob patterns that are matched
+/// relatively to a base URI. The common value for a `baseUri` is a workspace
+/// folder root, but it can be another absolute URI as well.
+///  @since 3.17.0
+class RelativePattern implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    RelativePattern.canParse,
+    RelativePattern.fromJson,
+  );
+
+  RelativePattern({
+    required this.baseUri,
+    required this.pattern,
+  });
+  static RelativePattern fromJson(Map<String, Object?> json) {
+    final baseUriJson = json['baseUri'];
+    final baseUri = WorkspaceFolder.canParse(baseUriJson, nullLspJsonReporter)
+        ? Either2<WorkspaceFolder, String>.t1(
+            WorkspaceFolder.fromJson(baseUriJson as Map<String, Object?>))
+        : (baseUriJson is String
+            ? Either2<WorkspaceFolder, String>.t2(baseUriJson)
+            : (throw '''$baseUriJson was not one of (WorkspaceFolder, String)'''));
+    final patternJson = json['pattern'];
+    final pattern = patternJson as String;
+    return RelativePattern(
+      baseUri: baseUri,
+      pattern: pattern,
+    );
+  }
+
+  /// A workspace folder or a base URI to which this pattern will be matched
+  /// against relatively.
+  final Either2<WorkspaceFolder, String> baseUri;
+
+  /// The actual glob pattern;
+  final String pattern;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['baseUri'] = baseUri;
+    __result['pattern'] = pattern;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('baseUri');
+      try {
+        if (!obj.containsKey('baseUri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final baseUri = obj['baseUri'];
+        if (baseUri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((WorkspaceFolder.canParse(baseUri, reporter) ||
+            baseUri is String))) {
+          reporter
+              .reportError('must be of type Either2<WorkspaceFolder, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('pattern');
+      try {
+        if (!obj.containsKey('pattern')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final pattern = obj['pattern'];
+        if (pattern == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(pattern is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type RelativePattern');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is RelativePattern && other.runtimeType == RelativePattern) {
+      return baseUri == other.baseUri && pattern == other.pattern && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        baseUri,
+        pattern,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class RenameClientCapabilities implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     RenameClientCapabilities.canParse,
@@ -22497,23 +30398,23 @@
   /// Whether rename supports dynamic registration.
   final bool? dynamicRegistration;
 
-  /// Whether the client honors the change annotations in text edits and
-  /// resource operations returned via the rename request's workspace edit by
-  /// for example presenting the workspace edit in the user interface and asking
-  /// for confirmation.
+  /// Whether th client honors the change annotations in text edits and resource
+  /// operations returned via the rename request's workspace edit by for example
+  /// presenting the workspace edit in the user interface and asking for
+  /// confirmation.
   ///  @since 3.16.0
   final bool? honorsChangeAnnotations;
 
   /// Client supports testing for validity of rename operations before
   /// execution.
-  ///  @since 3.12.0
+  ///  @since version 3.12.0
   final bool? prepareSupport;
 
   /// Client supports the default behavior result (`{ defaultBehavior: boolean
   /// }`).
   ///
   /// The value indicates the default behavior used by the client.
-  ///  @since 3.16.0
+  ///  @since version 3.16.0
   final PrepareSupportDefaultBehavior? prepareSupportDefaultBehavior;
 
   Map<String, Object?> toJson() {
@@ -22653,7 +30554,7 @@
     );
   }
 
-  /// An optional annotation identifer describing the operation.
+  /// An optional annotation identifier describing the operation.
   ///  @since 3.16.0
   final String? annotationId;
 
@@ -24568,6 +32469,8 @@
     required this.formats,
     this.overlappingTokenSupport,
     this.multilineTokenSupport,
+    this.serverCancelSupport,
+    this.augmentsSyntaxTokens,
   });
   static SemanticTokensClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
@@ -24591,6 +32494,10 @@
     final overlappingTokenSupport = overlappingTokenSupportJson as bool?;
     final multilineTokenSupportJson = json['multilineTokenSupport'];
     final multilineTokenSupport = multilineTokenSupportJson as bool?;
+    final serverCancelSupportJson = json['serverCancelSupport'];
+    final serverCancelSupport = serverCancelSupportJson as bool?;
+    final augmentsSyntaxTokensJson = json['augmentsSyntaxTokens'];
+    final augmentsSyntaxTokens = augmentsSyntaxTokensJson as bool?;
     return SemanticTokensClientCapabilities(
       dynamicRegistration: dynamicRegistration,
       requests: requests,
@@ -24599,9 +32506,20 @@
       formats: formats,
       overlappingTokenSupport: overlappingTokenSupport,
       multilineTokenSupport: multilineTokenSupport,
+      serverCancelSupport: serverCancelSupport,
+      augmentsSyntaxTokens: augmentsSyntaxTokens,
     );
   }
 
+  /// Whether the client uses semantic tokens to augment existing syntax tokens.
+  /// If set to `true` client side created syntax tokens and semantic tokens are
+  /// both used for colorization. If set to `false` the client only uses the
+  /// returned semantic tokens for colorization.
+  ///
+  /// If the value is `undefined` then the client behavior is not specified.
+  ///  @since 3.17.0
+  final bool? augmentsSyntaxTokens;
+
   /// Whether implementation supports dynamic registration. If this is set to
   /// `true` the client supports the new `(TextDocumentRegistrationOptions &
   /// StaticRegistrationOptions)` return value for the corresponding server
@@ -24627,6 +32545,12 @@
   /// semantic tokens at all.
   final SemanticTokensClientCapabilitiesRequests requests;
 
+  /// Whether the client allows the server to actively cancel a semantic token
+  /// request, e.g. supports returning ErrorCodes.ServerCancelled. If a server
+  /// does the client needs to retrigger the request.
+  ///  @since 3.17.0
+  final bool? serverCancelSupport;
+
   /// The token modifiers that the client supports.
   final List<String> tokenModifiers;
 
@@ -24648,6 +32572,12 @@
     if (multilineTokenSupport != null) {
       __result['multilineTokenSupport'] = multilineTokenSupport;
     }
+    if (serverCancelSupport != null) {
+      __result['serverCancelSupport'] = serverCancelSupport;
+    }
+    if (augmentsSyntaxTokens != null) {
+      __result['augmentsSyntaxTokens'] = augmentsSyntaxTokens;
+    }
     return __result;
   }
 
@@ -24761,6 +32691,26 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('serverCancelSupport');
+      try {
+        final serverCancelSupport = obj['serverCancelSupport'];
+        if (serverCancelSupport != null && !(serverCancelSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('augmentsSyntaxTokens');
+      try {
+        final augmentsSyntaxTokens = obj['augmentsSyntaxTokens'];
+        if (augmentsSyntaxTokens != null && !(augmentsSyntaxTokens is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type SemanticTokensClientCapabilities');
@@ -24782,6 +32732,8 @@
               (TokenFormat a, TokenFormat b) => a == b) &&
           overlappingTokenSupport == other.overlappingTokenSupport &&
           multilineTokenSupport == other.multilineTokenSupport &&
+          serverCancelSupport == other.serverCancelSupport &&
+          augmentsSyntaxTokens == other.augmentsSyntaxTokens &&
           true;
     }
     return false;
@@ -24796,6 +32748,8 @@
         lspHashCode(formats),
         overlappingTokenSupport,
         multilineTokenSupport,
+        serverCancelSupport,
+        augmentsSyntaxTokens,
       );
 
   @override
@@ -26521,7 +34475,9 @@
   );
 
   ServerCapabilities({
+    this.positionEncoding,
     this.textDocumentSync,
+    this.notebookDocumentSync,
     this.completionProvider,
     this.hoverProvider,
     this.signatureHelpProvider,
@@ -26547,11 +34503,19 @@
     this.callHierarchyProvider,
     this.semanticTokensProvider,
     this.monikerProvider,
+    this.typeHierarchyProvider,
+    this.inlineValueProvider,
+    this.inlayHintProvider,
+    this.diagnosticProvider,
     this.workspaceSymbolProvider,
     this.workspace,
     this.experimental,
   });
   static ServerCapabilities fromJson(Map<String, Object?> json) {
+    final positionEncodingJson = json['positionEncoding'];
+    final positionEncoding = positionEncodingJson != null
+        ? PositionEncodingKind.fromJson(positionEncodingJson as String)
+        : null;
     final textDocumentSyncJson = json['textDocumentSync'];
     final textDocumentSync = textDocumentSyncJson == null
         ? null
@@ -26565,6 +34529,20 @@
                 ? Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t2(
                     TextDocumentSyncKind.fromJson(textDocumentSyncJson as int))
                 : (throw '''$textDocumentSyncJson was not one of (TextDocumentSyncOptions, TextDocumentSyncKind)''')));
+    final notebookDocumentSyncJson = json['notebookDocumentSync'];
+    final notebookDocumentSync = notebookDocumentSyncJson == null
+        ? null
+        : (NotebookDocumentSyncOptions.canParse(notebookDocumentSyncJson, nullLspJsonReporter)
+            ? Either2<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>.t1(
+                NotebookDocumentSyncOptions.fromJson(
+                    notebookDocumentSyncJson as Map<String, Object?>))
+            : (NotebookDocumentSyncRegistrationOptions.canParse(
+                    notebookDocumentSyncJson, nullLspJsonReporter)
+                ? Either2<NotebookDocumentSyncOptions,
+                        NotebookDocumentSyncRegistrationOptions>.t2(
+                    NotebookDocumentSyncRegistrationOptions.fromJson(
+                        notebookDocumentSyncJson as Map<String, Object?>))
+                : (throw '''$notebookDocumentSyncJson was not one of (NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions)''')));
     final completionProviderJson = json['completionProvider'];
     final completionProvider = completionProviderJson != null
         ? CompletionOptions.fromJson(
@@ -26863,6 +34841,71 @@
                         MonikerRegistrationOptions.fromJson(
                             monikerProviderJson as Map<String, Object?>))
                     : (throw '''$monikerProviderJson was not one of (bool, MonikerOptions, MonikerRegistrationOptions)'''))));
+    final typeHierarchyProviderJson = json['typeHierarchyProvider'];
+    final typeHierarchyProvider = typeHierarchyProviderJson == null
+        ? null
+        : (typeHierarchyProviderJson is bool
+            ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t1(
+                typeHierarchyProviderJson)
+            : (TypeHierarchyOptions.canParse(
+                    typeHierarchyProviderJson, nullLspJsonReporter)
+                ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t2(
+                    TypeHierarchyOptions.fromJson(
+                        typeHierarchyProviderJson as Map<String, Object?>))
+                : (TypeHierarchyRegistrationOptions.canParse(
+                        typeHierarchyProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t3(
+                        TypeHierarchyRegistrationOptions.fromJson(
+                            typeHierarchyProviderJson as Map<String, Object?>))
+                    : (throw '''$typeHierarchyProviderJson was not one of (bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions)'''))));
+    final inlineValueProviderJson = json['inlineValueProvider'];
+    final inlineValueProvider = inlineValueProviderJson == null
+        ? null
+        : (inlineValueProviderJson is bool
+            ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t1(
+                inlineValueProviderJson)
+            : (InlineValueOptions.canParse(
+                    inlineValueProviderJson, nullLspJsonReporter)
+                ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t2(
+                    InlineValueOptions.fromJson(
+                        inlineValueProviderJson as Map<String, Object?>))
+                : (InlineValueRegistrationOptions.canParse(
+                        inlineValueProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t3(
+                        InlineValueRegistrationOptions.fromJson(
+                            inlineValueProviderJson as Map<String, Object?>))
+                    : (throw '''$inlineValueProviderJson was not one of (bool, InlineValueOptions, InlineValueRegistrationOptions)'''))));
+    final inlayHintProviderJson = json['inlayHintProvider'];
+    final inlayHintProvider = inlayHintProviderJson == null
+        ? null
+        : (inlayHintProviderJson is bool
+            ? Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>.t1(
+                inlayHintProviderJson)
+            : (InlayHintOptions.canParse(
+                    inlayHintProviderJson, nullLspJsonReporter)
+                ? Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>.t2(
+                    InlayHintOptions.fromJson(
+                        inlayHintProviderJson as Map<String, Object?>))
+                : (InlayHintRegistrationOptions.canParse(
+                        inlayHintProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>.t3(
+                        InlayHintRegistrationOptions.fromJson(
+                            inlayHintProviderJson as Map<String, Object?>))
+                    : (throw '''$inlayHintProviderJson was not one of (bool, InlayHintOptions, InlayHintRegistrationOptions)'''))));
+    final diagnosticProviderJson = json['diagnosticProvider'];
+    final diagnosticProvider = diagnosticProviderJson == null
+        ? null
+        : (DiagnosticOptions.canParse(
+                diagnosticProviderJson, nullLspJsonReporter)
+            ? Either2<DiagnosticOptions, DiagnosticRegistrationOptions>.t1(
+                DiagnosticOptions.fromJson(
+                    diagnosticProviderJson as Map<String, Object?>))
+            : (DiagnosticRegistrationOptions.canParse(
+                    diagnosticProviderJson, nullLspJsonReporter)
+                ? Either2<DiagnosticOptions, DiagnosticRegistrationOptions>.t2(
+                    DiagnosticRegistrationOptions.fromJson(
+                        diagnosticProviderJson as Map<String, Object?>))
+                : (throw '''$diagnosticProviderJson was not one of (DiagnosticOptions, DiagnosticRegistrationOptions)''')));
     final workspaceSymbolProviderJson = json['workspaceSymbolProvider'];
     final workspaceSymbolProvider = workspaceSymbolProviderJson == null
         ? null
@@ -26883,7 +34926,9 @@
     final experimentalJson = json['experimental'];
     final experimental = experimentalJson;
     return ServerCapabilities(
+      positionEncoding: positionEncoding,
       textDocumentSync: textDocumentSync,
+      notebookDocumentSync: notebookDocumentSync,
       completionProvider: completionProvider,
       hoverProvider: hoverProvider,
       signatureHelpProvider: signatureHelpProvider,
@@ -26909,6 +34954,10 @@
       callHierarchyProvider: callHierarchyProvider,
       semanticTokensProvider: semanticTokensProvider,
       monikerProvider: monikerProvider,
+      typeHierarchyProvider: typeHierarchyProvider,
+      inlineValueProvider: inlineValueProvider,
+      inlayHintProvider: inlayHintProvider,
+      diagnosticProvider: diagnosticProvider,
       workspaceSymbolProvider: workspaceSymbolProvider,
       workspace: workspace,
       experimental: experimental,
@@ -26944,6 +34993,11 @@
   /// The server provides goto definition support.
   final Either2<bool, DefinitionOptions>? definitionProvider;
 
+  /// The server has support for pull model diagnostics.
+  ///  @since 3.17.0
+  final Either2<DiagnosticOptions, DiagnosticRegistrationOptions>?
+      diagnosticProvider;
+
   /// The server provides document formatting.
   final Either2<bool, DocumentFormattingOptions>? documentFormattingProvider;
 
@@ -26982,6 +35036,16 @@
   final Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>?
       implementationProvider;
 
+  /// The server provides inlay hints.
+  ///  @since 3.17.0
+  final Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>?
+      inlayHintProvider;
+
+  /// The server provides inline values.
+  ///  @since 3.17.0
+  final Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>?
+      inlineValueProvider;
+
   /// The server provides linked editing range support.
   ///  @since 3.16.0
   final Either3<bool, LinkedEditingRangeOptions,
@@ -26992,6 +35056,21 @@
   final Either3<bool, MonikerOptions, MonikerRegistrationOptions>?
       monikerProvider;
 
+  /// Defines how notebook documents are synced.
+  ///  @since 3.17.0
+  final Either2<NotebookDocumentSyncOptions,
+      NotebookDocumentSyncRegistrationOptions>? notebookDocumentSync;
+
+  /// The position encoding the server picked from the encodings offered by the
+  /// client via the client capability `general.positionEncodings`.
+  ///
+  /// If the client didn't provide any position encodings the only valid value
+  /// that a server can return is 'utf-16'.
+  ///
+  /// If omitted it defaults to 'utf-16'.
+  ///  @since 3.17.0
+  final PositionEncodingKind? positionEncoding;
+
   /// The server provides find references support.
   final Either2<bool, ReferenceOptions>? referencesProvider;
 
@@ -27025,6 +35104,11 @@
   final Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>?
       typeDefinitionProvider;
 
+  /// The server provides type hierarchy support.
+  ///  @since 3.17.0
+  final Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>?
+      typeHierarchyProvider;
+
   /// Workspace specific server capabilities
   final ServerCapabilitiesWorkspace? workspace;
 
@@ -27033,9 +35117,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (positionEncoding != null) {
+      __result['positionEncoding'] = positionEncoding?.toJson();
+    }
     if (textDocumentSync != null) {
       __result['textDocumentSync'] = textDocumentSync;
     }
+    if (notebookDocumentSync != null) {
+      __result['notebookDocumentSync'] = notebookDocumentSync;
+    }
     if (completionProvider != null) {
       __result['completionProvider'] = completionProvider?.toJson();
     }
@@ -27113,6 +35203,18 @@
     if (monikerProvider != null) {
       __result['monikerProvider'] = monikerProvider;
     }
+    if (typeHierarchyProvider != null) {
+      __result['typeHierarchyProvider'] = typeHierarchyProvider;
+    }
+    if (inlineValueProvider != null) {
+      __result['inlineValueProvider'] = inlineValueProvider;
+    }
+    if (inlayHintProvider != null) {
+      __result['inlayHintProvider'] = inlayHintProvider;
+    }
+    if (diagnosticProvider != null) {
+      __result['diagnosticProvider'] = diagnosticProvider;
+    }
     if (workspaceSymbolProvider != null) {
       __result['workspaceSymbolProvider'] = workspaceSymbolProvider;
     }
@@ -27127,6 +35229,17 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('positionEncoding');
+      try {
+        final positionEncoding = obj['positionEncoding'];
+        if (positionEncoding != null &&
+            !(PositionEncodingKind.canParse(positionEncoding, reporter))) {
+          reporter.reportError('must be of type PositionEncodingKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocumentSync');
       try {
         final textDocumentSync = obj['textDocumentSync'];
@@ -27140,6 +35253,21 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('notebookDocumentSync');
+      try {
+        final notebookDocumentSync = obj['notebookDocumentSync'];
+        if (notebookDocumentSync != null &&
+            !((NotebookDocumentSyncOptions.canParse(
+                    notebookDocumentSync, reporter) ||
+                NotebookDocumentSyncRegistrationOptions.canParse(
+                    notebookDocumentSync, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('completionProvider');
       try {
         final completionProvider = obj['completionProvider'];
@@ -27485,6 +35613,66 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('typeHierarchyProvider');
+      try {
+        final typeHierarchyProvider = obj['typeHierarchyProvider'];
+        if (typeHierarchyProvider != null &&
+            !((typeHierarchyProvider is bool ||
+                TypeHierarchyOptions.canParse(
+                    typeHierarchyProvider, reporter) ||
+                TypeHierarchyRegistrationOptions.canParse(
+                    typeHierarchyProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlineValueProvider');
+      try {
+        final inlineValueProvider = obj['inlineValueProvider'];
+        if (inlineValueProvider != null &&
+            !((inlineValueProvider is bool ||
+                InlineValueOptions.canParse(inlineValueProvider, reporter) ||
+                InlineValueRegistrationOptions.canParse(
+                    inlineValueProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlayHintProvider');
+      try {
+        final inlayHintProvider = obj['inlayHintProvider'];
+        if (inlayHintProvider != null &&
+            !((inlayHintProvider is bool ||
+                InlayHintOptions.canParse(inlayHintProvider, reporter) ||
+                InlayHintRegistrationOptions.canParse(
+                    inlayHintProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('diagnosticProvider');
+      try {
+        final diagnosticProvider = obj['diagnosticProvider'];
+        if (diagnosticProvider != null &&
+            !((DiagnosticOptions.canParse(diagnosticProvider, reporter) ||
+                DiagnosticRegistrationOptions.canParse(
+                    diagnosticProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<DiagnosticOptions, DiagnosticRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workspaceSymbolProvider');
       try {
         final workspaceSymbolProvider = obj['workspaceSymbolProvider'];
@@ -27521,7 +35709,9 @@
   bool operator ==(Object other) {
     if (other is ServerCapabilities &&
         other.runtimeType == ServerCapabilities) {
-      return textDocumentSync == other.textDocumentSync &&
+      return positionEncoding == other.positionEncoding &&
+          textDocumentSync == other.textDocumentSync &&
+          notebookDocumentSync == other.notebookDocumentSync &&
           completionProvider == other.completionProvider &&
           hoverProvider == other.hoverProvider &&
           signatureHelpProvider == other.signatureHelpProvider &&
@@ -27549,6 +35739,10 @@
           callHierarchyProvider == other.callHierarchyProvider &&
           semanticTokensProvider == other.semanticTokensProvider &&
           monikerProvider == other.monikerProvider &&
+          typeHierarchyProvider == other.typeHierarchyProvider &&
+          inlineValueProvider == other.inlineValueProvider &&
+          inlayHintProvider == other.inlayHintProvider &&
+          diagnosticProvider == other.diagnosticProvider &&
           workspaceSymbolProvider == other.workspaceSymbolProvider &&
           workspace == other.workspace &&
           experimental == other.experimental &&
@@ -27559,7 +35753,9 @@
 
   @override
   int get hashCode => Object.hashAll([
+        positionEncoding,
         textDocumentSync,
+        notebookDocumentSync,
         completionProvider,
         hoverProvider,
         signatureHelpProvider,
@@ -27585,6 +35781,10 @@
         callHierarchyProvider,
         semanticTokensProvider,
         monikerProvider,
+        typeHierarchyProvider,
+        inlineValueProvider,
+        inlayHintProvider,
+        diagnosticProvider,
         workspaceSymbolProvider,
         workspace,
         experimental,
@@ -28675,8 +36875,8 @@
   final int? activeParameter;
 
   /// The active signature. If omitted or the value lies outside the range of
-  /// `signatures` the value defaults to zero or is ignored if the
-  /// `SignatureHelp` has no signatures.
+  /// `signatures` the value defaults to zero or is ignore if the
+  /// `SignatureHelp` as no signatures.
   ///
   /// Whenever possible implementors should make an active decision about the
   /// active signature and shouldn't rely on a default value.
@@ -29001,8 +37201,8 @@
   ///  @since 3.16.0
   final bool? activeParameterSupport;
 
-  /// Client supports the following content formats for the documentation
-  /// property. The order describes the preferred format of the client.
+  /// Client supports the follow content formats for the documentation property.
+  /// The order describes the preferred format of the client.
   final List<MarkupKind>? documentationFormat;
 
   /// Client capabilities specific to parameter information.
@@ -29906,6 +38106,10 @@
     this.id,
   });
   static StaticRegistrationOptions fromJson(Map<String, Object?> json) {
+    if (NotebookDocumentSyncRegistrationOptions.canParse(
+        json, nullLspJsonReporter)) {
+      return NotebookDocumentSyncRegistrationOptions.fromJson(json);
+    }
     if (DeclarationRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return DeclarationRegistrationOptions.fromJson(json);
     }
@@ -29915,8 +38119,11 @@
     if (ImplementationRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return ImplementationRegistrationOptions.fromJson(json);
     }
-    if (DocumentColorRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return DocumentColorRegistrationOptions.fromJson(json);
+    if (CallHierarchyRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyRegistrationOptions.fromJson(json);
+    }
+    if (TypeHierarchyRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchyRegistrationOptions.fromJson(json);
     }
     if (FoldingRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return FoldingRangeRegistrationOptions.fromJson(json);
@@ -29924,12 +38131,21 @@
     if (SelectionRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return SelectionRangeRegistrationOptions.fromJson(json);
     }
-    if (CallHierarchyRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyRegistrationOptions.fromJson(json);
-    }
     if (SemanticTokensRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return SemanticTokensRegistrationOptions.fromJson(json);
     }
+    if (InlayHintRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return InlayHintRegistrationOptions.fromJson(json);
+    }
+    if (InlineValueRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return InlineValueRegistrationOptions.fromJson(json);
+    }
+    if (DiagnosticRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DiagnosticRegistrationOptions.fromJson(json);
+    }
+    if (DocumentColorRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentColorRegistrationOptions.fromJson(json);
+    }
     if (LinkedEditingRangeRegistrationOptions.canParse(
         json, nullLspJsonReporter)) {
       return LinkedEditingRangeRegistrationOptions.fromJson(json);
@@ -29990,6 +38206,7 @@
 
 /// Represents information about programming constructs like variables, classes,
 /// interfaces etc.
+///  @deprecated use DocumentSymbol or WorkspaceSymbol instead.
 class SymbolInformation implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     SymbolInformation.canParse,
@@ -30250,7 +38467,7 @@
 }
 
 /// Symbol tags are extra annotations that tweak the rendering of a symbol.
-///  @since 3.16.0
+///  @since 3.16
 class SymbolTag {
   const SymbolTag(this._value);
   const SymbolTag.fromJson(this._value);
@@ -30418,6 +38635,10 @@
     this.callHierarchy,
     this.semanticTokens,
     this.moniker,
+    this.typeHierarchy,
+    this.inlineValue,
+    this.inlayHint,
+    this.diagnostic,
   });
   static TextDocumentClientCapabilities fromJson(Map<String, Object?> json) {
     final synchronizationJson = json['synchronization'];
@@ -30548,6 +38769,26 @@
         ? MonikerClientCapabilities.fromJson(
             monikerJson as Map<String, Object?>)
         : null;
+    final typeHierarchyJson = json['typeHierarchy'];
+    final typeHierarchy = typeHierarchyJson != null
+        ? TypeHierarchyClientCapabilities1.fromJson(
+            typeHierarchyJson as Map<String, Object?>)
+        : null;
+    final inlineValueJson = json['inlineValue'];
+    final inlineValue = inlineValueJson != null
+        ? InlineValueClientCapabilities.fromJson(
+            inlineValueJson as Map<String, Object?>)
+        : null;
+    final inlayHintJson = json['inlayHint'];
+    final inlayHint = inlayHintJson != null
+        ? InlayHintClientCapabilities.fromJson(
+            inlayHintJson as Map<String, Object?>)
+        : null;
+    final diagnosticJson = json['diagnostic'];
+    final diagnostic = diagnosticJson != null
+        ? DiagnosticClientCapabilities.fromJson(
+            diagnosticJson as Map<String, Object?>)
+        : null;
     return TextDocumentClientCapabilities(
       synchronization: synchronization,
       completion: completion,
@@ -30575,6 +38816,10 @@
       callHierarchy: callHierarchy,
       semanticTokens: semanticTokens,
       moniker: moniker,
+      typeHierarchy: typeHierarchy,
+      inlineValue: inlineValue,
+      inlayHint: inlayHint,
+      diagnostic: diagnostic,
     );
   }
 
@@ -30603,6 +38848,10 @@
   /// Capabilities specific to the `textDocument/definition` request.
   final DefinitionClientCapabilities? definition;
 
+  /// Capabilities specific to the diagnostic pull model.
+  ///  @since 3.17.0
+  final DiagnosticClientCapabilities? diagnostic;
+
   /// Capabilities specific to the `textDocument/documentHighlight` request.
   final DocumentHighlightClientCapabilities? documentHighlight;
 
@@ -30626,6 +38875,14 @@
   ///  @since 3.6.0
   final ImplementationClientCapabilities? implementation;
 
+  /// Capabilities specific to the `textDocument/inlayHint` request.
+  ///  @since 3.17.0
+  final InlayHintClientCapabilities? inlayHint;
+
+  /// Capabilities specific to the `textDocument/inlineValue` request.
+  ///  @since 3.17.0
+  final InlineValueClientCapabilities? inlineValue;
+
   /// Capabilities specific to the `textDocument/linkedEditingRange` request.
   ///  @since 3.16.0
   final LinkedEditingRangeClientCapabilities? linkedEditingRange;
@@ -30634,7 +38891,8 @@
   ///  @since 3.16.0
   final MonikerClientCapabilities? moniker;
 
-  /// Capabilities specific to the `textDocument/onTypeFormatting` request.
+  /// request. Capabilities specific to the `textDocument/onTypeFormatting`
+  /// request.
   final DocumentOnTypeFormattingClientCapabilities? onTypeFormatting;
 
   /// Capabilities specific to the `textDocument/publishDiagnostics`
@@ -30666,6 +38924,10 @@
   ///  @since 3.6.0
   final TypeDefinitionClientCapabilities? typeDefinition;
 
+  /// Capabilities specific to the various type hierarchy requests.
+  ///  @since 3.17.0
+  final TypeHierarchyClientCapabilities1? typeHierarchy;
+
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     if (synchronization != null) {
@@ -30746,6 +39008,18 @@
     if (moniker != null) {
       __result['moniker'] = moniker?.toJson();
     }
+    if (typeHierarchy != null) {
+      __result['typeHierarchy'] = typeHierarchy;
+    }
+    if (inlineValue != null) {
+      __result['inlineValue'] = inlineValue?.toJson();
+    }
+    if (inlayHint != null) {
+      __result['inlayHint'] = inlayHint?.toJson();
+    }
+    if (diagnostic != null) {
+      __result['diagnostic'] = diagnostic?.toJson();
+    }
     return __result;
   }
 
@@ -31071,6 +39345,52 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('typeHierarchy');
+      try {
+        final typeHierarchy = obj['typeHierarchy'];
+        if (typeHierarchy != null &&
+            !(TypeHierarchyClientCapabilities1.canParse(
+                typeHierarchy, reporter))) {
+          reporter
+              .reportError('must be of type TypeHierarchyClientCapabilities1');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlineValue');
+      try {
+        final inlineValue = obj['inlineValue'];
+        if (inlineValue != null &&
+            !(InlineValueClientCapabilities.canParse(inlineValue, reporter))) {
+          reporter.reportError('must be of type InlineValueClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlayHint');
+      try {
+        final inlayHint = obj['inlayHint'];
+        if (inlayHint != null &&
+            !(InlayHintClientCapabilities.canParse(inlayHint, reporter))) {
+          reporter.reportError('must be of type InlayHintClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('diagnostic');
+      try {
+        final diagnostic = obj['diagnostic'];
+        if (diagnostic != null &&
+            !(DiagnosticClientCapabilities.canParse(diagnostic, reporter))) {
+          reporter.reportError('must be of type DiagnosticClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type TextDocumentClientCapabilities');
@@ -31108,6 +39428,10 @@
           callHierarchy == other.callHierarchy &&
           semanticTokens == other.semanticTokens &&
           moniker == other.moniker &&
+          typeHierarchy == other.typeHierarchy &&
+          inlineValue == other.inlineValue &&
+          inlayHint == other.inlayHint &&
+          diagnostic == other.diagnostic &&
           true;
     }
     return false;
@@ -31141,6 +39465,10 @@
         callHierarchy,
         semanticTokens,
         moniker,
+        typeHierarchy,
+        inlineValue,
+        inlayHint,
+        diagnostic,
       ]);
 
   @override
@@ -31707,15 +40035,6 @@
     required this.position,
   });
   static TextDocumentPositionParams fromJson(Map<String, Object?> json) {
-    if (CompletionParams.canParse(json, nullLspJsonReporter)) {
-      return CompletionParams.fromJson(json);
-    }
-    if (HoverParams.canParse(json, nullLspJsonReporter)) {
-      return HoverParams.fromJson(json);
-    }
-    if (SignatureHelpParams.canParse(json, nullLspJsonReporter)) {
-      return SignatureHelpParams.fromJson(json);
-    }
     if (DeclarationParams.canParse(json, nullLspJsonReporter)) {
       return DeclarationParams.fromJson(json);
     }
@@ -31731,11 +40050,26 @@
     if (ReferenceParams.canParse(json, nullLspJsonReporter)) {
       return ReferenceParams.fromJson(json);
     }
+    if (CallHierarchyPrepareParams.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyPrepareParams.fromJson(json);
+    }
+    if (TypeHierarchyPrepareParams.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchyPrepareParams.fromJson(json);
+    }
     if (DocumentHighlightParams.canParse(json, nullLspJsonReporter)) {
       return DocumentHighlightParams.fromJson(json);
     }
-    if (DocumentOnTypeFormattingParams.canParse(json, nullLspJsonReporter)) {
-      return DocumentOnTypeFormattingParams.fromJson(json);
+    if (HoverParams.canParse(json, nullLspJsonReporter)) {
+      return HoverParams.fromJson(json);
+    }
+    if (MonikerParams.canParse(json, nullLspJsonReporter)) {
+      return MonikerParams.fromJson(json);
+    }
+    if (CompletionParams.canParse(json, nullLspJsonReporter)) {
+      return CompletionParams.fromJson(json);
+    }
+    if (SignatureHelpParams.canParse(json, nullLspJsonReporter)) {
+      return SignatureHelpParams.fromJson(json);
     }
     if (RenameParams.canParse(json, nullLspJsonReporter)) {
       return RenameParams.fromJson(json);
@@ -31743,15 +40077,9 @@
     if (PrepareRenameParams.canParse(json, nullLspJsonReporter)) {
       return PrepareRenameParams.fromJson(json);
     }
-    if (CallHierarchyPrepareParams.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyPrepareParams.fromJson(json);
-    }
     if (LinkedEditingRangeParams.canParse(json, nullLspJsonReporter)) {
       return LinkedEditingRangeParams.fromJson(json);
     }
-    if (MonikerParams.canParse(json, nullLspJsonReporter)) {
-      return MonikerParams.fromJson(json);
-    }
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
@@ -31861,15 +40189,6 @@
         json, nullLspJsonReporter)) {
       return TextDocumentSaveRegistrationOptions.fromJson(json);
     }
-    if (CompletionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return CompletionRegistrationOptions.fromJson(json);
-    }
-    if (HoverRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return HoverRegistrationOptions.fromJson(json);
-    }
-    if (SignatureHelpRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return SignatureHelpRegistrationOptions.fromJson(json);
-    }
     if (DeclarationRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return DeclarationRegistrationOptions.fromJson(json);
     }
@@ -31885,21 +40204,57 @@
     if (ReferenceRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return ReferenceRegistrationOptions.fromJson(json);
     }
+    if (CallHierarchyRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyRegistrationOptions.fromJson(json);
+    }
+    if (TypeHierarchyRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchyRegistrationOptions.fromJson(json);
+    }
     if (DocumentHighlightRegistrationOptions.canParse(
         json, nullLspJsonReporter)) {
       return DocumentHighlightRegistrationOptions.fromJson(json);
     }
-    if (DocumentSymbolRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return DocumentSymbolRegistrationOptions.fromJson(json);
+    if (DocumentLinkRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentLinkRegistrationOptions.fromJson(json);
     }
-    if (CodeActionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return CodeActionRegistrationOptions.fromJson(json);
+    if (HoverRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return HoverRegistrationOptions.fromJson(json);
     }
     if (CodeLensRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return CodeLensRegistrationOptions.fromJson(json);
     }
-    if (DocumentLinkRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return DocumentLinkRegistrationOptions.fromJson(json);
+    if (FoldingRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return FoldingRangeRegistrationOptions.fromJson(json);
+    }
+    if (SelectionRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return SelectionRangeRegistrationOptions.fromJson(json);
+    }
+    if (DocumentSymbolRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentSymbolRegistrationOptions.fromJson(json);
+    }
+    if (SemanticTokensRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return SemanticTokensRegistrationOptions.fromJson(json);
+    }
+    if (InlayHintRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return InlayHintRegistrationOptions.fromJson(json);
+    }
+    if (InlineValueRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return InlineValueRegistrationOptions.fromJson(json);
+    }
+    if (MonikerRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return MonikerRegistrationOptions.fromJson(json);
+    }
+    if (CompletionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return CompletionRegistrationOptions.fromJson(json);
+    }
+    if (DiagnosticRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DiagnosticRegistrationOptions.fromJson(json);
+    }
+    if (SignatureHelpRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return SignatureHelpRegistrationOptions.fromJson(json);
+    }
+    if (CodeActionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return CodeActionRegistrationOptions.fromJson(json);
     }
     if (DocumentColorRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return DocumentColorRegistrationOptions.fromJson(json);
@@ -31919,25 +40274,10 @@
     if (RenameRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return RenameRegistrationOptions.fromJson(json);
     }
-    if (FoldingRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return FoldingRangeRegistrationOptions.fromJson(json);
-    }
-    if (SelectionRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return SelectionRangeRegistrationOptions.fromJson(json);
-    }
-    if (CallHierarchyRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyRegistrationOptions.fromJson(json);
-    }
-    if (SemanticTokensRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return SemanticTokensRegistrationOptions.fromJson(json);
-    }
     if (LinkedEditingRangeRegistrationOptions.canParse(
         json, nullLspJsonReporter)) {
       return LinkedEditingRangeRegistrationOptions.fromJson(json);
     }
-    if (MonikerRegistrationOptions.canParse(json, nullLspJsonReporter)) {
-      return MonikerRegistrationOptions.fromJson(json);
-    }
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
         ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
@@ -33046,6 +41386,1018 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class TypeHierarchyClientCapabilities1 implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TypeHierarchyClientCapabilities1.canParse,
+    TypeHierarchyClientCapabilities1.fromJson,
+  );
+
+  TypeHierarchyClientCapabilities1({
+    this.dynamicRegistration,
+  });
+  static TypeHierarchyClientCapabilities1 fromJson(Map<String, Object?> json) {
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    return TypeHierarchyClientCapabilities1(
+      dynamicRegistration: dynamicRegistration,
+    );
+  }
+
+  /// Whether implementation supports dynamic registration. If this is set to
+  /// `true` the client supports the new `(TextDocumentRegistrationOptions &
+  /// StaticRegistrationOptions)` return value for the corresponding server
+  /// capability as well.
+  final bool? dynamicRegistration;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      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();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TypeHierarchyClientCapabilities1');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TypeHierarchyClientCapabilities1 &&
+        other.runtimeType == TypeHierarchyClientCapabilities1) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => dynamicRegistration.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TypeHierarchyItem implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TypeHierarchyItem.canParse,
+    TypeHierarchyItem.fromJson,
+  );
+
+  TypeHierarchyItem({
+    required this.name,
+    required this.kind,
+    this.tags,
+    this.detail,
+    required this.uri,
+    required this.range,
+    required this.selectionRange,
+    this.data,
+  });
+  static TypeHierarchyItem fromJson(Map<String, Object?> json) {
+    final nameJson = json['name'];
+    final name = nameJson as String;
+    final kindJson = json['kind'];
+    final kind = SymbolKind.fromJson(kindJson as int);
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => SymbolTag.fromJson(item as int))
+        .toList();
+    final detailJson = json['detail'];
+    final detail = detailJson as String?;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final selectionRangeJson = json['selectionRange'];
+    final selectionRange =
+        Range.fromJson(selectionRangeJson as Map<String, Object?>);
+    final dataJson = json['data'];
+    final data = dataJson;
+    return TypeHierarchyItem(
+      name: name,
+      kind: kind,
+      tags: tags,
+      detail: detail,
+      uri: uri,
+      range: range,
+      selectionRange: selectionRange,
+      data: data,
+    );
+  }
+
+  /// A data entry field that is preserved between a type hierarchy prepare and
+  /// supertypes or subtypes requests. It could also be used to identify the
+  /// type hierarchy in the server, helping improve the performance on resolving
+  /// supertypes and subtypes.
+  final Object? data;
+
+  /// More detail for this item, e.g. the signature of a function.
+  final String? detail;
+
+  /// The kind of this item.
+  final SymbolKind kind;
+
+  /// The name of this item.
+  final String name;
+
+  /// The range enclosing this symbol not including leading/trailing whitespace
+  /// but everything else, e.g. comments and code.
+  final Range range;
+
+  /// The range that should be selected and revealed when this symbol is being
+  /// picked, e.g. the name of a function. Must be contained by the
+  /// [`range`](#TypeHierarchyItem.range).
+  final Range selectionRange;
+
+  /// Tags for this item.
+  final List<SymbolTag>? tags;
+
+  /// The resource identifier of this item.
+  final String uri;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['name'] = name;
+    __result['kind'] = kind.toJson();
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    }
+    if (detail != null) {
+      __result['detail'] = detail;
+    }
+    __result['uri'] = uri;
+    __result['range'] = range.toJson();
+    __result['selectionRange'] = selectionRange.toJson();
+    if (data != null) {
+      __result['data'] = data;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('name');
+      try {
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final name = obj['name'];
+        if (name == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(name is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(SymbolKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type SymbolKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('detail');
+      try {
+        final detail = obj['detail'];
+        if (detail != null && !(detail is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('selectionRange');
+      try {
+        if (!obj.containsKey('selectionRange')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final selectionRange = obj['selectionRange'];
+        if (selectionRange == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(selectionRange, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TypeHierarchyItem');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TypeHierarchyItem && other.runtimeType == TypeHierarchyItem) {
+      return name == other.name &&
+          kind == other.kind &&
+          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
+          detail == other.detail &&
+          uri == other.uri &&
+          range == other.range &&
+          selectionRange == other.selectionRange &&
+          data == other.data &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        name,
+        kind,
+        lspHashCode(tags),
+        detail,
+        uri,
+        range,
+        selectionRange,
+        data,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TypeHierarchyOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TypeHierarchyOptions.canParse,
+    TypeHierarchyOptions.fromJson,
+  );
+
+  TypeHierarchyOptions({
+    this.workDoneProgress,
+  });
+  static TypeHierarchyOptions fromJson(Map<String, Object?> json) {
+    if (TypeHierarchyRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchyRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    return TypeHierarchyOptions(
+      workDoneProgress: workDoneProgress,
+    );
+  }
+
+  final bool? workDoneProgress;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TypeHierarchyOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TypeHierarchyOptions &&
+        other.runtimeType == TypeHierarchyOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => workDoneProgress.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TypeHierarchyPrepareParams
+    implements TextDocumentPositionParams, WorkDoneProgressParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TypeHierarchyPrepareParams.canParse,
+    TypeHierarchyPrepareParams.fromJson,
+  );
+
+  TypeHierarchyPrepareParams({
+    required this.textDocument,
+    required this.position,
+    this.workDoneToken,
+  });
+  static TypeHierarchyPrepareParams fromJson(Map<String, Object?> json) {
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    return TypeHierarchyPrepareParams(
+      textDocument: textDocument,
+      position: position,
+      workDoneToken: workDoneToken,
+    );
+  }
+
+  /// The position inside the text document.
+  final Position position;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<int, String>? workDoneToken;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['textDocument'] = textDocument.toJson();
+    __result['position'] = position.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('position');
+      try {
+        if (!obj.containsKey('position')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final position = obj['position'];
+        if (position == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(position, reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TypeHierarchyPrepareParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TypeHierarchyPrepareParams &&
+        other.runtimeType == TypeHierarchyPrepareParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        textDocument,
+        position,
+        workDoneToken,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TypeHierarchyRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        TypeHierarchyOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TypeHierarchyRegistrationOptions.canParse,
+    TypeHierarchyRegistrationOptions.fromJson,
+  );
+
+  TypeHierarchyRegistrationOptions({
+    this.documentSelector,
+    this.workDoneProgress,
+    this.id,
+  });
+  static TypeHierarchyRegistrationOptions fromJson(Map<String, Object?> json) {
+    final documentSelectorJson = json['documentSelector'];
+    final documentSelector = (documentSelectorJson as List<Object?>?)
+        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        .toList();
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    final idJson = json['id'];
+    final id = idJson as String?;
+    return TypeHierarchyRegistrationOptions(
+      documentSelector: documentSelector,
+      workDoneProgress: workDoneProgress,
+      id: id,
+    );
+  }
+
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
+  final List<DocumentFilter>? documentSelector;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String? id;
+  final bool? workDoneProgress;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    if (id != null) {
+      __result['id'] = id;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final documentSelector = obj['documentSelector'];
+        if (documentSelector != null &&
+            !((documentSelector is List<Object?> &&
+                (documentSelector.every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TypeHierarchyRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TypeHierarchyRegistrationOptions &&
+        other.runtimeType == TypeHierarchyRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(documentSelector),
+        workDoneProgress,
+        id,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TypeHierarchySubtypesParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TypeHierarchySubtypesParams.canParse,
+    TypeHierarchySubtypesParams.fromJson,
+  );
+
+  TypeHierarchySubtypesParams({
+    required this.item,
+    this.workDoneToken,
+    this.partialResultToken,
+  });
+  static TypeHierarchySubtypesParams fromJson(Map<String, Object?> json) {
+    final itemJson = json['item'];
+    final item = TypeHierarchyItem.fromJson(itemJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    return TypeHierarchySubtypesParams(
+      item: item,
+      workDoneToken: workDoneToken,
+      partialResultToken: partialResultToken,
+    );
+  }
+
+  final TypeHierarchyItem item;
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<int, String>? partialResultToken;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<int, String>? workDoneToken;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['item'] = item.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('item');
+      try {
+        if (!obj.containsKey('item')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final item = obj['item'];
+        if (item == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TypeHierarchyItem.canParse(item, reporter))) {
+          reporter.reportError('must be of type TypeHierarchyItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TypeHierarchySubtypesParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TypeHierarchySubtypesParams &&
+        other.runtimeType == TypeHierarchySubtypesParams) {
+      return item == other.item &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        item,
+        workDoneToken,
+        partialResultToken,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TypeHierarchySupertypesParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TypeHierarchySupertypesParams.canParse,
+    TypeHierarchySupertypesParams.fromJson,
+  );
+
+  TypeHierarchySupertypesParams({
+    required this.item,
+    this.workDoneToken,
+    this.partialResultToken,
+  });
+  static TypeHierarchySupertypesParams fromJson(Map<String, Object?> json) {
+    final itemJson = json['item'];
+    final item = TypeHierarchyItem.fromJson(itemJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    return TypeHierarchySupertypesParams(
+      item: item,
+      workDoneToken: workDoneToken,
+      partialResultToken: partialResultToken,
+    );
+  }
+
+  final TypeHierarchyItem item;
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<int, String>? partialResultToken;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<int, String>? workDoneToken;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['item'] = item.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('item');
+      try {
+        if (!obj.containsKey('item')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final item = obj['item'];
+        if (item == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TypeHierarchyItem.canParse(item, reporter))) {
+          reporter.reportError('must be of type TypeHierarchyItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TypeHierarchySupertypesParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TypeHierarchySupertypesParams &&
+        other.runtimeType == TypeHierarchySupertypesParams) {
+      return item == other.item &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        item,
+        workDoneToken,
+        partialResultToken,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A diagnostic report indicating that the last returned report is still
+/// accurate.
+///  @since 3.17.0
+class UnchangedDocumentDiagnosticReport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    UnchangedDocumentDiagnosticReport.canParse,
+    UnchangedDocumentDiagnosticReport.fromJson,
+  );
+
+  UnchangedDocumentDiagnosticReport({
+    this.kind = 'unchanged',
+    required this.resultId,
+  }) {
+    if (kind != 'unchanged') {
+      throw 'kind may only be the literal \'unchanged\'';
+    }
+  }
+  static UnchangedDocumentDiagnosticReport fromJson(Map<String, Object?> json) {
+    if (RelatedUnchangedDocumentDiagnosticReport.canParse(
+        json, nullLspJsonReporter)) {
+      return RelatedUnchangedDocumentDiagnosticReport.fromJson(json);
+    }
+    if (WorkspaceUnchangedDocumentDiagnosticReport.canParse(
+        json, nullLspJsonReporter)) {
+      return WorkspaceUnchangedDocumentDiagnosticReport.fromJson(json);
+    }
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String;
+    return UnchangedDocumentDiagnosticReport(
+      kind: kind,
+      resultId: resultId,
+    );
+  }
+
+  /// A document diagnostic report indicating no changes to the last result. A
+  /// server can only return `unchanged` if result ids are provided.
+  final String kind;
+
+  /// A result id which will be sent on the next diagnostic request for the same
+  /// document.
+  final String resultId;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['kind'] = kind;
+    __result['resultId'] = resultId;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind == 'unchanged')) {
+          reporter.reportError('must be the literal \'unchanged\'');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('resultId');
+      try {
+        if (!obj.containsKey('resultId')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final resultId = obj['resultId'];
+        if (resultId == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type UnchangedDocumentDiagnosticReport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is UnchangedDocumentDiagnosticReport &&
+        other.runtimeType == UnchangedDocumentDiagnosticReport) {
+      return kind == other.kind && resultId == other.resultId && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        kind,
+        resultId,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Moniker uniqueness level to define scope of the moniker.
 class UniquenessLevel {
   const UniquenessLevel(this._value);
@@ -33260,6 +42612,108 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// A versioned notebook document identifier.
+///  @since 3.17.0
+class VersionedNotebookDocumentIdentifier implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    VersionedNotebookDocumentIdentifier.canParse,
+    VersionedNotebookDocumentIdentifier.fromJson,
+  );
+
+  VersionedNotebookDocumentIdentifier({
+    required this.version,
+    required this.uri,
+  });
+  static VersionedNotebookDocumentIdentifier fromJson(
+      Map<String, Object?> json) {
+    final versionJson = json['version'];
+    final version = versionJson as int;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    return VersionedNotebookDocumentIdentifier(
+      version: version,
+      uri: uri,
+    );
+  }
+
+  /// The notebook document's uri.
+  final String uri;
+
+  /// The version number of this notebook document.
+  final int version;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['version'] = version;
+    __result['uri'] = uri;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type VersionedNotebookDocumentIdentifier');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is VersionedNotebookDocumentIdentifier &&
+        other.runtimeType == VersionedNotebookDocumentIdentifier) {
+      return version == other.version && uri == other.uri && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        version,
+        uri,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class VersionedTextDocumentIdentifier
     implements TextDocumentIdentifier, ToJsonable {
   static const jsonHandler = LspJsonHandler(
@@ -33928,21 +43382,6 @@
     this.workDoneProgress,
   });
   static WorkDoneProgressOptions fromJson(Map<String, Object?> json) {
-    if (WorkspaceSymbolOptions.canParse(json, nullLspJsonReporter)) {
-      return WorkspaceSymbolOptions.fromJson(json);
-    }
-    if (ExecuteCommandOptions.canParse(json, nullLspJsonReporter)) {
-      return ExecuteCommandOptions.fromJson(json);
-    }
-    if (CompletionOptions.canParse(json, nullLspJsonReporter)) {
-      return CompletionOptions.fromJson(json);
-    }
-    if (HoverOptions.canParse(json, nullLspJsonReporter)) {
-      return HoverOptions.fromJson(json);
-    }
-    if (SignatureHelpOptions.canParse(json, nullLspJsonReporter)) {
-      return SignatureHelpOptions.fromJson(json);
-    }
     if (DeclarationOptions.canParse(json, nullLspJsonReporter)) {
       return DeclarationOptions.fromJson(json);
     }
@@ -33958,20 +43397,56 @@
     if (ReferenceOptions.canParse(json, nullLspJsonReporter)) {
       return ReferenceOptions.fromJson(json);
     }
+    if (CallHierarchyOptions.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyOptions.fromJson(json);
+    }
+    if (TypeHierarchyOptions.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchyOptions.fromJson(json);
+    }
     if (DocumentHighlightOptions.canParse(json, nullLspJsonReporter)) {
       return DocumentHighlightOptions.fromJson(json);
     }
-    if (DocumentSymbolOptions.canParse(json, nullLspJsonReporter)) {
-      return DocumentSymbolOptions.fromJson(json);
+    if (DocumentLinkOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentLinkOptions.fromJson(json);
     }
-    if (CodeActionOptions.canParse(json, nullLspJsonReporter)) {
-      return CodeActionOptions.fromJson(json);
+    if (HoverOptions.canParse(json, nullLspJsonReporter)) {
+      return HoverOptions.fromJson(json);
     }
     if (CodeLensOptions.canParse(json, nullLspJsonReporter)) {
       return CodeLensOptions.fromJson(json);
     }
-    if (DocumentLinkOptions.canParse(json, nullLspJsonReporter)) {
-      return DocumentLinkOptions.fromJson(json);
+    if (FoldingRangeOptions.canParse(json, nullLspJsonReporter)) {
+      return FoldingRangeOptions.fromJson(json);
+    }
+    if (SelectionRangeOptions.canParse(json, nullLspJsonReporter)) {
+      return SelectionRangeOptions.fromJson(json);
+    }
+    if (DocumentSymbolOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentSymbolOptions.fromJson(json);
+    }
+    if (SemanticTokensOptions.canParse(json, nullLspJsonReporter)) {
+      return SemanticTokensOptions.fromJson(json);
+    }
+    if (InlayHintOptions.canParse(json, nullLspJsonReporter)) {
+      return InlayHintOptions.fromJson(json);
+    }
+    if (InlineValueOptions.canParse(json, nullLspJsonReporter)) {
+      return InlineValueOptions.fromJson(json);
+    }
+    if (MonikerOptions.canParse(json, nullLspJsonReporter)) {
+      return MonikerOptions.fromJson(json);
+    }
+    if (CompletionOptions.canParse(json, nullLspJsonReporter)) {
+      return CompletionOptions.fromJson(json);
+    }
+    if (DiagnosticOptions.canParse(json, nullLspJsonReporter)) {
+      return DiagnosticOptions.fromJson(json);
+    }
+    if (SignatureHelpOptions.canParse(json, nullLspJsonReporter)) {
+      return SignatureHelpOptions.fromJson(json);
+    }
+    if (CodeActionOptions.canParse(json, nullLspJsonReporter)) {
+      return CodeActionOptions.fromJson(json);
     }
     if (DocumentColorOptions.canParse(json, nullLspJsonReporter)) {
       return DocumentColorOptions.fromJson(json);
@@ -33985,23 +43460,14 @@
     if (RenameOptions.canParse(json, nullLspJsonReporter)) {
       return RenameOptions.fromJson(json);
     }
-    if (FoldingRangeOptions.canParse(json, nullLspJsonReporter)) {
-      return FoldingRangeOptions.fromJson(json);
-    }
-    if (SelectionRangeOptions.canParse(json, nullLspJsonReporter)) {
-      return SelectionRangeOptions.fromJson(json);
-    }
-    if (CallHierarchyOptions.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyOptions.fromJson(json);
-    }
-    if (SemanticTokensOptions.canParse(json, nullLspJsonReporter)) {
-      return SemanticTokensOptions.fromJson(json);
-    }
     if (LinkedEditingRangeOptions.canParse(json, nullLspJsonReporter)) {
       return LinkedEditingRangeOptions.fromJson(json);
     }
-    if (MonikerOptions.canParse(json, nullLspJsonReporter)) {
-      return MonikerOptions.fromJson(json);
+    if (WorkspaceSymbolOptions.canParse(json, nullLspJsonReporter)) {
+      return WorkspaceSymbolOptions.fromJson(json);
+    }
+    if (ExecuteCommandOptions.canParse(json, nullLspJsonReporter)) {
+      return ExecuteCommandOptions.fromJson(json);
     }
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -34068,21 +43534,6 @@
     if (InitializeParams.canParse(json, nullLspJsonReporter)) {
       return InitializeParams.fromJson(json);
     }
-    if (WorkspaceSymbolParams.canParse(json, nullLspJsonReporter)) {
-      return WorkspaceSymbolParams.fromJson(json);
-    }
-    if (ExecuteCommandParams.canParse(json, nullLspJsonReporter)) {
-      return ExecuteCommandParams.fromJson(json);
-    }
-    if (CompletionParams.canParse(json, nullLspJsonReporter)) {
-      return CompletionParams.fromJson(json);
-    }
-    if (HoverParams.canParse(json, nullLspJsonReporter)) {
-      return HoverParams.fromJson(json);
-    }
-    if (SignatureHelpParams.canParse(json, nullLspJsonReporter)) {
-      return SignatureHelpParams.fromJson(json);
-    }
     if (DeclarationParams.canParse(json, nullLspJsonReporter)) {
       return DeclarationParams.fromJson(json);
     }
@@ -34098,20 +43549,77 @@
     if (ReferenceParams.canParse(json, nullLspJsonReporter)) {
       return ReferenceParams.fromJson(json);
     }
+    if (CallHierarchyPrepareParams.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyPrepareParams.fromJson(json);
+    }
+    if (CallHierarchyIncomingCallsParams.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyIncomingCallsParams.fromJson(json);
+    }
+    if (CallHierarchyOutgoingCallsParams.canParse(json, nullLspJsonReporter)) {
+      return CallHierarchyOutgoingCallsParams.fromJson(json);
+    }
+    if (TypeHierarchyPrepareParams.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchyPrepareParams.fromJson(json);
+    }
+    if (TypeHierarchySupertypesParams.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchySupertypesParams.fromJson(json);
+    }
+    if (TypeHierarchySubtypesParams.canParse(json, nullLspJsonReporter)) {
+      return TypeHierarchySubtypesParams.fromJson(json);
+    }
     if (DocumentHighlightParams.canParse(json, nullLspJsonReporter)) {
       return DocumentHighlightParams.fromJson(json);
     }
-    if (DocumentSymbolParams.canParse(json, nullLspJsonReporter)) {
-      return DocumentSymbolParams.fromJson(json);
+    if (DocumentLinkParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentLinkParams.fromJson(json);
     }
-    if (CodeActionParams.canParse(json, nullLspJsonReporter)) {
-      return CodeActionParams.fromJson(json);
+    if (HoverParams.canParse(json, nullLspJsonReporter)) {
+      return HoverParams.fromJson(json);
     }
     if (CodeLensParams.canParse(json, nullLspJsonReporter)) {
       return CodeLensParams.fromJson(json);
     }
-    if (DocumentLinkParams.canParse(json, nullLspJsonReporter)) {
-      return DocumentLinkParams.fromJson(json);
+    if (FoldingRangeParams.canParse(json, nullLspJsonReporter)) {
+      return FoldingRangeParams.fromJson(json);
+    }
+    if (SelectionRangeParams.canParse(json, nullLspJsonReporter)) {
+      return SelectionRangeParams.fromJson(json);
+    }
+    if (DocumentSymbolParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentSymbolParams.fromJson(json);
+    }
+    if (SemanticTokensParams.canParse(json, nullLspJsonReporter)) {
+      return SemanticTokensParams.fromJson(json);
+    }
+    if (SemanticTokensDeltaParams.canParse(json, nullLspJsonReporter)) {
+      return SemanticTokensDeltaParams.fromJson(json);
+    }
+    if (SemanticTokensRangeParams.canParse(json, nullLspJsonReporter)) {
+      return SemanticTokensRangeParams.fromJson(json);
+    }
+    if (InlayHintParams.canParse(json, nullLspJsonReporter)) {
+      return InlayHintParams.fromJson(json);
+    }
+    if (InlineValueParams.canParse(json, nullLspJsonReporter)) {
+      return InlineValueParams.fromJson(json);
+    }
+    if (MonikerParams.canParse(json, nullLspJsonReporter)) {
+      return MonikerParams.fromJson(json);
+    }
+    if (CompletionParams.canParse(json, nullLspJsonReporter)) {
+      return CompletionParams.fromJson(json);
+    }
+    if (DocumentDiagnosticParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentDiagnosticParams.fromJson(json);
+    }
+    if (WorkspaceDiagnosticParams.canParse(json, nullLspJsonReporter)) {
+      return WorkspaceDiagnosticParams.fromJson(json);
+    }
+    if (SignatureHelpParams.canParse(json, nullLspJsonReporter)) {
+      return SignatureHelpParams.fromJson(json);
+    }
+    if (CodeActionParams.canParse(json, nullLspJsonReporter)) {
+      return CodeActionParams.fromJson(json);
     }
     if (DocumentColorParams.canParse(json, nullLspJsonReporter)) {
       return DocumentColorParams.fromJson(json);
@@ -34128,35 +43636,14 @@
     if (RenameParams.canParse(json, nullLspJsonReporter)) {
       return RenameParams.fromJson(json);
     }
-    if (FoldingRangeParams.canParse(json, nullLspJsonReporter)) {
-      return FoldingRangeParams.fromJson(json);
-    }
-    if (SelectionRangeParams.canParse(json, nullLspJsonReporter)) {
-      return SelectionRangeParams.fromJson(json);
-    }
-    if (CallHierarchyPrepareParams.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyPrepareParams.fromJson(json);
-    }
-    if (CallHierarchyIncomingCallsParams.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyIncomingCallsParams.fromJson(json);
-    }
-    if (CallHierarchyOutgoingCallsParams.canParse(json, nullLspJsonReporter)) {
-      return CallHierarchyOutgoingCallsParams.fromJson(json);
-    }
-    if (SemanticTokensParams.canParse(json, nullLspJsonReporter)) {
-      return SemanticTokensParams.fromJson(json);
-    }
-    if (SemanticTokensDeltaParams.canParse(json, nullLspJsonReporter)) {
-      return SemanticTokensDeltaParams.fromJson(json);
-    }
-    if (SemanticTokensRangeParams.canParse(json, nullLspJsonReporter)) {
-      return SemanticTokensRangeParams.fromJson(json);
-    }
     if (LinkedEditingRangeParams.canParse(json, nullLspJsonReporter)) {
       return LinkedEditingRangeParams.fromJson(json);
     }
-    if (MonikerParams.canParse(json, nullLspJsonReporter)) {
-      return MonikerParams.fromJson(json);
+    if (WorkspaceSymbolParams.canParse(json, nullLspJsonReporter)) {
+      return WorkspaceSymbolParams.fromJson(json);
+    }
+    if (ExecuteCommandParams.canParse(json, nullLspJsonReporter)) {
+      return ExecuteCommandParams.fromJson(json);
     }
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
@@ -34371,6 +43858,370 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// Parameters of the workspace diagnostic request.
+///  @since 3.17.0
+class WorkspaceDiagnosticParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceDiagnosticParams.canParse,
+    WorkspaceDiagnosticParams.fromJson,
+  );
+
+  WorkspaceDiagnosticParams({
+    this.identifier,
+    required this.previousResultIds,
+    this.workDoneToken,
+    this.partialResultToken,
+  });
+  static WorkspaceDiagnosticParams fromJson(Map<String, Object?> json) {
+    final identifierJson = json['identifier'];
+    final identifier = identifierJson as String?;
+    final previousResultIdsJson = json['previousResultIds'];
+    final previousResultIds = (previousResultIdsJson as List<Object?>)
+        .map((item) => PreviousResultId.fromJson(item as Map<String, Object?>))
+        .toList();
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    return WorkspaceDiagnosticParams(
+      identifier: identifier,
+      previousResultIds: previousResultIds,
+      workDoneToken: workDoneToken,
+      partialResultToken: partialResultToken,
+    );
+  }
+
+  /// The additional identifier provided during registration.
+  final String? identifier;
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<int, String>? partialResultToken;
+
+  /// The currently known diagnostic reports with their previous result ids.
+  final List<PreviousResultId> previousResultIds;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<int, String>? workDoneToken;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (identifier != null) {
+      __result['identifier'] = identifier;
+    }
+    __result['previousResultIds'] =
+        previousResultIds.map((item) => item.toJson()).toList();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('identifier');
+      try {
+        final identifier = obj['identifier'];
+        if (identifier != null && !(identifier is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('previousResultIds');
+      try {
+        if (!obj.containsKey('previousResultIds')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final previousResultIds = obj['previousResultIds'];
+        if (previousResultIds == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((previousResultIds is List<Object?> &&
+            (previousResultIds.every(
+                (item) => PreviousResultId.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<PreviousResultId>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type WorkspaceDiagnosticParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceDiagnosticParams &&
+        other.runtimeType == WorkspaceDiagnosticParams) {
+      return identifier == other.identifier &&
+          listEqual(previousResultIds, other.previousResultIds,
+              (PreviousResultId a, PreviousResultId b) => a == b) &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        identifier,
+        lspHashCode(previousResultIds),
+        workDoneToken,
+        partialResultToken,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A workspace diagnostic report.
+///  @since 3.17.0
+class WorkspaceDiagnosticReport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceDiagnosticReport.canParse,
+    WorkspaceDiagnosticReport.fromJson,
+  );
+
+  WorkspaceDiagnosticReport({
+    required this.items,
+  });
+  static WorkspaceDiagnosticReport fromJson(Map<String, Object?> json) {
+    final itemsJson = json['items'];
+    final items = (itemsJson as List<Object?>)
+        .map((item) => WorkspaceFullDocumentDiagnosticReport.canParse(
+                item, nullLspJsonReporter)
+            ? Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>.t1(
+                WorkspaceFullDocumentDiagnosticReport.fromJson(
+                    item as Map<String, Object?>))
+            : (WorkspaceUnchangedDocumentDiagnosticReport.canParse(
+                    item, nullLspJsonReporter)
+                ? Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>.t2(
+                    WorkspaceUnchangedDocumentDiagnosticReport.fromJson(
+                        item as Map<String, Object?>))
+                : (throw '''$item was not one of (WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport)''')))
+        .toList();
+    return WorkspaceDiagnosticReport(
+      items: items,
+    );
+  }
+
+  final List<
+      Either2<WorkspaceFullDocumentDiagnosticReport,
+          WorkspaceUnchangedDocumentDiagnosticReport>> items;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['items'] = items;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('items');
+      try {
+        if (!obj.containsKey('items')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final items = obj['items'];
+        if (items == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((items is List<Object?> &&
+            (items.every((item) =>
+                (WorkspaceFullDocumentDiagnosticReport.canParse(
+                        item, reporter) ||
+                    WorkspaceUnchangedDocumentDiagnosticReport.canParse(
+                        item, reporter))))))) {
+          reporter.reportError(
+              'must be of type List<Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type WorkspaceDiagnosticReport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceDiagnosticReport &&
+        other.runtimeType == WorkspaceDiagnosticReport) {
+      return listEqual(
+              items,
+              other.items,
+              (Either2<WorkspaceFullDocumentDiagnosticReport,
+                              WorkspaceUnchangedDocumentDiagnosticReport>
+                          a,
+                      Either2<WorkspaceFullDocumentDiagnosticReport,
+                              WorkspaceUnchangedDocumentDiagnosticReport>
+                          b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(items);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A partial result for a workspace diagnostic report.
+///  @since 3.17.0
+class WorkspaceDiagnosticReportPartialResult implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceDiagnosticReportPartialResult.canParse,
+    WorkspaceDiagnosticReportPartialResult.fromJson,
+  );
+
+  WorkspaceDiagnosticReportPartialResult({
+    required this.items,
+  });
+  static WorkspaceDiagnosticReportPartialResult fromJson(
+      Map<String, Object?> json) {
+    final itemsJson = json['items'];
+    final items = (itemsJson as List<Object?>)
+        .map((item) => WorkspaceFullDocumentDiagnosticReport.canParse(
+                item, nullLspJsonReporter)
+            ? Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>.t1(
+                WorkspaceFullDocumentDiagnosticReport.fromJson(
+                    item as Map<String, Object?>))
+            : (WorkspaceUnchangedDocumentDiagnosticReport.canParse(
+                    item, nullLspJsonReporter)
+                ? Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>.t2(
+                    WorkspaceUnchangedDocumentDiagnosticReport.fromJson(
+                        item as Map<String, Object?>))
+                : (throw '''$item was not one of (WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport)''')))
+        .toList();
+    return WorkspaceDiagnosticReportPartialResult(
+      items: items,
+    );
+  }
+
+  final List<
+      Either2<WorkspaceFullDocumentDiagnosticReport,
+          WorkspaceUnchangedDocumentDiagnosticReport>> items;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['items'] = items;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('items');
+      try {
+        if (!obj.containsKey('items')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final items = obj['items'];
+        if (items == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((items is List<Object?> &&
+            (items.every((item) =>
+                (WorkspaceFullDocumentDiagnosticReport.canParse(
+                        item, reporter) ||
+                    WorkspaceUnchangedDocumentDiagnosticReport.canParse(
+                        item, reporter))))))) {
+          reporter.reportError(
+              'must be of type List<Either2<WorkspaceFullDocumentDiagnosticReport, WorkspaceUnchangedDocumentDiagnosticReport>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type WorkspaceDiagnosticReportPartialResult');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceDiagnosticReportPartialResult &&
+        other.runtimeType == WorkspaceDiagnosticReportPartialResult) {
+      return listEqual(
+              items,
+              other.items,
+              (Either2<WorkspaceFullDocumentDiagnosticReport,
+                              WorkspaceUnchangedDocumentDiagnosticReport>
+                          a,
+                      Either2<WorkspaceFullDocumentDiagnosticReport,
+                              WorkspaceUnchangedDocumentDiagnosticReport>
+                          b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => lspHashCode(items);
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class WorkspaceEdit implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     WorkspaceEdit.canParse,
@@ -35109,6 +44960,388 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+/// A full document diagnostic report for a workspace diagnostic result.
+///  @since 3.17.0
+class WorkspaceFullDocumentDiagnosticReport
+    implements FullDocumentDiagnosticReport, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceFullDocumentDiagnosticReport.canParse,
+    WorkspaceFullDocumentDiagnosticReport.fromJson,
+  );
+
+  WorkspaceFullDocumentDiagnosticReport({
+    required this.uri,
+    this.version,
+    this.kind = 'full',
+    this.resultId,
+    required this.items,
+  }) {
+    if (kind != 'full') {
+      throw 'kind may only be the literal \'full\'';
+    }
+  }
+  static WorkspaceFullDocumentDiagnosticReport fromJson(
+      Map<String, Object?> json) {
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int?;
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String?;
+    final itemsJson = json['items'];
+    final items = (itemsJson as List<Object?>)
+        .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
+        .toList();
+    return WorkspaceFullDocumentDiagnosticReport(
+      uri: uri,
+      version: version,
+      kind: kind,
+      resultId: resultId,
+      items: items,
+    );
+  }
+
+  /// The actual items.
+  final List<Diagnostic> items;
+
+  /// A full document diagnostic report.
+  final String kind;
+
+  /// An optional result id. If provided it will be sent on the next diagnostic
+  /// request for the same document.
+  final String? resultId;
+
+  /// The URI for which diagnostic information is reported.
+  final String uri;
+
+  /// The version number for which the diagnostics are reported. If the document
+  /// is not marked as open `null` can be provided.
+  final int? version;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['uri'] = uri;
+    __result['version'] = version;
+    __result['kind'] = kind;
+    if (resultId != null) {
+      __result['resultId'] = resultId;
+    }
+    __result['items'] = items.map((item) => item.toJson()).toList();
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version != null && !(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind == 'full')) {
+          reporter.reportError('must be the literal \'full\'');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('resultId');
+      try {
+        final resultId = obj['resultId'];
+        if (resultId != null && !(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('items');
+      try {
+        if (!obj.containsKey('items')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final items = obj['items'];
+        if (items == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((items is List<Object?> &&
+            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Diagnostic>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type WorkspaceFullDocumentDiagnosticReport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceFullDocumentDiagnosticReport &&
+        other.runtimeType == WorkspaceFullDocumentDiagnosticReport) {
+      return uri == other.uri &&
+          version == other.version &&
+          kind == other.kind &&
+          resultId == other.resultId &&
+          listEqual(
+              items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        uri,
+        version,
+        kind,
+        resultId,
+        lspHashCode(items),
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// A special workspace symbol that supports locations without a range
+///  @since 3.17.0
+class WorkspaceSymbol implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceSymbol.canParse,
+    WorkspaceSymbol.fromJson,
+  );
+
+  WorkspaceSymbol({
+    required this.name,
+    required this.kind,
+    this.tags,
+    required this.location,
+    this.containerName,
+  });
+  static WorkspaceSymbol fromJson(Map<String, Object?> json) {
+    final nameJson = json['name'];
+    final name = nameJson as String;
+    final kindJson = json['kind'];
+    final kind = SymbolKind.fromJson(kindJson as int);
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => SymbolTag.fromJson(item as int))
+        .toList();
+    final locationJson = json['location'];
+    final location = Location.canParse(locationJson, nullLspJsonReporter)
+        ? Either2<Location, WorkspaceSymbolLocation>.t1(
+            Location.fromJson(locationJson as Map<String, Object?>))
+        : (WorkspaceSymbolLocation.canParse(locationJson, nullLspJsonReporter)
+            ? Either2<Location, WorkspaceSymbolLocation>.t2(
+                WorkspaceSymbolLocation.fromJson(
+                    locationJson as Map<String, Object?>))
+            : (throw '''$locationJson was not one of (Location, WorkspaceSymbolLocation)'''));
+    final containerNameJson = json['containerName'];
+    final containerName = containerNameJson as String?;
+    return WorkspaceSymbol(
+      name: name,
+      kind: kind,
+      tags: tags,
+      location: location,
+      containerName: containerName,
+    );
+  }
+
+  /// The name of the symbol containing this symbol. This information is for
+  /// user interface purposes (e.g. to render a qualifier in the user interface
+  /// if necessary). It can't be used to re-infer a hierarchy for the document
+  /// symbols.
+  final String? containerName;
+
+  /// The kind of this symbol.
+  final SymbolKind kind;
+
+  /// The location of this symbol. Whether a server is allowed to return a
+  /// location without a range depends on the client capability
+  /// `workspace.symbol.resolveSupport`.
+  ///
+  /// See also `SymbolInformation.location`.
+  final Either2<Location, WorkspaceSymbolLocation> location;
+
+  /// The name of this symbol.
+  final String name;
+
+  /// Tags for this completion item.
+  final List<SymbolTag>? tags;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['name'] = name;
+    __result['kind'] = kind.toJson();
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    }
+    __result['location'] = location;
+    if (containerName != null) {
+      __result['containerName'] = containerName;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('name');
+      try {
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final name = obj['name'];
+        if (name == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(name is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(SymbolKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type SymbolKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('location');
+      try {
+        if (!obj.containsKey('location')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final location = obj['location'];
+        if (location == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((Location.canParse(location, reporter) ||
+            WorkspaceSymbolLocation.canParse(location, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<Location, WorkspaceSymbolLocation>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('containerName');
+      try {
+        final containerName = obj['containerName'];
+        if (containerName != null && !(containerName is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type WorkspaceSymbol');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceSymbol && other.runtimeType == WorkspaceSymbol) {
+      return name == other.name &&
+          kind == other.kind &&
+          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
+          location == other.location &&
+          containerName == other.containerName &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        name,
+        kind,
+        lspHashCode(tags),
+        location,
+        containerName,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class WorkspaceSymbolClientCapabilities implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     WorkspaceSymbolClientCapabilities.canParse,
@@ -35119,6 +45352,7 @@
     this.dynamicRegistration,
     this.symbolKind,
     this.tagSupport,
+    this.resolveSupport,
   });
   static WorkspaceSymbolClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
@@ -35133,22 +45367,34 @@
         ? WorkspaceSymbolClientCapabilitiesTagSupport.fromJson(
             tagSupportJson as Map<String, Object?>)
         : null;
+    final resolveSupportJson = json['resolveSupport'];
+    final resolveSupport = resolveSupportJson != null
+        ? WorkspaceSymbolClientCapabilitiesResolveSupport.fromJson(
+            resolveSupportJson as Map<String, Object?>)
+        : null;
     return WorkspaceSymbolClientCapabilities(
       dynamicRegistration: dynamicRegistration,
       symbolKind: symbolKind,
       tagSupport: tagSupport,
+      resolveSupport: resolveSupport,
     );
   }
 
   /// Symbol request supports dynamic registration.
   final bool? dynamicRegistration;
 
+  /// The client support partial workspace symbols. The client will send the
+  /// request `workspaceSymbol/resolve` to the server to resolve additional
+  /// properties.
+  ///  @since 3.17.0 - proposedState
+  final WorkspaceSymbolClientCapabilitiesResolveSupport? resolveSupport;
+
   /// Specific capabilities for the `SymbolKind` in the `workspace/symbol`
   /// request.
   final WorkspaceSymbolClientCapabilitiesSymbolKind? symbolKind;
 
-  /// The client supports tags on `SymbolInformation`. Clients supporting tags
-  /// have to handle unknown tags gracefully.
+  /// The client supports tags on `SymbolInformation` and `WorkspaceSymbol`.
+  /// Clients supporting tags have to handle unknown tags gracefully.
   ///  @since 3.16.0
   final WorkspaceSymbolClientCapabilitiesTagSupport? tagSupport;
 
@@ -35163,6 +45409,9 @@
     if (tagSupport != null) {
       __result['tagSupport'] = tagSupport?.toJson();
     }
+    if (resolveSupport != null) {
+      __result['resolveSupport'] = resolveSupport?.toJson();
+    }
     return __result;
   }
 
@@ -35204,6 +45453,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('resolveSupport');
+      try {
+        final resolveSupport = obj['resolveSupport'];
+        if (resolveSupport != null &&
+            !(WorkspaceSymbolClientCapabilitiesResolveSupport.canParse(
+                resolveSupport, reporter))) {
+          reporter.reportError(
+              'must be of type WorkspaceSymbolClientCapabilitiesResolveSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type WorkspaceSymbolClientCapabilities');
@@ -35218,6 +45480,7 @@
       return dynamicRegistration == other.dynamicRegistration &&
           symbolKind == other.symbolKind &&
           tagSupport == other.tagSupport &&
+          resolveSupport == other.resolveSupport &&
           true;
     }
     return false;
@@ -35228,12 +45491,89 @@
         dynamicRegistration,
         symbolKind,
         tagSupport,
+        resolveSupport,
       );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class WorkspaceSymbolClientCapabilitiesResolveSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceSymbolClientCapabilitiesResolveSupport.canParse,
+    WorkspaceSymbolClientCapabilitiesResolveSupport.fromJson,
+  );
+
+  WorkspaceSymbolClientCapabilitiesResolveSupport({
+    required this.properties,
+  });
+  static WorkspaceSymbolClientCapabilitiesResolveSupport fromJson(
+      Map<String, Object?> json) {
+    final propertiesJson = json['properties'];
+    final properties = (propertiesJson as List<Object?>)
+        .map((item) => item as String)
+        .toList();
+    return WorkspaceSymbolClientCapabilitiesResolveSupport(
+      properties: properties,
+    );
+  }
+
+  /// The properties that a client can resolve lazily. Usually `location.range`
+  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 WorkspaceSymbolClientCapabilitiesResolveSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceSymbolClientCapabilitiesResolveSupport &&
+        other.runtimeType == WorkspaceSymbolClientCapabilitiesResolveSupport) {
+      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 WorkspaceSymbolClientCapabilitiesSymbolKind implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     WorkspaceSymbolClientCapabilitiesSymbolKind.canParse,
@@ -35387,6 +45727,74 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class WorkspaceSymbolLocation implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceSymbolLocation.canParse,
+    WorkspaceSymbolLocation.fromJson,
+  );
+
+  WorkspaceSymbolLocation({
+    required this.uri,
+  });
+  static WorkspaceSymbolLocation fromJson(Map<String, Object?> json) {
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    return WorkspaceSymbolLocation(
+      uri: uri,
+    );
+  }
+
+  final String uri;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['uri'] = uri;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type WorkspaceSymbolLocation');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceSymbolLocation &&
+        other.runtimeType == WorkspaceSymbolLocation) {
+      return uri == other.uri && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => uri.hashCode;
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class WorkspaceSymbolOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
     WorkspaceSymbolOptions.canParse,
@@ -35394,6 +45802,7 @@
   );
 
   WorkspaceSymbolOptions({
+    this.resolveProvider,
     this.workDoneProgress,
   });
   static WorkspaceSymbolOptions fromJson(Map<String, Object?> json) {
@@ -35401,17 +45810,27 @@
         json, nullLspJsonReporter)) {
       return WorkspaceSymbolRegistrationOptions.fromJson(json);
     }
+    final resolveProviderJson = json['resolveProvider'];
+    final resolveProvider = resolveProviderJson as bool?;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return WorkspaceSymbolOptions(
+      resolveProvider: resolveProvider,
       workDoneProgress: workDoneProgress,
     );
   }
 
+  /// The server provides support to resolve additional information for a
+  /// workspace symbol.
+  ///  @since 3.17.0
+  final bool? resolveProvider;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (resolveProvider != null) {
+      __result['resolveProvider'] = resolveProvider;
+    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
@@ -35420,6 +45839,16 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('resolveProvider');
+      try {
+        final resolveProvider = obj['resolveProvider'];
+        if (resolveProvider != null && !(resolveProvider is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -35441,13 +45870,18 @@
   bool operator ==(Object other) {
     if (other is WorkspaceSymbolOptions &&
         other.runtimeType == WorkspaceSymbolOptions) {
-      return workDoneProgress == other.workDoneProgress && true;
+      return resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
     }
     return false;
   }
 
   @override
-  int get hashCode => workDoneProgress.hashCode;
+  int get hashCode => Object.hash(
+        resolveProvider,
+        workDoneProgress,
+      );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
@@ -35595,21 +46029,32 @@
   );
 
   WorkspaceSymbolRegistrationOptions({
+    this.resolveProvider,
     this.workDoneProgress,
   });
   static WorkspaceSymbolRegistrationOptions fromJson(
       Map<String, Object?> json) {
+    final resolveProviderJson = json['resolveProvider'];
+    final resolveProvider = resolveProviderJson as bool?;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return WorkspaceSymbolRegistrationOptions(
+      resolveProvider: resolveProvider,
       workDoneProgress: workDoneProgress,
     );
   }
 
+  /// The server provides support to resolve additional information for a
+  /// workspace symbol.
+  ///  @since 3.17.0
+  final bool? resolveProvider;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (resolveProvider != null) {
+      __result['resolveProvider'] = resolveProvider;
+    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
@@ -35618,6 +46063,16 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('resolveProvider');
+      try {
+        final resolveProvider = obj['resolveProvider'];
+        if (resolveProvider != null && !(resolveProvider is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -35640,13 +46095,182 @@
   bool operator ==(Object other) {
     if (other is WorkspaceSymbolRegistrationOptions &&
         other.runtimeType == WorkspaceSymbolRegistrationOptions) {
-      return workDoneProgress == other.workDoneProgress && true;
+      return resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
     }
     return false;
   }
 
   @override
-  int get hashCode => workDoneProgress.hashCode;
+  int get hashCode => Object.hash(
+        resolveProvider,
+        workDoneProgress,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// An unchanged document diagnostic report for a workspace diagnostic result.
+///  @since 3.17.0
+class WorkspaceUnchangedDocumentDiagnosticReport
+    implements UnchangedDocumentDiagnosticReport, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceUnchangedDocumentDiagnosticReport.canParse,
+    WorkspaceUnchangedDocumentDiagnosticReport.fromJson,
+  );
+
+  WorkspaceUnchangedDocumentDiagnosticReport({
+    required this.uri,
+    this.version,
+    this.kind = 'unchanged',
+    required this.resultId,
+  }) {
+    if (kind != 'unchanged') {
+      throw 'kind may only be the literal \'unchanged\'';
+    }
+  }
+  static WorkspaceUnchangedDocumentDiagnosticReport fromJson(
+      Map<String, Object?> json) {
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int?;
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String;
+    return WorkspaceUnchangedDocumentDiagnosticReport(
+      uri: uri,
+      version: version,
+      kind: kind,
+      resultId: resultId,
+    );
+  }
+
+  /// A document diagnostic report indicating no changes to the last result. A
+  /// server can only return `unchanged` if result ids are provided.
+  final String kind;
+
+  /// A result id which will be sent on the next diagnostic request for the same
+  /// document.
+  final String resultId;
+
+  /// The URI for which diagnostic information is reported.
+  final String uri;
+
+  /// The version number for which the diagnostics are reported. If the document
+  /// is not marked as open `null` can be provided.
+  final int? version;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['uri'] = uri;
+    __result['version'] = version;
+    __result['kind'] = kind;
+    __result['resultId'] = resultId;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version != null && !(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind == 'unchanged')) {
+          reporter.reportError('must be the literal \'unchanged\'');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('resultId');
+      try {
+        if (!obj.containsKey('resultId')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final resultId = obj['resultId'];
+        if (resultId == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type WorkspaceUnchangedDocumentDiagnosticReport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceUnchangedDocumentDiagnosticReport &&
+        other.runtimeType == WorkspaceUnchangedDocumentDiagnosticReport) {
+      return uri == other.uri &&
+          version == other.version &&
+          kind == other.kind &&
+          resultId == other.resultId &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        uri,
+        version,
+        kind,
+        resultId,
+      );
 
   @override
   String toString() => jsonEncoder.convert(toJson());
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
index 7e1b851..317d1b9 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
@@ -71,7 +71,7 @@
     // sent - and may have failed to apply - was related to this command
     // execution).
     // We need to fromJson to convert the JSON map to the real types.
-    final editResponseResult = ApplyWorkspaceEditResponse.fromJson(
+    final editResponseResult = ApplyWorkspaceEditResult.fromJson(
         editResponse.result as Map<String, Object?>);
     if (editResponseResult.applied) {
       return success(null);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart
index dcca7a9..2d74fe1 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart'
+    hide TypeHierarchyItem;
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart
index 7ebfe8c..8f04696 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:collection/collection.dart';
 
 class AddKeyToConstructors extends CorrectionProducer {
@@ -49,8 +50,12 @@
           }
           builder.write(className);
           builder.write('({');
-          builder.writeType(keyType);
-          builder.write(' key}) : super(key: key);');
+          if (libraryElement.featureSet.isEnabled(Feature.super_parameters)) {
+            builder.write('super.key});');
+          } else {
+            builder.writeType(keyType);
+            builder.write(' key}) : super(key: key);');
+          }
           builder.write(targetLocation.suffix);
         });
       });
@@ -61,6 +66,18 @@
       if (keyType == null) {
         return;
       }
+      var superParameters =
+          libraryElement.featureSet.isEnabled(Feature.super_parameters);
+
+      void writeKey(DartEditBuilder builder) {
+        if (superParameters) {
+          builder.write('super.key');
+        } else {
+          builder.writeType(keyType);
+          builder.write(' key');
+        }
+      }
+
       var parameterList = parent.parameters;
       var parameters = parameterList.parameters;
       if (parameters.isEmpty) {
@@ -68,10 +85,10 @@
         await builder.addDartFileEdit(file, (builder) {
           builder.addInsertion(parameterList.leftParenthesis.end, (builder) {
             builder.write('{');
-            builder.writeType(keyType);
-            builder.write(' key}');
+            writeKey(builder);
+            builder.write('}');
           });
-          _updateSuper(builder, parent);
+          _updateSuper(builder, parent, superParameters);
         });
         return;
       }
@@ -81,19 +98,19 @@
         await builder.addDartFileEdit(file, (builder) {
           builder.addInsertion(parameters.last.end, (builder) {
             builder.write(', {');
-            builder.writeType(keyType);
-            builder.write(' key}');
+            writeKey(builder);
+            builder.write('}');
           });
-          _updateSuper(builder, parent);
+          _updateSuper(builder, parent, superParameters);
         });
       } else if (leftDelimiter.type == TokenType.OPEN_CURLY_BRACKET) {
         // There are other named parameters, so add the new named parameter.
         await builder.addDartFileEdit(file, (builder) {
           builder.addInsertion(leftDelimiter.end, (builder) {
-            builder.writeType(keyType);
-            builder.write(' key, ');
+            writeKey(builder);
+            builder.write(', ');
           });
-          _updateSuper(builder, parent);
+          _updateSuper(builder, parent, superParameters);
         });
       }
     }
@@ -140,8 +157,8 @@
     );
   }
 
-  void _updateSuper(
-      DartFileEditBuilder builder, ConstructorDeclaration constructor) {
+  void _updateSuper(DartFileEditBuilder builder,
+      ConstructorDeclaration constructor, bool superParameters) {
     if (constructor.factoryKeyword != null ||
         constructor.redirectedConstructor != null) {
       // Can't have a super constructor invocation.
@@ -159,6 +176,16 @@
         return;
       }
     }
+    if (superParameters) {
+      if (invocation != null && invocation.argumentList.arguments.isEmpty) {
+        var previous = initializers.length == 1
+            ? constructor.parameters
+            : initializers[initializers.indexOf(invocation) - 1];
+        builder.addDeletion(range.endStart(previous, constructor.body));
+      }
+      return;
+    }
+
     if (invocation == null) {
       // There is no super constructor invocation, so add one.
       if (initializers.isEmpty) {
diff --git a/pkg/analysis_server/test/lsp/code_actions_abstract.dart b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
index 8537420..cd29ba9 100644
--- a/pkg/analysis_server/test/lsp/code_actions_abstract.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
@@ -101,7 +101,7 @@
     ApplyWorkspaceEditParams? editParams;
 
     final commandResponse = await handleExpectedRequest<Object?,
-        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResult>(
       Method.workspace_applyEdit,
       ApplyWorkspaceEditParams.fromJson,
       () => executeCommand(command, workDoneToken: workDoneToken),
@@ -109,7 +109,7 @@
         // When the server sends the edit back, just keep a copy and say we
         // applied successfully (it'll be verified below).
         editParams = edit;
-        return ApplyWorkspaceEditResponse(applied: true);
+        return ApplyWorkspaceEditResult(applied: true);
       },
     );
     // Successful edits return an empty success() response.
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index d9b96bf..824d782 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -192,7 +192,7 @@
         final params = ApplyWorkspaceEditParams.fromJson(
             request.params as Map<String, Object?>);
         edit = params.edit;
-        respondTo(request, ApplyWorkspaceEditResponse(applied: true));
+        respondTo(request, ApplyWorkspaceEditResult(applied: true));
       }
     });
 
diff --git a/pkg/analysis_server/test/lsp/code_actions_source_test.dart b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
index 215da02..172c10f 100644
--- a/pkg/analysis_server/test/lsp/code_actions_source_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
@@ -322,14 +322,14 @@
     );
 
     final commandResponse = handleExpectedRequest<Object?,
-        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResult>(
       Method.workspace_applyEdit,
       ApplyWorkspaceEditParams.fromJson,
       () => executeCommand(command),
       // Claim that we failed tpo apply the edits. This is what the client
       // would do if the edits provided were for an old version of the
       // document.
-      handler: (edit) => ApplyWorkspaceEditResponse(
+      handler: (edit) => ApplyWorkspaceEditResult(
           applied: false, failureReason: 'Document changed'),
     );
 
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 8c28b61..1ae1b51 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -2169,7 +2169,7 @@
     // Execute the associated command (which will handle edits in other files).
     ApplyWorkspaceEditParams? editParams;
     final commandResponse = await handleExpectedRequest<Object?,
-        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResult>(
       Method.workspace_applyEdit,
       ApplyWorkspaceEditParams.fromJson,
       () => executeCommand(resolved.command!),
@@ -2177,7 +2177,7 @@
         // When the server sends the edit back, just keep a copy and say we
         // applied successfully (it'll be verified below).
         editParams = edit;
-        return ApplyWorkspaceEditResponse(applied: true);
+        return ApplyWorkspaceEditResult(applied: true);
       },
     );
     // Successful edits return an empty success() response.
diff --git a/pkg/analysis_server/test/mocks_lsp.dart b/pkg/analysis_server/test/mocks_lsp.dart
index 8478ce4..45201cc 100644
--- a/pkg/analysis_server/test/mocks_lsp.dart
+++ b/pkg/analysis_server/test/mocks_lsp.dart
@@ -6,7 +6,6 @@
 import 'dart:convert';
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/lsp_protocol/protocol_special.dart' as lsp;
 import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
 
@@ -40,12 +39,12 @@
     // `window/showMessage`.
     _serverToClient.stream.listen((message) {
       if (message is lsp.NotificationMessage &&
-          message.method == Method.window_showMessage) {
+          message.method == lsp.Method.window_showMessage) {
         final params = message.params;
         if (params is lsp.ShowMessageParams) {
-          if (params.type == MessageType.Error) {
+          if (params.type == lsp.MessageType.Error) {
             shownErrors.add(params);
-          } else if (params.type == MessageType.Warning) {
+          } else if (params.type == lsp.MessageType.Warning) {
             shownWarnings.add(params);
           }
         }
@@ -170,13 +169,7 @@
   }) async {
     final response = await _serverToClient.stream.firstWhere((message) =>
         (message is lsp.ResponseMessage && message.id == request.id) ||
-        (throwOnError &&
-            message is lsp.NotificationMessage &&
-            message.method == Method.window_showMessage &&
-            lsp.ShowMessageParams.fromJson(
-                        message.params as Map<String, Object?>)
-                    .type ==
-                MessageType.Error));
+        (throwOnError && _isShowErrorMessageNotification(message)));
 
     if (response is lsp.ResponseMessage) {
       return response;
@@ -195,4 +188,19 @@
     return constructor(
         jsonDecode(jsonEncode(message.toJson())) as Map<String, Object?>);
   }
+
+  /// Checks whether [message] is a `window/showMessage` notification with a
+  /// type of [lsp.MessageType.Error].
+  bool _isShowErrorMessageNotification(lsp.Message message) {
+    if (message is! lsp.NotificationMessage) {
+      return false;
+    }
+    if (message.method != lsp.Method.window_showMessage) {
+      return false;
+    }
+    final params = lsp.ShowMessageParams.fromJson(
+      message.params as Map<String, Object?>,
+    );
+    return params.type == lsp.MessageType.Error;
+  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart
index 1d48dd5..cc18b0b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart
@@ -15,6 +15,7 @@
     defineReflectiveTests(AddKeyToConstructorsTest);
     defineReflectiveTests(
         AddKeyToConstructorsWithoutNamedArgumentsAnywhereTest);
+    defineReflectiveTests(AddKeyToConstructorsWithoutSuperParametersTest);
   });
 }
 
@@ -45,6 +46,449 @@
 import 'package:flutter/material.dart';
 
 class MyWidget extends StatelessWidget {
+  const MyWidget({super.key});
+}
+''');
+  }
+
+  Future<void> test_class_noNewline() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  const MyWidget({super.key});
+}
+''');
+  }
+
+  Future<void> test_constructor_namedParameters_withoutSuper() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({required String s});
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({super.key, required String s});
+}
+''');
+  }
+
+  Future<void> test_constructor_namedParameters_withSuper() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({required String s}) : super();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({super.key, required String s});
+}
+''');
+  }
+
+  Future<void> test_constructor_namedParameters_withSuper_assert() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({required String s}) : assert(s.isNotEmpty), super();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({super.key, required String s}) : assert(s.isNotEmpty);
+}
+''');
+  }
+
+  Future<void> test_constructor_noNamedParameters_withoutSuper() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget(String s);
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget(String s, {super.key});
+}
+''');
+  }
+
+  Future<void> test_constructor_noNamedParameters_withSuper() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget(String s) : super();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget(String s, {super.key});
+}
+''');
+  }
+
+  Future<void> test_constructor_noParameters_withoutSuper() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({super.key});
+}
+''');
+  }
+
+  Future<void> test_constructor_noParameters_withSuper_empty() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget() : super();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget({super.key});
+}
+''');
+  }
+
+  Future<void> test_constructor_noParameters_withSuper_nonEmpty() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A({required this.text, Key? key}) : super(key: key);
+
+  final String text;
+}
+
+class MyWidget extends A {
+  MyWidget() : super(text: '');
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A({required this.text, Key? key}) : super(key: key);
+
+  final String text;
+}
+
+class MyWidget extends A {
+  MyWidget({super.key}) : super(text: '');
+}
+''', errorFilter: (error) => error.errorCode is LintCode);
+  }
+
+  Future<void>
+      test_constructor_noParameters_withSuper_nonEmpty_tailingComma() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A({required this.text, Key? key}) : super(key: key);
+
+  final String text;
+}
+
+class MyWidget extends A {
+  MyWidget() : super(text: '',);
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A({required this.text, Key? key}) : super(key: key);
+
+  final String text;
+}
+
+class MyWidget extends A {
+  MyWidget({super.key}) : super(text: '',);
+}
+''', errorFilter: (error) => error.errorCode is LintCode);
+  }
+
+  Future<void>
+      test_constructor_noParameters_withSuper_nonNamed_trailingComma() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A(this.widget, {Key? key}) : super(key: key);
+
+  final Widget widget;
+}
+
+class B extends A {
+  B() : super(const Text(''),);
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A(this.widget, {Key? key}) : super(key: key);
+
+  final Widget widget;
+}
+
+class B extends A {
+  B({super.key}) : super(const Text(''),);
+}
+''',
+        //TODO(asashour) there should be no other errors
+        errorFilter: (error) => error.errorCode is LintCode);
+  }
+
+  Future<void> test_initializer_final_constant() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  final t = const Text('');
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  final t = const Text('');
+
+  const MyWidget({super.key});
+}
+''',
+        //TODO(asashour) there should be no other errors
+        errorFilter: (error) => error.errorCode is LintCode);
+  }
+
+  Future<void> test_initializer_final_not_constant() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  final c = Container();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  final c = Container();
+
+  MyWidget({super.key});
+}
+''');
+  }
+
+  Future<void> test_initializer_not_final_constant() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  var t = const Text('');
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  var t = const Text('');
+
+  MyWidget({super.key});
+}
+''',
+        //TODO(asashour) there should be no other errors
+        errorFilter: (error) => error.errorCode is LintCode);
+  }
+
+  Future<void> test_initializer_not_final_not_constant() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  var c = Container();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  var c = Container();
+
+  MyWidget({super.key});
+}
+''');
+  }
+
+  Future<void> test_initializer_static() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  static Text t = const Text('');
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+  static Text t = const Text('');
+
+  const MyWidget({super.key});
+}
+''',
+        //TODO(asashour) there should be no other errors
+        errorFilter: (error) => error.errorCode is LintCode);
+  }
+
+  Future<void> test_super_not_constant() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class ParentWidget extends StatelessWidget {
+  final c = Container();
+
+  ParentWidget({Key? key}) : super(key: key);
+}
+
+class MyWidget extends ParentWidget {
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class ParentWidget extends StatelessWidget {
+  final c = Container();
+
+  ParentWidget({Key? key}) : super(key: key);
+}
+
+class MyWidget extends ParentWidget {
+  MyWidget({super.key});
+}
+''', errorFilter: (error) => error.errorCode is LintCode);
+  }
+}
+
+@reflectiveTest
+class AddKeyToConstructorsWithoutNamedArgumentsAnywhereTest
+    extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_KEY_TO_CONSTRUCTORS;
+
+  @override
+  String get lintCode => LintNames.use_key_in_widget_constructors;
+
+  @override
+  String get testPackageLanguageVersion => '2.16';
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
+  Future<void> test_constructor_noParameters_withSuper_nonEmpty() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A(this.widget, {Key? key}) : super(key: key);
+
+  final Widget widget;
+}
+
+class B extends A {
+  B() : super(const Text(''));
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class A extends StatelessWidget {
+  const A(this.widget, {Key? key}) : super(key: key);
+
+  final Widget widget;
+}
+
+class B extends A {
+  B({Key? key}) : super(const Text(''), key: key);
+}
+''',
+        //TODO(asashour) there should be no other errors
+        errorFilter: (error) => error.errorCode is LintCode);
+  }
+}
+
+@reflectiveTest
+class AddKeyToConstructorsWithoutSuperParametersTest
+    extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_KEY_TO_CONSTRUCTORS;
+
+  @override
+  String get lintCode => LintNames.use_key_in_widget_constructors;
+
+  @override
+  String get testPackageLanguageVersion => '2.16';
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
+  Future<void> test_class_newline() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+
+class MyWidget extends StatelessWidget {
   const MyWidget({Key? key}) : super(key: key);
 }
 ''');
@@ -387,55 +831,3 @@
 ''', errorFilter: (error) => error.errorCode is LintCode);
   }
 }
-
-@reflectiveTest
-class AddKeyToConstructorsWithoutNamedArgumentsAnywhereTest
-    extends FixProcessorLintTest {
-  @override
-  FixKind get kind => DartFixKind.ADD_KEY_TO_CONSTRUCTORS;
-
-  @override
-  String get lintCode => LintNames.use_key_in_widget_constructors;
-
-  @override
-  String get testPackageLanguageVersion => '2.16';
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      flutter: true,
-    );
-  }
-
-  Future<void> test_constructor_noParameters_withSuper_nonEmpty() async {
-    await resolveTestCode('''
-import 'package:flutter/material.dart';
-
-class A extends StatelessWidget {
-  const A(this.widget, {Key? key}) : super(key: key);
-
-  final Widget widget;
-}
-
-class B extends A {
-  B() : super(const Text(''));
-}
-''');
-    await assertHasFix('''
-import 'package:flutter/material.dart';
-
-class A extends StatelessWidget {
-  const A(this.widget, {Key? key}) : super(key: key);
-
-  final Widget widget;
-}
-
-class B extends A {
-  B({Key? key}) : super(const Text(''), key: key);
-}
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
-  }
-}
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index f17f389..115f15a 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -69,7 +69,7 @@
 /// The URI of the version of the spec to generate from. This should be periodically updated as
 /// there's no longer a stable URI for the latest published version.
 final Uri specUri = Uri.parse(
-    'https://raw.githubusercontent.com/microsoft/language-server-protocol/gh-pages/_specifications/specification-3-16.md');
+    'https://raw.githubusercontent.com/microsoft/language-server-protocol/gh-pages/_specifications/lsp/3.17/specification.md');
 
 /// Pattern to extract inline types from the `result: {xx, yy }` notes in the spec.
 /// Doesn't parse past full stops as some of these have english sentences tagged on
@@ -90,7 +90,7 @@
 download the latest version of the specification before regenerating the
 code, run the same script with an argument of "--download".''',
     licenseResp.body,
-    specResp.body
+    await _fetchIncludes(specResp.body, specUri),
   ];
   await File(localSpecPath).writeAsString(text.join('\n\n---\n\n'));
 }
@@ -203,6 +203,16 @@
   }
 
   final customTypes = <AstNode>[
+    TypeAlias(
+      null,
+      Token.identifier('LSPAny'),
+      Type.Any,
+    ),
+    TypeAlias(
+      null,
+      Token.identifier('LSPObject'),
+      Type.Any,
+    ),
     interface('DartDiagnosticServer', [field('port', type: 'int')]),
     interface('AnalyzerStatusParams', [field('isAnalyzing', type: 'boolean')]),
     interface('PublishClosingLabelsParams', [
@@ -370,7 +380,8 @@
   // Skip over some typescript blocks that are known sample code and not part
   // of the LSP spec.
   if (input.trim() == r"export const EOL: string[] = ['\n', '\r\n', '\r'];" ||
-      input.startsWith('textDocument.codeAction.resolveSupport =')) {
+      input.startsWith('textDocument.codeAction.resolveSupport =') ||
+      input.startsWith('textDocument.inlayHint.resolveSupport =')) {
     return false;
   }
 
@@ -416,3 +427,23 @@
     [...node.members, ...customFields],
   );
 }
+
+/// Fetches and in-lines any includes that appear in [spec] in the form
+/// `{% include_relative types/uri.md %}`.
+Future<String> _fetchIncludes(String spec, Uri baseUri) async {
+  final pattern = RegExp(r'{% include_relative ([\w\-.\/]+.md) %}');
+  final includeStrings = <String, String>{};
+  for (final match in pattern.allMatches(spec)) {
+    final relativeUri = match.group(1)!;
+    final fullUri = baseUri.resolve(relativeUri);
+    final response = await http.get(fullUri);
+    if (response.statusCode != 200) {
+      throw 'Faild to fetch $fullUri (${response.statusCode} ${response.reasonPhrase})';
+    }
+    includeStrings[relativeUri] = response.body;
+  }
+  return spec.replaceAllMapped(
+    pattern,
+    (match) => includeStrings[match.group(1)!]!,
+  );
+}
diff --git a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
index 90cf478..fb1e6d3 100644
--- a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
+++ b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
@@ -1,5 +1,5 @@
 This is an unmodified copy of the Language Server Protocol Specification,
-downloaded from https://raw.githubusercontent.com/microsoft/language-server-protocol/gh-pages/_specifications/specification-3-16.md. It is the version of the specification that was
+downloaded from https://raw.githubusercontent.com/microsoft/language-server-protocol/gh-pages/_specifications/lsp/3.17/specification.md. It is the version of the specification that was
 used to generate a portion of the Dart code used to support the protocol.
 
 To regenerate the generated code, run the script in
@@ -22,30 +22,26 @@
 
 ---
 title: Specification
-shortTitle: 3.16 (Current)
+shortTitle: 3.17 (Upcoming)
 layout: specifications
-sectionid: specification-3-16
-toc: specification-3-16-toc
-fullTitle: Language Server Protocol Specification - 3.16
+sectionid: specification-3-17
+toc: specification-3-17-toc
+fullTitle: Language Server Protocol Specification - 3.17
 index: 2
+redirect_from:
+  - /specification
+  - /specifications/specification-current
 ---
 
-This document describes the 3.16.x version of the language server protocol. An implementation for node of the 3.16.x version of the protocol can be found [here](https://github.com/Microsoft/vscode-languageserver-node).
+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).
 
-**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/specification-3-16.md).
+**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).
 
-## <a href="#whatIsNew" name="whatIsNew" class="anchor"> What's new in 3.16 </a>
+## <a href="#whatIsNew" name="whatIsNew" class="anchor"> What's new in 3.17 </a>
 
-All new 3.16 features are tagged with a corresponding since version 3.16 text or in JSDoc using `@since 3.16.0` annotation. Major new feature are:
+All new 3.17 features are tagged with a corresponding since version 3.17 text or in JSDoc using `@since 3.17.0` annotation. Major new feature are: type hierarchy, inline values, inlay hints, notebook document support and a meta model that describes the 3.17 LSP version.
 
-- Semantic Token support
-- Call Hierarchy support
-- Linked Editing support
-- Moniker support
-- Events for file operations (create, rename, delete)
-- Change annotation support for text edits and file operations (create, rename, delete)
-
-A detailed list of the changes can be found in the [change log](#version_3_16_0)
+A detailed list of the changes can be found in the [change log](#version_3_17_0)
 
 The version of the specification is used to group features into a new specification release and to refer to their first appearance. Features in the spec are kept compatible using so called capability flags which are exchanged between the client and the server during initialization.
 
@@ -92,9 +88,11 @@
 
 The following TypeScript definitions describe the base [JSON-RPC protocol](http://www.jsonrpc.org/specification):
 
-#### <a href="#number" name="number" class="anchor"> Numbers </a>
+#### <a href="#baseTypes" name="baseTypes" class="anchor"> Base Types </a>
 
-The protocol use the following definitions for integers, unsigned integers and decimal numbers:
+The protocol use the following definitions for integers, unsigned integers, decimal numbers, objects and arrays:
+
+<div class="anchorHolder"><a href="#integer" name="integer" class="linkableAnchor"></a></div>
 
 ```typescript
 /**
@@ -103,6 +101,8 @@
 export type integer = number;
 ```
 
+<div class="anchorHolder"><a href="#uinteger" name="uinteger" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Defines an unsigned integer number in the range of 0 to 2^31 - 1.
@@ -110,6 +110,8 @@
 export type uinteger = number;
 ```
 
+<div class="anchorHolder"><a href="#decimal" name="decimal" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Defines a decimal number. Since decimal numbers are very
@@ -121,10 +123,46 @@
 export type decimal = number;
 ```
 
-#### Abstract Message
+<div class="anchorHolder"><a href="#lspAny" name="lspAny" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The LSP any type
+ *
+ * @since 3.17.0
+ */
+export type LSPAny = LSPObject | LSPArray | string | integer | uinteger |
+	decimal | boolean | null;
+```
+
+<div class="anchorHolder"><a href="#lspObject" name="lspObject" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * LSP object definition.
+ *
+ * @since 3.17.0
+ */
+export type LSPObject = { [key: string]: LSPAny };
+```
+
+<div class="anchorHolder"><a href="#lspArray" name="lspArray" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * LSP arrays.
+ *
+ * @since 3.17.0
+ */
+export type LSPArray = LSPAny[];
+```
+
+#### <a href="#abstractMessage" name="abstractMessage" class="anchor"> Abstract Message </a>
 
 A general message as defined by JSON-RPC. The language server protocol always uses "2.0" as the `jsonrpc` version.
 
+<div class="anchorHolder"><a href="#message" name="message" class="linkableAnchor"></a></div>
+
 ```typescript
 interface Message {
 	jsonrpc: string;
@@ -176,7 +214,11 @@
 	 */
 	error?: ResponseError;
 }
+```
 
+<div class="anchorHolder"><a href="#responseError" name="responseError" class="linkableAnchor"></a></div>
+
+```typescript
 interface ResponseError {
 	/**
 	 * A number indicating the error type that occurred.
@@ -194,7 +236,11 @@
 	 */
 	data?: string | number | boolean | array | object | null;
 }
+```
 
+<div class="anchorHolder"><a href="#errorCodes" name="errorCodes" class="linkableAnchor"></a></div>
+
+```typescript
 export namespace ErrorCodes {
 	// Defined by JSON RPC
 	export const ParseError: integer = -32700;
@@ -241,7 +287,41 @@
 	 */
 	export const lspReservedErrorRangeStart: integer = -32899;
 
+	/**
+	 * A request failed but it was syntactically correct, e.g the
+	 * method name was known and the parameters were valid. The error
+	 * message should contain human readable information about why
+	 * the request failed.
+	 *
+	 * @since 3.17.0
+	 */
+	export const RequestFailed: integer = -32803;
+
+	/**
+	 * The server cancelled the request. This error code should
+	 * only be used for requests that explicitly support being
+	 * server cancellable.
+	 *
+	 * @since 3.17.0
+	 */
+	export const ServerCancelled: integer = -32802;
+
+	/**
+	 * The server detected that the content of a document got
+	 * modified outside normal conditions. A server should
+	 * NOT send this error code if it detects a content change
+	 * in it unprocessed messages. The result even computed
+	 * on an older state might still be useful for the client.
+	 *
+	 * If a client decides that a result is not of any use anymore
+	 * the client should cancel the request.
+	 */
 	export const ContentModified: integer = -32801;
+
+	/**
+	 * The client has canceled a request and a server as detected
+	 * the cancel.
+	 */
 	export const RequestCancelled: integer = -32800;
 
 	/**
@@ -308,7 +388,9 @@
 
 ```typescript
 type ProgressToken = integer | string;
+```
 
+```typescript
 interface ProgressParams<T> {
 	/**
 	 * The progress token provided by the client or server.
@@ -324,15 +406,60 @@
 
 Progress is reported against a token. The token is different than the request ID which allows to report progress out of band and also for notification.
 
-## Language Server Protocol
+## <a href="#languageServerProtocol" name="languageServerProtocol" class="anchor"> Language Server Protocol </a>
 
-The language server protocol defines a set of JSON-RPC request, response and notification messages which are exchanged using the above base protocol. This section starts describing the basic JSON structures used in the protocol. The document uses TypeScript interfaces to describe these. Based on the basic JSON structures, the actual requests with their responses and the notifications are described.
+The language server protocol defines a set of JSON-RPC request, response and notification messages which are exchanged using the above base protocol. This section starts describing the basic JSON structures used in the protocol. The document uses TypeScript interfaces in strict mode to describe these. This means for example that a `null` value has to be explicitly listed and that a mandatory property must be listed even if a falsify value might exist. Based on the basic JSON structures, the actual requests with their responses and the notifications are described.
+
+An example would be a request send from the client to the server to request a hover value for a symbol at a certain position in a text document. The request's method would be `textDocument/hover` with a parameter like this:
+
+```typescript
+interface HoverParams {
+	textDocument: string; /** The text document's URI in string form */
+	position: { line: uinteger; character: uinteger; };
+}
+```
+
+The result of the request would be the hover to be presented. In its simple form it can be a string. So the result looks like this:
+
+```typescript
+interface HoverResult {
+	value: string;
+}
+```
+
+Please also note that a response return value of `null` indicates no result. It doesn't tell the client to resend the request.
 
 In general, the language server protocol supports JSON-RPC messages, however the base protocol defined here uses a convention such that the parameters passed to request/notification messages should be of `object` type (if passed at all). However, this does not disallow using `Array` parameter types in custom messages.
 
 The protocol currently assumes that one server serves one tool. There is currently no support in the protocol to share one server between different tools. Such a sharing would require additional protocol e.g. to lock a document to support concurrent editing.
 
-### Basic JSON Structures
+### <a href="#capabilities" name= "capabilities" class="anchor"> Capabilities </a>
+
+Not every language server can support all features defined by the protocol. LSP therefore provides ‘capabilities’. A capability groups a set of language features. A development tool and the language server announce their supported features using capabilities. As an example, a server announces that it can handle the `textDocument/hover` request, but it might not handle the `workspace/symbol` request. Similarly, a development tool announces its ability to provide `about to save` notifications before a document is saved, so that a server can compute textual edits to format the edited document before it is saved.
+
+The set of capabilities is exchanged between the client and server during the [initialize](#initialize) request.
+
+### <a href="#messageOrdering" name= "messageOrdering" class="anchor"> Request, Notification and Response Ordering </a>
+
+Responses to requests should be sent in roughly the same order as the requests appear on the server or client side. So for example if a server receives a `textDocument/completion` request and then a `textDocument/signatureHelp` request it will usually first return the response for the `textDocument/completion` and then the response for `textDocument/signatureHelp`.
+
+However, the server may decide to use a parallel execution strategy and may wish to return responses in a different order than the requests were received. The server may do so as long as this reordering doesn't affect the correctness of the responses. For example, reordering the result of `textDocument/completion` and `textDocument/signatureHelp` is allowed, as these each of these requests usually won't affect the output of the other. On the other hand, the server most likely should not reorder `textDocument/definition` and `textDocument/rename` requests, since the executing the latter may affect the result of the former.
+
+### <a href="#messageDocumentation" name= "messageDocumentation" class="anchor"> Message Documentation </a>
+
+As said LSP defines a set of requests, responses and notifications. Each of those are document using the following format:
+
+* a header describing the request
+* an optional _Client capability_ section describing the client capability of the request. This includes the client capabilities property path and JSON structure.
+* an optional _Server Capability_ section describing the server capability of the request. This includes the server capabilities property path and JSON structure. Clients should ignore server capabilities they don't understand (e.g. the initialize request shouldn't fail in this case).
+* an optional _Registration Options_ section describing the registration option if the request or notification supports dynamic capability registration. See the [register](#client_registerCapability) and [unregister](#client_unregisterCapability) request for how this works in detail.
+* a _Request_ section describing the format of the request sent. The method is a string identifying the request the params are documented using a TypeScript interface. It is also documented whether the request supports work done progress and partial result progress.
+* a _Response_ section describing the format of the response. The result item describes the returned data in case of a success. The optional partial result item describes the returned data of a partial result notification. The error.data describes the returned data in case of an error. Please remember that in case of a failure the response already contains an error.code and an error.message field. These fields are only specified if the protocol forces the use of certain error codes or messages. In cases where the server can decide on these values freely they aren't listed here.
+
+
+### <a href="#basicJsonStructures" name="basicJsonStructures" class="anchor"> Basic JSON Structures </a>
+
+There are quite some JSON structures that are shared between different requests and notifications. Their structure and capabilities are document in this section.
 
 #### <a href="#uri" name="uri" class="anchor"> URI </a>
 
@@ -352,6 +479,8 @@
 
 Many of the interfaces contain fields that correspond to the URI of a document. For clarity, the type of such a field is declared as a `DocumentUri`. Over the wire, it will still be transferred as a string, but this guarantees that the contents of that string can be parsed as a valid URI.
 
+<div class="anchorHolder"><a href="#documentUri" name="documentUri" class="linkableAnchor"></a></div>
+
 ```typescript
 type DocumentUri = string;
 ```
@@ -361,7 +490,6 @@
 ```typescript
 type URI = string;
 ```
-
 #### <a href="#regExp" name="regExp" class="anchor"> Regular Expressions </a>
 
 Regular expression are a powerful tool and there are actual use cases for them in the language server protocol. However the downside with them is that almost every programming language has its own set of regular expression features so the specification can not simply refer to them as a regular expression. So the LSP uses a two step approach to support regular expressions:
@@ -410,17 +538,22 @@
 
 The only regular expression flag that a client needs to support is 'i' to specify a case insensitive search.
 
-### <a href="#enumerations" name="enumerations" class="anchor"> Enumerations </a>
+#### <a href="#enumerations" name="enumerations" class="anchor"> Enumerations </a>
 
 The protocol supports two kind of enumerations: (a) integer based enumerations and (b) strings based enumerations. Integer based enumerations usually start with `1`. The onces that don't are historical and they were kept to stay backwards compatible. If appropriate the value set of an enumeration is announced by the defining side (e.g. client or server) and transmitted to the other side during the initialize handshake. An example is the `CompletionItemKind` enumeration. It is announced by the client using the `textDocument.completion.completionItemKind` client property.
 
-To support the evolution of enumerations the using side of an enumeration shouldn't fail on a enumeration value it doesn't know. It should simply ignore it as a value it can use and try to do its best to preserve the value on round trips. Lets look at the `CompletionItemKind` enumeration as an example again: if in a future version of the specification an additional completion item kind with the value `n` gets added and announced by a client a (older) server not knowing about the value should not fail but simply ignore the value as a usable item kind.
+To support the evolution of enumerations the using side of an enumeration shouldn't fail on an enumeration value it doesn't know. It should simply ignore it as a value it can use and try to do its best to preserve the value on round trips. Lets look at the `CompletionItemKind` enumeration as an example again: if in a future version of the specification an additional completion item kind with the value `n` gets added and announced by a client a (older) server not knowing about the value should not fail but simply ignore the value as a usable item kind.
+
 
 #### <a href="#textDocuments" name="textDocuments" class="anchor"> Text Documents </a>
 
-The current protocol is tailored for textual documents whose content can be represented as a string. There is currently no support for binary documents. A position inside a document (see Position definition below) is expressed as a zero-based line and character offset. The offsets are based on a UTF-16 string representation. So a string of the form `a𐐀b` the character offset of the character `a` is 0, the character offset of `𐐀` is 1 and the character offset of b is 3 since `𐐀` is represented using two code units in UTF-16. To ensure that both client and server split the string into the same line representation the protocol specifies the following end-of-line sequences: '\n', '\r\n' and '\r'.
+The current protocol is tailored for textual documents whose content can be represented as a string. There is currently no support for binary documents. A position inside a document (see Position definition below) is expressed as a zero-based line and character offset.
 
-Positions are line end character agnostic. So you can not specify a position that denotes `\r|\n` or `\n|` where `|` represents the character offset.
+> New in 3.17
+
+Prior to 3.17 the offsets were always based on a UTF-16 string representation. So a string of the form `a𐐀b` the character offset of the character `a` is 0, the character offset of `𐐀` is 1 and the character offset of b is 3 since `𐐀` is represented using two code units in UTF-16. Since 3.17 clients and servers can agree on a different string encoding representation (e.g. UTF-8). The client announces it's supported encoding via the client capability [`general.positionEncodings`](#clientCapabilities). The value is an array of position encodings the client supports, with decreasing preference (e.g. the encoding at index `0` is the most preferred one). To stay backwards compatible the only mandatory encoding is UTF-16 represented via the string `utf-16`. The server can pick one of the encodings offered by the client and signals that encoding back to the client via the initialize result's property [`capabilities.positionEncoding`](#serverCapabilities). If the string value `utf-16` is missing from the client's capability `general.positionEncodings` servers can safely assume that the client supports UTF-16. If the server omits the position encoding in its initialize result the encoding defaults to the string value `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.
+
+To ensure that both client and server split the string into the same line representation the protocol specifies the following end-of-line sequences: '\n', '\r\n' and '\r'. Positions are line end character agnostic. So you can not specify a position that denotes `\r|\n` or `\n|` where `|` represents the character offset.
 
 ```typescript
 export const EOL: string[] = ['\n', '\r\n', '\r'];
@@ -438,9 +571,8 @@
 	line: uinteger;
 
 	/**
-	 * Character offset on a line in a document (zero-based). Assuming that
-	 * the line is represented as a string, the `character` value represents
-	 * the gap between the `character` and `character + 1`.
+	 * Character offset on a line in a document (zero-based). The meaning of this
+	 * offset is determined by the negotiated `PositionEncodingKind`.
 	 *
 	 * If the character value is greater than the line length it defaults back
 	 * to the line length.
@@ -448,6 +580,53 @@
 	character: uinteger;
 }
 ```
+
+When describing positions the protocol needs to specify how offsets (specifically character offsets) should be interpreted.
+The corresponding `PositionEncodingKind` is negotiated between the client and the server during initialization.
+
+<div class="anchorHolder"><a href="#positionEncodingKind" name="positionEncodingKind" class="linkableAnchor"></a></div>
+
+
+```typescript
+/**
+ * A type indicating how positions are encoded,
+ * specifically what column offsets mean.
+ *
+ * @since 3.17.0
+ */
+export type PositionEncodingKind = string;
+
+/**
+ * A set of predefined position encoding kinds.
+ *
+ * @since 3.17.0
+ */
+export namespace PositionEncodingKind {
+
+	/**
+	 * Character offsets count UTF-8 code units.
+	 */
+	export const UTF8: PositionEncodingKind = 'utf-8';
+
+	/**
+	 * Character offsets count UTF-16 code units.
+	 *
+	 * This is the default and must always be supported
+	 * by servers
+	 */
+	export const UTF16: PositionEncodingKind = 'utf-16';
+
+	/**
+	 * Character offsets count UTF-32 code units.
+	 *
+	 * Implementation note: these are the same as Unicode code points,
+	 * so this `PositionEncodingKind` may also be used for an
+	 * encoding-agnostic representation of character offsets.
+	 */
+	export const UTF32: PositionEncodingKind = 'utf-32';
+}
+```
+
 #### <a href="#range" name="range" class="anchor"> Range </a>
 
 A range in a text document expressed as (zero-based) start and end positions. A range is comparable to a selection in an editor. Therefore the end position is exclusive. If you want to specify a range that contains a line including the line ending character(s) then use an end position denoting the start of the next line. For example:
@@ -472,648 +651,6 @@
 }
 ```
 
-#### <a href="#location" name="location" class="anchor"> Location </a>
-
-Represents a location inside a resource, such as a line inside a text file.
-```typescript
-interface Location {
-	uri: DocumentUri;
-	range: Range;
-}
-```
-
-#### <a href="#locationLink" name="locationLink" class="anchor"> LocationLink </a>
-
-Represents a link between a source and a target location.
-
-```typescript
-interface LocationLink {
-
-	/**
-	 * Span of the origin of this link.
-	 *
-	 * Used as the underlined span for mouse interaction. Defaults to the word
-	 * range at the mouse position.
-	 */
-	originSelectionRange?: Range;
-
-	/**
-	 * The target resource identifier of this link.
-	 */
-	targetUri: DocumentUri;
-
-	/**
-	 * The full target range of this link. If the target for example is a symbol
-	 * then target range is the range enclosing this symbol not including
-	 * leading/trailing whitespace but everything else like comments. This
-	 * information is typically used to highlight the range in the editor.
-	 */
-	targetRange: Range;
-
-	/**
-	 * The range that should be selected and revealed when this link is being
-	 * followed, e.g the name of a function. Must be contained by the the
-	 * `targetRange`. See also `DocumentSymbol#range`
-	 */
-	targetSelectionRange: Range;
-}
-```
-
-#### <a href="#diagnostic" name="diagnostic" class="anchor"> Diagnostic </a>
-
-Represents a diagnostic, such as a compiler error or warning. Diagnostic objects are only valid in the scope of a resource.
-
-```typescript
-export interface Diagnostic {
-	/**
-	 * The range at which the message applies.
-	 */
-	range: Range;
-
-	/**
-	 * The diagnostic's severity. Can be omitted. If omitted it is up to the
-	 * client to interpret diagnostics as error, warning, info or hint.
-	 */
-	severity?: DiagnosticSeverity;
-
-	/**
-	 * The diagnostic's code, which might appear in the user interface.
-	 */
-	code?: integer | string;
-
-	/**
-	 * An optional property to describe the error code.
-	 *
-	 * @since 3.16.0
-	 */
-	codeDescription?: CodeDescription;
-
-	/**
-	 * A human-readable string describing the source of this
-	 * diagnostic, e.g. 'typescript' or 'super lint'.
-	 */
-	source?: string;
-
-	/**
-	 * The diagnostic's message.
-	 */
-	message: string;
-
-	/**
-	 * Additional metadata about the diagnostic.
-	 *
-	 * @since 3.15.0
-	 */
-	tags?: DiagnosticTag[];
-
-	/**
-	 * An array of related diagnostic information, e.g. when symbol-names within
-	 * a scope collide all definitions can be marked via this property.
-	 */
-	relatedInformation?: DiagnosticRelatedInformation[];
-
-	/**
-	 * A data entry field that is preserved between a
-	 * `textDocument/publishDiagnostics` notification and
-	 * `textDocument/codeAction` request.
-	 *
-	 * @since 3.16.0
-	 */
-	data?: unknown;
-}
-```
-
-The protocol currently supports the following diagnostic severities and tags:
-
-```typescript
-export namespace DiagnosticSeverity {
-	/**
-	 * Reports an error.
-	 */
-	export const Error: 1 = 1;
-	/**
-	 * Reports a warning.
-	 */
-	export const Warning: 2 = 2;
-	/**
-	 * Reports an information.
-	 */
-	export const Information: 3 = 3;
-	/**
-	 * Reports a hint.
-	 */
-	export const Hint: 4 = 4;
-}
-
-export type DiagnosticSeverity = 1 | 2 | 3 | 4;
-
-/**
- * The diagnostic tags.
- *
- * @since 3.15.0
- */
-export namespace DiagnosticTag {
-	/**
-	 * Unused or unnecessary code.
-	 *
-	 * Clients are allowed to render diagnostics with this tag faded out
-	 * instead of having an error squiggle.
-	 */
-	export const Unnecessary: 1 = 1;
-	/**
-	 * Deprecated or obsolete code.
-	 *
-	 * Clients are allowed to rendered diagnostics with this tag strike through.
-	 */
-	export const Deprecated: 2 = 2;
-}
-
-export type DiagnosticTag = 1 | 2;
-```
-
-`DiagnosticRelatedInformation` is defined as follows:
-
-```typescript
-/**
- * Represents a related message and source code location for a diagnostic.
- * This should be used to point to code locations that cause or are related to
- * a diagnostics, e.g when duplicating a symbol in a scope.
- */
-export interface DiagnosticRelatedInformation {
-	/**
-	 * The location of this related diagnostic information.
-	 */
-	location: Location;
-
-	/**
-	 * The message of this related diagnostic information.
-	 */
-	message: string;
-}
-```
-
-`CodeDescription` is defined as follows:
-
-```typescript
-/**
- * Structure to capture a description for an error code.
- *
- * @since 3.16.0
- */
-export interface CodeDescription {
-	/**
-	 * An URI to open with more information about the diagnostic error.
-	 */
-	href: URI;
-}
-```
-
-#### <a href="#command" name="command" class="anchor"> Command </a>
-
-Represents a reference to a command. Provides a title which will be used to represent a command in the UI. Commands are identified by a string identifier. The recommended way to handle commands is to implement their execution on the server side if the client and server provides the corresponding capabilities. Alternatively the tool extension code could handle the command. The protocol currently doesn't specify a set of well-known commands.
-
-```typescript
-interface Command {
-	/**
-	 * Title of the command, like `save`.
-	 */
-	title: string;
-	/**
-	 * The identifier of the actual command handler.
-	 */
-	command: string;
-	/**
-	 * Arguments that the command handler should be
-	 * invoked with.
-	 */
-	arguments?: any[];
-}
-```
-
-#### <a href="#textEdit" name="textEdit" class="anchor"> TextEdit & AnnotatedTextEdit </a>
-
-> New in version 3.16: Support for `AnnotatedTextEdit`.
-
-A textual edit applicable to a text document.
-
-```typescript
-interface TextEdit {
-	/**
-	 * The range of the text document to be manipulated. To insert
-	 * text into a document create a range where start === end.
-	 */
-	range: Range;
-
-	/**
-	 * The string to be inserted. For delete operations use an
-	 * empty string.
-	 */
-	newText: string;
-}
-```
-
-Since 3.16.0 there is also the concept of an annotated text edit which supports to add an annotation to a text edit. The annotation can add information describing the change to the text edit.
-
-```typescript
-/**
- * Additional information that describes document changes.
- *
- * @since 3.16.0
- */
-export interface ChangeAnnotation {
-	/**
-	 * A human-readable string describing the actual change. The string
-	 * is rendered prominent in the user interface.
-	 */
-	label: string;
-
-	/**
-	 * A flag which indicates that user confirmation is needed
-	 * before applying the change.
-	 */
-	needsConfirmation?: boolean;
-
-	/**
-	 * A human-readable string which is rendered less prominent in
-	 * the user interface.
-	 */
-	description?: string;
-}
-```
-
-Usually clients provide options to group the changes along the annotations they are associated with. To support this in the protocol an edit or resource operation refers to a change annotation using an identifier and not the change annotation literal directly. This allows servers to use the identical annotation across multiple edits or resource operations which then allows clients to group the operations under that change annotation. The actual change annotations together with their identifers are managed by the workspace edit via the new property `changeAnnotations`.
-
-```typescript
-
-/**
- * An identifier referring to a change annotation managed by a workspace
- * edit.
- *
- * @since 3.16.0
- */
-export type ChangeAnnotationIdentifier = string;
-
-
-/**
- * A special text edit with an additional change annotation.
- *
- * @since 3.16.0
- */
-export interface AnnotatedTextEdit extends TextEdit {
-	/**
-	 * The actual annotation identifier.
-	 */
-	annotationId: ChangeAnnotationIdentifier;
-}
-```
-
-#### <a href="#textEditArray" name="textEditArray" class="anchor"> TextEdit[] </a>
-
-Complex text manipulations are described with an array of `TextEdit`'s or `AnnotatedTextEdit`'s, representing a single change to the document.
-
-All text edits ranges refer to positions in the document the are computed on. They therefore move a document from state S1 to S2 without describing any intermediate state. Text edits ranges must never overlap, that means no part of the original document must be manipulated by more than one edit. However, it is possible that multiple edits have the same start position: multiple inserts, or any number of inserts followed by a single remove or replace edit. If multiple inserts have the same position, the order in the array defines the order in which the inserted strings appear in the resulting text.
-
-#### <a href="#textDocumentEdit" name="textDocumentEdit" class="anchor"> TextDocumentEdit </a>
-
-> New in version 3.16: support for `AnnotatedTextEdit`. The support is guarded by the client capability `workspace.workspaceEdit.changeAnnotationSupport`. If a client doesn't signal the capability, servers shouldn't send `AnnotatedTextEdit` literals back to the client.
-
-Describes textual changes on a single text document. The text document is referred to as a `OptionalVersionedTextDocumentIdentifier` to allow clients to check the text document version before an edit is applied. A `TextDocumentEdit` describes all changes on a version Si and after they are applied move the document to version Si+1. So the creator of a `TextDocumentEdit` doesn't need to sort the array of edits or do any kind of ordering. However the edits must be non overlapping.
-
-```typescript
-export interface TextDocumentEdit {
-	/**
-	 * The text document to change.
-	 */
-	textDocument: OptionalVersionedTextDocumentIdentifier;
-
-	/**
-	 * The edits to be applied.
-	 *
-	 * @since 3.16.0 - support for AnnotatedTextEdit. This is guarded by the
-	 * client capability `workspace.workspaceEdit.changeAnnotationSupport`
-	 */
-	edits: (TextEdit | AnnotatedTextEdit)[];
-}
-```
-
-### <a href="#resourceChanges" name="resourceChanges" class="anchor"> File Resource changes </a>
-
-> New in version 3.13. Since version 3.16 file resource changes can carry an additional property `changeAnnotation` to describe the actual change in more detail. Whether a client has support for change annotations is guarded by the client capability `workspace.workspaceEdit.changeAnnotationSupport`.
-
-File resource changes allow servers to create, rename and delete files and folders via the client. Note that the names talk about files but the operations are supposed to work on files and folders. This is in line with other naming in the Language Server Protocol (see file watchers which can watch files and folders). The corresponding change literals look as follows:
-
-```typescript
-/**
- * Options to create a file.
- */
-export interface CreateFileOptions {
-	/**
-	 * Overwrite existing file. Overwrite wins over `ignoreIfExists`
-	 */
-	overwrite?: boolean;
-
-	/**
-	 * Ignore if exists.
-	 */
-	ignoreIfExists?: boolean;
-}
-
-/**
- * Create file operation
- */
-export interface CreateFile {
-	/**
-	 * A create
-	 */
-	kind: 'create';
-
-	/**
-	 * The resource to create.
-	 */
-	uri: DocumentUri;
-
-	/**
-	 * Additional options
-	 */
-	options?: CreateFileOptions;
-
-	/**
-	 * An optional annotation identifer describing the operation.
-	 *
-	 * @since 3.16.0
-	 */
-	annotationId?: ChangeAnnotationIdentifier;
-}
-
-/**
- * Rename file options
- */
-export interface RenameFileOptions {
-	/**
-	 * Overwrite target if existing. Overwrite wins over `ignoreIfExists`
-	 */
-	overwrite?: boolean;
-
-	/**
-	 * Ignores if target exists.
-	 */
-	ignoreIfExists?: boolean;
-}
-
-/**
- * Rename file operation
- */
-export interface RenameFile {
-	/**
-	 * A rename
-	 */
-	kind: 'rename';
-
-	/**
-	 * The old (existing) location.
-	 */
-	oldUri: DocumentUri;
-
-	/**
-	 * The new location.
-	 */
-	newUri: DocumentUri;
-
-	/**
-	 * Rename options.
-	 */
-	options?: RenameFileOptions;
-
-	/**
-	 * An optional annotation identifer describing the operation.
-	 *
-	 * @since 3.16.0
-	 */
-	annotationId?: ChangeAnnotationIdentifier;
-}
-
-/**
- * Delete file options
- */
-export interface DeleteFileOptions {
-	/**
-	 * Delete the content recursively if a folder is denoted.
-	 */
-	recursive?: boolean;
-
-	/**
-	 * Ignore the operation if the file doesn't exist.
-	 */
-	ignoreIfNotExists?: boolean;
-}
-
-/**
- * Delete file operation
- */
-export interface DeleteFile {
-	/**
-	 * A delete
-	 */
-	kind: 'delete';
-
-	/**
-	 * The file to delete.
-	 */
-	uri: DocumentUri;
-
-	/**
-	 * Delete options.
-	 */
-	options?: DeleteFileOptions;
-
-	/**
-	 * An optional annotation identifer describing the operation.
-	 *
-	 * @since 3.16.0
-	 */
-	annotationId?: ChangeAnnotationIdentifier;
-}
-```
-
-#### <a href="#workspaceEdit" name="workspaceEdit" class="anchor"> WorkspaceEdit </a>
-
-A workspace edit represents changes to many resources managed in the workspace. The edit should either provide `changes` or `documentChanges`. If the client can handle versioned document edits and if `documentChanges` are present, the latter are preferred over `changes`.
-
- Since version 3.13.0 a workspace edit can contain resource operations (create, delete or rename files and folders) as well. If resource operations are present clients need to execute the operations in the order in which they are provided. So a workspace edit for example can consist of the following two changes: (1) create file a.txt and (2) a text document edit which insert text into file a.txt. An invalid sequence (e.g. (1) delete file a.txt and (2) insert text into file a.txt) will cause failure of the operation. How the client recovers from the failure is described by the client capability: `workspace.workspaceEdit.failureHandling`
-
-
-```typescript
-export interface WorkspaceEdit {
-	/**
-	 * Holds changes to existing resources.
-	 */
-	changes?: { [uri: DocumentUri]: TextEdit[]; };
-
-	/**
-	 * Depending on the client capability
-	 * `workspace.workspaceEdit.resourceOperations` document changes are either
-	 * an array of `TextDocumentEdit`s to express changes to n different text
-	 * documents where each text document edit addresses a specific version of
-	 * a text document. Or it can contain above `TextDocumentEdit`s mixed with
-	 * create, rename and delete file / folder operations.
-	 *
-	 * Whether a client supports versioned document edits is expressed via
-	 * `workspace.workspaceEdit.documentChanges` client capability.
-	 *
-	 * If a client neither supports `documentChanges` nor
-	 * `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s
-	 * using the `changes` property are supported.
-	 */
-	documentChanges?: (
-		TextDocumentEdit[] |
-		(TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[]
-	);
-
-	/**
-	 * A map of change annotations that can be referenced in
-	 * `AnnotatedTextEdit`s or create, rename and delete file / folder
-	 * operations.
-	 *
-	 * Whether clients honor this property depends on the client capability
-	 * `workspace.changeAnnotationSupport`.
-	 *
-	 * @since 3.16.0
-	 */
-	changeAnnotations?: {
-		[id: string /* ChangeAnnotationIdentifier */]: ChangeAnnotation;
-	};
-}
-```
-
-##### <a href="#workspaceEditClientCapabilities" name="workspaceEditClientCapabilities" class="anchor"> WorkspaceEditClientCapabilities </a>
-
-> New in version 3.13: `ResourceOperationKind` and `FailureHandlingKind` and the client capability `workspace.workspaceEdit.resourceOperations` as well as `workspace.workspaceEdit.failureHandling`.
-
-
-The capabilities of a workspace edit has evolved over the time. Clients can describe their support using the following client capability:
-_Client Capability_:
-* property path (optional): `workspace.workspaceEdit`
-* property type: `WorkspaceEditClientCapabilities` defined as follows:
-
-```typescript
-export interface WorkspaceEditClientCapabilities {
-	/**
-	 * The client supports versioned document changes in `WorkspaceEdit`s
-	 */
-	documentChanges?: boolean;
-
-	/**
-	 * The resource operations the client supports. Clients should at least
-	 * support 'create', 'rename' and 'delete' files and folders.
-	 *
-	 * @since 3.13.0
-	 */
-	resourceOperations?: ResourceOperationKind[];
-
-	/**
-	 * The failure handling strategy of a client if applying the workspace edit
-	 * fails.
-	 *
-	 * @since 3.13.0
-	 */
-	failureHandling?: FailureHandlingKind;
-
-	/**
-	 * Whether the client normalizes line endings to the client specific
-	 * setting.
-	 * If set to `true` the client will normalize line ending characters
-	 * in a workspace edit to the client specific new line character(s).
-	 *
-	 * @since 3.16.0
-	 */
-	normalizesLineEndings?: boolean;
-
-	/**
-	 * Whether the client in general supports change annotations on text edits,
-	 * create file, rename file and delete file changes.
-	 *
-	 * @since 3.16.0
-	 */
-	changeAnnotationSupport?: {
-		/**
-		 * Whether the client groups edits with equal labels into tree nodes,
-		 * for instance all edits labelled with "Changes in Strings" would
-		 * be a tree node.
-		 */
-		groupsOnLabel?: boolean;
-	};
-}
-
-/**
- * The kind of resource operations supported by the client.
- */
-export type ResourceOperationKind = 'create' | 'rename' | 'delete';
-
-export namespace ResourceOperationKind {
-
-	/**
-	 * Supports creating new files and folders.
-	 */
-	export const Create: ResourceOperationKind = 'create';
-
-	/**
-	 * Supports renaming existing files and folders.
-	 */
-	export const Rename: ResourceOperationKind = 'rename';
-
-	/**
-	 * Supports deleting existing files and folders.
-	 */
-	export const Delete: ResourceOperationKind = 'delete';
-}
-
-export type FailureHandlingKind = 'abort' | 'transactional' | 'undo'
-	| 'textOnlyTransactional';
-
-export namespace FailureHandlingKind {
-
-	/**
-	 * Applying the workspace change is simply aborted if one of the changes
-	 * provided fails. All operations executed before the failing operation
-	 * stay executed.
-	 */
-	export const Abort: FailureHandlingKind = 'abort';
-
-	/**
-	 * All operations are executed transactional. That means they either all
-	 * succeed or no changes at all are applied to the workspace.
-	 */
-	export const Transactional: FailureHandlingKind = 'transactional';
-
-
-	/**
-	 * If the workspace edit contains only textual file changes they are
-	 * executed transactional. If resource changes (create, rename or delete
-	 * file) are part of the change the failure handling strategy is abort.
-	 */
-	export const TextOnlyTransactional: FailureHandlingKind
-		= 'textOnlyTransactional';
-
-	/**
-	 * The client tries to undo the operations already executed. But there is no
-	 * guarantee that this is succeeding.
-	 */
-	export const Undo: FailureHandlingKind = 'undo';
-}
-```
-
-#### <a href="#textDocumentIdentifier" name="textDocumentIdentifier" class="anchor"> TextDocumentIdentifier </a>
-
-Text documents are identified using a URI. On the protocol level, URIs are passed as strings. The corresponding JSON structure looks like this:
-```typescript
-interface TextDocumentIdentifier {
-	/**
-	 * The text document's URI.
-	 */
-	uri: DocumentUri;
-}
-```
-
 #### <a href="#textDocumentItem" name="textDocumentItem" class="anchor"> TextDocumentItem </a>
 
 An item to transfer a text document from the client to the server.
@@ -1204,6 +741,18 @@
 YAML | `yaml`
 {: .table .table-bordered .table-responsive}
 
+
+#### <a href="#textDocumentIdentifier" name="textDocumentIdentifier" class="anchor"> TextDocumentIdentifier </a>
+
+Text documents are identified using a URI. On the protocol level, URIs are passed as strings. The corresponding JSON structure looks like this:
+```typescript
+interface TextDocumentIdentifier {
+	/**
+	 * The text document's URI.
+	 */
+	uri: DocumentUri;
+}
+```
 #### <a href="#versionedTextDocumentIdentifier" name="versionedTextDocumentIdentifier" class="anchor"> VersionedTextDocumentIdentifier </a>
 
 An identifier to denote a specific version of a text document. This information usually flows from the client to the server.
@@ -1222,6 +771,8 @@
 
 An identifier which optionally denotes a specific version of a text document. This information usually flows from the server to the client.
 
+<div class="anchorHolder"><a href="#optionalVersionedTextDocumentIdentifier" name="optionalVersionedTextDocumentIdentifier" class="linkableAnchor"></a></div>
+
 ```typescript
 interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier {
 	/**
@@ -1238,7 +789,6 @@
 	version: integer | null;
 }
 ```
-
 #### <a href="#textDocumentPositionParams" name="textDocumentPositionParams" class="anchor"> TextDocumentPositionParams </a>
 
 Was `TextDocumentPosition` in 1.0 with inlined parameters.
@@ -1258,7 +808,6 @@
 	position: Position;
 }
 ```
-
 #### <a href="#documentFilter" name="documentFilter" class="anchor"> DocumentFilter </a>
 
 A document filter denotes a document through properties like `language`, `scheme` or `pattern`. An example is a filter that applies to TypeScript files on disk. Another example is a filter the applies to JSON files with name `package.json`:
@@ -1300,44 +849,345 @@
 
 A document selector is the combination of one or more document filters.
 
+<div class="anchorHolder"><a href="#documentSelector" name="documentSelector" class="linkableAnchor"></a></div>
+
 ```typescript
 export type DocumentSelector = DocumentFilter[];
 ```
 
-#### <a href="#staticRegistrationOptions" name="staticRegistrationOptions" class="anchor"> StaticRegistrationOptions </a>
+#### <a href="#textEdit" name="textEdit" class="anchor"> TextEdit & AnnotatedTextEdit </a>
 
-Static registration options can be used to register a feature in the initialize result with a given server control ID to be able to un-register the feature later on.
+> New in version 3.16: Support for `AnnotatedTextEdit`.
+
+A textual edit applicable to a text document.
+
+```typescript
+interface TextEdit {
+	/**
+	 * The range of the text document to be manipulated. To insert
+	 * text into a document create a range where start === end.
+	 */
+	range: Range;
+
+	/**
+	 * The string to be inserted. For delete operations use an
+	 * empty string.
+	 */
+	newText: string;
+}
+```
+Since 3.16.0 there is also the concept of an annotated text edit which supports to add an annotation to a text edit. The annotation can add information describing the change to the text edit.
+
+<div class="anchorHolder"><a href="#changeAnnotation" name="changeAnnotation" class="linkableAnchor"></a></div>
 
 ```typescript
 /**
- * Static registration options to be returned in the initialize request.
+ * Additional information that describes document changes.
+ *
+ * @since 3.16.0
  */
-export interface StaticRegistrationOptions {
+export interface ChangeAnnotation {
 	/**
-	 * The id used to register the request. The id can be used to deregister
-	 * the request again. See also Registration#id.
+	 * A human-readable string describing the actual change. The string
+	 * is rendered prominent in the user interface.
 	 */
-	id?: string;
+	label: string;
+
+	/**
+	 * A flag which indicates that user confirmation is needed
+	 * before applying the change.
+	 */
+	needsConfirmation?: boolean;
+
+	/**
+	 * A human-readable string which is rendered less prominent in
+	 * the user interface.
+	 */
+	description?: string;
 }
 ```
 
-#### <a href="#textDocumentRegistrationOptions" name="textDocumentRegistrationOptions" class="anchor"> TextDocumentRegistrationOptions </a>
+Usually clients provide options to group the changes along the annotations they are associated with. To support this in the protocol an edit or resource operation refers to a change annotation using an identifier and not the change annotation literal directly. This allows servers to use the identical annotation across multiple edits or resource operations which then allows clients to group the operations under that change annotation. The actual change annotations together with their identifiers are managed by the workspace edit via the new property `changeAnnotations`.
 
-Options to dynamically register for requests for a set of text documents.
+<div class="anchorHolder"><a href="#changeAnnotationIdentifier" name="changeAnnotationIdentifier" class="linkableAnchor"></a></div>
 
 ```typescript
 /**
- * General text document registration options.
+ * An identifier referring to a change annotation managed by a workspace
+ * edit.
+ *
+ * @since 3.16.0.
  */
-export interface TextDocumentRegistrationOptions {
+export type ChangeAnnotationIdentifier = string;
+```
+
+<div class="anchorHolder"><a href="#annotatedTextEdit" name="annotatedTextEdit" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A special text edit with an additional change annotation.
+ *
+ * @since 3.16.0.
+ */
+export interface AnnotatedTextEdit extends TextEdit {
 	/**
-	 * A document selector to identify the scope of the registration. If set to
-	 * null the document selector provided on the client side will be used.
+	 * The actual annotation identifier.
 	 */
-	documentSelector: DocumentSelector | null;
+	annotationId: ChangeAnnotationIdentifier;
+}
+```
+#### <a href="#textEditArray" name="textEditArray" class="anchor"> TextEdit[] </a>
+
+Complex text manipulations are described with an array of `TextEdit`'s or `AnnotatedTextEdit`'s, representing a single change to the document.
+
+All text edits ranges refer to positions in the document the are computed on. They therefore move a document from state S1 to S2 without describing any intermediate state. Text edits ranges must never overlap, that means no part of the original document must be manipulated by more than one edit. However, it is possible that multiple edits have the same start position: multiple inserts, or any number of inserts followed by a single remove or replace edit. If multiple inserts have the same position, the order in the array defines the order in which the inserted strings appear in the resulting text.
+
+#### <a href="#textDocumentEdit" name="textDocumentEdit" class="anchor"> TextDocumentEdit </a>
+
+> New in version 3.16: support for `AnnotatedTextEdit`. The support is guarded by the client capability `workspace.workspaceEdit.changeAnnotationSupport`. If a client doesn't signal the capability, servers shouldn't send `AnnotatedTextEdit` literals back to the client.
+
+Describes textual changes on a single text document. The text document is referred to as a `OptionalVersionedTextDocumentIdentifier` to allow clients to check the text document version before an edit is applied. A `TextDocumentEdit` describes all changes on a version Si and after they are applied move the document to version Si+1. So the creator of a `TextDocumentEdit` doesn't need to sort the array of edits or do any kind of ordering. However the edits must be non overlapping.
+
+```typescript
+export interface TextDocumentEdit {
+	/**
+	 * The text document to change.
+	 */
+	textDocument: OptionalVersionedTextDocumentIdentifier;
+
+	/**
+	 * The edits to be applied.
+	 *
+	 * @since 3.16.0 - support for AnnotatedTextEdit. This is guarded by the
+	 * client capability `workspace.workspaceEdit.changeAnnotationSupport`
+	 */
+	edits: (TextEdit | AnnotatedTextEdit)[];
+}
+```
+#### <a href="#location" name="location" class="anchor"> Location </a>
+
+Represents a location inside a resource, such as a line inside a text file.
+```typescript
+interface Location {
+	uri: DocumentUri;
+	range: Range;
+}
+```
+#### <a href="#locationLink" name="locationLink" class="anchor"> LocationLink </a>
+
+Represents a link between a source and a target location.
+
+```typescript
+interface LocationLink {
+
+	/**
+	 * Span of the origin of this link.
+	 *
+	 * Used as the underlined span for mouse interaction. Defaults to the word
+	 * range at the mouse position.
+	 */
+	originSelectionRange?: Range;
+
+	/**
+	 * The target resource identifier of this link.
+	 */
+	targetUri: DocumentUri;
+
+	/**
+	 * The full target range of this link. If the target for example is a symbol
+	 * then target range is the range enclosing this symbol not including
+	 * leading/trailing whitespace but everything else like comments. This
+	 * information is typically used to highlight the range in the editor.
+	 */
+	targetRange: Range;
+
+	/**
+	 * The range that should be selected and revealed when this link is being
+	 * followed, e.g the name of a function. Must be contained by the the
+	 * `targetRange`. See also `DocumentSymbol#range`
+	 */
+	targetSelectionRange: Range;
+}
+```
+#### <a href="#diagnostic" name="diagnostic" class="anchor"> Diagnostic </a>
+
+Represents a diagnostic, such as a compiler error or warning. Diagnostic objects are only valid in the scope of a resource.
+
+```typescript
+export interface Diagnostic {
+	/**
+	 * The range at which the message applies.
+	 */
+	range: Range;
+
+	/**
+	 * The diagnostic's severity. Can be omitted. If omitted it is up to the
+	 * client to interpret diagnostics as error, warning, info or hint.
+	 */
+	severity?: DiagnosticSeverity;
+
+	/**
+	 * The diagnostic's code, which might appear in the user interface.
+	 */
+	code?: integer | string;
+
+	/**
+	 * An optional property to describe the error code.
+	 *
+	 * @since 3.16.0
+	 */
+	codeDescription?: CodeDescription;
+
+	/**
+	 * A human-readable string describing the source of this
+	 * diagnostic, e.g. 'typescript' or 'super lint'.
+	 */
+	source?: string;
+
+	/**
+	 * The diagnostic's message.
+	 */
+	message: string;
+
+	/**
+	 * Additional metadata about the diagnostic.
+	 *
+	 * @since 3.15.0
+	 */
+	tags?: DiagnosticTag[];
+
+	/**
+	 * An array of related diagnostic information, e.g. when symbol-names within
+	 * a scope collide all definitions can be marked via this property.
+	 */
+	relatedInformation?: DiagnosticRelatedInformation[];
+
+	/**
+	 * A data entry field that is preserved between a
+	 * `textDocument/publishDiagnostics` notification and
+	 * `textDocument/codeAction` request.
+	 *
+	 * @since 3.16.0
+	 */
+	data?: unknown;
 }
 ```
 
+The protocol currently supports the following diagnostic severities and tags:
+
+<div class="anchorHolder"><a href="#diagnosticSeverity" name="diagnosticSeverity" class="linkableAnchor"></a></div>
+
+```typescript
+export namespace DiagnosticSeverity {
+	/**
+	 * Reports an error.
+	 */
+	export const Error: 1 = 1;
+	/**
+	 * Reports a warning.
+	 */
+	export const Warning: 2 = 2;
+	/**
+	 * Reports an information.
+	 */
+	export const Information: 3 = 3;
+	/**
+	 * Reports a hint.
+	 */
+	export const Hint: 4 = 4;
+}
+
+export type DiagnosticSeverity = 1 | 2 | 3 | 4;
+```
+
+<div class="anchorHolder"><a href="#diagnosticTag" name="diagnosticTag" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The diagnostic tags.
+ *
+ * @since 3.15.0
+ */
+export namespace DiagnosticTag {
+	/**
+	 * Unused or unnecessary code.
+	 *
+	 * Clients are allowed to render diagnostics with this tag faded out
+	 * instead of having an error squiggle.
+	 */
+	export const Unnecessary: 1 = 1;
+	/**
+	 * Deprecated or obsolete code.
+	 *
+	 * Clients are allowed to rendered diagnostics with this tag strike through.
+	 */
+	export const Deprecated: 2 = 2;
+}
+
+export type DiagnosticTag = 1 | 2;
+```
+
+`DiagnosticRelatedInformation` is defined as follows:
+
+<div class="anchorHolder"><a href="#diagnosticRelatedInformation" name="diagnosticRelatedInformation" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Represents a related message and source code location for a diagnostic.
+ * This should be used to point to code locations that cause or are related to
+ * a diagnostics, e.g when duplicating a symbol in a scope.
+ */
+export interface DiagnosticRelatedInformation {
+	/**
+	 * The location of this related diagnostic information.
+	 */
+	location: Location;
+
+	/**
+	 * The message of this related diagnostic information.
+	 */
+	message: string;
+}
+```
+
+`CodeDescription` is defined as follows:
+
+<div class="anchorHolder"><a href="#codeDescription" name="codeDescription" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Structure to capture a description for an error code.
+ *
+ * @since 3.16.0
+ */
+export interface CodeDescription {
+	/**
+	 * An URI to open with more information about the diagnostic error.
+	 */
+	href: URI;
+}
+```
+#### <a href="#command" name="command" class="anchor"> Command </a>
+
+Represents a reference to a command. Provides a title which will be used to represent a command in the UI. Commands are identified by a string identifier. The recommended way to handle commands is to implement their execution on the server side if the client and server provides the corresponding capabilities. Alternatively the tool extension code could handle the command. The protocol currently doesn't specify a set of well-known commands.
+
+```typescript
+interface Command {
+	/**
+	 * Title of the command, like `save`.
+	 */
+	title: string;
+	/**
+	 * The identifier of the actual command handler.
+	 */
+	command: string;
+	/**
+	 * Arguments that the command handler should be
+	 * invoked with.
+	 */
+	arguments?: LSPAny[];
+}
+```
 #### <a href="#markupContent" name="markupContent" class="anchor"> MarkupContent </a>
 
  A `MarkupContent` literal represents a string value which content can be represented in different formats. Currently `plaintext` and `markdown` are supported formats. A `MarkupContent` is usually used in documentation properties of result literals like `CompletionItem` or `SignatureInformation`. If the format is `markdown` the content should follow the [GitHub Flavored Markdown Specification](https://github.github.com/gfm/).
@@ -1362,7 +1212,11 @@
 	export const Markdown: 'markdown' = 'markdown';
 }
 export type MarkupKind = 'plaintext' | 'markdown';
+```
 
+<div class="anchorHolder"><a href="#markupContentDefinition" name="markupContentInnerDefinition" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * A `MarkupContent` literal represents a string value which content is
  * interpreted base on its kind flag. Currently the protocol supports
@@ -1404,7 +1258,9 @@
 
 In addition clients should signal the markdown parser they are using via the client capability `general.markdown` introduced in version 3.16.0 defined as follows:
 
-```typescript
+<div class="anchorHolder"><a href="#markdownClientCapabilities" name="markdownClientCapabilities" class="linkableAnchor"></a></div>
+
+ ```typescript
 /**
  * Client capabilities specific to the used markdown parser.
  *
@@ -1420,15 +1276,357 @@
 	 * The version of the parser.
 	 */
 	version?: string;
+
+	/**
+	 * A list of HTML tags that the client allows / supports in
+	 * Markdown.
+	 *
+	 * @since 3.17.0
+	 */
+	allowedTags?: string[];
 }
-```
+ ```
 
 Known markdown parsers used by clients right now are:
 
-Parser | Version | Documentation
------- | ------- | -------------
-marked | 1.1.0   | [Marked Documentation](https://marked.js.org/)
+Parser          | Version | Documentation
+--------------- | ------- | -------------
+marked          | 1.1.0   | [Marked Documentation](https://marked.js.org/)
+Python-Markdown | 3.2.2   | [Python-Markdown Documentation](https://python-markdown.github.io)
+### <a href="#resourceChanges" name="resourceChanges" class="anchor"> File Resource changes </a>
 
+> New in version 3.13. Since version 3.16 file resource changes can carry an additional property `changeAnnotation` to describe the actual change in more detail. Whether a client has support for change annotations is guarded by the client capability `workspace.workspaceEdit.changeAnnotationSupport`.
+
+File resource changes allow servers to create, rename and delete files and folders via the client. Note that the names talk about files but the operations are supposed to work on files and folders. This is in line with other naming in the Language Server Protocol (see file watchers which can watch files and folders). The corresponding change literals look as follows:
+
+<div class="anchorHolder"><a href="#createFileOptions" name="createFileOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Options to create a file.
+ */
+export interface CreateFileOptions {
+	/**
+	 * Overwrite existing file. Overwrite wins over `ignoreIfExists`
+	 */
+	overwrite?: boolean;
+
+	/**
+	 * Ignore if exists.
+	 */
+	ignoreIfExists?: boolean;
+}
+```
+
+<div class="anchorHolder"><a href="#createFile" name="createFile" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Create file operation
+ */
+export interface CreateFile {
+	/**
+	 * A create
+	 */
+	kind: 'create';
+
+	/**
+	 * The resource to create.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * Additional options
+	 */
+	options?: CreateFileOptions;
+
+	/**
+	 * An optional annotation identifier describing the operation.
+	 *
+	 * @since 3.16.0
+	 */
+	annotationId?: ChangeAnnotationIdentifier;
+}
+```
+
+<div class="anchorHolder"><a href="#renameFileOptions" name="renameFileOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Rename file options
+ */
+export interface RenameFileOptions {
+	/**
+	 * Overwrite target if existing. Overwrite wins over `ignoreIfExists`
+	 */
+	overwrite?: boolean;
+
+	/**
+	 * Ignores if target exists.
+	 */
+	ignoreIfExists?: boolean;
+}
+```
+
+<div class="anchorHolder"><a href="#renameFile" name="renameFile" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Rename file operation
+ */
+export interface RenameFile {
+	/**
+	 * A rename
+	 */
+	kind: 'rename';
+
+	/**
+	 * The old (existing) location.
+	 */
+	oldUri: DocumentUri;
+
+	/**
+	 * The new location.
+	 */
+	newUri: DocumentUri;
+
+	/**
+	 * Rename options.
+	 */
+	options?: RenameFileOptions;
+
+	/**
+	 * An optional annotation identifier describing the operation.
+	 *
+	 * @since 3.16.0
+	 */
+	annotationId?: ChangeAnnotationIdentifier;
+}
+```
+
+<div class="anchorHolder"><a href="#deleteFileOptions" name="deleteFileOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Delete file options
+ */
+export interface DeleteFileOptions {
+	/**
+	 * Delete the content recursively if a folder is denoted.
+	 */
+	recursive?: boolean;
+
+	/**
+	 * Ignore the operation if the file doesn't exist.
+	 */
+	ignoreIfNotExists?: boolean;
+}
+```
+
+<div class="anchorHolder"><a href="#deleteFile" name="deleteFile" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Delete file operation
+ */
+export interface DeleteFile {
+	/**
+	 * A delete
+	 */
+	kind: 'delete';
+
+	/**
+	 * The file to delete.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * Delete options.
+	 */
+	options?: DeleteFileOptions;
+
+	/**
+	 * An optional annotation identifier describing the operation.
+	 *
+	 * @since 3.16.0
+	 */
+	annotationId?: ChangeAnnotationIdentifier;
+}
+```
+#### <a href="#workspaceEdit" name="workspaceEdit" class="anchor"> WorkspaceEdit </a>
+
+A workspace edit represents changes to many resources managed in the workspace. The edit should either provide `changes` or `documentChanges`. If the client can handle versioned document edits and if `documentChanges` are present, the latter are preferred over `changes`.
+
+ Since version 3.13.0 a workspace edit can contain resource operations (create, delete or rename files and folders) as well. If resource operations are present clients need to execute the operations in the order in which they are provided. So a workspace edit for example can consist of the following two changes: (1) create file a.txt and (2) a text document edit which insert text into file a.txt. An invalid sequence (e.g. (1) delete file a.txt and (2) insert text into file a.txt) will cause failure of the operation. How the client recovers from the failure is described by the client capability: `workspace.workspaceEdit.failureHandling`
+
+```typescript
+export interface WorkspaceEdit {
+	/**
+	 * Holds changes to existing resources.
+	 */
+	changes?: { [uri: DocumentUri]: TextEdit[]; };
+
+	/**
+	 * Depending on the client capability
+	 * `workspace.workspaceEdit.resourceOperations` document changes are either
+	 * an array of `TextDocumentEdit`s to express changes to n different text
+	 * documents where each text document edit addresses a specific version of
+	 * a text document. Or it can contain above `TextDocumentEdit`s mixed with
+	 * create, rename and delete file / folder operations.
+	 *
+	 * Whether a client supports versioned document edits is expressed via
+	 * `workspace.workspaceEdit.documentChanges` client capability.
+	 *
+	 * If a client neither supports `documentChanges` nor
+	 * `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s
+	 * using the `changes` property are supported.
+	 */
+	documentChanges?: (
+		TextDocumentEdit[] |
+		(TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[]
+	);
+
+	/**
+	 * A map of change annotations that can be referenced in
+	 * `AnnotatedTextEdit`s or create, rename and delete file / folder
+	 * operations.
+	 *
+	 * Whether clients honor this property depends on the client capability
+	 * `workspace.changeAnnotationSupport`.
+	 *
+	 * @since 3.16.0
+	 */
+	changeAnnotations?: {
+		[id: string /* ChangeAnnotationIdentifier */]: ChangeAnnotation;
+	};
+}
+```
+
+##### <a href="#workspaceEditClientCapabilities" name="workspaceEditClientCapabilities" class="anchor"> WorkspaceEditClientCapabilities </a>
+
+> New in version 3.13: `ResourceOperationKind` and `FailureHandlingKind` and the client capability `workspace.workspaceEdit.resourceOperations` as well as `workspace.workspaceEdit.failureHandling`.
+
+
+The capabilities of a workspace edit has evolved over the time. Clients can describe their support using the following client capability:
+
+_Client Capability_:
+* property path (optional): `workspace.workspaceEdit`
+* property type: `WorkspaceEditClientCapabilities` defined as follows:
+
+```typescript
+export interface WorkspaceEditClientCapabilities {
+	/**
+	 * The client supports versioned document changes in `WorkspaceEdit`s
+	 */
+	documentChanges?: boolean;
+
+	/**
+	 * The resource operations the client supports. Clients should at least
+	 * support 'create', 'rename' and 'delete' files and folders.
+	 *
+	 * @since 3.13.0
+	 */
+	resourceOperations?: ResourceOperationKind[];
+
+	/**
+	 * The failure handling strategy of a client if applying the workspace edit
+	 * fails.
+	 *
+	 * @since 3.13.0
+	 */
+	failureHandling?: FailureHandlingKind;
+
+	/**
+	 * Whether the client normalizes line endings to the client specific
+	 * setting.
+	 * If set to `true` the client will normalize line ending characters
+	 * in a workspace edit to the client specific new line character(s).
+	 *
+	 * @since 3.16.0
+	 */
+	normalizesLineEndings?: boolean;
+
+	/**
+	 * Whether the client in general supports change annotations on text edits,
+	 * create file, rename file and delete file changes.
+	 *
+	 * @since 3.16.0
+	 */
+	changeAnnotationSupport?: {
+		/**
+		 * Whether the client groups edits with equal labels into tree nodes,
+		 * for instance all edits labelled with "Changes in Strings" would
+		 * be a tree node.
+		 */
+		groupsOnLabel?: boolean;
+	};
+}
+```
+
+<div class="anchorHolder"><a href="#resourceOperationKind" name="resourceOperationKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The kind of resource operations supported by the client.
+ */
+export type ResourceOperationKind = 'create' | 'rename' | 'delete';
+
+export namespace ResourceOperationKind {
+
+	/**
+	 * Supports creating new files and folders.
+	 */
+	export const Create: ResourceOperationKind = 'create';
+
+	/**
+	 * Supports renaming existing files and folders.
+	 */
+	export const Rename: ResourceOperationKind = 'rename';
+
+	/**
+	 * Supports deleting existing files and folders.
+	 */
+	export const Delete: ResourceOperationKind = 'delete';
+}
+```
+
+<div class="anchorHolder"><a href="#failureHandlingKind" name="failureHandlingKind" class="linkableAnchor"></a></div>
+
+```typescript
+export type FailureHandlingKind = 'abort' | 'transactional' | 'undo'
+	| 'textOnlyTransactional';
+
+export namespace FailureHandlingKind {
+
+	/**
+	 * Applying the workspace change is simply aborted if one of the changes
+	 * provided fails. All operations executed before the failing operation
+	 * stay executed.
+	 */
+	export const Abort: FailureHandlingKind = 'abort';
+
+	/**
+	 * All operations are executed transactional. That means they either all
+	 * succeed or no changes at all are applied to the workspace.
+	 */
+	export const Transactional: FailureHandlingKind = 'transactional';
+
+
+	/**
+	 * If the workspace edit contains only textual file changes they are
+	 * executed transactional. If resource changes (create, rename or delete
+	 * file) are part of the change the failure handling strategy is abort.
+	 */
+	export const TextOnlyTransactional: FailureHandlingKind
+		= 'textOnlyTransactional';
+
+	/**
+	 * The client tries to undo the operations already executed. But there is no
+	 * guarantee that this is succeeding.
+	 */
+	export const Undo: FailureHandlingKind = 'undo';
+}
+```
 
 #### <a href="#workDoneProgress" name="workDoneProgress" class="anchor"> Work Done Progress </a>
 
@@ -1567,6 +1765,9 @@
 
 The corresponding type definition for the parameter property looks like this:
 
+
+<div class="anchorHolder"><a href="#workDoneProgressParams" name="workDoneProgressParams" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface WorkDoneProgressParams {
 	/**
@@ -1607,6 +1808,8 @@
 
 The corresponding type definition for the server capability looks like this:
 
+<div class="anchorHolder"><a href="#workDoneProgressOptions" name="workDoneProgressOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface WorkDoneProgressOptions {
 	workDoneProgress?: boolean;
@@ -1614,7 +1817,7 @@
 ```
 ###### <a href="#serverInitiatedProgress" name="serverInitiatedProgress" class="anchor">Server Initiated Progress </a>
 
-Servers can also initiate progress reporting using the `window/workDoneProgress/create` request. This is useful if the server needs to report progress outside of a request (for example the server needs to re-index a database). The returned token can then be used to report progress using the same notifications used as for client initiated progress. A token obtained using the create request should only be used once (e.g. only one begin, many report and one end notification should be sent to it).
+Servers can also initiate progress reporting using the `window/workDoneProgress/create` request. This is useful if the server needs to report progress outside of a request (for example the server needs to re-index a database). The token can then be used to report progress using the same notifications used as for client initiated progress. The token provided in the create request should only be used once (e.g. only one begin, many report and one end notification should be sent to it).
 
 To keep the protocol backwards compatible servers are only allowed to use `window/workDoneProgress/create` request if the client signals corresponding support using the client capability `window.workDoneProgress` which is defined as follows:
 
@@ -1630,12 +1833,11 @@
 		workDoneProgress?: boolean;
 	};
 ```
-
 #### <a href="#partialResults" name="partialResults" class="anchor"> Partial Result Progress </a>
 
 > *Since version 3.15.0*
 
-Partial results are also reported using the generic [`$/progress`](#progress) notification. The value payload of a partial result progress notification is in most cases the same as the final result. For example the `workspace/symbol` request has `SymbolInformation[]` as the result type. Partial result is therefore also of type `SymbolInformation[]`. Whether a client accepts partial result notifications for a request is signaled by adding a `partialResultToken` to the request parameter. For example, a `textDocument/reference` request that supports both work done and partial result progress might look like this:
+Partial results are also reported using the generic [`$/progress`](#progress) notification. The value payload of a partial result progress notification is in most cases the same as the final result. For example the `workspace/symbol` request has `SymbolInformation[]` \| `WorkspaceSymbol[]` as the result type. Partial result is therefore also of type `SymbolInformation[]` \| `WorkspaceSymbol[]`. Whether a client accepts partial result notifications for a request is signaled by adding a `partialResultToken` to the request parameter. For example, a `textDocument/reference` request that supports both work done and partial result progress might look like this:
 
 ```json
 {
@@ -1664,7 +1866,6 @@
 
 - the `code` equals to `RequestCancelled`: the client is free to use the provided results but should make clear that the request got canceled and may be incomplete.
 - in all other cases the provided partial results shouldn't be used.
-
 #### <a href="#partialResultParams" name="partialResultParams" class="anchor"> PartialResultParams </a>
 
 A parameter literal used to pass a partial result token.
@@ -1678,7 +1879,6 @@
 	partialResultToken?: ProgressToken;
 }
 ```
-
 #### <a href="#traceValue" name="traceValue" class="anchor"> TraceValue </a>
 
 A `TraceValue` represents the level of verbosity with which the server systematically reports its execution trace using [$/logTrace](#logTrace) notifications.
@@ -1688,26 +1888,9 @@
 export type TraceValue = 'off' | 'messages' | 'verbose';
 ```
 
-### Actual Protocol
+### <a href="#lifeCycleMessages" name="lifeCycleMessages" class="anchor"> Server lifecycle </a>
 
-This section documents the actual language server protocol. It uses the following format:
-
-* a header describing the request
-* an optional _Client capability_ section describing the client capability of the request. This includes the client capabilities property path and JSON structure.
-* an optional _Server Capability_ section describing the server capability of the request. This includes the server capabilities property path and JSON structure. Clients should ignore server capabilities they don't understand (e.g. the initialize request shouldn't fail in this case).
-* an optional _Registration Options_ section describing the registration option if the request or notification supports dynamic capability registration. See the [register](#client_registerCapability) and [unregister](#client_unregisterCapability) request for how this works in detail.
-* a _Request_ section describing the format of the request sent. The method is a string identifying the request the params are documented using a TypeScript interface. It is also documented whether the request supports work done progress and partial result progress.
-* a _Response_ section describing the format of the response. The result item describes the returned data in case of a success. The optional partial result item describes the returned data of a partial result notification. The error.data describes the returned data in case of an error. Please remember that in case of a failure the response already contains an error.code and an error.message field. These fields are only specified if the protocol forces the use of certain error codes or messages. In cases where the server can decide on these values freely they aren't listed here.
-
-#### Request, Notification and Response ordering
-
-Responses to requests should be sent in roughly the same order as the requests appear on the server or client side. So for example if a server receives a `textDocument/completion` request and then a `textDocument/signatureHelp` request it will usually first return the response for the `textDocument/completion` and then the response for `textDocument/signatureHelp`.
-
-However, the server may decide to use a parallel execution strategy and may wish to return responses in a different order than the requests were received. The server may do so as long as this reordering doesn't affect the correctness of the responses. For example, reordering the result of `textDocument/completion` and `textDocument/signatureHelp` is allowed, as these each of these requests usually won't affect the output of the other. On the other hand, the server most likely should not reorder `textDocument/definition` and `textDocument/rename` requests, since the executing the latter may affect the result of the former.
-
-#### Server lifetime
-
-The current protocol specification defines that the lifetime of a server is managed by the client (e.g. a tool like VS Code or Emacs). It is up to the client to decide when to start (process-wise) and when to shutdown a server.
+The current protocol specification defines that the lifecycle of a server is managed by the client (e.g. a tool like VS Code or Emacs). It is up to the client to decide when to start (process-wise) and when to shutdown a server.
 
 #### <a href="#initialize" name="initialize" class="anchor">Initialize Request (:leftwards_arrow_with_hook:)</a>
 
@@ -1724,6 +1907,8 @@
 * method: 'initialize'
 * params: `InitializeParams` defined as follows:
 
+<div class="anchorHolder"><a href="#initializeParams" name="initializeParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface InitializeParams extends WorkDoneProgressParams {
 	/**
@@ -1783,7 +1968,7 @@
 	/**
 	 * User provided initialization options.
 	 */
-	initializationOptions?: any;
+	initializationOptions?: LSPAny;
 
 	/**
 	 * The capabilities provided by the client (editor or tool)
@@ -1813,6 +1998,8 @@
 
 `TextDocumentClientCapabilities` define capabilities the editor / tool provides on text documents.
 
+<div class="anchorHolder"><a href="#textDocumentClientCapabilities" name="textDocumentClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Text document specific client capabilities.
@@ -1910,7 +2097,7 @@
 	 */
 	rangeFormatting?: DocumentRangeFormattingClientCapabilities;
 
-	/**
+	/** request.
 	 * Capabilities specific to the `textDocument/onTypeFormatting` request.
 	 */
 	onTypeFormatting?: DocumentOnTypeFormattingClientCapabilities;
@@ -1967,13 +2154,66 @@
 	 * @since 3.16.0
 	 */
 	moniker?: MonikerClientCapabilities;
+
+	/**
+	 * Capabilities specific to the various type hierarchy requests.
+	 *
+	 * @since 3.17.0
+	 */
+	typeHierarchy?: TypeHierarchyClientCapabilities;
+
+	/**
+	 * Capabilities specific to the `textDocument/inlineValue` request.
+	 *
+	 * @since 3.17.0
+	 */
+	inlineValue?: InlineValueClientCapabilities;
+
+	/**
+	 * Capabilities specific to the `textDocument/inlayHint` request.
+	 *
+	 * @since 3.17.0
+	 */
+	inlayHint?: InlayHintClientCapabilities;
+
+	/**
+	 * Capabilities specific to the diagnostic pull model.
+	 *
+	 * @since 3.17.0
+	 */
+	diagnostic?: DiagnosticClientCapabilities;
 }
 ```
 
+##### NotebookDocumentClientCapabilities
+
+`NotebookDocumentClientCapabilities` define capabilities the editor / tool provides on notebook documents.
+
+<div class="anchorHolder"><a href="#notebookDocumentClientCapabilities" name="notebookDocumentClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Capabilities specific to the notebook document support.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookDocumentClientCapabilities {
+	/**
+	 * Capabilities specific to notebook document synchronization
+	 *
+	 * @since 3.17.0
+	 */
+	synchronization: NotebookDocumentSyncClientCapabilities;
+}
+```
+
+
 `ClientCapabilities` define capabilities for dynamic registration, workspace and text document features the client supports. The `experimental` can be used to pass experimental capabilities under development. For future compatibility a `ClientCapabilities` object literal can have more properties set than currently defined. Servers receiving a `ClientCapabilities` object literal with unknown properties should ignore these properties. A missing property should be interpreted as an absence of the capability. If a missing property normally defines sub properties, all missing sub properties should be interpreted as an absence of the corresponding capability.
 
 Client capabilities got introduced with version 3.0 of the protocol. They therefore only describe capabilities that got introduced in 3.x or later. Capabilities that existed in the 2.x version of the protocol are still mandatory for clients. Clients cannot opt out of providing them. So even if a client omits the `ClientCapabilities.textDocument.synchronization` it is still required that the client provides text document synchronization (e.g. open, changed and close notifications).
 
+<div class="anchorHolder"><a href="#clientCapabilities" name="clientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 interface ClientCapabilities {
 	/**
@@ -2086,6 +2326,27 @@
 			 */
 			willDelete?: boolean;
 		};
+
+		/**
+		 * Client workspace capabilities specific to inline values.
+		 *
+		 * @since 3.17.0
+		 */
+		inlineValue?: InlineValueWorkspaceClientCapabilities;
+
+		/**
+		 * Client workspace capabilities specific to inlay hints.
+		 *
+		 * @since 3.17.0
+		 */
+		inlayHint?: InlayHintWorkspaceClientCapabilities;
+
+		/**
+		 * Client workspace capabilities specific to diagnostics.
+		 *
+		 * @since 3.17.0.
+		 */
+		diagnostics?: DiagnosticWorkspaceClientCapabilities;
 	};
 
 	/**
@@ -2094,13 +2355,24 @@
 	textDocument?: TextDocumentClientCapabilities;
 
 	/**
+	 * Capabilities specific to the notebook document support.
+	 *
+	 * @since 3.17.0
+	 */
+	notebookDocument?: NotebookDocumentClientCapabilities;
+
+	/**
 	 * Window specific client capabilities.
 	 */
 	window?: {
 		/**
-		 * Whether client supports handling progress notifications. If set
-		 * servers are allowed to report in `workDoneProgress` property in the
-		 * request specific server capabilities.
+		 * It indicates whether the client supports server initiated
+		 * progress using the `window/workDoneProgress/create` request.
+		 *
+		 * The capability also controls Whether client supports handling
+		 * of progress notifications. If set servers are allowed to report a
+		 * `workDoneProgress` property in the request specific server
+		 * capabilities.
 		 *
 		 * @since 3.15.0
 		 */
@@ -2128,6 +2400,28 @@
 	 */
 	general?: {
 		/**
+		 * 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
+		 */
+		staleRequestSupport?: {
+			/**
+			 * The client will actively cancel the request.
+			 */
+			cancel: boolean;
+
+			/**
+			 * The list of requests for which the client
+			 * will retry the request if it receives a
+			 * response with error code `ContentModified``
+			 */
+			 retryOnContentModified: string[];
+		}
+
+		/**
 		 * Client capabilities specific to regular expressions.
 		 *
 		 * @since 3.16.0
@@ -2140,18 +2434,42 @@
 		 * @since 3.16.0
 		 */
 		markdown?: MarkdownClientCapabilities;
+
+		/**
+		 * 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
+		 */
+		positionEncodings?: PositionEncodingKind[];
 	};
 
 	/**
 	 * Experimental client capabilities.
 	 */
-	experimental?: any;
+	experimental?: LSPAny;
 }
 ```
 
 _Response_:
 * result: `InitializeResult` defined as follows:
 
+<div class="anchorHolder"><a href="#initializeResult" name="initializeResult" class="linkableAnchor"></a></div>
+
 ```typescript
 interface InitializeResult {
 	/**
@@ -2179,24 +2497,31 @@
 ```
 * error.code:
 
+<div class="anchorHolder"><a href="#initializeErrorCodes" name="initializeErrorCodes" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
- * Known error codes for an `InitializeError`;
+ * Known error codes for an `InitializeErrorCodes`;
  */
-export namespace InitializeError {
+export namespace InitializeErrorCodes {
+
 	/**
-	 * If the protocol version provided by the client can't be handled by the
-	 * server.
+	 * If the protocol version provided by the client can't be handled by
+	 * the server.
 	 *
 	 * @deprecated This initialize error got replaced by client capabilities.
 	 * There is no version handshake in version 3.0x
 	 */
 	export const unknownProtocolVersion: 1 = 1;
 }
+
+export type InitializeErrorCodes = 1;
 ```
 
 * error.data:
 
+<div class="anchorHolder"><a href="#initializeError" name="initializeError" class="linkableAnchor"></a></div>
+
 ```typescript
 interface InitializeError {
 	/**
@@ -2211,8 +2536,24 @@
 
 The server can signal the following capabilities:
 
+<div class="anchorHolder"><a href="#serverCapabilities" name="serverCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 interface ServerCapabilities {
+
+	/**
+	 * The position encoding the server picked from the encodings offered
+	 * by the client via the client capability `general.positionEncodings`.
+	 *
+	 * If the client didn't provide any position encodings the only valid
+	 * value that a server can return is 'utf-16'.
+	 *
+	 * If omitted it defaults to 'utf-16'.
+	 *
+	 * @since 3.17.0
+	 */
+	positionEncoding?: PositionEncodingKind;
+
 	/**
 	 * Defines how text documents are synced. Is either a detailed structure
 	 * defining each notification or for backwards compatibility the
@@ -2222,6 +2563,14 @@
 	textDocumentSync?: TextDocumentSyncOptions | TextDocumentSyncKind;
 
 	/**
+	 * Defines how notebook documents are synced.
+	 *
+	 * @since 3.17.0
+	 */
+	notebookDocumentSync?: NotebookDocumentSyncOptions
+		| NotebookDocumentSyncRegistrationOptions;
+
+	/**
 	 * The server provides completion support.
 	 */
 	completionProvider?: CompletionOptions;
@@ -2380,6 +2729,37 @@
 	monikerProvider?: boolean | MonikerOptions | MonikerRegistrationOptions;
 
 	/**
+	 * The server provides type hierarchy support.
+	 *
+	 * @since 3.17.0
+	 */
+	typeHierarchyProvider?: boolean | TypeHierarchyOptions
+		 | TypeHierarchyRegistrationOptions;
+
+	/**
+	 * The server provides inline values.
+	 *
+	 * @since 3.17.0
+	 */
+	inlineValueProvider?: boolean | InlineValueOptions
+		 | InlineValueRegistrationOptions;
+
+	/**
+	 * The server provides inlay hints.
+	 *
+	 * @since 3.17.0
+	 */
+	inlayHintProvider?: boolean | InlayHintOptions
+		 | InlayHintRegistrationOptions;
+
+	/**
+	 * The server has support for pull model diagnostics.
+	 *
+	 * @since 3.17.0
+	 */
+	diagnosticProvider?: DiagnosticOptions | DiagnosticRegistrationOptions;
+
+	/**
 	 * The server provides workspace symbol support.
 	 */
 	workspaceSymbolProvider?: boolean | WorkspaceSymbolOptions;
@@ -2440,7 +2820,7 @@
 	/**
 	 * Experimental server capabilities.
 	 */
-	experimental?: any;
+	experimental?: LSPAny;
 }
 ```
 
@@ -2457,342 +2837,6 @@
 }
 ```
 
-#### <a href="#shutdown" name="shutdown" class="anchor">Shutdown Request (:leftwards_arrow_with_hook:)</a>
-
-The shutdown request is sent from the client to the server. It asks the server to shut down, but to not exit (otherwise the response might not be delivered correctly to the client). There is a separate exit notification that asks the server to exit. Clients must not send any notifications other than `exit` or requests to a server to which they have sent a shutdown request. Clients should also wait with sending the `exit` notification until they have received a response from the `shutdown` request.
-
-If a server receives requests after a shutdown request those requests should error with `InvalidRequest`.
-
-_Request_:
-* method: 'shutdown'
-* params: void
-
-_Response_:
-* result: null
-* error: code and message set in case an exception happens during shutdown request.
-
-#### <a href="#exit" name="exit" class="anchor">Exit Notification (:arrow_right:)</a>
-
-A notification to ask the server to exit its process.
-The server should exit with `success` code 0 if the shutdown request has been received before; otherwise with `error` code 1.
-
-_Notification_:
-* method: 'exit'
-* params: void
-
-#### <a href="#logTrace" name="logTrace" class="anchor">LogTrace Notification (:arrow_left:)</a>
-
-A notification to log the trace of the server's execution.
-The amount and content of these notifications depends on the current `trace` configuration.
-If `trace` is `'off'`, the server should not send any `logTrace` notification.
-If `trace` is `'messages'`, the server should not add the `'verbose'` field in the `LogTraceParams`.
-
-`$/logTrace` should be used for systematic trace reporting. For single debugging messages, the server should send [`window/logMessage`](#window_logMessage) notifications.
-
-
-_Notification_:
-* method: '$/logTrace'
-* params: `LogTraceParams` defined as follows:
-
-```typescript
-interface LogTraceParams {
-	/**
-	 * The message to be logged.
-	 */
-	message: string;
-	/**
-	 * Additional information that can be computed if the `trace` configuration
-	 * is set to `'verbose'`
-	 */
-	verbose?: string;
-}
-```
-
-#### <a href="#setTrace" name="setTrace" class="anchor">SetTrace Notification (:arrow_right:)</a>
-
-A notification that should be used by the client to modify the trace setting of the server.
-
-_Notification_:
-* method: '$/setTrace'
-* params: `SetTraceParams` defined as follows:
-
-```typescript
-interface SetTraceParams {
-	/**
-	 * The new value that should be assigned to the trace setting.
-	 */
-	value: TraceValue;
-}
-```
-
-#### <a href="#window_showMessage" name="window_showMessage" class="anchor">ShowMessage Notification (:arrow_left:)</a>
-
-The show message notification is sent from a server to a client to ask the client to display a particular message in the user interface.
-
-_Notification_:
-* method: 'window/showMessage'
-* params: `ShowMessageParams` defined as follows:
-
-```typescript
-interface ShowMessageParams {
-	/**
-	 * The message type. See {@link MessageType}.
-	 */
-	type: MessageType;
-
-	/**
-	 * The actual message.
-	 */
-	message: string;
-}
-```
-
-Where the type is defined as follows:
-
-```typescript
-export namespace MessageType {
-	/**
-	 * An error message.
-	 */
-	export const Error = 1;
-	/**
-	 * A warning message.
-	 */
-	export const Warning = 2;
-	/**
-	 * An information message.
-	 */
-	export const Info = 3;
-	/**
-	 * A log message.
-	 */
-	export const Log = 4;
-}
-
-export type MessageType = 1 | 2 | 3 | 4;
-```
-
-#### <a href="#window_showMessageRequest" name="window_showMessageRequest" class="anchor">ShowMessage Request (:arrow_right_hook:)</a>
-
-The show message request is sent from a server to a client to ask the client to display a particular message in the user interface. In addition to the show message notification the request allows to pass actions and to wait for an answer from the client.
-
-_Client Capability_:
-* property path (optional): `window.showMessage`
-* property type: `ShowMessageRequestClientCapabilities` defined as follows:
-
-```typescript
-/**
- * Show message request client capabilities
- */
-export interface ShowMessageRequestClientCapabilities {
-	/**
-	 * Capabilities specific to the `MessageActionItem` type.
-	 */
-	messageActionItem?: {
-		/**
-		 * Whether the client supports additional attributes which
-		 * are preserved and sent back to the server in the
-		 * request's response.
-		 */
-		additionalPropertiesSupport?: boolean;
-	};
-}
-```
-
-_Request_:
-* method: 'window/showMessageRequest'
-* params: `ShowMessageRequestParams` defined as follows:
-
-_Response_:
-* result: the selected `MessageActionItem` \| `null` if none got selected.
-* error: code and message set in case an exception happens during showing a message.
-
-```typescript
-interface ShowMessageRequestParams {
-	/**
-	 * The message type. See {@link MessageType}
-	 */
-	type: MessageType;
-
-	/**
-	 * The actual message
-	 */
-	message: string;
-
-	/**
-	 * The message action items to present.
-	 */
-	actions?: MessageActionItem[];
-}
-```
-
-Where the `MessageActionItem` is defined as follows:
-
-```typescript
-interface MessageActionItem {
-	/**
-	 * A short title like 'Retry', 'Open Log' etc.
-	 */
-	title: string;
-}
-```
-
-#### <a href="#window_showDocument" name="window_showDocument" class="anchor">Show Document Request (:arrow_right_hook:)</a>
-
-> New in version 3.16.0
-
-The show document request is sent from a server to a client to ask the client to display a particular document in the user interface.
-
-_Client Capability_:
-* property path (optional): `window.showDocument`
-* property type: `ShowDocumentClientCapabilities` defined as follows:
-
-```typescript
-/**
- * Client capabilities for the show document request.
- *
- * @since 3.16.0
- */
-export interface ShowDocumentClientCapabilities {
-	/**
-	 * The client has support for the show document
-	 * request.
-	 */
-	support: boolean;
-}
-```
-
-_Request_:
-* method: 'window/showDocument'
-* params: `ShowDocumentParams` defined as follows:
-
-```typescript
-/**
- * Params to show a document.
- *
- * @since 3.16.0
- */
-export interface ShowDocumentParams {
-	/**
-	 * The document uri to show.
-	 */
-	uri: URI;
-
-	/**
-	 * Indicates to show the resource in an external program.
-	 * To show for example `https://code.visualstudio.com/`
-	 * in the default WEB browser set `external` to `true`.
-	 */
-	external?: boolean;
-
-	/**
-	 * An optional property to indicate whether the editor
-	 * showing the document should take focus or not.
-	 * Clients might ignore this property if an external
-	 * program is started.
-	 */
-	takeFocus?: boolean;
-
-	/**
-	 * An optional selection range if the document is a text
-	 * document. Clients might ignore the property if an
-	 * external program is started or the file is not a text
-	 * file.
-	 */
-	selection?: Range;
-}
-```
-
-_Response_:
-
-* result: `ShowDocumentResult` defined as follows:
-
-```typescript
-/**
- * The result of an show document request.
- *
- * @since 3.16.0
- */
-export interface ShowDocumentResult {
-	/**
-	 * A boolean indicating if the show was successful.
-	 */
-	success: boolean;
-}
-```
-* error: code and message set in case an exception happens during showing a document.
-
-#### <a href="#window_logMessage" name="window_logMessage" class="anchor">LogMessage Notification (:arrow_left:)</a>
-
-The log message notification is sent from the server to the client to ask the client to log a particular message.
-
-_Notification_:
-* method: 'window/logMessage'
-* params: `LogMessageParams` defined as follows:
-
-```typescript
-interface LogMessageParams {
-	/**
-	 * The message type. See {@link MessageType}
-	 */
-	type: MessageType;
-
-	/**
-	 * The actual message
-	 */
-	message: string;
-}
-```
-
-#### <a href="#window_workDoneProgress_create" name="window_workDoneProgress_create" class="anchor"> Creating Work Done Progress (:arrow_right_hook:)</a>
-
-The `window/workDoneProgress/create` request is sent from the server to the client to ask the client to create a work done progress.
-
-_Request_:
-
-* method: 'window/workDoneProgress/create'
-* params: `WorkDoneProgressCreateParams` defined as follows:
-
-```typescript
-export interface WorkDoneProgressCreateParams {
-	/**
-	 * The token to be used to report progress.
-	 */
-	token: ProgressToken;
-}
-```
-
-_Response_:
-
-* result: void
-* error: code and message set in case an exception happens during the 'window/workDoneProgress/create' request. In case an error occurs a server must not send any progress notification using the token provided in the `WorkDoneProgressCreateParams`.
-
-#### <a href="#window_workDoneProgress_cancel" name="window_workDoneProgress_cancel" class="anchor"> Canceling a Work Done Progress (:arrow_right:)</a>
-
-The `window/workDoneProgress/cancel` notification is sent from the client to the server to cancel a progress initiated on the server side using the `window/workDoneProgress/create`. The progress need not be marked as `cancellable` to be cancelled and a client may cancel a progress for any number of reasons: in case of error, reloading a workspace etc.
-
-_Notification_:
-
-* method: 'window/workDoneProgress/cancel'
-* params: `WorkDoneProgressCancelParams` defined as follows:
-
-```typescript
-export interface WorkDoneProgressCancelParams {
-	/**
-	 * The token to be used to report progress.
-	 */
-	token: ProgressToken;
-}
-```
-
-#### <a href="#telemetry_event" name="telemetry_event" class="anchor">Telemetry Notification (:arrow_left:)</a>
-
-The telemetry notification is sent from the server to the client to ask the client to log a telemetry event. The protocol doesn't specify the payload since no interpretation of the data happens in the protocol. Most clients even don't handle the event directly but forward them to the extensions owing the corresponding server issuing the event.
-
-_Notification_:
-* method: 'telemetry/event'
-* params: 'object' \| 'number' \| 'boolean' \| 'string';
-
 #### <a href="#client_registerCapability" name="client_registerCapability" class="anchor">Register Capability (:arrow_right_hook:)</a>
 
 The `client/registerCapability` request is sent from the server to the client to register for a new capability on the client side. Not all clients need to support dynamic capability registration. A client opts in via the `dynamicRegistration` property on the specific client capabilities. A client can even provide dynamic registration for capability A but not for capability B (see `TextDocumentClientCapabilities` as an example).
@@ -2805,6 +2849,8 @@
 
 Where `RegistrationParams` are defined as follows:
 
+<div class="anchorHolder"><a href="#registration" name="registration" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * General parameters to register for a capability.
@@ -2824,9 +2870,13 @@
 	/**
 	 * Options necessary for the registration.
 	 */
-	registerOptions?: any;
+	registerOptions?: LSPAny;
 }
+```
 
+<div class="anchorHolder"><a href="#registrationParams" name="registrationParams" class="linkableAnchor"></a></div>
+
+```typescript
 export interface RegistrationParams {
 	registrations: Registration[];
 }
@@ -2861,6 +2911,39 @@
 * result: void.
 * error: code and message set in case an exception happens during the request.
 
+`StaticRegistrationOptions` can be used to register a feature in the initialize result with a given server control ID to be able to un-register the feature later on.
+
+<div class="anchorHolder"><a href="#staticRegistrationOptions" name="staticRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Static registration options to be returned in the initialize request.
+ */
+export interface StaticRegistrationOptions {
+	/**
+	 * The id used to register the request. The id can be used to deregister
+	 * the request again. See also Registration#id.
+	 */
+	id?: string;
+}
+```
+
+`TextDocumentRegistrationOptions` can be used to dynamically register for requests for a set of text documents.
+
+<div class="anchorHolder"><a href="#textDocumentRegistrationOptions" name="textDocumentRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * General text document registration options.
+ */
+export interface TextDocumentRegistrationOptions {
+	/**
+	 * A document selector to identify the scope of the registration. If set to
+	 * null the document selector provided on the client side will be used.
+	 */
+	documentSelector: DocumentSelector | null;
+}
+```
 #### <a href="#client_unregisterCapability" name="client_unregisterCapability" class="anchor">Unregister Capability (:arrow_right_hook:)</a>
 
 The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability.
@@ -2871,6 +2954,8 @@
 
 Where `UnregistrationParams` are defined as follows:
 
+<div class="anchorHolder"><a href="#unregistration" name="unregistration" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * General parameters to unregister a capability.
@@ -2887,7 +2972,11 @@
 	 */
 	method: string;
 }
+```
 
+<div class="anchorHolder"><a href="#unregistrationParams" name="unregistrationParams" class="linkableAnchor"></a></div>
+
+```typescript
 export interface UnregistrationParams {
 	// This should correctly be named `unregistrations`. However changing this
 	// is a breaking change and needs to wait until we deliver a 4.x version
@@ -2915,849 +3004,78 @@
 * result: void.
 * error: code and message set in case an exception happens during the request.
 
-##### <a href="#workspace_workspaceFolders" name="workspace_workspaceFolders" class="anchor">Workspace folders request (:arrow_right_hook:)</a>
+#### <a href="#setTrace" name="setTrace" class="anchor">SetTrace Notification (:arrow_right:)</a>
 
-> *Since version 3.6.0*
-
-Many tools support more than one root folder per workspace. Examples for this are VS Code's multi-root support, Atom's project folder support or Sublime's project support. If a client workspace consists of multiple roots then a server typically needs to know about this. The protocol up to now assumes one root folder which is announced to the server by the `rootUri` property of the `InitializeParams`. If the client supports workspace folders and announces them via the corresponding `workspaceFolders` client capability, the `InitializeParams` contain an additional property `workspaceFolders` with the configured workspace folders when the server starts.
-
-The `workspace/workspaceFolders` request is sent from the server to the client to fetch the current open list of workspace folders. Returns `null` in the response if only a single file is open in the tool. Returns an empty array if a workspace is open but no folders are configured.
-
-_Client Capability_:
-* property path (optional): `workspace.workspaceFolders`
-* property type: `boolean`
-
-_Server Capability_:
-* property path (optional): `workspace.workspaceFolders`
-* property type: `WorkspaceFoldersServerCapabilities` defined as follows:
-
-```typescript
-export interface WorkspaceFoldersServerCapabilities {
-	/**
-	 * The server has support for workspace folders
-	 */
-	supported?: boolean;
-
-	/**
-	 * Whether the server wants to receive workspace folder
-	 * change notifications.
-	 *
-	 * If a string is provided, the string is treated as an ID
-	 * under which the notification is registered on the client
-	 * side. The ID can be used to unregister for these events
-	 * using the `client/unregisterCapability` request.
-	 */
-	changeNotifications?: string | boolean;
-}
-```
-
-_Request_:
-* method: 'workspace/workspaceFolders'
-* params: none
-
-_Response_:
-* result: `WorkspaceFolder[] | null` defined as follows:
-
-```typescript
-export interface WorkspaceFolder {
-	/**
-	 * The associated URI for this workspace folder.
-	 */
-	uri: DocumentUri;
-
-	/**
-	 * The name of the workspace folder. Used to refer to this
-	 * workspace folder in the user interface.
-	 */
-	name: string;
-}
-```
-* error: code and message set in case an exception happens during the 'workspace/workspaceFolders' request
-
-##### <a href="#workspace_didChangeWorkspaceFolders" name="workspace_didChangeWorkspaceFolders" class="anchor">DidChangeWorkspaceFolders Notification (:arrow_right:)</a>
-
-> *Since version 3.6.0*
-
-> *Correction in 3.16.0*
-
-The spec stated that the notification is sent by default if both _client capability_ `workspace.workspaceFolders` and the _server capability_ `workspace.workspaceFolders.supported` are true. This was incorrect and the correct way is to use the `changeNotification` property defined above which was introduced in 3.6.0 as well.
-
-The `workspace/didChangeWorkspaceFolders` notification is sent from the client to the server to inform the server about workspace folder configuration changes. The notification is sent automatically if the servers signals interest in it using the server capability `workspace.workspaceFolders.changeNotification` or if the server has registered itself to receive this notification. To register for the `workspace/didChangeWorkspaceFolders` send a `client/registerCapability` request from the server to the client. The registration parameter must have a `registrations` item of the following form, where `id` is a unique id used to unregister the capability (the example uses a UUID):
-```ts
-{
-	id: "28c6150c-bd7b-11e7-abc4-cec278b6b50a",
-	method: "workspace/didChangeWorkspaceFolders"
-}
-```
+A notification that should be used by the client to modify the trace setting of the server.
 
 _Notification_:
-* method: 'workspace/didChangeWorkspaceFolders'
-* params: `DidChangeWorkspaceFoldersParams` defined as follows:
+* method: '$/setTrace'
+* params: `SetTraceParams` defined as follows:
 
 ```typescript
-export interface DidChangeWorkspaceFoldersParams {
+interface SetTraceParams {
 	/**
-	 * The actual workspace folder change event.
+	 * The new value that should be assigned to the trace setting.
 	 */
-	event: WorkspaceFoldersChangeEvent;
-}
-
-/**
- * The workspace folder change event.
- */
-export interface WorkspaceFoldersChangeEvent {
-	/**
-	 * The array of added workspace folders
-	 */
-	added: WorkspaceFolder[];
-
-	/**
-	 * The array of the removed workspace folders
-	 */
-	removed: WorkspaceFolder[];
+	value: TraceValue;
 }
 ```
 
-#### <a href="#workspace_didChangeConfiguration" name="workspace_didChangeConfiguration" class="anchor">DidChangeConfiguration Notification (:arrow_right:)</a>
+#### <a href="#logTrace" name="logTrace" class="anchor">LogTrace Notification (:arrow_left:)</a>
 
-A notification sent from the client to the server to signal the change of configuration settings.
+A notification to log the trace of the server's execution.
+The amount and content of these notifications depends on the current `trace` configuration.
+If `trace` is `'off'`, the server should not send any `logTrace` notification.
+If `trace` is `'messages'`, the server should not add the `'verbose'` field in the `LogTraceParams`.
 
-_Client Capability_:
-* property path (optional): `workspace.didChangeConfiguration`
-* property type: `DidChangeConfigurationClientCapabilities` defined as follows:
+`$/logTrace` should be used for systematic trace reporting. For single debugging messages, the server should send [`window/logMessage`](#window_logMessage) notifications.
 
-```typescript
-export interface DidChangeConfigurationClientCapabilities {
-	/**
-	 * Did change configuration notification supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
 
 _Notification_:
-* method: 'workspace/didChangeConfiguration',
-* params: `DidChangeConfigurationParams` defined as follows:
+* method: '$/logTrace'
+* params: `LogTraceParams` defined as follows:
 
 ```typescript
-interface DidChangeConfigurationParams {
+interface LogTraceParams {
 	/**
-	 * The actual changed settings
+	 * The message to be logged.
 	 */
-	settings: any;
+	message: string;
+	/**
+	 * Additional information that can be computed if the `trace` configuration
+	 * is set to `'verbose'`
+	 */
+	verbose?: string;
 }
 ```
 
-#### <a href="#workspace_configuration" name="workspace_configuration" class="anchor">Configuration Request (:arrow_right_hook:)</a>
+#### <a href="#shutdown" name="shutdown" class="anchor">Shutdown Request (:leftwards_arrow_with_hook:)</a>
 
-> *Since version 3.6.0*
+The shutdown request is sent from the client to the server. It asks the server to shut down, but to not exit (otherwise the response might not be delivered correctly to the client). There is a separate exit notification that asks the server to exit. Clients must not send any notifications other than `exit` or requests to a server to which they have sent a shutdown request. Clients should also wait with sending the `exit` notification until they have received a response from the `shutdown` request.
 
-The `workspace/configuration` request is sent from the server to the client to fetch configuration settings from the client. The request can fetch several configuration settings in one roundtrip. The order of the returned configuration settings correspond to the order of the passed `ConfigurationItems` (e.g. the first item in the response is the result for the first configuration item in the params).
-
-A `ConfigurationItem` consists of the configuration section to ask for and an additional scope URI. The configuration section asked for is defined by the server and doesn't necessarily need to correspond to the configuration store used by the client. So a server might ask for a configuration `cpp.formatterOptions` but the client stores the configuration in an XML store layout differently. It is up to the client to do the necessary conversion. If a scope URI is provided the client should return the setting scoped to the provided resource. If the client for example uses [EditorConfig](http://editorconfig.org/) to manage its settings the configuration should be returned for the passed resource URI. If the client can't provide a configuration setting for a given scope then `null` needs to be present in the returned array.
-
-_Client Capability_:
-* property path (optional): `workspace.configuration`
-* property type: `boolean`
+If a server receives requests after a shutdown request those requests should error with `InvalidRequest`.
 
 _Request_:
-* method: 'workspace/configuration'
-* params: `ConfigurationParams` defined as follows
-
-```typescript
-export interface ConfigurationParams {
-	items: ConfigurationItem[];
-}
-
-export interface ConfigurationItem {
-	/**
-	 * The scope to get the configuration section for.
-	 */
-	scopeUri?: DocumentUri;
-
-	/**
-	 * The configuration section asked for.
-	 */
-	section?: string;
-}
-```
+* method: 'shutdown'
+* params: void
 
 _Response_:
-* result: any[]
-* error: code and message set in case an exception happens during the 'workspace/configuration' request
+* result: null
+* error: code and message set in case an exception happens during shutdown request.
 
-#### <a href="#workspace_didChangeWatchedFiles" name="workspace_didChangeWatchedFiles" class="anchor">DidChangeWatchedFiles Notification (:arrow_right:)</a>
+#### <a href="#exit" name="exit" class="anchor">Exit Notification (:arrow_right:)</a>
 
-The watched files notification is sent from the client to the server when the client detects changes to files and folders watched by the language client (note although the name suggest that only file events are sent it is about file system events which include folders as well). It is recommended that servers register for these file system events using the registration mechanism. In former implementations clients pushed file events without the server actively asking for it.
-
-Servers are allowed to run their own file system watching mechanism and not rely on clients to provide file system events. However this is not recommended due to the following reasons:
-
-- to our experience getting file system watching on disk right is challenging, especially if it needs to be supported across multiple OSes.
-- file system watching is not for free especially if the implementation uses some sort of polling and keeps a file system tree in memory to compare time stamps (as for example some node modules do)
-- a client usually starts more than one server. If every server runs its own file system watching it can become a CPU or memory problem.
-- in general there are more server than client implementations. So this problem is better solved on the client side.
-
-_Client Capability_:
-* property path (optional): `workspace.didChangeWatchedFiles`
-* property type: `DidChangeWatchedFilesClientCapabilities` defined as follows:
-
-```typescript
-export interface DidChangeWatchedFilesClientCapabilities {
-	/**
-	 * Did change watched files notification supports dynamic registration.
-	 * Please note that the current protocol doesn't support static
-	 * configuration for file changes from the server side.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
-
-_Registration Options_: `DidChangeWatchedFilesRegistrationOptions` defined as follows:
-```typescript
-/**
- * Describe options to be used when registering for file system change events.
- */
-export interface DidChangeWatchedFilesRegistrationOptions {
-	/**
-	 * The watchers to register.
-	 */
-	watchers: FileSystemWatcher[];
-}
-
-export interface FileSystemWatcher {
-	/**
-	 * The glob pattern to watch.
-	 *
-	 * Glob patterns can have the following syntax:
-	 * - `*` to match one or more characters in a path segment
-	 * - `?` to match on one character in a path segment
-	 * - `**` to match any number of path segments, including none
-	 * - `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}`
-	 *   matches all TypeScript and JavaScript files)
-	 * - `[]` to declare a range of characters to match in a path segment
-	 *   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
-	 * - `[!...]` to negate a range of characters to match in a path segment
-	 *   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not
-	 *   `example.0`)
-	 */
-	globPattern: string;
-
-	/**
-	 * The kind of events of interest. If omitted it defaults
-	 * to WatchKind.Create | WatchKind.Change | WatchKind.Delete
-	 * which is 7.
-	 */
-	kind?: uinteger;
-}
-
-export namespace WatchKind {
-	/**
-	 * Interested in create events.
-	 */
-	export const Create = 1;
-
-	/**
-	 * Interested in change events
-	 */
-	export const Change = 2;
-
-	/**
-	 * Interested in delete events
-	 */
-	export const Delete = 4;
-}
-```
+A notification to ask the server to exit its process.
+The server should exit with `success` code 0 if the shutdown request has been received before; otherwise with `error` code 1.
 
 _Notification_:
-* method: 'workspace/didChangeWatchedFiles'
-* params: `DidChangeWatchedFilesParams` defined as follows:
+* method: 'exit'
+* params: void
 
-```typescript
-interface DidChangeWatchedFilesParams {
-	/**
-	 * The actual file events.
-	 */
-	changes: FileEvent[];
-}
-```
 
-Where FileEvents are described as follows:
+### <a href="#textDocument_synchronization" name="textDocument_synchronization" class="anchor">Text Document Synchronization</a>
 
-```typescript
-/**
- * An event describing a file change.
- */
-interface FileEvent {
-	/**
-	 * The file's URI.
-	 */
-	uri: DocumentUri;
-	/**
-	 * The change type.
-	 */
-	type: uinteger;
-}
-
-/**
- * The file event type.
- */
-export namespace FileChangeType {
-	/**
-	 * The file got created.
-	 */
-	export const Created = 1;
-	/**
-	 * The file got changed.
-	 */
-	export const Changed = 2;
-	/**
-	 * The file got deleted.
-	 */
-	export const Deleted = 3;
-}
-```
-
-#### <a href="#workspace_symbol" name="workspace_symbol" class="anchor">Workspace Symbols Request (:leftwards_arrow_with_hook:)</a>
-
-The workspace symbol request is sent from the client to the server to list project-wide symbols matching the query string.
-
-_Client Capability_:
-* property path (optional): `workspace.symbol`
-* property type: `WorkspaceSymbolClientCapabilities` defined as follows:
-
-```typescript
-interface WorkspaceSymbolClientCapabilities {
-	/**
-	 * Symbol request supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * Specific capabilities for the `SymbolKind` in the `workspace/symbol`
-	 * request.
-	 */
-	symbolKind?: {
-		/**
-		 * The symbol 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.
-		 *
-		 * If this property is not present the client only supports
-		 * the symbol kinds from `File` to `Array` as defined in
-		 * the initial version of the protocol.
-		 */
-		valueSet?: SymbolKind[];
-	};
-
-	/**
-	 * The client supports tags on `SymbolInformation`.
-	 * Clients supporting tags have to handle unknown tags gracefully.
-	 *
-	 * @since 3.16.0
-	 */
-	tagSupport?: {
-		/**
-		 * The tags supported by the client.
-		 */
-		valueSet: SymbolTag[];
-	};
-}
-```
-
-_Server Capability_:
-* property path (optional): `workspaceSymbolProvider`
-* property type: `boolean | WorkspaceSymbolOptions` where `WorkspaceSymbolOptions` is defined as follows:
-
-```typescript
-export interface WorkspaceSymbolOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `WorkspaceSymbolRegistrationOptions` defined as follows:
-```typescript
-export interface WorkspaceSymbolRegistrationOptions
-	extends WorkspaceSymbolOptions {
-}
-```
-
-_Request_:
-* method: 'workspace/symbol'
-* params: `WorkspaceSymbolParams` defined as follows:
-
-```typescript
-/**
- * The parameters of a Workspace Symbol Request.
- */
-interface WorkspaceSymbolParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * A query string to filter symbols by. Clients may send an empty
-	 * string here to request all symbols.
-	 */
-	query: string;
-}
-```
-
-_Response_:
-* result: `SymbolInformation[]` \| `null` as defined above.
-* partial result: `SymbolInformation[]` as defined above.
-* error: code and message set in case an exception happens during the workspace symbol request.
-
-#### <a href="#workspace_executeCommand" name="workspace_executeCommand" class="anchor">Execute a command (:leftwards_arrow_with_hook:)</a>
-
-The `workspace/executeCommand` request is sent from the client to the server to trigger command execution on the server. In most cases the server creates a `WorkspaceEdit` structure and applies the changes to the workspace using the request `workspace/applyEdit` which is sent from the server to the client.
-
-_Client Capability_:
-* property path (optional): `workspace.executeCommand`
-* property type: `ExecuteCommandClientCapabilities` defined as follows:
-
-```typescript
-export interface ExecuteCommandClientCapabilities {
-	/**
-	 * Execute command supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
-
-_Server Capability_:
-* property path (optional): `executeCommandProvider`
-* property type: `ExecuteCommandOptions` defined as follows:
-
-```typescript
-export interface ExecuteCommandOptions extends WorkDoneProgressOptions {
-	/**
-	 * The commands to be executed on the server
-	 */
-	commands: string[];
-}
-```
-
-_Registration Options_: `ExecuteCommandRegistrationOptions` defined as follows:
-```typescript
-/**
- * Execute command registration options.
- */
-export interface ExecuteCommandRegistrationOptions
-	extends ExecuteCommandOptions {
-}
-```
-
-_Request_:
-* method: 'workspace/executeCommand'
-* params: `ExecuteCommandParams` defined as follows:
-
-```typescript
-export interface ExecuteCommandParams extends WorkDoneProgressParams {
-
-	/**
-	 * The identifier of the actual command handler.
-	 */
-	command: string;
-	/**
-	 * Arguments that the command should be invoked with.
-	 */
-	arguments?: any[];
-}
-```
-
-The arguments are typically specified when a command is returned from the server to the client. Example requests that return a command are `textDocument/codeAction` or `textDocument/codeLens`.
-
-_Response_:
-* result: `any` \| `null`
-* error: code and message set in case an exception happens during the request.
-
-#### <a href="#workspace_applyEdit" name="workspace_applyEdit" class="anchor">Applies a WorkspaceEdit (:arrow_right_hook:)</a>
-
-The `workspace/applyEdit` request is sent from the server to the client to modify resource on the client side.
-
-_Client Capability_:
-* property path (optional): `workspace.applyEdit`
-* property type: `boolean`
-
-See also the [WorkspaceEditClientCapabilities](#workspaceEditClientCapabilities) for the supported capabilities of a workspace edit.
-
-_Request_:
-* method: 'workspace/applyEdit'
-* params: `ApplyWorkspaceEditParams` defined as follows:
-
-```typescript
-export interface ApplyWorkspaceEditParams {
-	/**
-	 * An optional label of the workspace edit. This label is
-	 * presented in the user interface for example on an undo
-	 * stack to undo the workspace edit.
-	 */
-	label?: string;
-
-	/**
-	 * The edits to apply.
-	 */
-	edit: WorkspaceEdit;
-}
-```
-
-_Response_:
-* result: `ApplyWorkspaceEditResponse` defined as follows:
-
-```typescript
-export interface ApplyWorkspaceEditResponse {
-	/**
-	 * Indicates whether the edit was applied or not.
-	 */
-	applied: boolean;
-
-	/**
-	 * An optional textual description for why the edit was not applied.
-	 * This may be used by the server for diagnostic logging or to provide
-	 * a suitable error for a request that triggered the edit.
-	 */
-	failureReason?: string;
-
-	/**
-	 * Depending on the client's failure handling strategy `failedChange`
-	 * might contain the index of the change that failed. This property is
-	 * only available if the client signals a `failureHandling` strategy
-	 * in its client capabilities.
-	 */
-	failedChange?: uinteger;
-}
-```
-* error: code and message set in case an exception happens during the request.
-
-#### <a href="#workspace_willCreateFiles" name="workspace_willCreateFiles" class="anchor">WillCreateFiles Request (:leftwards_arrow_with_hook:)</a>
-
-The will create files request is sent from the client to the server before files are actually created as long as the creation is triggered from within the client either by a user action or by applying a workspace edit. The request can return a WorkspaceEdit which will be applied to workspace before the files are created. Please note that clients might drop results if computing the edit took too long or if a server constantly fails on this request. This is done to keep creates fast and reliable.
-
-_Client Capability_:
-* property name (optional): `workspace.fileOperations.willCreate`
-* property type: `boolean`
-
-The capability indicates that the client supports sending `workspace/willCreateFiles` requests.
-
-_Server Capability_:
-* property name (optional): `workspace.fileOperations.willCreate`
-* property type: `FileOperationRegistrationOptions` where `FileOperationRegistrationOptions` is defined as follows:
-
-```typescript
-/**
- * The options to register for file operations.
- *
- * @since 3.16.0
- */
-interface FileOperationRegistrationOptions {
-	/**
-	 * The actual filters.
-	 */
-	filters: FileOperationFilter[];
-}
-
-/**
- * A pattern kind describing if a glob pattern matches a file a folder or
- * both.
- *
- * @since 3.16.0
- */
-export namespace FileOperationPatternKind {
-	/**
-	 * The pattern matches a file only.
-	 */
-	export const file: 'file' = 'file';
-
-	/**
-	 * The pattern matches a folder only.
-	 */
-	export const folder: 'folder' = 'folder';
-}
-
-export type FileOperationPatternKind = 'file' | 'folder';
-
-/**
- * Matching options for the file operation pattern.
- *
- * @since 3.16.0
- */
-export interface FileOperationPatternOptions {
-
-	/**
-	 * The pattern should be matched ignoring casing.
-	 */
-	ignoreCase?: boolean;
-}
-
-/**
- * A pattern to describe in which file operation requests or notifications
- * the server is interested in.
- *
- * @since 3.16.0
- */
-interface FileOperationPattern {
-	/**
-	 * The glob pattern to match. Glob patterns can have the following syntax:
-	 * - `*` to match one or more characters in a path segment
-	 * - `?` to match on one character in a path segment
-	 * - `**` to match any number of path segments, including none
-	 * - `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}`
-	 *   matches all TypeScript and JavaScript files)
-	 * - `[]` to declare a range of characters to match in a path segment
-	 *   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
-	 * - `[!...]` to negate a range of characters to match in a path segment
-	 *   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
-	 *   not `example.0`)
-	 */
-	glob: string;
-
-	/**
-	 * Whether to match files or folders with this pattern.
-	 *
-	 * Matches both if undefined.
-	 */
-	matches?: FileOperationPatternKind;
-
-	/**
-	 * Additional options used during matching.
-	 */
-	options?: FileOperationPatternOptions;
-}
-
-/**
- * A filter to describe in which file operation requests or notifications
- * the server is interested in.
- *
- * @since 3.16.0
- */
-export interface FileOperationFilter {
-
-	/**
-	 * A Uri like `file` or `untitled`.
-	 */
-	scheme?: string;
-
-	/**
-	 * The actual file operation pattern.
-	 */
-	pattern: FileOperationPattern;
-}
-```
-
-The capability indicates that the server is interested in receiving `workspace/willCreateFiles` requests.
-
-_Registration Options_: none
-
-_Request_:
-* method: 'workspace/willCreateFiles'
-* params: `CreateFilesParams` defined as follows:
-
-```typescript
-/**
- * The parameters sent in notifications/requests for user-initiated creation
- * of files.
- *
- * @since 3.16.0
- */
-export interface CreateFilesParams {
-
-	/**
-	 * An array of all files/folders created in this operation.
-	 */
-	files: FileCreate[];
-}
-/**
- * Represents information on a file/folder create.
- *
- * @since 3.16.0
- */
-export interface FileCreate {
-
-	/**
-	 * A file:// URI for the location of the file/folder being created.
-	 */
-	uri: string;
-}
-```
-
-_Response_:
-* result:`WorkspaceEdit` \| `null`
-* error: code and message set in case an exception happens during the `willCreateFiles` request.
-
-#### <a href="#workspace_didCreateFiles" name="workspace_didCreateFiles" class="anchor">DidCreateFiles Notification (:arrow_right:)</a>
-
-The did create files notification is sent from the client to the server when files were created from within the client.
-
-_Client Capability_:
-* property name (optional): `workspace.fileOperations.didCreate`
-* property type: `boolean`
-
-The capability indicates that the client supports sending `workspace/didCreateFiles` notifications.
-
-_Server Capability_:
-* property name (optional): `workspace.fileOperations.didCreate`
-* property type: `FileOperationRegistrationOptions`
-
-The capability indicates that the server is interested in receiving `workspace/didCreateFiles` notifications.
-
-_Notification_:
-* method: 'workspace/didCreateFiles'
-* params: `CreateFilesParams`
-
-#### <a href="#workspace_willRenameFiles" name="workspace_willRenameFiles" class="anchor">WillRenameFiles Request (:leftwards_arrow_with_hook:)</a>
-
-The will rename files request is sent from the client to the server before files are actually renamed as long as the rename is triggered from within the client either by a user action or by applying a workspace edit. The request can return a WorkspaceEdit which will be applied to workspace before the files are renamed. Please note that clients might drop results if computing the edit took too long or if a server constantly fails on this request. This is done to keep renames fast and reliable.
-
-_Client Capability_:
-* property name (optional): `workspace.fileOperations.willRename`
-* property type: `boolean`
-
-The capability indicates that the client supports sending `workspace/willRenameFiles` requests.
-
-_Server Capability_:
-* property name (optional): `workspace.fileOperations.willRename`
-* property type: `FileOperationRegistrationOptions`
-
-The capability indicates that the server is interested in receiving `workspace/willRenameFiles` requests.
-
-_Registration Options_: none
-
-_Request_:
-* method: 'workspace/willRenameFiles'
-* params: `RenameFilesParams` defined as follows:
-
-```typescript
-/**
- * The parameters sent in notifications/requests for user-initiated renames
- * of files.
- *
- * @since 3.16.0
- */
-export interface RenameFilesParams {
-
-	/**
-	 * An array of all files/folders renamed in this operation. When a folder
-	 * is renamed, only the folder will be included, and not its children.
-	 */
-	files: FileRename[];
-}
-/**
- * Represents information on a file/folder rename.
- *
- * @since 3.16.0
- */
-export interface FileRename {
-
-	/**
-	 * A file:// URI for the original location of the file/folder being renamed.
-	 */
-	oldUri: string;
-
-	/**
-	 * A file:// URI for the new location of the file/folder being renamed.
-	 */
-	newUri: string;
-}
-```
-
-_Response_:
-* result:`WorkspaceEdit` \| `null`
-* error: code and message set in case an exception happens during the `willRenameFiles` request.
-
-#### <a href="#workspace_didRenameFiles" name="workspace_didRenameFiles" class="anchor">DidRenameFiles Notification (:arrow_right:)</a>
-
-The did rename files notification is sent from the client to the server when files were renamed from within the client.
-
-_Client Capability_:
-* property name (optional): `workspace.fileOperations.didRename`
-* property type: `boolean`
-
-The capability indicates that the client supports sending `workspace/didRenameFiles` notifications.
-
-_Server Capability_:
-* property name (optional): `workspace.fileOperations.didRename`
-* property type: `FileOperationRegistrationOptions`
-
-The capability indicates that the server is interested in receiving `workspace/didRenameFiles` notifications.
-
-_Notification_:
-* method: 'workspace/didRenameFiles'
-* params: `RenameFilesParams`
-
-#### <a href="#workspace_willDeleteFiles" name="workspace_willDeleteFiles" class="anchor">WillDeleteFiles Request (:leftwards_arrow_with_hook:)</a>
-
-The will delete files request is sent from the client to the server before files are actually deleted as long as the deletion is triggered from within the client either by a user action or by applying a workspace edit. The request can return a WorkspaceEdit which will be applied to workspace before the files are deleted. Please note that clients might drop results if computing the edit took too long or if a server constantly fails on this request. This is done to keep deletes fast and reliable.
-
-_Client Capability_:
-* property name (optional): `workspace.fileOperations.willDelete`
-* property type: `boolean`
-
-The capability indicates that the client supports sending `workspace/willDeleteFiles` requests.
-
-_Server Capability_:
-* property name (optional): `workspace.fileOperations.willDelete`
-* property type: `FileOperationRegistrationOptions`
-
-The capability indicates that the server is interested in receiving `workspace/willDeleteFiles` requests.
-
-_Registration Options_: none
-
-_Request_:
-* method: 'workspace/willDeleteFiles'
-* params: `DeleteFilesParams` defined as follows:
-
-```typescript
-/**
- * The parameters sent in notifications/requests for user-initiated deletes
- * of files.
- *
- * @since 3.16.0
- */
-export interface DeleteFilesParams {
-
-	/**
-	 * An array of all files/folders deleted in this operation.
-	 */
-	files: FileDelete[];
-}
-/**
- * Represents information on a file/folder delete.
- *
- * @since 3.16.0
- */
-export interface FileDelete {
-
-	/**
-	 * A file:// URI for the location of the file/folder being deleted.
-	 */
-	uri: string;
-}
-```
-
-_Response_:
-* result:`WorkspaceEdit` \| `null`
-* error: code and message set in case an exception happens during the `willDeleteFiles` request.
-
-#### <a href="#workspace_didDeleteFiles" name="workspace_didDeleteFiles" class="anchor">DidDeleteFiles Notification (:arrow_right:)</a>
-
-The did delete files notification is sent from the client to the server when files were deleted from within the client.
-
-_Client Capability_:
-* property name (optional): `workspace.fileOperations.didDelete`
-* property type: `boolean`
-
-The capability indicates that the client supports sending `workspace/didDeleteFiles` notifications.
-
-_Server Capability_:
-* property name (optional): `workspace.fileOperations.didDelete`
-* property type: `FileOperationRegistrationOptions`
-
-The capability indicates that the server is interested in receiving `workspace/didDeleteFiles` notifications.
-
-_Notification_:
-* method: 'workspace/didDeleteFiles'
-* params: `DeleteFilesParams`
-
-#### <a href="#textDocument_synchronization" name="textDocument_synchronization" class="anchor">Text Document Synchronization</a>
-
-Client support for `textDocument/didOpen`, `textDocument/didChange` and `textDocument/didClose` notifications is mandatory in the protocol and clients can not opt out supporting them. This includes both full and incremental synchronization in the `textDocument/didChange` notification. In addition a server must either implement all three of them or none. Their capabilities are therefore controlled via a combined client and server capability.
+Client support for `textDocument/didOpen`, `textDocument/didChange` and `textDocument/didClose` notifications is mandatory in the protocol and clients can not opt out supporting them. This includes both full and incremental synchronization in the `textDocument/didChange` notification. In addition a server must either implement all three of them or none. Their capabilities are therefore controlled via a combined client and server capability. Opting out of text document synchronization makes only sense if the documents shown by the client are read only. Otherwise the server might receive request for documents, for which the content is managed in the client (e.g. they might have changed).
 
 <a href="#textDocument_synchronization_cc" name="textDocument_synchronization_cc" class="anchor">_Client Capability_:</a>
 * property path (optional): `textDocument.synchronization.dynamicRegistration`
@@ -3769,6 +3087,8 @@
 * property path (optional): `textDocumentSync`
 * property type: `TextDocumentSyncKind | TextDocumentSyncOptions`. The below definition of the `TextDocumentSyncOptions` only covers the properties specific to the open, change and close notifications. A complete definition covering all properties can be found [here](#textDocument_didClose):
 
+<div class="anchorHolder"><a href="#textDocumentSyncKind" name="textDocumentSyncKind" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Defines how the host (editor) should sync document changes to the language
@@ -3793,7 +3113,11 @@
 	 */
 	export const Incremental = 2;
 }
+```
 
+<div class="anchorHolder"><a href="#textDocumentSyncOptions" name="textDocumentSyncOptions" class="linkableAnchor"></a></div>
+
+```typescript
 export interface TextDocumentSyncOptions {
 	/**
 	 * Open and close notifications are sent to the server. If omitted open
@@ -3829,6 +3153,8 @@
 * method: 'textDocument/didOpen'
 * params: `DidOpenTextDocumentParams` defined as follows:
 
+<div class="anchorHolder"><a href="#didOpenTextDocumentParams" name="didOpenTextDocumentParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface DidOpenTextDocumentParams {
 	/**
@@ -3837,7 +3163,6 @@
 	textDocument: TextDocumentItem;
 }
 ```
-
 #### <a href="#textDocument_didChange" name="textDocument_didChange" class="anchor">DidChangeTextDocument Notification (:arrow_right:)</a>
 
 The document change notification is sent from the client to the server to signal changes to a text document. Before a client can change a text document it must claim ownership of its content using the `textDocument/didOpen` notification. In 2.0 the shape of the params has changed to include proper version numbers.
@@ -3849,6 +3174,9 @@
 See general synchronization [server capabilities](#textDocument_synchronization_sc).
 
 _Registration Options_: `TextDocumentChangeRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#textDocumentChangeRegistrationOptions" name="textDocumentChangeRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Describe options to be used when registering for text document change events.
@@ -3864,9 +3192,11 @@
 ```
 
 _Notification_:
-* method: 'textDocument/didChange'
+* method: `textDocument/didChange`
 * params: `DidChangeTextDocumentParams` defined as follows:
 
+<div class="anchorHolder"><a href="#didChangeTextDocumentParams" name="didChangeTextDocumentParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface DidChangeTextDocumentParams {
 	/**
@@ -3893,10 +3223,14 @@
 	 */
 	contentChanges: TextDocumentContentChangeEvent[];
 }
+```
 
+<div class="anchorHolder"><a href="#textDocumentContentChangeEvent" name="textDocumentContentChangeEvent" class="linkableAnchor"></a></div>
+
+```typescript
 /**
- * An event describing a change to a text document. If range and rangeLength are
- * omitted the new text is considered to be the full content of the document.
+ * An event describing a change to a text document. If only a text is provided
+ * it is considered to be the full content of the document.
  */
 export type TextDocumentContentChangeEvent = {
 	/**
@@ -3925,7 +3259,7 @@
 
 #### <a href="#textDocument_willSave" name="textDocument_willSave" class="anchor">WillSaveTextDocument Notification (:arrow_right:)</a>
 
-The document will save notification is sent from the client to the server before the document is actually saved.
+The document will save notification is sent from the client to the server before the document is actually saved. If a server has registered for open / close events clients should ensure that the document is open before a `willSave` notification is sent since clients can't change the content of a file without ownership transferal.
 
 _Client Capability_:
 * property name (optional): `textDocument.synchronization.willSave`
@@ -3945,6 +3279,8 @@
 * method: 'textDocument/willSave'
 * params: `WillSaveTextDocumentParams` defined as follows:
 
+<div class="anchorHolder"><a href="#willSaveTextDocumentParams" name="willSaveTextDocumentParams" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * The parameters send in a will save text document notification.
@@ -3960,7 +3296,11 @@
 	 */
 	reason: TextDocumentSaveReason;
 }
+```
 
+<div class="anchorHolder"><a href="#textDocumentSaveReason" name="textDocumentSaveReason" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Represents reasons why a text document is saved.
  */
@@ -3988,7 +3328,7 @@
 
 #### <a href="#textDocument_willSaveWaitUntil" name="textDocument_willSaveWaitUntil" class="anchor">WillSaveWaitUntilTextDocument Request (:leftwards_arrow_with_hook:)</a>
 
-The document will save request is sent from the client to the server before the document is actually saved. The request can return an array of TextEdits which will be applied to the text document before it is saved. Please note that clients might drop results if computing the text edits took too long or if a server constantly fails on this request. This is done to keep the save fast and reliable.
+The document will save request is sent from the client to the server before the document is actually saved. The request can return an array of TextEdits which will be applied to the text document before it is saved. Please note that clients might drop results if computing the text edits took too long or if a server constantly fails on this request. This is done to keep the save fast and reliable.  If a server has registered for open / close events clients should ensure that the document is open before a `willSaveWaitUntil` notification is sent since clients can't change the content of a file without ownership transferal.
 
 _Client Capability_:
 * property name (optional): `textDocument.synchronization.willSaveWaitUntil`
@@ -4005,12 +3345,12 @@
 _Registration Options_: `TextDocumentRegistrationOptions`
 
 _Request_:
-* method: 'textDocument/willSaveWaitUntil'
+* method: `textDocument/willSaveWaitUntil`
 * params: `WillSaveTextDocumentParams`
 
 _Response_:
 * result:[`TextEdit[]`](#textEdit) \| `null`
-* error: code and message set in case an exception happens during the `willSaveWaitUntil` request.
+* error: code and message set in case an exception happens during the `textDocument/willSaveWaitUntil` request.
 
 #### <a href="#textDocument_didSave" name="textDocument_didSave" class="anchor">DidSaveTextDocument Notification (:arrow_right:)</a>
 
@@ -4026,6 +3366,8 @@
 * property name (optional): `textDocumentSync.save`
 * property type: `boolean | SaveOptions` where `SaveOptions` is defined as follows:
 
+<div class="anchorHolder"><a href="#saveOptions" name="saveOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface SaveOptions {
 	/**
@@ -4038,6 +3380,9 @@
 The capability indicates that the server is interested in `textDocument/didSave` notifications.
 
 _Registration Options_: `TextDocumentSaveRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#textDocumentSaveRegistrationOptions" name="textDocumentSaveRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface TextDocumentSaveRegistrationOptions
 	extends TextDocumentRegistrationOptions {
@@ -4049,9 +3394,11 @@
 ```
 
 _Notification_:
-* method: 'textDocument/didSave'
+* method: `textDocument/didSave`
 * params: `DidSaveTextDocumentParams` defined as follows:
 
+<div class="anchorHolder"><a href="#didSaveTextDocumentParams" name="didSaveTextDocumentParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface DidSaveTextDocumentParams {
 	/**
@@ -4080,9 +3427,11 @@
 _Registration Options_: `TextDocumentRegistrationOptions`
 
 _Notification_:
-* method: 'textDocument/didClose'
+* method: `textDocument/didClose`
 * params: `DidCloseTextDocumentParams` defined as follows:
 
+<div class="anchorHolder"><a href="#didCloseTextDocumentParams" name="didCloseTextDocumentParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface DidCloseTextDocumentParams {
 	/**
@@ -4091,9 +3440,17 @@
 	textDocument: TextDocumentIdentifier;
 }
 ```
+#### <a href="#textDocument_didRename" name="textDocument_didRename" class="anchor">Renaming a document</a>
+
+Document renames should be signaled to a server sending a document close notification with the document's old name followed by a open notification using the document's new name. Major reason is that besides the name other attributes can change as well like the language that is associated with the document. In addition the new document could not be of interest for the server anymore.
+
+Servers can participate in a document rename by subscribing for the [`workspace/didRenameFiles`](#workspace_didRenameFiles) notification or the [`workspace/willRenameFiles`](#workspace_willRenameFiles) request.
+
 
 The final structure of the `TextDocumentSyncClientCapabilities` and the `TextDocumentSyncOptions` server options look like this
 
+<div class="anchorHolder"><a href="#textDocumentSyncClientCapabilities" name="textDocumentSyncClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface TextDocumentSyncClientCapabilities {
 	/**
@@ -4118,7 +3475,11 @@
 	 */
 	didSave?: boolean;
 }
+```
 
+<div class="anchorHolder"><a href="#textDocumentSyncKind" name="textDocumentSyncKind" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Defines how the host (editor) should sync document changes to the language
  * server.
@@ -4144,7 +3505,11 @@
 }
 
 export type TextDocumentSyncKind = 0 | 1 | 2;
+```
 
+<div class="anchorHolder"><a href="#textDocumentSyncOptions" name="textDocumentSyncOptions" class="linkableAnchor"></a></div>
+
+```typescript
 export interface TextDocumentSyncOptions {
 	/**
 	 * Open and close notifications are sent to the server. If omitted open
@@ -4176,104 +3541,3702 @@
 }
 ```
 
-#### <a href="#textDocument_publishDiagnostics" name="textDocument_publishDiagnostics" class="anchor">PublishDiagnostics Notification (:arrow_left:)</a>
+### <a href="#notebookDocument_synchronization" name="notebookDocument_synchronization" class="anchor">Notebook Document Synchronization</a>
 
-Diagnostics notification are sent from the server to the client to signal results of validation runs.
+Notebooks are becoming more and more popular. Adding support for them to the language server protocol allows notebook editors to reused language smarts provided by the server inside a notebook or a notebook cell, respectively. To reuse protocol parts and therefore server implementations notebooks are modeled in the following way in LSP:
 
-Diagnostics are "owned" by the server so it is the server's responsibility to clear them if necessary. The following rule is used for VS Code servers that generate diagnostics:
+- *notebook document*: a collection of notebook cells typically stored in a file on disk. A notebook document has a type and can be uniquely identified using a resource URI.
+- *notebook cell*: holds the actual text content. Cells have a kind (either code or markdown). The actual text content of the cell is stored in a text document which can be synced to the server like all other text documents. Cell text documents have an URI however servers should not rely on any format for this URI since it is up to the client on how it will create these URIs. The URIs must be unique across ALL notebook cells and can therefore be used to uniquely identify a notebook cell or the cell's text document.
 
-* if a language is single file only (for example HTML) then diagnostics are cleared by the server when the file is closed. Please note that open / close events don't necessarily reflect what the user sees in the user interface. These events are ownership events. So with the current version of the specification it is possible that problems are not cleared although the file is not visible in the user interface since the client has not closed the file yet.
-* if a language has a project system (for example C#) diagnostics are not cleared when a file closes. When a project is opened all diagnostics for all files are recomputed (or read from a cache).
+The two concepts are defined as follows:
 
-When a file changes it is the server's responsibility to re-compute diagnostics and push them to the client. If the computed set is empty it has to push the empty array to clear former diagnostics. Newly pushed diagnostics always replace previously pushed diagnostics. There is no merging that happens on the client side.
-
-See also the [Diagnostic](#diagnostic) section.
-
-_Client Capability_:
-* property name (optional): `textDocument.publishDiagnostics`
-* property type: `PublishDiagnosticsClientCapabilities` defined as follows:
+<div class="anchorHolder"><a href="#notebookDocument" name="notebookDocument" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface PublishDiagnosticsClientCapabilities {
-	/**
-	 * Whether the clients accepts diagnostics with related information.
-	 */
-	relatedInformation?: boolean;
+/**
+ * A notebook document.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookDocument {
 
 	/**
-	 * Client supports the tag property to provide meta data about a diagnostic.
-	 * Clients supporting tags have to handle unknown tags gracefully.
+	 * The notebook document's uri.
+	 */
+	uri: URI;
+
+	/**
+	 * The type of the notebook.
+	 */
+	notebookType: string;
+
+	/**
+	 * The version number of this document (it will increase after each
+	 * change, including undo/redo).
+	 */
+	version: integer;
+
+	/**
+	 * Additional metadata stored with the notebook
+	 * document.
+	 */
+	metadata?: LSPObject;
+
+	/**
+	 * The cells of a notebook.
+	 */
+	cells: NotebookCell[];
+}
+```
+
+<div class="anchorHolder"><a href="#notebookCell" name="notebookCell" class="linkableAnchor"></a></div>
+
+
+```typescript
+/**
+ * A notebook cell.
+ *
+ * A cell's document URI must be unique across ALL notebook
+ * cells and can therefore be used to uniquely identify a
+ * notebook cell or the cell's text document.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookCell {
+
+	/**
+	 * The cell's kind
+	 */
+	kind: NotebookCellKind;
+
+	/**
+	 * The URI of the cell's text document
+	 * content.
+	 */
+	document: DocumentUri;
+
+	/**
+	 * Additional metadata stored with the cell.
+	 */
+	metadata?: LSPObject;
+
+	/**
+	 * Additional execution summary information
+	 * if supported by the client.
+	 */
+	executionSummary?: ExecutionSummary;
+}
+```
+
+<div class="anchorHolder"><a href="#notebookCellKind" name="notebookCellKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A notebook cell kind.
+ *
+ * @since 3.17.0
+ */
+export namespace NotebookCellKind {
+
+	/**
+     * A markup-cell is formatted source that is used for display.
+     */
+	export const Markup: 1 = 1;
+
+	/**
+     * A code-cell is source code.
+     */
+	export const Code: 2 = 2;
+}
+```
+
+<div class="anchorHolder"><a href="#executionSummary" name="executionSummary" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ExecutionSummary {
+	/**
+	 * A strict monotonically increasing value
+	 * indicating the execution order of a cell
+	 * inside a notebook.
+	 */
+	executionOrder: uinteger;
+
+	/**
+	 * Whether the execution was successful or
+	 * not if known by the client.
+	 */
+	success?: boolean;
+}
+```
+
+Next we describe how notebooks, notebook cells and the content of a notebook cell should be synchronized to a language server.
+
+Syncing the text content of a cell is relatively easy since clients should model them as text documents. However since the URI of a notebook cell's text document should be opaque, servers can not know its scheme nor its path. However what is know is the notebook document itself. We therefore introduce a special filter for notebook cell documents:
+
+<div class="anchorHolder"><a href="#notebookCellTextDocumentFilter" name="notebookCellTextDocumentFilter" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A notebook cell text document filter denotes a cell text
+ * document by different properties.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookCellTextDocumentFilter {
+	/**
+	 * A filter that matches against the notebook
+	 * containing the notebook cell. If a string
+	 * value is provided it matches against the
+	 * notebook type. '*' matches every notebook.
+	 */
+	notebook: string | NotebookDocumentFilter;
+
+	/**
+	 * A language id like `python`.
+	 *
+	 * Will be matched against the language id of the
+	 * notebook cell document. '*' matches every language.
+	 */
+	language?: string;
+}
+```
+
+<div class="anchorHolder"><a href="#notebookDocumentFilter" name="notebookDocumentFilter" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A notebook document filter denotes a notebook document by
+ * different properties.
+ *
+ * @since 3.17.0
+ */
+export type NotebookDocumentFilter = {
+	/** The type of the enclosing notebook. */
+	notebookType: string;
+
+	/** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */
+	scheme?: string;
+
+	/** A glob pattern. */
+	pattern?: string;
+} | {
+	/** The type of the enclosing notebook. */
+	notebookType?: string;
+
+	/** A Uri [scheme](#Uri.scheme), like `file` or `untitled`.*/
+	scheme: string;
+
+	/** A glob pattern. */
+	pattern?: string;
+} | {
+	/** The type of the enclosing notebook. */
+	notebookType?: string;
+
+	/** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */
+	scheme?: string;
+
+	/** A glob pattern. */
+	pattern: string;
+};
+```
+
+Given these structures a Python cell document in a Jupyter notebook stored on disk in a folder having `books1` in its path can be identified as follows;
+
+```typescript
+{
+	notebook: {
+		scheme: 'file',
+		pattern '**/books1/**',
+		notebookType: 'jupyter-notebook'
+	},
+	language: 'python'
+}
+```
+
+A `NotebookCellTextDocumentFilter` can be used to register providers for certain requests like code complete or hover. If such a provider is registered the client will send the corresponding `textDocument/*` requests to the server using the cell text document's URI as the document URI.
+
+There are cases where simply only knowing about a cell's text content is not enough for a server to reason about the cells content and to provide good language smarts. Sometimes it is necessary to know all cells of a notebook document including the notebook document itself. Consider a notebook that has two JavaScript cells with the following content
+
+Cell one:
+
+```javascript
+function add(a, b) {
+	return a + b;
+}
+```
+
+Cell two:
+
+```javascript
+add/*<cursor>*/;
+```
+Requesting code assist in cell two at the marked cursor position should propose the function `add` which is only possible if the server knows about cell one and cell two and knows that they belong to the same notebook document.
+
+The protocol will therefore support two modes when it comes to synchronizing cell text content:
+
+* _cellContent_: in this mode only the cell text content is synchronized to the server using the standard `textDocument/did*` notification. No notebook document and no cell structure is synchronized. This mode allows for easy adoption of notebooks since servers can reuse most of it implementation logic.
+* _notebook_: in this mode the notebook document, the notebook cells and the notebook cell text content is synchronized to the server. To allow servers to create a consistent picture of a notebook document the cell text content is NOT synchronized using the standard `textDocument/did*` notifications. It is instead synchronized using special `notebook/did*` notifications. This ensures that the cell and its text content arrives on the server using one open, change or close event.
+
+To request the cell content only a normal document selector can be used. For example the selector `[{ language: 'python' }]` will synchronize Python notebook document cells to the server. However since this might synchronize unwanted documents as well a document filter can also be a `NotebookCellTextDocumentFilter`. So `{ notebook: { scheme: 'file', notebookType: 'jupyter-notebook' }, language: 'python' }` synchronizes all Python cells in a Jupyter notebook stored on disk.
+
+To synchronize the whole notebook document a server provides a `notebookDocumentSync` in its server capabilities. For example:
+
+```typescript
+{
+	notebookDocumentSync: {
+		notebookSelector: {
+			notebook: { scheme: 'file', notebookType: 'jupyter-notebook' },
+			cells: [{ language: 'python' }]
+		}
+	}
+}
+```
+Synchronizes the notebook including all Python cells to the server if the notebook is stored on disk.
+
+_Client Capability_:
+
+The following client capabilities are defined for notebook documents:
+
+* property name (optional): `notebookDocument.synchronization`
+* property type: `NotebookDocumentSyncClientCapabilities` defined as follows
+
+<div class="anchorHolder"><a href="#notebookDocumentSyncClientCapabilities" name="notebookDocumentSyncClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Notebook specific client capabilities.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookDocumentSyncClientCapabilities {
+
+	/**
+	 * Whether implementation supports dynamic registration. If this is
+	 * set to `true` the client supports the new
+	 * `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+	 * return value for the corresponding server capability as well.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+
+The following server capabilities are defined for notebook documents:
+
+* property name (optional): `notebookDocumentSync`
+* property type: `NotebookDocumentOptions | NotebookDocumentRegistrationOptions` where `NotebookDocumentOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#notebookDocumentSyncOptions" name="notebookDocumentSyncOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Options specific to a notebook plus its cells
+ * to be synced to the server.
+ *
+ * If a selector provider a notebook document
+ * filter but no cell selector all cells of a
+ * matching notebook document will be synced.
+ *
+ * If a selector provides no notebook document
+ * filter but only a cell selector all notebook
+ * document that contain at least one matching
+ * cell will be synced.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookDocumentSyncOptions {
+	/**
+	 * The notebooks to be synced
+	 */
+	notebookSelector: ({
+		/**
+		 * The notebook to be synced If a string
+	 	 * value is provided it matches against the
+	     * notebook type. '*' matches every notebook.
+		 */
+		notebookDocument: string | NotebookDocumentFilter;
+
+		/**
+		 * The cells of the matching notebook to be synced.
+		 */
+		cells?: { language: string }[];
+	} | {
+		/**
+		 * The notebook to be synced If a string
+	 	 * value is provided it matches against the
+	     * notebook type. '*' matches every notebook.
+		 */
+		notebookDocument?: string | NotebookDocumentFilter;
+
+		/**
+		 * The cells of the matching notebook to be synced.
+		 */
+		cells: { language: string }[];
+	})[];
+
+	/**
+	 * Whether save notification should be forwarded to
+	 * the server. Will only be honored if mode === `notebook`.
+	 */
+	save?: boolean;
+}
+```
+
+_Registration Options_: `NotebookDocumentRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#notebookDocumentSyncRegistrationOptions" name="notebookDocumentSyncRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Registration options specific to a notebook.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookDocumentSyncRegistrationOptions extends
+	NotebookDocumentSyncOptions, StaticRegistrationOptions {
+}
+```
+
+#### <a href="#notebookDocument_didOpen" name="notebookDocument_didOpen" class="anchor">DidOpenNotebookDocument Notification (:arrow_right:)</a>
+
+The open notification is sent from the client to the server when a notebook document is opened. It is only sent by a client if the server requested the synchronization mode `notebook` in its `notebookDocumentSync` capability.
+
+_Notification_:
+
+* method: `notebookDocument/didOpen`
+* params: `DidOpenNotebookDocumentParams` defined as follows:
+
+<div class="anchorHolder"><a href="#didOpenNotebookDocumentParams" name="didOpenNotebookDocumentParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The params sent in a open notebook document notification.
+ *
+ * @since 3.17.0
+ */
+export interface DidOpenNotebookDocumentParams {
+
+	/**
+	 * The notebook document that got opened.
+	 */
+	notebookDocument: NotebookDocument;
+
+	/**
+	 * The text documents that represent the content
+	 * of a notebook cell.
+	 */
+	cellTextDocuments: TextDocumentItem[];
+}
+```
+
+#### <a href="#notebookDocument_didChange" name="notebookDocument_didChange" class="anchor">DidChangeNotebookDocument Notification (:arrow_right:)</a>
+
+The change notification is sent from the client to the server when a notebook document changes. It is only sent by a client if the server requested the synchronization mode `notebook` in its `notebookDocumentSync` capability.
+
+_Notification_:
+
+* method: `notebookDocument/didChange`
+* params: `DidChangeNotebookDocumentParams` defined as follows:
+
+<div class="anchorHolder"><a href="#didChangeNotebookDocumentParams" name="didChangeNotebookDocumentParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The params sent in a change notebook document notification.
+ *
+ * @since 3.17.0
+ */
+export interface DidChangeNotebookDocumentParams {
+
+	/**
+	 * The notebook document that did change. The version number points
+	 * to the version after all provided changes have been applied.
+	 */
+	notebookDocument: VersionedNotebookDocumentIdentifier;
+
+	/**
+	 * The actual changes to the notebook document.
+	 *
+	 * The change describes single state change to the notebook document.
+	 * So it moves a notebook document, its cells and its cell text document
+	 * contents from state S to S'.
+	 *
+	 * To mirror the content of a notebook using change events use the
+	 * following approach:
+	 * - start with the same initial content
+	 * - apply the 'notebookDocument/didChange' notifications in the order
+	 *   you receive them.
+	 */
+	change: NotebookDocumentChangeEvent;
+}
+```
+
+<div class="anchorHolder"><a href="#versionedNotebookDocumentIdentifier" name="versionedNotebookDocumentIdentifier" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A versioned notebook document identifier.
+ *
+ * @since 3.17.0
+ */
+export interface VersionedNotebookDocumentIdentifier {
+
+	/**
+	 * The version number of this notebook document.
+	 */
+	version: integer;
+
+	/**
+	 * The notebook document's uri.
+	 */
+	uri: URI;
+}
+```
+
+<div class="anchorHolder"><a href="#notebookDocumentChangeEvent" name="notebookDocumentChangeEvent" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A change event for a notebook document.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookDocumentChangeEvent {
+	/**
+	 * The changed meta data if any.
+	 */
+	metadata?: LSPObject;
+
+	/**
+	 * Changes to cells
+	 */
+	cells?: {
+		/**
+		 * Changes to the cell structure to add or
+		 * remove cells.
+		 */
+		structure?: {
+			/**
+			 * The change to the cell array.
+			 */
+			array: NotebookCellArrayChange;
+
+			/**
+			 * Additional opened cell text documents.
+			 */
+			didOpen?: TextDocumentItem[];
+
+			/**
+			 * Additional closed cell text documents.
+			 */
+			didClose?: TextDocumentIdentifier[];
+		};
+
+		/**
+		 * Changes to notebook cells properties like its
+		 * kind, execution summary or metadata.
+		 */
+		data?: NotebookCell[];
+
+		/**
+    	 * Changes to the text content of notebook cells.
+     	 */
+		textContent?: {
+			document: VersionedTextDocumentIdentifier;
+			changes: TextDocumentContentChangeEvent[];
+		}[];
+	};
+}
+```
+
+<div class="anchorHolder"><a href="#notebookCellArrayChange" name="notebookCellArrayChange" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A change describing how to move a `NotebookCell`
+ * array from state S to S'.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookCellArrayChange {
+	/**
+	 * The start oftest of the cell that changed.
+	 */
+	start: uinteger;
+
+	/**
+	 * The deleted cells
+	 */
+	deleteCount: uinteger;
+
+	/**
+	 * The new cells, if any
+	 */
+	cells?: NotebookCell[];
+}
+```
+
+#### <a href="#notebookDocument_didSave" name="notebookDocument_didSave" class="anchor">DidSaveNotebookDocument Notification (:arrow_right:)</a>
+
+The save notification is sent from the client to the server when a notebook document is saved. It is only sent by a client if the server requested the synchronization mode `notebook` in its `notebookDocumentSync` capability.
+
+_Notification_:
+
+<div class="anchorHolder"><a href="#notebookDocument_didSave" name="notebookDocument_didSave" class="linkableAnchor"></a></div>
+
+* method: `notebookDocument/didSave`
+* params: `DidSaveNotebookDocumentParams` defined as follows:
+
+<div class="anchorHolder"><a href="#didSaveNotebookDocumentParams" name="didSaveNotebookDocumentParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The params sent in a save notebook document notification.
+ *
+ * @since 3.17.0
+ */
+export interface DidSaveNotebookDocumentParams {
+	/**
+	 * The notebook document that got saved.
+	 */
+	notebookDocument: NotebookDocumentIdentifier;
+}
+```
+
+#### <a href="#notebookDocument_didClose" name="notebookDocument_didClose" class="anchor">DidCloseNotebookDocument Notification (:arrow_right:)</a>
+
+The close notification is sent from the client to the server when a notebook document is closed. It is only sent by a client if the server requested the synchronization mode `notebook` in its `notebookDocumentSync` capability.
+
+_Notification_:
+
+<div class="anchorHolder"><a href="#notebookDocument_didClose" name="notebookDocument_didClose" class="linkableAnchor"></a></div>
+
+* method: `notebookDocument/didClose`
+* params: `DidCloseNotebookDocumentParams` defined as follows:
+
+<div class="anchorHolder"><a href="#didCloseNotebookDocumentParams" name="didCloseNotebookDocumentParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The params sent in a close notebook document notification.
+ *
+ * @since 3.17.0
+ */
+export interface DidCloseNotebookDocumentParams {
+
+	/**
+	 * The notebook document that got closed.
+	 */
+	notebookDocument: NotebookDocumentIdentifier;
+
+	/**
+	 * The text documents that represent the content
+	 * of a notebook cell that got closed.
+	 */
+	cellTextDocuments: TextDocumentIdentifier[];
+}
+```
+
+<div class="anchorHolder"><a href="#notebookDocumentIdentifier" name="notebookDocumentIdentifier" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A literal to identify a notebook document in the client.
+ *
+ * @since 3.17.0
+ */
+export interface NotebookDocumentIdentifier {
+	/**
+	 * The notebook document's uri.
+	 */
+	uri: URI;
+}
+```
+
+### <a href="#languageFeatures" name="languageFeatures" class="anchor">Language Features</a>
+
+Language Feature provide the actual smarts in the language server protocol. The are usually executed on a [text document, position] tuple. The main language feature categories are:
+
+- code comprehension features like Hover or Goto Definition.
+- coding features like diagnostics, code complete or code actions.
+
+#### <a href="#textDocument_declaration" name="textDocument_declaration" class="anchor">Goto Declaration Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.14.0*
+
+The go to declaration request is sent from the client to the server to resolve the declaration location of a symbol at a given text document position.
+
+The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.declaration.linkSupport`.
+
+_Client Capability_:
+* property name (optional): `textDocument.declaration`
+* property type: `DeclarationClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#declarationClientCapabilities" name="declarationClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DeclarationClientCapabilities {
+	/**
+	 * Whether declaration supports dynamic registration. If this is set to
+	 * `true` the client supports the new `DeclarationRegistrationOptions`
+	 * return value for the corresponding server capability as well.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * The client supports additional metadata in the form of declaration links.
+	 */
+	linkSupport?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `declarationProvider`
+* property type: `boolean | DeclarationOptions | DeclarationRegistrationOptions` where `DeclarationOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#declarationOptions" name="declarationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DeclarationOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `DeclarationRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#declarationRegistrationOptions" name="declarationRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DeclarationRegistrationOptions extends DeclarationOptions,
+	TextDocumentRegistrationOptions, StaticRegistrationOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/declaration`
+* params: `DeclarationParams` defined as follows:
+
+<div class="anchorHolder"><a href="#declarationParams" name="declarationParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DeclarationParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
+}
+```
+
+_Response_:
+* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \|`null`
+* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
+* error: code and message set in case an exception happens during the declaration request.
+
+#### <a href="#textDocument_definition" name="textDocument_definition" class="anchor">Goto Definition Request (:leftwards_arrow_with_hook:)</a>
+
+The go to definition request is sent from the client to the server to resolve the definition location of a symbol at a given text document position.
+
+The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.definition.linkSupport`.
+
+_Client Capability_:
+* property name (optional): `textDocument.definition`
+* property type: `DefinitionClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#definitionClientCapabilities" name="definitionClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DefinitionClientCapabilities {
+	/**
+	 * Whether definition supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * The client supports additional metadata in the form of definition links.
+	 *
+	 * @since 3.14.0
+	 */
+	linkSupport?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `definitionProvider`
+* property type: `boolean | DefinitionOptions` where `DefinitionOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#definitionOptions" name="definitionOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DefinitionOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `DefinitionRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#definitionRegistrationOptions" name="definitionRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DefinitionRegistrationOptions extends
+	TextDocumentRegistrationOptions, DefinitionOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/definition`
+* params: `DefinitionParams` defined as follows:
+
+<div class="anchorHolder"><a href="#definitionParams" name="definitionParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DefinitionParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
+}
+```
+
+_Response_:
+* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \| `null`
+* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
+* error: code and message set in case an exception happens during the definition request.
+
+#### <a href="#textDocument_typeDefinition" name="textDocument_typeDefinition" class="anchor">Goto Type Definition Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.6.0*
+
+The go to type definition request is sent from the client to the server to resolve the type definition location of a symbol at a given text document position.
+
+The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.typeDefinition.linkSupport`.
+
+_Client Capability_:
+* property name (optional): `textDocument.typeDefinition`
+* property type: `TypeDefinitionClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#typeDefinitionClientCapabilities" name="typeDefinitionClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeDefinitionClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration. If this is set to
+	 * `true` the client supports the new `TypeDefinitionRegistrationOptions`
+	 * return value for the corresponding server capability as well.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * The client supports additional metadata in the form of definition links.
+	 *
+	 * @since 3.14.0
+	 */
+	linkSupport?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `typeDefinitionProvider`
+* property type: `boolean | TypeDefinitionOptions | TypeDefinitionRegistrationOptions` where `TypeDefinitionOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#typeDefinitionOptions" name="typeDefinitionOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeDefinitionOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `TypeDefinitionRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#typeDefinitionRegistrationOptions" name="typeDefinitionRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeDefinitionRegistrationOptions extends
+	TextDocumentRegistrationOptions, TypeDefinitionOptions,
+	StaticRegistrationOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/typeDefinition`
+* params: `TypeDefinitionParams` defined as follows:
+
+<div class="anchorHolder"><a href="#typeDefinitionParams" name="typeDefinitionParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeDefinitionParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
+}
+```
+
+_Response_:
+* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \| `null`
+* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
+* error: code and message set in case an exception happens during the definition request.
+
+#### <a href="#textDocument_implementation" name="textDocument_implementation" class="anchor">Goto Implementation Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.6.0*
+
+The go to implementation request is sent from the client to the server to resolve the implementation location of a symbol at a given text document position.
+
+The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.implementation.linkSupport`.
+
+_Client Capability_:
+* property name (optional): `textDocument.implementation`
+* property type: `ImplementationClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#implementationClientCapabilities" name="implementationClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ImplementationClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration. If this is set to
+	 * `true` the client supports the new `ImplementationRegistrationOptions`
+	 * return value for the corresponding server capability as well.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * The client supports additional metadata in the form of definition links.
+	 *
+	 * @since 3.14.0
+	 */
+	linkSupport?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `implementationProvider`
+* property type: `boolean | ImplementationOptions | ImplementationRegistrationOptions` where `ImplementationOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#implementationOptions" name="implementationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ImplementationOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `ImplementationRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#implementationRegistrationOptions" name="implementationRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ImplementationRegistrationOptions extends
+	TextDocumentRegistrationOptions, ImplementationOptions,
+	StaticRegistrationOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/implementation`
+* params: `ImplementationParams` defined as follows:
+
+<div class="anchorHolder"><a href="#implementationParams" name="implementationParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ImplementationParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
+}
+```
+
+_Response_:
+* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \| `null`
+* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
+* error: code and message set in case an exception happens during the definition request.
+
+#### <a href="#textDocument_references" name="textDocument_references" class="anchor">Find References Request (:leftwards_arrow_with_hook:)</a>
+
+The references request is sent from the client to the server to resolve project-wide references for the symbol denoted by the given text document position.
+
+_Client Capability_:
+* property name (optional): `textDocument.references`
+* property type: `ReferenceClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#referenceClientCapabilities" name="referenceClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ReferenceClientCapabilities {
+	/**
+	 * Whether references supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `referencesProvider`
+* property type: `boolean | ReferenceOptions` where `ReferenceOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#referenceOptions" name="referenceOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ReferenceOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `ReferenceRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#referenceRegistrationOptions" name="referenceRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ReferenceRegistrationOptions extends
+	TextDocumentRegistrationOptions, ReferenceOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/references`
+* params: `ReferenceParams` defined as follows:
+
+<div class="anchorHolder"><a href="#referenceParams" name="referenceParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ReferenceParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
+	context: ReferenceContext;
+}
+```
+
+<div class="anchorHolder"><a href="#referenceContext" name="referenceContext" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ReferenceContext {
+	/**
+	 * Include the declaration of the current symbol.
+	 */
+	includeDeclaration: boolean;
+}
+```
+_Response_:
+* result: [`Location`](#location)[] \| `null`
+* partial result: [`Location`](#location)[]
+* error: code and message set in case an exception happens during the reference request.
+
+#### <a href="#textDocument_prepareCallHierarchy" name="textDocument_prepareCallHierarchy" class="anchor">Prepare Call Hierarchy Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.16.0*
+
+The call hierarchy request is sent from the client to the server to return a call hierarchy for the language element of given text document positions. The call hierarchy requests are executed in two steps:
+
+  1. first a call hierarchy item is resolved for the given text document position
+  1. for a call hierarchy item the incoming or outgoing call hierarchy items are resolved.
+
+_Client Capability_:
+
+* property name (optional): `textDocument.callHierarchy`
+* property type: `CallHierarchyClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyClientCapabilities" name="callHierarchyClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+interface CallHierarchyClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration. If this is set to
+	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
+	 * StaticRegistrationOptions)` return value for the corresponding server
+	 * capability as well.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+
+* property name (optional): `callHierarchyProvider`
+* property type: `boolean | CallHierarchyOptions | CallHierarchyRegistrationOptions` where `CallHierarchyOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyOptions" name="callHierarchyOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `CallHierarchyRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyRegistrationOptions" name="callHierarchyRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyRegistrationOptions extends
+	TextDocumentRegistrationOptions, CallHierarchyOptions,
+	StaticRegistrationOptions {
+}
+```
+
+_Request_:
+
+* method: `textDocument/prepareCallHierarchy`
+* params: `CallHierarchyPrepareParams` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyPrepareParams" name="callHierarchyPrepareParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyPrepareParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams {
+}
+```
+
+_Response_:
+
+* result: `CallHierarchyItem[] | null` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyItem" name="callHierarchyItem" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyItem {
+	/**
+	 * The name of this item.
+	 */
+	name: string;
+
+	/**
+	 * The kind of this item.
+	 */
+	kind: SymbolKind;
+
+	/**
+	 * Tags for this item.
+	 */
+	tags?: SymbolTag[];
+
+	/**
+	 * More detail for this item, e.g. the signature of a function.
+	 */
+	detail?: string;
+
+	/**
+	 * The resource identifier of this item.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * The range enclosing this symbol not including leading/trailing whitespace
+	 * but everything else, e.g. comments and code.
+	 */
+	range: Range;
+
+	/**
+	 * The range that should be selected and revealed when this symbol is being
+	 * picked, e.g. the name of a function. Must be contained by the
+	 * [`range`](#CallHierarchyItem.range).
+	 */
+	selectionRange: Range;
+
+	/**
+	 * A data entry field that is preserved between a call hierarchy prepare and
+	 * incoming calls or outgoing calls requests.
+	 */
+	data?: unknown;
+}
+```
+
+* error: code and message set in case an exception happens during the 'textDocument/prepareCallHierarchy' request
+
+#### <a href="#callHierarchy_incomingCalls" name="callHierarchy_incomingCalls" class="anchor">Call Hierarchy Incoming Calls (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.16.0*
+
+The request is sent from the client to the server to resolve incoming calls for a given call hierarchy item. The request doesn't define its own client and server capabilities. It is only issued if a server registers for the [`textDocument/prepareCallHierarchy` request](#textDocument_prepareCallHierarchy).
+
+_Request_:
+
+* method: `callHierarchy/incomingCalls`
+* params: `CallHierarchyIncomingCallsParams` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyIncomingCallsParams" name="callHierarchyIncomingCallsParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyIncomingCallsParams extends
+	WorkDoneProgressParams, PartialResultParams {
+	item: CallHierarchyItem;
+}
+```
+
+_Response_:
+
+* result: `CallHierarchyIncomingCall[] | null` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyIncomingCall" name="callHierarchyIncomingCall" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyIncomingCall {
+
+	/**
+	 * The item that makes the call.
+	 */
+	from: CallHierarchyItem;
+
+	/**
+	 * The ranges at which the calls appear. This is relative to the caller
+	 * denoted by [`this.from`](#CallHierarchyIncomingCall.from).
+	 */
+	fromRanges: Range[];
+}
+```
+
+* partial result: `CallHierarchyIncomingCall[]`
+* error: code and message set in case an exception happens during the 'callHierarchy/incomingCalls' request
+
+#### <a href="#callHierarchy_outgoingCalls" name="callHierarchy_outgoingCalls" class="anchor">Call Hierarchy Outgoing Calls (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.16.0*
+
+The request is sent from the client to the server to resolve outgoing calls for a given call hierarchy item. The request doesn't define its own client and server capabilities. It is only issued if a server registers for the [`textDocument/prepareCallHierarchy` request](#textDocument_prepareCallHierarchy).
+
+_Request_:
+
+* method: `callHierarchy/outgoingCalls`
+* params: `CallHierarchyOutgoingCallsParams` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyOutgoingCallsParams" name="callHierarchyOutgoingCallsParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyOutgoingCallsParams extends
+	WorkDoneProgressParams, PartialResultParams {
+	item: CallHierarchyItem;
+}
+```
+
+_Response_:
+
+* result: `CallHierarchyOutgoingCall[] | null` defined as follows:
+
+<div class="anchorHolder"><a href="#callHierarchyOutgoingCall" name="callHierarchyOutgoingCall" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CallHierarchyOutgoingCall {
+
+	/**
+	 * The item that is called.
+	 */
+	to: CallHierarchyItem;
+
+	/**
+	 * The range at which this item is called. This is the range relative to
+	 * the caller, e.g the item passed to `callHierarchy/outgoingCalls` request.
+	 */
+	fromRanges: Range[];
+}
+```
+
+* partial result: `CallHierarchyOutgoingCall[]`
+* error: code and message set in case an exception happens during the 'callHierarchy/outgoingCalls' request
+
+
+#### <a href="#textDocument_prepareTypeHierarchy" name="textDocument_prepareTypeHierarchy" class="anchor">Prepare Type Hierarchy Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.17.0*
+
+The type hierarchy request is sent from the client to the server to return a type hierarchy for the language element of given text document positions. Will return `null` if the server couldn't infer a valid type from the position. The type hierarchy requests are executed in two steps:
+
+  1. first a type hierarchy item is prepared for the given text document position.
+  1. for a type hierarchy item the supertype or subtype type hierarchy items are resolved.
+
+_Client Capability_:
+
+* property name (optional): `textDocument.typeHierarchy`
+* property type: `TypeHierarchyClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#typeHierarchyClientCapabilities" name="typeHierarchyClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+type TypeHierarchyClientCapabilities = {
+	/**
+	 * Whether implementation supports dynamic registration. If this is set to
+	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
+	 * StaticRegistrationOptions)` return value for the corresponding server
+	 * capability as well.
+	 */
+	dynamicRegistration?: boolean;
+};
+```
+
+_Server Capability_:
+
+* property name (optional): `typeHierarchyProvider`
+* property type: `boolean | TypeHierarchyOptions | TypeHierarchyRegistrationOptions` where `TypeHierarchyOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#typeHierarchyOptions" name="typeHierarchyOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeHierarchyOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `TypeHierarchyRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#typeHierarchyRegistrationOptions" name="typeHierarchyRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeHierarchyRegistrationOptions extends
+	TextDocumentRegistrationOptions, TypeHierarchyOptions,
+	StaticRegistrationOptions {
+}
+```
+
+_Request_:
+
+* method: 'textDocument/prepareTypeHierarchy'
+* params: `TypeHierarchyPrepareParams` defined as follows:
+
+<div class="anchorHolder"><a href="#typeHierarchyPrepareParams" name="typeHierarchyPrepareParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeHierarchyPrepareParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams {
+}
+```
+
+_Response_:
+
+* result: `TypeHierarchyItem[] | null` defined as follows:
+
+<div class="anchorHolder"><a href="#typeHierarchyItem" name="typeHierarchyItem" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeHierarchyItem {
+	/**
+	 * The name of this item.
+	 */
+	name: string;
+
+	/**
+	 * The kind of this item.
+	 */
+	kind: SymbolKind;
+
+	/**
+	 * Tags for this item.
+	 */
+	tags?: SymbolTag[];
+
+	/**
+	 * More detail for this item, e.g. the signature of a function.
+	 */
+	detail?: string;
+
+	/**
+	 * The resource identifier of this item.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * The range enclosing this symbol not including leading/trailing whitespace
+	 * but everything else, e.g. comments and code.
+	 */
+	range: Range;
+
+	/**
+	 * The range that should be selected and revealed when this symbol is being
+	 * picked, e.g. the name of a function. Must be contained by the
+	 * [`range`](#TypeHierarchyItem.range).
+	 */
+	selectionRange: Range;
+
+	/**
+	 * A data entry field that is preserved between a type hierarchy prepare and
+	 * supertypes or subtypes requests. It could also be used to identify the
+	 * type hierarchy in the server, helping improve the performance on
+	 * resolving supertypes and subtypes.
+	 */
+	data?: LSPAny;
+}
+```
+
+* error: code and message set in case an exception happens during the 'textDocument/prepareTypeHierarchy' request
+
+#### <a href="#typeHierarchy_supertypes" name="typeHierarchy_supertypes" class="anchor">Type Hierarchy Supertypes(:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.17.0*
+
+The request is sent from the client to the server to resolve the supertypes for a given type hierarchy item. Will return `null` if the server couldn't infer a valid type from `item` in the params. The request doesn't define its own client and server capabilities. It is only issued if a server registers for the [`textDocument/prepareTypeHierarchy` request](#textDocument_prepareTypeHierarchy).
+
+_Request_:
+
+* method: 'typeHierarchy/supertypes'
+* params: `TypeHierarchySupertypesParams` defined as follows:
+
+<div class="anchorHolder"><a href="#typeHierarchySupertypesParams" name="typeHierarchySupertypesParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeHierarchySupertypesParams extends
+	WorkDoneProgressParams, PartialResultParams {
+	item: TypeHierarchyItem;
+}
+```
+_Response_:
+
+* result: `TypeHierarchyItem[] | null`
+* partial result: `TypeHierarchyItem[]`
+* error: code and message set in case an exception happens during the 'typeHierarchy/supertypes' request
+
+#### <a href="#typeHierarchy_subtypes" name="typeHierarchy_subtypes" class="anchor">Type Hierarchy Subtypes(:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.17.0*
+
+The request is sent from the client to the server to resolve the subtypes for a given type hierarchy item. Will return `null` if the server couldn't infer a valid type from `item` in the params. The request doesn't define its own client and server capabilities. It is only issued if a server registers for the [`textDocument/prepareTypeHierarchy` request](#textDocument_prepareTypeHierarchy).
+
+_Request_:
+
+* method: 'typeHierarchy/subtypes'
+* params: `TypeHierarchySubtypesParams` defined as follows:
+
+<div class="anchorHolder"><a href="#typeHierarchySubtypesParams" name="typeHierarchySubtypesParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface TypeHierarchySubtypesParams extends
+	WorkDoneProgressParams, PartialResultParams {
+	item: TypeHierarchyItem;
+}
+```
+_Response_:
+
+* result: `TypeHierarchyItem[] | null`
+* partial result: `TypeHierarchyItem[]`
+* error: code and message set in case an exception happens during the 'typeHierarchy/subtypes' request
+#### <a href="#textDocument_documentHighlight" name="textDocument_documentHighlight" class="anchor">Document Highlights Request (:leftwards_arrow_with_hook:)</a>
+
+The document highlight request is sent from the client to the server to resolve a document highlights for a given text document position.
+For programming languages this usually highlights all references to the symbol scoped to this file. However we kept 'textDocument/documentHighlight'
+and 'textDocument/references' separate requests since the first one is allowed to be more fuzzy. Symbol matches usually have a `DocumentHighlightKind`
+of `Read` or `Write` whereas fuzzy or textual matches use `Text`as the kind.
+
+_Client Capability_:
+* property name (optional): `textDocument.documentHighlight`
+* property type: `DocumentHighlightClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#documentHighlightClientCapabilities" name="documentHighlightClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentHighlightClientCapabilities {
+	/**
+	 * Whether document highlight supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `documentHighlightProvider`
+* property type: `boolean | DocumentHighlightOptions` where `DocumentHighlightOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#documentHighlightOptions" name="documentHighlightOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentHighlightOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `DocumentHighlightRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentHighlightRegistrationOptions" name="documentHighlightRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentHighlightRegistrationOptions extends
+	TextDocumentRegistrationOptions, DocumentHighlightOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/documentHighlight`
+* params: `DocumentHighlightParams` defined as follows:
+
+<div class="anchorHolder"><a href="#documentHighlightParams" name="documentHighlightParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentHighlightParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
+}
+```
+
+_Response_:
+* result: `DocumentHighlight[]` \| `null` defined as follows:
+
+<div class="anchorHolder"><a href="#documentHighlight" name="documentHighlight" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A document highlight is a range inside a text document which deserves
+ * special attention. Usually a document highlight is visualized by changing
+ * the background color of its range.
+ *
+ */
+export interface DocumentHighlight {
+	/**
+	 * The range this highlight applies to.
+	 */
+	range: Range;
+
+	/**
+	 * The highlight kind, default is DocumentHighlightKind.Text.
+	 */
+	kind?: DocumentHighlightKind;
+}
+```
+
+<div class="anchorHolder"><a href="#documentHighlightKind" name="documentHighlightKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A document highlight kind.
+ */
+export namespace DocumentHighlightKind {
+	/**
+	 * A textual occurrence.
+	 */
+	export const Text = 1;
+
+	/**
+	 * Read-access of a symbol, like reading a variable.
+	 */
+	export const Read = 2;
+
+	/**
+	 * Write-access of a symbol, like writing to a variable.
+	 */
+	export const Write = 3;
+}
+
+export type DocumentHighlightKind = 1 | 2 | 3;
+```
+
+* partial result: `DocumentHighlight[]`
+* error: code and message set in case an exception happens during the document highlight request.
+
+#### <a href="#textDocument_documentLink" name="textDocument_documentLink" class="anchor">Document Link Request (:leftwards_arrow_with_hook:)</a>
+
+The document links request is sent from the client to the server to request the location of links in a document.
+
+_Client Capability_:
+* property name (optional): `textDocument.documentLink`
+* property type: `DocumentLinkClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#documentLinkClientCapabilities" name="documentLinkClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentLinkClientCapabilities {
+	/**
+	 * Whether document link supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * Whether the client supports the `tooltip` property on `DocumentLink`.
 	 *
 	 * @since 3.15.0
 	 */
+	tooltipSupport?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `documentLinkProvider`
+* property type: `DocumentLinkOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentLinkOptions" name="documentLinkOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentLinkOptions extends WorkDoneProgressOptions {
+	/**
+	 * Document links have a resolve provider as well.
+	 */
+	resolveProvider?: boolean;
+}
+```
+
+_Registration Options_: `DocumentLinkRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentLinkRegistrationOptions" name="documentLinkRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentLinkRegistrationOptions extends
+	TextDocumentRegistrationOptions, DocumentLinkOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/documentLink`
+* params: `DocumentLinkParams` defined as follows:
+
+<div class="anchorHolder"><a href="#documentLinkParams" name="documentLinkParams" class="linkableAnchor"></a></div>
+
+```typescript
+interface DocumentLinkParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The document to provide document links for.
+	 */
+	textDocument: TextDocumentIdentifier;
+}
+```
+
+_Response_:
+* result: `DocumentLink[]` \| `null`.
+
+<div class="anchorHolder"><a href="#documentLink" name="documentLink" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A document link is a range in a text document that links to an internal or
+ * external resource, like another text document or a web site.
+ */
+interface DocumentLink {
+	/**
+	 * The range this link applies to.
+	 */
+	range: Range;
+
+	/**
+	 * The uri this link points to. If missing a resolve request is sent later.
+	 */
+	target?: DocumentUri;
+
+	/**
+	 * The tooltip text when you hover over this link.
+	 *
+	 * If a tooltip is provided, is will be displayed in a string that includes
+	 * instructions on how to trigger the link, such as `{0} (ctrl + click)`.
+	 * The specific instructions vary depending on OS, user settings, and
+	 * localization.
+	 *
+	 * @since 3.15.0
+	 */
+	tooltip?: string;
+
+	/**
+	 * A data entry field that is preserved on a document link between a
+	 * DocumentLinkRequest and a DocumentLinkResolveRequest.
+	 */
+	data?: LSPAny;
+}
+```
+* partial result: `DocumentLink[]`
+* error: code and message set in case an exception happens during the document link request.
+
+#### <a href="#documentLink_resolve" name="documentLink_resolve" class="anchor">Document Link Resolve Request (:leftwards_arrow_with_hook:)</a>
+
+The document link resolve request is sent from the client to the server to resolve the target of a given document link.
+
+_Request_:
+* method: `documentLink/resolve`
+* params: `DocumentLink`
+
+_Response_:
+* result: `DocumentLink`
+* error: code and message set in case an exception happens during the document link resolve request.
+
+#### <a href="#textDocument_hover" name="textDocument_hover" class="anchor">Hover Request (:leftwards_arrow_with_hook:)</a>
+
+The hover request is sent from the client to the server to request hover information at a given text document position.
+
+_Client Capability_:
+* property name (optional): `textDocument.hover`
+* property type: `HoverClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#hoverClientCapabilities" name="hoverClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface HoverClientCapabilities {
+	/**
+	 * Whether hover supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * Client supports the follow content formats if the content
+	 * property refers to a `literal of type MarkupContent`.
+	 * The order describes the preferred format of the client.
+	 */
+	contentFormat?: MarkupKind[];
+}
+```
+
+_Server Capability_:
+* property name (optional): `hoverProvider`
+* property type: `boolean | HoverOptions` where `HoverOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#hoverOptions" name="hoverOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface HoverOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `HoverRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#hoverRegistrationOptions" name="hoverRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface HoverRegistrationOptions
+	extends TextDocumentRegistrationOptions, HoverOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/hover`
+* params: `HoverParams` defined as follows:
+
+<div class="anchorHolder"><a href="#hoverParams" name="hoverParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface HoverParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams {
+}
+```
+
+_Response_:
+* result: `Hover` \| `null` defined as follows:
+
+<div class="anchorHolder"><a href="#hover" name="hover" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The result of a hover request.
+ */
+export interface Hover {
+	/**
+	 * The hover's content
+	 */
+	contents: MarkedString | MarkedString[] | MarkupContent;
+
+	/**
+	 * An optional range is a range inside a text document
+	 * that is used to visualize a hover, e.g. by changing the background color.
+	 */
+	range?: Range;
+}
+```
+
+Where `MarkedString` is defined as follows:
+
+<div class="anchorHolder"><a href="#markedString" name="markedString" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * MarkedString can be used to render human readable text. It is either a
+ * markdown string or a code-block that provides a language and a code snippet.
+ * The language identifier is semantically equal to the optional language
+ * identifier in fenced code blocks in GitHub issues.
+ *
+ * The pair of a language and a value is an equivalent to markdown:
+ * ```${language}
+ * ${value}
+ * ```
+ *
+ * Note that markdown strings will be sanitized - that means html will be
+ * escaped.
+ *
+ * @deprecated use MarkupContent instead.
+ */
+type MarkedString = string | { language: string; value: string };
+```
+
+* error: code and message set in case an exception happens during the hover request.
+
+#### <a href="#textDocument_codeLens" name="textDocument_codeLens" class="anchor">Code Lens Request (:leftwards_arrow_with_hook:)</a>
+
+The code lens request is sent from the client to the server to compute code lenses for a given text document.
+
+_Client Capability_:
+* property name (optional): `textDocument.codeLens`
+* property type: `CodeLensClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#codeLensClientCapabilities" name="codeLensClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CodeLensClientCapabilities {
+	/**
+	 * Whether code lens supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `codeLensProvider`
+* property type: `CodeLensOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#codeLensOptions" name="codeLensOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CodeLensOptions extends WorkDoneProgressOptions {
+	/**
+	 * Code lens has a resolve provider as well.
+	 */
+	resolveProvider?: boolean;
+}
+```
+
+_Registration Options_: `CodeLensRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#codeLensRegistrationOptions" name="codeLensRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CodeLensRegistrationOptions extends
+	TextDocumentRegistrationOptions, CodeLensOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/codeLens`
+* params: `CodeLensParams` defined as follows:
+
+<div class="anchorHolder"><a href="#codeLensParams" name="codeLensParams" class="linkableAnchor"></a></div>
+
+```typescript
+interface CodeLensParams extends WorkDoneProgressParams, PartialResultParams {
+	/**
+	 * The document to request code lens for.
+	 */
+	textDocument: TextDocumentIdentifier;
+}
+```
+
+_Response_:
+* result: `CodeLens[]` \| `null` defined as follows:
+
+<div class="anchorHolder"><a href="#codeLens" name="codeLens" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A code lens represents a command that should be shown along with
+ * source text, like the number of references, a way to run tests, etc.
+ *
+ * A code lens is _unresolved_ when no command is associated to it. For
+ * performance reasons the creation of a code lens and resolving should be done
+ * in two stages.
+ */
+interface CodeLens {
+	/**
+	 * The range in which this code lens is valid. Should only span a single
+	 * line.
+	 */
+	range: Range;
+
+	/**
+	 * The command this code lens represents.
+	 */
+	command?: Command;
+
+	/**
+	 * A data entry field that is preserved on a code lens item between
+	 * a code lens and a code lens resolve request.
+	 */
+	data?: LSPAny;
+}
+```
+* partial result: `CodeLens[]`
+* error: code and message set in case an exception happens during the code lens request.
+
+#### <a href="#codeLens_resolve" name="codeLens_resolve" class="anchor">Code Lens Resolve Request (:leftwards_arrow_with_hook:)</a>
+
+The code lens resolve request is sent from the client to the server to resolve the command for a given code lens item.
+
+_Request_:
+* method: `codeLens/resolve`
+* params: `CodeLens`
+
+_Response_:
+* result: `CodeLens`
+* error: code and message set in case an exception happens during the code lens resolve request.
+
+#### <a href="#codeLens_refresh" name="codeLens_refresh" class="anchor">Code Lens Refresh Request (:arrow_right_hook:)</a>
+
+> *Since version 3.16.0*
+
+The `workspace/codeLens/refresh` request is sent from the server to the client. Servers can use it to ask clients to refresh the code lenses currently shown in editors. As a result the client should ask the server to recompute the code lenses for these editors. This is useful if a server detects a configuration change which requires a re-calculation of all code lenses. Note that the client still has the freedom to delay the re-calculation of the code lenses if for example an editor is currently not visible.
+
+_Client Capability_:
+
+* property name (optional): `workspace.codeLens`
+* property type: `CodeLensWorkspaceClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#codeLensWorkspaceClientCapabilities" name="codeLensWorkspaceClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CodeLensWorkspaceClientCapabilities {
+	/**
+	 * Whether the client implementation supports a refresh request sent from the
+	 * server to the client.
+	 *
+	 * Note that this event is global and will force the client to refresh all
+	 * code lenses currently shown. It should be used with absolute care and is
+	 * useful for situation where a server for example detect a project wide
+	 * change that requires such a calculation.
+	 */
+	refreshSupport?: boolean;
+}
+```
+
+_Request_:
+
+* method: `workspace/codeLens/refresh`
+* params: none
+
+_Response_:
+
+* result: void
+* error: code and message set in case an exception happens during the 'workspace/codeLens/refresh' request
+
+#### <a href="#textDocument_foldingRange" name="textDocument_foldingRange" class="anchor">Folding Range Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.10.0*
+
+The folding range request is sent from the client to the server to return all folding ranges found in a given text document.
+
+_Client Capability_:
+* property name (optional): `textDocument.foldingRange`
+* property type: `FoldingRangeClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#foldingRangeClientCapabilities" name="foldingRangeClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface FoldingRangeClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration for folding range
+	 * providers. If this is set to `true` the client supports the new
+	 * `FoldingRangeRegistrationOptions` return value for the corresponding
+	 * server capability as well.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * The maximum number of folding ranges that the client prefers to receive
+	 * per document. The value serves as a hint, servers are free to follow the
+	 * limit.
+	 */
+	rangeLimit?: uinteger;
+
+	/**
+	 * If set, the client signals that it only supports folding complete lines.
+	 * If set, client will ignore specified `startCharacter` and `endCharacter`
+	 * properties in a FoldingRange.
+	 */
+	lineFoldingOnly?: boolean;
+
+	/**
+	 * Specific options for the folding range kind.
+	 *
+	 * @since 3.17.0
+	 */
+	foldingRangeKind? : {
+		/**
+		 * The folding range 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.
+		 */
+		valueSet?: FoldingRangeKind[];
+	};
+
+	/**
+	 * Specific options for the folding range.
+	 * @since 3.17.0
+	 */
+	foldingRange?: {
+		/**
+		* If set, the client signals that it supports setting collapsedText on
+		* folding ranges to display custom labels instead of the default text.
+		*
+		* @since 3.17.0
+		*/
+		collapsedText?: boolean;
+	};
+}
+```
+
+_Server Capability_:
+* property name (optional): `foldingRangeProvider`
+* property type: `boolean | FoldingRangeOptions | FoldingRangeRegistrationOptions` where `FoldingRangeOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#foldingRangeOptions" name="foldingRangeOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface FoldingRangeOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `FoldingRangeRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#foldingRangeRegistrationOptions" name="foldingRangeRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface FoldingRangeRegistrationOptions extends
+	TextDocumentRegistrationOptions, FoldingRangeOptions,
+	StaticRegistrationOptions {
+}
+```
+
+_Request_:
+
+* method: `textDocument/foldingRange`
+* params: `FoldingRangeParams` defined as follows
+
+<div class="anchorHolder"><a href="#foldingRangeParams" name="foldingRangeParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface FoldingRangeParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+}
+```
+
+_Response_:
+* result: `FoldingRange[] | null` defined as follows:
+
+<div class="anchorHolder"><a href="#foldingRangeKind" name="foldingRangeKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A set of predefined range kinds.
+ */
+export namespace FoldingRangeKind {
+	/**
+	 * Folding range for a comment
+	 */
+	export const Comment = 'comment';
+
+	/**
+	 * Folding range for a imports or includes
+	 */
+	export const Imports = 'imports';
+
+	/**
+	 * Folding range for a region (e.g. `#region`)
+	 */
+	export const Region = 'region';
+}
+
+/**
+ * The type is a string since the value set is extensible
+ */
+export type FoldingRangeKind = string;
+```
+
+<div class="anchorHolder"><a href="#foldingRange" name="foldingRange" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Represents a folding range. To be valid, start and end line must be bigger
+ * than zero and smaller than the number of lines in the document. Clients
+ * are free to ignore invalid ranges.
+ */
+export interface FoldingRange {
+
+	/**
+	 * The zero-based start line of the range to fold. The folded area starts
+	 * after the line's last character. To be valid, the end must be zero or
+	 * larger and smaller than the number of lines in the document.
+	 */
+	startLine: uinteger;
+
+	/**
+	 * The zero-based character offset from where the folded range starts. If
+	 * not defined, defaults to the length of the start line.
+	 */
+	startCharacter?: uinteger;
+
+	/**
+	 * The zero-based end line of the range to fold. The folded area ends with
+	 * the line's last character. To be valid, the end must be zero or larger
+	 * and smaller than the number of lines in the document.
+	 */
+	endLine: uinteger;
+
+	/**
+	 * The zero-based character offset before the folded range ends. If not
+	 * defined, defaults to the length of the end line.
+	 */
+	endCharacter?: uinteger;
+
+	/**
+	 * Describes the kind of the folding range such as `comment` or `region`.
+	 * The kind is used to categorize folding ranges and used by commands like
+	 * 'Fold all comments'. See [FoldingRangeKind](#FoldingRangeKind) for an
+	 * enumeration of standardized kinds.
+	 */
+	kind?: FoldingRangeKind;
+
+	/**
+	 * The text that the client should show when the specified range is
+	 * collapsed. If not defined or not supported by the client, a default
+	 * will be chosen by the client.
+	 *
+	 * @since 3.17.0 - proposed
+	 */
+	collapsedText?: string;
+}
+```
+
+* partial result: `FoldingRange[]`
+* error: code and message set in case an exception happens during the 'textDocument/foldingRange' request
+
+#### <a href="#textDocument_selectionRange" name="textDocument_selectionRange" class="anchor">Selection Range Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.15.0*
+
+The selection range request is sent from the client to the server to return suggested selection ranges at an array of given positions. A selection range is a range around the cursor position which the user might be interested in selecting.
+
+A selection range in the return array is for the position in the provided parameters at the same index. Therefore positions[i] must be contained in result[i].range. To allow for results where some positions have selection ranges and others do not, result[i].range is allowed to be the empty range at positions[i].
+
+Typically, but not necessary, selection ranges correspond to the nodes of the syntax tree.
+
+_Client Capability_:
+* property name (optional): `textDocument.selectionRange`
+* property type: `SelectionRangeClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#selectionRangeClientCapabilities" name="selectionRangeClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SelectionRangeClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration for selection range
+	 * providers. If this is set to `true` the client supports the new
+	 * `SelectionRangeRegistrationOptions` return value for the corresponding
+	 * server capability as well.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `selectionRangeProvider`
+* property type: `boolean | SelectionRangeOptions | SelectionRangeRegistrationOptions` where `SelectionRangeOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#selectionRangeOptions" name="selectionRangeOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SelectionRangeOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `SelectionRangeRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#selectionRangeRegistrationOptions" name="selectionRangeRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SelectionRangeRegistrationOptions extends
+	SelectionRangeOptions, TextDocumentRegistrationOptions,
+	StaticRegistrationOptions {
+}
+```
+
+_Request_:
+
+* method: `textDocument/selectionRange`
+* params: `SelectionRangeParams` defined as follows:
+
+<div class="anchorHolder"><a href="#selectionRangeParams" name="selectionRangeParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SelectionRangeParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The positions inside the text document.
+	 */
+	positions: Position[];
+}
+```
+
+_Response_:
+
+* result: `SelectionRange[] | null` defined as follows:
+
+<div class="anchorHolder"><a href="#selectionRange" name="selectionRange" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SelectionRange {
+	/**
+	 * The [range](#Range) of this selection range.
+	 */
+	range: Range;
+	/**
+	 * The parent selection range containing this range. Therefore
+	 * `parent.range` must contain `this.range`.
+	 */
+	parent?: SelectionRange;
+}
+```
+
+* partial result: `SelectionRange[]`
+* error: code and message set in case an exception happens during the 'textDocument/selectionRange' request
+
+#### <a href="#textDocument_documentSymbol" name="textDocument_documentSymbol" class="anchor">Document Symbols Request (:leftwards_arrow_with_hook:)</a>
+
+The document symbol request is sent from the client to the server. The returned result is either
+
+- `SymbolInformation[]` which is a flat list of all symbols found in a given text document. Then neither the symbol's location range nor the symbol's container name should be used to infer a hierarchy.
+- `DocumentSymbol[]` which is a hierarchy of symbols found in a given text document.
+
+Servers should whenever possible return `DocumentSymbol` since it is the richer data structure.
+
+_Client Capability_:
+* property name (optional): `textDocument.documentSymbol`
+* property type: `DocumentSymbolClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#documentSymbolClientCapabilities" name="documentSymbolClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentSymbolClientCapabilities {
+	/**
+	 * Whether document symbol supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * Specific capabilities for the `SymbolKind` in the
+	 * `textDocument/documentSymbol` request.
+	 */
+	symbolKind?: {
+		/**
+		 * The symbol 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.
+		 *
+		 * If this property is not present the client only supports
+		 * the symbol kinds from `File` to `Array` as defined in
+		 * the initial version of the protocol.
+		 */
+		valueSet?: SymbolKind[];
+	};
+
+	/**
+	 * The client supports hierarchical document symbols.
+	 */
+	hierarchicalDocumentSymbolSupport?: boolean;
+
+	/**
+	 * The client supports tags on `SymbolInformation`. Tags are supported on
+	 * `DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true.
+	 * Clients supporting tags have to handle unknown tags gracefully.
+	 *
+	 * @since 3.16.0
+	 */
 	tagSupport?: {
 		/**
 		 * The tags supported by the client.
 		 */
-		valueSet: DiagnosticTag[];
+		valueSet: SymbolTag[];
 	};
 
 	/**
-	 * Whether the client interprets the version property of the
-	 * `textDocument/publishDiagnostics` notification's parameter.
-	 *
-	 * @since 3.15.0
-	 */
-	versionSupport?: boolean;
-
-	/**
-	 * Client supports a codeDescription property
+	 * The client supports an additional label presented in the UI when
+	 * registering a document symbol provider.
 	 *
 	 * @since 3.16.0
 	 */
-	codeDescriptionSupport?: boolean;
-
-	/**
-	 * Whether code action supports the `data` property which is
-	 * preserved between a `textDocument/publishDiagnostics` and
-	 * `textDocument/codeAction` request.
-	 *
-	 * @since 3.16.0
-	 */
-	dataSupport?: boolean;
+	labelSupport?: boolean;
 }
 ```
 
-_Notification_:
-* method: 'textDocument/publishDiagnostics'
-* params: `PublishDiagnosticsParams` defined as follows:
+_Server Capability_:
+* property name (optional): `documentSymbolProvider`
+* property type: `boolean | DocumentSymbolOptions` where `DocumentSymbolOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#documentSymbolOptions" name="documentSymbolOptions" class="linkableAnchor"></a></div>
 
 ```typescript
-interface PublishDiagnosticsParams {
+export interface DocumentSymbolOptions extends WorkDoneProgressOptions {
 	/**
-	 * The URI for which diagnostic information is reported.
-	 */
-	uri: DocumentUri;
-
-	/**
-	 * Optional the version number of the document the diagnostics are published
-	 * for.
+	 * A human-readable string that is shown when multiple outlines trees
+	 * are shown for the same document.
 	 *
-	 * @since 3.15.0
+	 * @since 3.16.0
 	 */
-	version?: integer;
-
-	/**
-	 * An array of diagnostic information items.
-	 */
-	diagnostics: Diagnostic[];
+	label?: string;
 }
 ```
 
+_Registration Options_: `DocumentSymbolRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentSymbolRegistrationOptions" name="documentSymbolRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentSymbolRegistrationOptions extends
+	TextDocumentRegistrationOptions, DocumentSymbolOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/documentSymbol`
+* params: `DocumentSymbolParams` defined as follows:
+
+<div class="anchorHolder"><a href="#documentSymbolParams" name="documentSymbolParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DocumentSymbolParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+}
+```
+
+_Response_:
+* result: `DocumentSymbol[]` \| `SymbolInformation[]` \| `null` defined as follows:
+
+<div class="anchorHolder"><a href="#symbolKind" name="symbolKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A symbol kind.
+ */
+export namespace SymbolKind {
+	export const File = 1;
+	export const Module = 2;
+	export const Namespace = 3;
+	export const Package = 4;
+	export const Class = 5;
+	export const Method = 6;
+	export const Property = 7;
+	export const Field = 8;
+	export const Constructor = 9;
+	export const Enum = 10;
+	export const Interface = 11;
+	export const Function = 12;
+	export const Variable = 13;
+	export const Constant = 14;
+	export const String = 15;
+	export const Number = 16;
+	export const Boolean = 17;
+	export const Array = 18;
+	export const Object = 19;
+	export const Key = 20;
+	export const Null = 21;
+	export const EnumMember = 22;
+	export const Struct = 23;
+	export const Event = 24;
+	export const Operator = 25;
+	export const TypeParameter = 26;
+}
+```
+
+<div class="anchorHolder"><a href="#symbolTag" name="symbolTag" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Symbol tags are extra annotations that tweak the rendering of a symbol.
+ *
+ * @since 3.16
+ */
+export namespace SymbolTag {
+
+	/**
+	 * Render a symbol as obsolete, usually using a strike-out.
+	 */
+	export const Deprecated: 1 = 1;
+}
+
+export type SymbolTag = 1;
+```
+
+<div class="anchorHolder"><a href="#documentSymbol" name="documentSymbol" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Represents programming constructs like variables, classes, interfaces etc.
+ * that appear in a document. Document symbols can be hierarchical and they
+ * have two ranges: one that encloses its definition and one that points to its
+ * most interesting range, e.g. the range of an identifier.
+ */
+export interface DocumentSymbol {
+
+	/**
+	 * The name of this symbol. Will be displayed in the user interface and
+	 * therefore must not be an empty string or a string only consisting of
+	 * white spaces.
+	 */
+	name: string;
+
+	/**
+	 * More detail for this symbol, e.g the signature of a function.
+	 */
+	detail?: string;
+
+	/**
+	 * The kind of this symbol.
+	 */
+	kind: SymbolKind;
+
+	/**
+	 * Tags for this document symbol.
+	 *
+	 * @since 3.16.0
+	 */
+	tags?: SymbolTag[];
+
+	/**
+	 * Indicates if this symbol is deprecated.
+	 *
+	 * @deprecated Use tags instead
+	 */
+	deprecated?: boolean;
+
+	/**
+	 * The range enclosing this symbol not including leading/trailing whitespace
+	 * but everything else like comments. This information is typically used to
+	 * determine if the clients cursor is inside the symbol to reveal in the
+	 * symbol in the UI.
+	 */
+	range: Range;
+
+	/**
+	 * The range that should be selected and revealed when this symbol is being
+	 * picked, e.g. the name of a function. Must be contained by the `range`.
+	 */
+	selectionRange: Range;
+
+	/**
+	 * Children of this symbol, e.g. properties of a class.
+	 */
+	children?: DocumentSymbol[];
+}
+```
+
+<div class="anchorHolder"><a href="#symbolInformation" name="symbolInformation" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Represents information about programming constructs like variables, classes,
+ * interfaces etc.
+ *
+ * @deprecated use DocumentSymbol or WorkspaceSymbol instead.
+ */
+export interface SymbolInformation {
+	/**
+	 * The name of this symbol.
+	 */
+	name: string;
+
+	/**
+	 * The kind of this symbol.
+	 */
+	kind: SymbolKind;
+
+	/**
+	 * Tags for this symbol.
+	 *
+	 * @since 3.16.0
+	 */
+	tags?: SymbolTag[];
+
+	/**
+	 * Indicates if this symbol is deprecated.
+	 *
+	 * @deprecated Use tags instead
+	 */
+	deprecated?: boolean;
+
+	/**
+	 * The location of this symbol. The location's range is used by a tool
+	 * to reveal the location in the editor. If the symbol is selected in the
+	 * tool the range's start information is used to position the cursor. So
+	 * the range usually spans more then the actual symbol's name and does
+	 * normally include things like visibility modifiers.
+	 *
+	 * The range doesn't have to denote a node range in the sense of a abstract
+	 * syntax tree. It can therefore not be used to re-construct a hierarchy of
+	 * the symbols.
+	 */
+	location: Location;
+
+	/**
+	 * The name of the symbol containing this symbol. This information is for
+	 * user interface purposes (e.g. to render a qualifier in the user interface
+	 * if necessary). It can't be used to re-infer a hierarchy for the document
+	 * symbols.
+	 */
+	containerName?: string;
+}
+```
+
+* partial result: `DocumentSymbol[]` \| `SymbolInformation[]`. `DocumentSymbol[]` and `SymbolInformation[]` can not be mixed. That means the first chunk defines the type of all the other chunks.
+* error: code and message set in case an exception happens during the document symbol request.
+
+#### <a href="#textDocument_semanticTokens" name="textDocument_semanticTokens" class="anchor">Semantic Tokens (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.16.0*
+
+The request is sent from the client to the server to resolve semantic tokens for a given file. Semantic tokens are used to add additional color information to a file that depends on language specific symbol information. A semantic token request usually produces a large result. The protocol therefore supports encoding tokens with numbers. In addition optional support for deltas is available.
+
+_General Concepts_
+
+Tokens are represented using one token type combined with n token modifiers. A token type is something like `class` or `function` and token modifiers are like `static` or `async`. The protocol defines a set of token types and modifiers but clients are allowed to extend these and announce the values they support in the corresponding client capability. The predefined values are:
+
+<div class="anchorHolder"><a href="#semanticTokenTypes" name="semanticTokenTypes" class="linkableAnchor"></a></div>
+
+```typescript
+export enum SemanticTokenTypes {
+	namespace = 'namespace',
+	/**
+	 * Represents a generic type. Acts as a fallback for types which
+	 * can't be mapped to a specific type like class or enum.
+	 */
+	type = 'type',
+	class = 'class',
+	enum = 'enum',
+	interface = 'interface',
+	struct = 'struct',
+	typeParameter = 'typeParameter',
+	parameter = 'parameter',
+	variable = 'variable',
+	property = 'property',
+	enumMember = 'enumMember',
+	event = 'event',
+	function = 'function',
+	method = 'method',
+	macro = 'macro',
+	keyword = 'keyword',
+	modifier = 'modifier',
+	comment = 'comment',
+	string = 'string',
+	number = 'number',
+	regexp = 'regexp',
+	operator = 'operator'
+}
+```
+
+<div class="anchorHolder"><a href="#semanticTokenModifiers" name="semanticTokenModifiers" class="linkableAnchor"></a></div>
+
+```typescript
+export enum SemanticTokenModifiers {
+	declaration = 'declaration',
+	definition = 'definition',
+	readonly = 'readonly',
+	static = 'static',
+	deprecated = 'deprecated',
+	abstract = 'abstract',
+	async = 'async',
+	modification = 'modification',
+	documentation = 'documentation',
+	defaultLibrary = 'defaultLibrary'
+}
+```
+
+The protocol defines an additional token format capability to allow future extensions of the format. The only format that is currently specified is `relative` expressing that the tokens are described using relative positions (see Integer Encoding for Tokens below).
+
+<div class="anchorHolder"><a href="#tokenFormat" name="tokenFormat" class="linkableAnchor"></a></div>
+
+```typescript
+export namespace TokenFormat {
+	export const Relative: 'relative' = 'relative';
+}
+
+export type TokenFormat = 'relative';
+```
+
+_Integer Encoding for Tokens_
+
+On the capability level types and modifiers are defined using strings. However the real encoding happens using numbers. The server therefore needs to let the client know which numbers it is using for which types and modifiers. They do so using a legend, which is defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensLegend" name="semanticTokensLegend" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensLegend {
+	/**
+	 * The token types a server uses.
+	 */
+	tokenTypes: string[];
+
+	/**
+	 * The token modifiers a server uses.
+	 */
+	tokenModifiers: string[];
+}
+```
+
+Token types are looked up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Since a token type can have n modifiers, multiple token modifiers can be set by using bit flags,
+so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because bits 0 and 1 are set.
+
+There are different ways how the position of a token can be expressed in a file. Absolute positions or relative positions. The protocol for the token format `relative` uses relative positions, because most tokens remain stable relative to each other when edits are made in a file. This simplifies the computation of a delta if a server supports it. So each token is represented using 5 integers. A specific token `i` in the file consists of the following array indices:
+
+- at index `5*i`   - `deltaLine`: token line number, relative to the previous token
+- at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line)
+- at index `5*i+2` - `length`: the length of the token.
+- at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536.
+- at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
+
+Whether a token can span multiple lines is defined by the client capability `multilineTokenSupport`. If multiline tokens are not supported and a tokens length takes it past the end of the line, it should be treated as if the token ends at the end of the line and will not wrap onto the next line.
+
+The client capability `overlappingTokenSupport` defines whether tokens can overlap each other.
+
+Lets look at a concrete example which uses single line tokens without overlaps for encoding a file with 3 tokens in a number array. We start with absolute positions to demonstrate how they can easily be transformed into relative positions:
+
+```typescript
+{ line: 2, startChar:  5, length: 3, tokenType: "property",
+	tokenModifiers: ["private", "static"]
+},
+{ line: 2, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] },
+{ line: 5, startChar:  2, length: 7, tokenType: "class", tokenModifiers: [] }
+```
+
+First of all, a legend must be devised. This legend must be provided up-front on registration and capture all possible token types and modifiers. For the example we use this legend:
+
+```typescript
+{
+   tokenTypes: ['property', 'type', 'class'],
+   tokenModifiers: ['private', 'static']
+}
+```
+
+The first transformation step is to encode `tokenType` and `tokenModifiers` as integers using the legend. As said, token types are looked up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Multiple token modifiers can be set by using bit flags, so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because bits 0 and 1 are set. Using this legend, the tokens now are:
+
+```typescript
+{ line: 2, startChar:  5, length: 3, tokenType: 0, tokenModifiers: 3 },
+{ line: 2, startChar: 10, length: 4, tokenType: 1, tokenModifiers: 0 },
+{ line: 5, startChar:  2, length: 7, tokenType: 2, tokenModifiers: 0 }
+```
+
+The next step is to represent each token relative to the previous token in the file. In this case, the second token is on the same line as the first token, so the `startChar` of the second token is made relative to the `startChar` of the first token, so it will be `10 - 5`. The third token is on a different line than the second token, so the `startChar` of the third token will not be altered:
+
+```typescript
+{ deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 },
+{ deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 },
+{ deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 }
+```
+
+Finally, the last step is to inline each of the 5 fields for a token in a single array, which is a memory friendly representation:
+
+```typescript
+// 1st token,  2nd token,  3rd token
+[  2,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0 ]
+```
+
+Now assume that the user types a new empty line at the beginning of the file which results in the following tokens in the file:
+
+```typescript
+{ line: 3, startChar:  5, length: 3, tokenType: "property",
+	tokenModifiers: ["private", "static"]
+},
+{ line: 3, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] },
+{ line: 6, startChar:  2, length: 7, tokenType: "class", tokenModifiers: [] }
+```
+
+Running the same transformations as above will result in the following number array:
+
+```typescript
+// 1st token,  2nd token,  3rd token
+[  3,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0]
+```
+
+The delta is now expressed on these number arrays without any form of interpretation what these numbers mean. This is comparable to the text document edits send from the server to the client to modify the content of a file. Those are character based and don't make any assumption about the meaning of the characters. So `[  2,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0 ]` can be transformed into `[  3,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0]` using the following edit description: `{ start:  0, deleteCount: 1, data: [3] }` which tells the client to simply replace the first number (e.g. `2`) in the array with `3`.
+
+Semantic token edits behave conceptually like [text edits](#textEditArray) on documents: if an edit description consists of n edits all n edits are based on the same state Sm of the number array. They will move the number array from state Sm to Sm+1. A client applying the edits must not assume that they are sorted. An easy algorithm to apply them to the number array is to sort the edits and apply them from the back to the front of the number array.
+
+_Client Capability_:
+
+The following client capabilities are defined for semantic token requests sent from the client to the server:
+
+* property name (optional): `textDocument.semanticTokens`
+* property type: `SemanticTokensClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensClientCapabilities" name="semanticTokensClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+interface SemanticTokensClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration. If this is set to
+	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
+	 * StaticRegistrationOptions)` return value for the corresponding server
+	 * capability as well.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * Which requests the client supports and might send to the server
+	 * depending on the server's capability. Please note that clients might not
+	 * show semantic tokens or degrade some of the user experience if a range
+	 * or full request is advertised by the client but not provided by the
+	 * server. If for example the client capability `requests.full` and
+	 * `request.range` are both set to true but the server only provides a
+	 * range provider the client might not render a minimap correctly or might
+	 * even decide to not show any semantic tokens at all.
+	 */
+	requests: {
+		/**
+		 * The client will send the `textDocument/semanticTokens/range` request
+		 * if the server provides a corresponding handler.
+		 */
+		range?: boolean | {
+		};
+
+		/**
+		 * The client will send the `textDocument/semanticTokens/full` request
+		 * if the server provides a corresponding handler.
+		 */
+		full?: boolean | {
+			/**
+			 * The client will send the `textDocument/semanticTokens/full/delta`
+			 * request if the server provides a corresponding handler.
+			 */
+			delta?: boolean;
+		};
+	};
+
+	/**
+	 * The token types that the client supports.
+	 */
+	tokenTypes: string[];
+
+	/**
+	 * The token modifiers that the client supports.
+	 */
+	tokenModifiers: string[];
+
+	/**
+	 * The formats the clients supports.
+	 */
+	formats: TokenFormat[];
+
+	/**
+	 * Whether the client supports tokens that can overlap each other.
+	 */
+	overlappingTokenSupport?: boolean;
+
+	/**
+	 * Whether the client supports tokens that can span multiple lines.
+	 */
+	multilineTokenSupport?: boolean;
+
+	/**
+	 * Whether the client allows the server to actively cancel a
+	 * semantic token request, e.g. supports returning
+	 * ErrorCodes.ServerCancelled. If a server does the client
+	 * needs to retrigger the request.
+	 *
+	 * @since 3.17.0
+	 */
+	serverCancelSupport?: boolean;
+
+	/**
+	 * Whether the client uses semantic tokens to augment existing
+	 * syntax tokens. If set to `true` client side created syntax
+	 * tokens and semantic tokens are both used for colorization. If
+	 * set to `false` the client only uses the returned semantic tokens
+	 * for colorization.
+	 *
+	 * If the value is `undefined` then the client behavior is not
+	 * specified.
+	 *
+	 * @since 3.17.0
+	 */
+	augmentsSyntaxTokens?: boolean;
+}
+```
+
+_Server Capability_:
+
+The following server capabilities are defined for semantic tokens:
+
+* property name (optional): `semanticTokensProvider`
+* property type: `SemanticTokensOptions | SemanticTokensRegistrationOptions` where `SemanticTokensOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensOptions" name="semanticTokensOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensOptions extends WorkDoneProgressOptions {
+	/**
+	 * The legend used by the server
+	 */
+	legend: SemanticTokensLegend;
+
+	/**
+	 * Server supports providing semantic tokens for a specific range
+	 * of a document.
+	 */
+	range?: boolean | {
+	};
+
+	/**
+	 * Server supports providing semantic tokens for a full document.
+	 */
+	full?: boolean | {
+		/**
+		 * The server supports deltas for full documents.
+		 */
+		delta?: boolean;
+	};
+}
+```
+
+_Registration Options_: `SemanticTokensRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensRegistrationOptions" name="semanticTokensRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensRegistrationOptions extends
+	TextDocumentRegistrationOptions, SemanticTokensOptions,
+	StaticRegistrationOptions {
+}
+```
+
+Since the registration option handles range, full and delta requests the method used to register for semantic tokens requests is `textDocument/semanticTokens` and not one of the specific methods described below.
+
+**Requesting semantic tokens for a whole file**
+
+_Request_:
+
+<div class="anchorHolder"><a href="#semanticTokens_fullRequest" name="semanticTokens_fullRequest" class="linkableAnchor"></a></div>
+
+* method: `textDocument/semanticTokens/full`
+* params: `SemanticTokensParams` defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensParams" name="semanticTokensParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+}
+```
+
+_Response_:
+
+* result: `SemanticTokens | null` where `SemanticTokens` is defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokens" name="semanticTokens" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokens {
+	/**
+	 * An optional result id. If provided and clients support delta updating
+	 * the client will include the result id in the next semantic token request.
+	 * A server can then instead of computing all semantic tokens again simply
+	 * send a delta.
+	 */
+	resultId?: string;
+
+	/**
+	 * The actual tokens.
+	 */
+	data: uinteger[];
+}
+```
+
+* partial result: `SemanticTokensPartialResult` defines as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensPartialResult" name="semanticTokensPartialResult" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensPartialResult {
+	data: uinteger[];
+}
+```
+
+* error: code and message set in case an exception happens during the 'textDocument/semanticTokens/full' request
+
+**Requesting semantic token delta for a whole file**
+
+_Request_:
+
+<div class="anchorHolder"><a href="#semanticTokens_deltaRequest" name="semanticTokens_deltaRequest" class="linkableAnchor"></a></div>
+
+* method: `textDocument/semanticTokens/full/delta`
+* params: `SemanticTokensDeltaParams` defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensDeltaParams" name="semanticTokensDeltaParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensDeltaParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The result id of a previous response. The result Id can either point to
+	 * a full response or a delta response depending on what was received last.
+	 */
+	previousResultId: string;
+}
+```
+
+_Response_:
+
+* result: `SemanticTokens | SemanticTokensDelta | null` where `SemanticTokensDelta` is defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensDelta" name="semanticTokensDelta" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensDelta {
+	readonly resultId?: string;
+	/**
+	 * The semantic token edits to transform a previous result into a new
+	 * result.
+	 */
+	edits: SemanticTokensEdit[];
+}
+```
+
+<div class="anchorHolder"><a href="#semanticTokensEdit" name="semanticTokensEdit" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensEdit {
+	/**
+	 * The start offset of the edit.
+	 */
+	start: uinteger;
+
+	/**
+	 * The count of elements to remove.
+	 */
+	deleteCount: uinteger;
+
+	/**
+	 * The elements to insert.
+	 */
+	data?: uinteger[];
+}
+```
+
+* partial result: `SemanticTokensDeltaPartialResult` defines as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensDeltaPartialResult" name="semanticTokensDeltaPartialResult" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensDeltaPartialResult {
+	edits: SemanticTokensEdit[];
+}
+```
+
+* error: code and message set in case an exception happens during the 'textDocument/semanticTokens/full/delta' request
+
+**Requesting semantic tokens for a range**
+
+There are two uses cases where it can be beneficial to only compute semantic tokens for a visible range:
+
+- for faster rendering of the tokens in the user interface when a user opens a file. In this use cases servers should also implement the `textDocument/semanticTokens/full` request as well to allow for flicker free scrolling and semantic coloring of a minimap.
+- if computing semantic tokens for a full document is too expensive servers can only provide a range call. In this case the client might not render a minimap correctly or might even decide to not show any semantic tokens at all.
+
+A server is allowed to compute the semantic tokens for a broader range than requested by the client. However if the server does the semantic tokens for the broader range must be complete and correct.
+
+_Request_:
+
+<div class="anchorHolder"><a href="#semanticTokens_rangeRequest" name="semanticTokens_rangeRequest" class="linkableAnchor"></a></div>
+
+* method: `textDocument/semanticTokens/range`
+* params: `SemanticTokensRangeParams` defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensRangeParams" name="semanticTokensRangeParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensRangeParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The range the semantic tokens are requested for.
+	 */
+	range: Range;
+}
+```
+
+_Response_:
+
+* result: `SemanticTokens | null`
+* partial result: `SemanticTokensPartialResult`
+* error: code and message set in case an exception happens during the 'textDocument/semanticTokens/range' request
+
+**Requesting a refresh of all semantic tokens**
+
+The `workspace/semanticTokens/refresh` request is sent from the server to the client. Servers can use it to ask clients to refresh the editors for which this server provides semantic tokens. As a result the client should ask the server to recompute the semantic tokens for these editors. This is useful if a server detects a project wide configuration change which requires a re-calculation of all semantic tokens. Note that the client still has the freedom to delay the re-calculation of the semantic tokens if for example an editor is currently not visible.
+
+_Client Capability_:
+
+* property name (optional): `workspace.semanticTokens`
+* property type: `SemanticTokensWorkspaceClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#semanticTokensWorkspaceClientCapabilities" name="semanticTokensWorkspaceClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface SemanticTokensWorkspaceClientCapabilities {
+	/**
+	 * Whether the client implementation supports a refresh request sent from
+	 * the server to the client.
+	 *
+	 * Note that this event is global and will force the client to refresh all
+	 * semantic tokens currently shown. It should be used with absolute care
+	 * and is useful for situation where a server for example detect a project
+	 * wide change that requires such a calculation.
+	 */
+	refreshSupport?: boolean;
+}
+```
+
+_Request_:
+
+<div class="anchorHolder"><a href="#semanticTokens_refreshRequest" name="semanticTokens_refreshRequest" class="linkableAnchor"></a></div>
+
+* method: `workspace/semanticTokens/refresh`
+* params: none
+
+_Response_:
+
+* result: void
+* error: code and message set in case an exception happens during the 'workspace/semanticTokens/refresh' request
+
+#### <a href="#textDocument_inlayHint" name="textDocument_inlayHint" class="anchor">Inlay Hint Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.17.0*
+
+The inlay hints request is sent from the client to the server to compute inlay hints for a given [text document, range] tuple that may be rendered in the editor in place with other text.
+
+_Client Capability_:
+* property name (optional): `textDocument.inlayHint`
+* property type: `InlayHintClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#inlayHintClientCapabilities" name="inlayHintClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inlay hint client capabilities.
+ *
+ * @since 3.17.0
+ */
+export interface InlayHintClientCapabilities {
+
+	/**
+	 * Whether inlay hints support dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * Indicates which properties a client can resolve lazily on a inlay
+	 * hint.
+	 */
+	resolveSupport?: {
+
+		/**
+		 * The properties that a client can resolve lazily.
+		 */
+		properties: string[];
+	};
+}
+```
+
+_Server Capability_:
+* property name (optional): `inlayHintProvider`
+* property type: `InlayHintOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#inlayHintOptions" name="inlayHintOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inlay hint options used during static registration.
+ *
+ * @since 3.17.0
+ */
+export interface InlayHintOptions extends WorkDoneProgressOptions {
+	/**
+	 * The server provides support to resolve additional
+	 * information for an inlay hint item.
+	 */
+	resolveProvider?: boolean;
+}
+```
+
+_Registration Options_: `InlayHintRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#inlayHintRegistrationOptions" name="inlayHintRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inlay hint options used during static or dynamic registration.
+ *
+ * @since 3.17.0
+ */
+export interface InlayHintRegistrationOptions extends InlayHintOptions,
+	TextDocumentRegistrationOptions, StaticRegistrationOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/inlayHint`
+* params: `InlayHintParams` defined as follows:
+
+<div class="anchorHolder"><a href="#inlayHintParams" name="inlayHintParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A parameter literal used in inlay hint requests.
+ *
+ * @since 3.17.0
+ */
+export interface InlayHintParams extends WorkDoneProgressParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The visible document range for which inlay hints should be computed.
+	 */
+	range: Range;
+}
+```
+
+_Response_:
+* result: `InlayHint[]` \| `null` defined as follows:
+
+<div class="anchorHolder"><a href="#inlayHint" name="inlayHint" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inlay hint information.
+ *
+ * @since 3.17.0
+ */
+export interface InlayHint {
+
+	/**
+	 * The position of this hint.
+	 */
+	position: Position;
+
+	/**
+	 * The label of this hint. A human readable string or an array of
+	 * InlayHintLabelPart label parts.
+	 *
+	 * *Note* that neither the string nor the label part can be empty.
+	 */
+	label: string | InlayHintLabelPart[];
+
+	/**
+	 * The kind of this hint. Can be omitted in which case the client
+	 * should fall back to a reasonable default.
+	 */
+	kind?: InlayHintKind;
+
+	/**
+	 * Optional text edits that are performed when accepting this inlay hint.
+	 *
+	 * *Note* that edits are expected to change the document so that the inlay
+	 * hint (or its nearest variant) is now part of the document and the inlay
+	 * hint itself is now obsolete.
+	 *
+	 * Depending on the client capability `inlayHint.resolveSupport` clients
+	 * might resolve this property late using the resolve request.
+	 */
+	textEdits?: TextEdit[];
+
+	/**
+	 * The tooltip text when you hover over this item.
+	 *
+	 * Depending on the client capability `inlayHint.resolveSupport` clients
+	 * might resolve this property late using the resolve request.
+	 */
+	tooltip?: string | MarkupContent;
+
+	/**
+	 * Render padding before the hint.
+	 *
+	 * Note: Padding should use the editor's background color, not the
+	 * background color of the hint itself. That means padding can be used
+	 * to visually align/separate an inlay hint.
+	 */
+	paddingLeft?: boolean;
+
+	/**
+	 * Render padding after the hint.
+	 *
+	 * Note: Padding should use the editor's background color, not the
+	 * background color of the hint itself. That means padding can be used
+	 * to visually align/separate an inlay hint.
+	 */
+	paddingRight?: boolean;
+
+
+	/**
+	 * A data entry field that is preserved on a inlay hint between
+	 * a `textDocument/inlayHint` and a `inlayHint/resolve` request.
+	 */
+	data?: LSPAny;
+}
+```
+
+<div class="anchorHolder"><a href="#inlayHintLabelPart" name="inlayHintLabelPart" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * An inlay hint label part allows for interactive and composite labels
+ * of inlay hints.
+ *
+ * @since 3.17.0
+ */
+export interface InlayHintLabelPart {
+
+	/**
+	 * The value of this label part.
+	 */
+	value: string;
+
+	/**
+	 * The tooltip text when you hover over this label part. Depending on
+	 * the client capability `inlayHint.resolveSupport` clients might resolve
+	 * this property late using the resolve request.
+	 */
+	tooltip?: string | MarkupContent;
+
+	/**
+	 * An optional source code location that represents this
+	 * label part.
+	 *
+	 * The editor will use this location for the hover and for code navigation
+	 * features: This part will become a clickable link that resolves to the
+	 * definition of the symbol at the given location (not necessarily the
+	 * location itself), it shows the hover that shows at the given location,
+	 * and it shows a context menu with further code navigation commands.
+	 *
+	 * Depending on the client capability `inlayHint.resolveSupport` clients
+	 * might resolve this property late using the resolve request.
+	 */
+	location?: Location;
+
+	/**
+	 * An optional command for this label part.
+	 *
+	 * Depending on the client capability `inlayHint.resolveSupport` clients
+	 * might resolve this property late using the resolve request.
+	 */
+	command?: Command;
+}
+```
+
+<div class="anchorHolder"><a href="#inlayHintKind" name="inlayHintKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inlay hint kinds.
+ *
+ * @since 3.17.0
+ */
+export namespace InlayHintKind {
+
+	/**
+	 * An inlay hint that for a type annotation.
+	 */
+	export const Type = 1;
+
+	/**
+	 * An inlay hint that is for a parameter.
+	 */
+	export const Parameter = 2;
+};
+```
+
+* error: code and message set in case an exception happens during the inlay hint request.
+
+#### <a href="#inlayHint_resolve" name="inlayHint_resolve" class="anchor">Inlay Hint Resolve Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.17.0*
+
+The request is sent from the client to the server to resolve additional information for a given inlay hint. This is usually used to compute
+the `tooltip`, `location` or `command` properties of a inlay hint's label part to avoid its unnecessary computation during the `textDocument/inlayHint` request.
+
+Consider the clients announces the `label.location` property as a property that can be resolved lazy using the client capability
+
+```typescript
+textDocument.inlayHint.resolveSupport = { properties: ['label.location'] };
+```
+
+then an inlay hint with a label part without a location needs to be resolved using the `inlayHint/resolve` request before it can be used.
+
+_Client Capability_:
+* property name (optional): `textDocument.inlayHint.resolveSupport`
+* property type: `{ properties: string[]; }`
+
+_Request_:
+* method: `inlayHint/resolve`
+* params: `InlayHint`
+
+_Response_:
+* result: `InlayHint`
+* error: code and message set in case an exception happens during the completion resolve request.
+
+#### <a href="#workspace_inlayHint_refresh" name="workspace_inlayHint_refresh" class="anchor">Inlay Hint Refresh Request  (:arrow_right_hook:)</a>
+
+> *Since version 3.17.0*
+
+The `workspace/inlayHint/refresh` request is sent from the server to the client. Servers can use it to ask clients to refresh the inlay hints currently shown in editors. As a result the client should ask the server to recompute the inlay hints for these editors. This is useful if a server detects a configuration change which requires a re-calculation of all inlay hints. Note that the client still has the freedom to delay the re-calculation of the inlay hints if for example an editor is currently not visible.
+
+_Client Capability_:
+
+* property name (optional): `workspace.inlayHint`
+* property type: `InlayHintWorkspaceClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#inlayHintWorkspaceClientCapabilities" name="inlayHintWorkspaceClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Client workspace capabilities specific to inlay hints.
+ *
+ * @since 3.17.0
+ */
+export interface InlayHintWorkspaceClientCapabilities {
+	/**
+	 * Whether the client implementation supports a refresh request sent from
+	 * the server to the client.
+	 *
+	 * Note that this event is global and will force the client to refresh all
+	 * inlay hints currently shown. It should be used with absolute care and
+	 * is useful for situation where a server for example detects a project wide
+	 * change that requires such a calculation.
+	 */
+	refreshSupport?: boolean;
+}
+```
+
+_Request_:
+* method: `workspace/inlayHint/refresh`
+* params: none
+
+_Response_:
+
+* result: void
+* error: code and message set in case an exception happens during the 'workspace/inlayHint/refresh' request
+
+#### <a href="#textDocument_inlineValue" name="textDocument_inlineValue" class="anchor">Inline Value Request (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.17.0*
+
+The inline value request is sent from the client to the server to compute inline values for a given text document that may be rendered in the editor at the end of lines.
+
+_Client Capability_:
+* property name (optional): `textDocument.inlineValue`
+* property type: `InlineValueClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#inlineValueClientCapabilities" name="inlineValueClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Client capabilities specific to inline values.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration for inline
+	 * value providers.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+* property name (optional): `inlineValueProvider`
+* property type: `InlineValueOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#inlineValueOptions" name="inlineValueOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inline value options used during static registration.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `InlineValueRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#inlineValueRegistrationOptions" name="inlineValueRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inline value options used during static or dynamic registration.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueRegistrationOptions extends InlineValueOptions,
+	TextDocumentRegistrationOptions, StaticRegistrationOptions {
+}
+```
+
+_Request_:
+* method: `textDocument/inlineValue`
+* params: `InlineValueParams` defined as follows:
+
+<div class="anchorHolder"><a href="#inlineValueParams" name="inlineValueParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A parameter literal used in inline value requests.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueParams extends WorkDoneProgressParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The document range for which inline values should be computed.
+	 */
+	range: Range;
+
+	/**
+	 * Additional information about the context in which inline values were
+	 * requested.
+	 */
+	context: InlineValueContext;
+}
+```
+
+<div class="anchorHolder"><a href="#inlineValueContext" name="inlineValueContext" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * @since 3.17.0
+ */
+export interface InlineValueContext {
+	/**
+	 * The document range where execution has stopped.
+	 * Typically the end position of the range denotes the line where the
+	 * inline values are shown.
+	 */
+	stoppedLocation: Range;
+}
+```
+
+_Response_:
+* result: `InlineValue[]` \| `null` defined as follows:
+
+<div class="anchorHolder"><a href="#inlineValueText" name="inlineValueText" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Provide inline value as text.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueText {
+	/**
+	 * The document range for which the inline value applies.
+	 */
+	range: Range;
+
+	/**
+	 * The text of the inline value.
+	 */
+	text: string;
+}
+```
+
+<div class="anchorHolder"><a href="#inlineValueVariableLookup" name="inlineValueVariableLookup" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Provide inline value through a variable lookup.
+ *
+ * If only a range is specified, the variable name will be extracted from
+ * the underlying document.
+ *
+ * An optional variable name can be used to override the extracted name.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueVariableLookup {
+	/**
+	 * The document range for which the inline value applies.
+	 * The range is used to extract the variable name from the underlying
+	 * document.
+	 */
+	range: Range;
+
+	/**
+	 * If specified the name of the variable to look up.
+	 */
+	variableName?: string;
+
+	/**
+	 * How to perform the lookup.
+	 */
+	caseSensitiveLookup: boolean;
+}
+```
+
+<div class="anchorHolder"><a href="#inlineValueEvaluatableExpression" name="inlineValueEvaluatableExpression" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Provide an inline value through an expression evaluation.
+ *
+ * If only a range is specified, the expression will be extracted from the
+ * underlying document.
+ *
+ * An optional expression can be used to override the extracted expression.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueEvaluatableExpression {
+	/**
+	 * The document range for which the inline value applies.
+	 * The range is used to extract the evaluatable expression from the
+	 * underlying document.
+	 */
+	range: Range;
+
+	/**
+	 * If specified the expression overrides the extracted expression.
+	 */
+	expression?: string;
+}
+```
+
+<div class="anchorHolder"><a href="#inlineValue" name="inlineValue" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Inline value information can be provided by different means:
+ * - directly as a text value (class InlineValueText).
+ * - as a name to use for a variable lookup (class InlineValueVariableLookup)
+ * - as an evaluatable expression (class InlineValueEvaluatableExpression)
+ * The InlineValue types combines all inline value types into one type.
+ *
+ * @since 3.17.0
+ */
+export type InlineValue = InlineValueText | InlineValueVariableLookup
+	| InlineValueEvaluatableExpression;
+```
+* error: code and message set in case an exception happens during the inline values request.
+
+#### <a href="#workspace_inlineValue_refresh" name="workspace_inlineValue_refresh" class="anchor">Inline Value Refresh Request  (:arrow_right_hook:)</a>
+
+> *Since version 3.17.0*
+
+The `workspace/inlineValue/refresh` request is sent from the server to the client. Servers can use it to ask clients to refresh the inline values currently shown in editors. As a result the client should ask the server to recompute the inline values for these editors. This is useful if a server detects a configuration change which requires a re-calculation of all inline values. Note that the client still has the freedom to delay the re-calculation of the inline values if for example an editor is currently not visible.
+
+_Client Capability_:
+
+* property name (optional): `workspace.inlineValue`
+* property type: `InlineValueWorkspaceClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#inlineValueWorkspaceClientCapabilities" name="inlineValueWorkspaceClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Client workspace capabilities specific to inline values.
+ *
+ * @since 3.17.0
+ */
+export interface InlineValueWorkspaceClientCapabilities {
+	/**
+	 * Whether the client implementation supports a refresh request sent from
+	 * the server to the client.
+	 *
+	 * Note that this event is global and will force the client to refresh all
+	 * inline values currently shown. It should be used with absolute care and
+	 * is useful for situation where a server for example detect a project wide
+	 * change that requires such a calculation.
+	 */
+	refreshSupport?: boolean;
+}
+```
+_Request_:
+* method: `workspace/inlineValue/refresh`
+* params: none
+
+_Response_:
+
+* result: void
+* error: code and message set in case an exception happens during the 'workspace/inlineValue/refresh' request
+
+#### <a href="#textDocument_moniker" name="textDocument_moniker" class="anchor">Monikers (:leftwards_arrow_with_hook:)</a>
+
+> *Since version 3.16.0*
+
+Language Server Index Format (LSIF) introduced the concept of symbol monikers to help associate symbols across different indexes. This request adds capability for LSP server implementations to provide the same symbol moniker information given a text document position. Clients can utilize this method to get the moniker at the current location in a file user is editing and do further code navigation queries in other services that rely on LSIF indexes and link symbols together.
+
+The `textDocument/moniker` request is sent from the client to the server to get the symbol monikers for a given text document position. An array of Moniker types is returned as response to indicate possible monikers at the given location. If no monikers can be calculated, an empty array or `null` should be returned.
+
+_Client Capabilities_:
+
+* property name (optional): `textDocument.moniker`
+* property type: `MonikerClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#monikerClientCapabilities" name="monikerClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+interface MonikerClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration. If this is set to
+	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
+	 * StaticRegistrationOptions)` return value for the corresponding server
+	 * capability as well.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Server Capability_:
+
+* property name (optional): `monikerProvider`
+* property type: `boolean | MonikerOptions | MonikerRegistrationOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#monikerOptions" name="monikerOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface MonikerOptions extends WorkDoneProgressOptions {
+}
+```
+
+_Registration Options_: `MonikerRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#monikerRegistrationOptions" name="monikerRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface MonikerRegistrationOptions extends
+	TextDocumentRegistrationOptions, MonikerOptions {
+}
+```
+
+_Request_:
+
+* method: `textDocument/moniker`
+* params: `MonikerParams` defined as follows:
+
+<div class="anchorHolder"><a href="#monikerParams" name="monikerParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface MonikerParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
+}
+```
+
+_Response_:
+
+* result: `Moniker[] | null`
+* partial result: `Moniker[]`
+* error: code and message set in case an exception happens during the 'textDocument/moniker' request
+
+`Moniker` is defined as follows:
+
+<div class="anchorHolder"><a href="#uniquenessLevel" name="uniquenessLevel" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Moniker uniqueness level to define scope of the moniker.
+ */
+export enum UniquenessLevel {
+	/**
+	 * The moniker is only unique inside a document
+	 */
+	document = 'document',
+
+	/**
+	 * The moniker is unique inside a project for which a dump got created
+	 */
+	project = 'project',
+
+	/**
+	 * The moniker is unique inside the group to which a project belongs
+	 */
+	group = 'group',
+
+	/**
+	 * The moniker is unique inside the moniker scheme.
+	 */
+	scheme = 'scheme',
+
+	/**
+	 * The moniker is globally unique
+	 */
+	global = 'global'
+}
+```
+
+<div class="anchorHolder"><a href="#monikerKind" name="monikerKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The moniker kind.
+ */
+export enum MonikerKind {
+	/**
+	 * The moniker represent a symbol that is imported into a project
+	 */
+	import = 'import',
+
+	/**
+	 * The moniker represents a symbol that is exported from a project
+	 */
+	export = 'export',
+
+	/**
+	 * The moniker represents a symbol that is local to a project (e.g. a local
+	 * variable of a function, a class not visible outside the project, ...)
+	 */
+	local = 'local'
+}
+```
+
+<div class="anchorHolder"><a href="#moniker" name="moniker" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Moniker definition to match LSIF 0.5 moniker definition.
+ */
+export interface Moniker {
+	/**
+	 * The scheme of the moniker. For example tsc or .Net
+	 */
+	scheme: string;
+
+	/**
+	 * The identifier of the moniker. The value is opaque in LSIF however
+	 * schema owners are allowed to define the structure if they want.
+	 */
+	identifier: string;
+
+	/**
+	 * The scope in which the moniker is unique
+	 */
+	unique: UniquenessLevel;
+
+	/**
+	 * The moniker kind if known.
+	 */
+	kind?: MonikerKind;
+}
+```
+
+##### Notes
+
+Server implementations of this method should ensure that the moniker calculation matches to those used in the corresponding LSIF implementation to ensure symbols can be associated correctly across IDE sessions and LSIF indexes.
 #### <a href="#textDocument_completion" name="textDocument_completion" class="anchor">Completion Request (:leftwards_arrow_with_hook:)</a>
 
-The Completion request is sent from the client to the server to compute completion items at a given cursor position. Completion items are presented in the [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense) user interface. If computing full completion items is expensive, servers can additionally provide a handler for the completion item resolve request ('completionItem/resolve'). This request is sent when a completion item is selected in the user interface. A typical use case is for example: the 'textDocument/completion' request doesn't fill in the `documentation` property for returned completion items since it is expensive to compute. When the item is selected in the user interface then a 'completionItem/resolve' request is sent with the selected completion item as a parameter. The returned completion item should have the documentation property filled in. By default the request can only delay the computation of the `detail` and `documentation` properties. Since 3.16.0 the client
+The Completion request is sent from the client to the server to compute completion items at a given cursor position. Completion items are presented in the [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense) user interface. If computing full completion items is expensive, servers can additionally provide a handler for the completion item resolve request ('completionItem/resolve'). This request is sent when a completion item is selected in the user interface. A typical use case is for example: the `textDocument/completion` request doesn't fill in the `documentation` property for returned completion items since it is expensive to compute. When the item is selected in the user interface then a 'completionItem/resolve' request is sent with the selected completion item as a parameter. The returned completion item should have the documentation property filled in. By default the request can only delay the computation of the `detail` and `documentation` properties. Since 3.16.0 the client
 can signal that it can resolve more properties lazily. This is done using the `completionItem#resolveSupport` client capability which lists all properties that can be filled in during a 'completionItem/resolve' request. All other properties (usually `sortText`, `filterText`, `insertText` and `textEdit`) must be provided in the `textDocument/completion` response and must not be changed during resolve.
 
+The language server protocol uses the following model around completions:
+
+- to achieve consistency across languages and to honor different clients usually the client is responsible for filtering and sorting. This has also the advantage that client can experiment with different filter and sorting models. However servers can enforce different behavior by setting a `filterText` / `sortText`
+- for speed clients should be able to filter an already received completion list if the user continues typing. Servers can opt out of this using a `CompletionList` and mark it as `isIncomplete`.
+
+A completion item provides additional means to influence filtering and sorting. They are expressed by either creating a `CompletionItem` with a `insertText` or with a `textEdit`. The two modes differ as follows:
+
+- **Completion item provides an insertText / label without a text edit**: in the model the client should filter against what the user has already typed using the word boundary rules of the language (e.g. resolving the word under the cursor position). The reason for this mode is that it makes it extremely easy for a server to implement a basic completion list and get it filtered on the client.
+
+- **Completion Item with text edits**: in this mode the server tells the client that it actually knows what it is doing. If you create a completion item with a text edit at the current cursor position no word guessing takes place and no filtering should happen. This mode can be combined with a sort text and filter text to customize two things. If the text edit is a replace edit then the range denotes the word used for filtering. If the replace changes the text it most likely makes sense to specify a filter text to be used.
+
 _Client Capability_:
 * property name (optional): `textDocument.completion`
 * property type: `CompletionClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#completionClientCapabilities" name="completionClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface CompletionClientCapabilities {
 	/**
@@ -4302,7 +7265,7 @@
 		commitCharactersSupport?: boolean;
 
 		/**
-		 * Client supports the following content formats for the documentation
+		 * Client supports the follow content formats for the documentation
 		 * property. The order describes the preferred format of the client.
 		 */
 		documentationFormat?: MarkupKind[];
@@ -4357,13 +7320,21 @@
 		/**
 		 * The client supports the `insertTextMode` property on
 		 * a completion item to override the whitespace handling mode
-		 * as defined by the client.
+		 * as defined by the client (see `insertTextMode`).
 		 *
 		 * @since 3.16.0
 		 */
 		insertTextModeSupport?: {
 			valueSet: InsertTextMode[];
 		};
+
+		/**
+		 * The client has support for completion item label
+		 * details (see also `CompletionItemLabelDetails`).
+		 *
+		 * @since 3.17.0
+		 */
+		labelDetailsSupport?: boolean;
 	};
 
 	completionItemKind?: {
@@ -4385,6 +7356,34 @@
 	 * `textDocument/completion` request.
 	 */
 	contextSupport?: boolean;
+
+	/**
+	 * The client's default when the completion item doesn't provide a
+	 * `insertTextMode` property.
+	 *
+	 * @since 3.17.0
+	 */
+	insertTextMode?: InsertTextMode;
+
+	/**
+	 * The client supports the following `CompletionList` specific
+	 * capabilities.
+	 *
+	 * @since 3.17.0
+	 */
+	completionList?: {
+		/**
+		 * The client supports the the following itemDefaults on
+		 * a completion list.
+		 *
+		 * The value lists the supported property names of the
+		 * `CompletionList.itemDefaults` object. If omitted
+		 * no properties are supported.
+		 *
+		 * @since 3.17.0
+		 */
+		itemDefaults?: string[];
+	}
 }
 ```
 
@@ -4392,6 +7391,8 @@
 * property name (optional): `completionProvider`
 * property type: `CompletionOptions` defined as follows:
 
+<div class="anchorHolder"><a href="#completionOptions" name="completionOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Completion options.
@@ -4429,10 +7430,30 @@
 	 * information for a completion item.
 	 */
 	resolveProvider?: boolean;
+
+	/**
+	 * The server supports the following `CompletionItem` specific
+	 * capabilities.
+	 *
+	 * @since 3.17.0
+	 */
+	completionItem?: {
+		/**
+		 * The server has support for completion item label
+		 * details (see also `CompletionItemLabelDetails`) when receiving
+		 * a completion item in a resolve call.
+		 *
+		 * @since 3.17.0
+		 */
+		labelDetailsSupport?: boolean;
+	}
 }
 ```
 
 _Registration Options_: `CompletionRegistrationOptions` options defined as follows:
+
+<div class="anchorHolder"><a href="#completionRegistrationOptions" name="completionRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface CompletionRegistrationOptions
 	extends TextDocumentRegistrationOptions, CompletionOptions {
@@ -4440,9 +7461,11 @@
 ```
 
 _Request_:
-* method: 'textDocument/completion'
+* method: `textDocument/completion`
 * params: `CompletionParams` defined as follows:
 
+<div class="anchorHolder"><a href="#completionParams" name="completionParams" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface CompletionParams extends TextDocumentPositionParams,
 	WorkDoneProgressParams, PartialResultParams {
@@ -4453,7 +7476,11 @@
 	 */
 	context?: CompletionContext;
 }
+```
 
+<div class="anchorHolder"><a href="#completionTriggerKind" name="completionTriggerKind" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * How a completion was triggered
  */
@@ -4477,8 +7504,11 @@
 	export const TriggerForIncompleteCompletions: 3 = 3;
 }
 export type CompletionTriggerKind = 1 | 2 | 3;
+```
 
+<div class="anchorHolder"><a href="#completionContext" name="completionContext" class="linkableAnchor"></a></div>
 
+```typescript
 /**
  * Contains additional information about the context in which a completion
  * request is triggered.
@@ -4501,6 +7531,8 @@
 _Response_:
 * result: `CompletionItem[]` \| `CompletionList` \| `null`. If a `CompletionItem[]` is provided it is interpreted to be complete. So it is the same as `{ isIncomplete: false, items }`
 
+<div class="anchorHolder"><a href="#completionList" name="completionList" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Represents a collection of [completion items](#CompletionItem) to be
@@ -4517,11 +7549,63 @@
 	isIncomplete: boolean;
 
 	/**
+	 * In many cases the items of an actual completion result share the same
+	 * value for properties like `commitCharacters` or the range of a text
+	 * edit. A completion list can therefore define item defaults which will
+	 * be used if a completion item itself doesn't specify the value.
+	 *
+	 * If a completion list specifies a default value and a completion item
+	 * also specifies a corresponding value the one from the item is used.
+	 *
+	 * Servers are only allowed to return default values if the client
+	 * signals support for this via the `completionList.itemDefaults`
+	 * capability.
+	 *
+	 * @since 3.17.0
+	 */
+	itemDefaults?: {
+		/**
+		 * A default commit character set.
+		 *
+		 * @since 3.17.0
+		 */
+		commitCharacters?: string[];
+
+		/**
+		 * A default edit range
+		 *
+		 * @since 3.17.0
+		 */
+		editRange?: Range | {
+			insert: Range;
+			replace: Range;
+		};
+
+		/**
+		 * A default insert text format
+		 *
+		 * @since 3.17.0
+		 */
+		insertTextFormat?: InsertTextFormat;
+
+		/**
+		 * A default insert text mode
+		 *
+		 * @since 3.17.0
+		 */
+		insertTextMode?: InsertTextMode;
+	}
+
+	/**
 	 * The completion items.
 	 */
 	items: CompletionItem[];
 }
+```
 
+<div class="anchorHolder"><a href="#insertTextFormat" name="insertTextFormat" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Defines whether the insert text in a completion item should be interpreted as
  * plain text or a snippet.
@@ -4544,7 +7628,11 @@
 }
 
 export type InsertTextFormat = 1 | 2;
+```
 
+<div class="anchorHolder"><a href="#completionItemTag" name="completionItemTag" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Completion item tags are extra annotations that tweak the rendering of a
  * completion item.
@@ -4559,7 +7647,11 @@
 }
 
 export type CompletionItemTag = 1;
+```
 
+<div class="anchorHolder"><a href="#insertReplaceEdit" name="insertReplaceEdit" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * A special text edit to provide an insert and a replace operation.
  *
@@ -4581,7 +7673,11 @@
 	 */
 	replace: Range;
 }
+```
 
+<div class="anchorHolder"><a href="#insertTextMode" name="insertTextMode" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * How whitespace and indentation is handled during completion
  * item insertion.
@@ -4611,16 +7707,59 @@
 }
 
 export type InsertTextMode = 1 | 2;
+```
 
-export interface CompletionItem {
+<div class="anchorHolder"><a href="#completionItemLabelDetails" name="completionItemLabelDetails" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Additional details for a completion item label.
+ *
+ * @since 3.17.0
+ */
+export interface CompletionItemLabelDetails {
+
 	/**
-	 * The label of this completion item. By default
-	 * also the text that is inserted when selecting
-	 * this completion.
+	 * An optional string which is rendered less prominently directly after
+	 * {@link CompletionItem.label label}, without any spacing. Should be
+	 * used for function signatures or type annotations.
+	 */
+	detail?: string;
+
+	/**
+	 * An optional string which is rendered less prominently after
+	 * {@link CompletionItemLabelDetails.detail}. Should be used for fully qualified
+	 * names or file path.
+	 */
+	description?: string;
+}
+```
+
+<div class="anchorHolder"><a href="#completionItem" name="completionItem" class="linkableAnchor"></a></div>
+
+```typescript
+export interface CompletionItem {
+
+	/**
+	 * The label of this completion item.
+	 *
+	 * The label property is also by default the text that
+	 * is inserted when selecting this completion.
+	 *
+	 * If label details are provided the label itself should
+	 * be an unqualified name of the completion item.
 	 */
 	label: string;
 
 	/**
+	 * Additional details for the label
+	 *
+	 * @since 3.17.0
+	 */
+	labelDetails?: CompletionItemLabelDetails;
+
+
+	/**
 	 * The kind of this completion item. Based of the kind
 	 * an icon is chosen by the editor. The standardized set
 	 * of available values is defined in `CompletionItemKind`.
@@ -4694,14 +7833,19 @@
 	 * The format of the insert text. The format applies to both the
 	 * `insertText` property and the `newText` property of a provided
 	 * `textEdit`. If omitted defaults to `InsertTextFormat.PlainText`.
+	 *
+	 * Please note that the insertTextFormat doesn't apply to
+	 * `additionalTextEdits`.
 	 */
 	insertTextFormat?: InsertTextFormat;
 
 	/**
 	 * How whitespace and indentation is handled during completion
-	 * item insertion. If not provided the client's default value is used.
+	 * item insertion. If not provided the client's default value depends on
+	 * the `textDocument.completion.insertTextMode` client capability.
 	 *
 	 * @since 3.16.0
+	 * @since 3.17.0 - support for `textDocument.completion.insertTextMode`
 	 */
 	insertTextMode?: InsertTextMode;
 
@@ -4717,8 +7861,8 @@
 	 * existing text with a completion text. Since this can usually not be
 	 * predetermined by a server it can report both ranges. Clients need to
 	 * signal support for `InsertReplaceEdit`s via the
-	 * `textDocument.completion.insertReplaceSupport` client capability
-	 * property.
+	 * `textDocument.completion.completionItem.insertReplaceSupport` client
+	 * capability property.
 	 *
 	 * *Note 1:* The text edit's range as well as both ranges from an insert
 	 * replace edit must be a [single line] and they must contain the position
@@ -4732,6 +7876,20 @@
 	textEdit?: TextEdit | InsertReplaceEdit;
 
 	/**
+	 * The edit text used if the completion item is part of a CompletionList and
+	 * CompletionList defines an item default for the text edit range.
+	 *
+	 * Clients will only honor this property if they opt into completion list
+	 * item defaults using the capability `completionList.itemDefaults`.
+	 *
+	 * If not provided and a list's default range is provided the label
+	 * property is used as a text.
+	 *
+	 * @since 3.17.0
+	 */
+	textEditText?: string;
+
+	/**
 	 * An optional array of additional text edits that are applied when
 	 * selecting this completion. Edits must not overlap (including the same
 	 * insert position) with the main edit nor with themselves.
@@ -4761,9 +7919,13 @@
 	 * A data entry field that is preserved on a completion item between
 	 * a completion and a completion resolve request.
 	 */
-	data?: any;
+	data?: LSPAny;
 }
+```
 
+<div class="anchorHolder"><a href="#completionItemKind" name="completionItemKind" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * The kind of a completion entry.
  */
@@ -4885,107 +8047,608 @@
 The request is sent from the client to the server to resolve additional information for a given completion item.
 
 _Request_:
-* method: 'completionItem/resolve'
+* method: `completionItem/resolve`
 * params: `CompletionItem`
 
 _Response_:
 * result: `CompletionItem`
 * error: code and message set in case an exception happens during the completion resolve request.
 
-#### <a href="#textDocument_hover" name="textDocument_hover" class="anchor">Hover Request (:leftwards_arrow_with_hook:)</a>
+#### <a href="#textDocument_publishDiagnostics" name="textDocument_publishDiagnostics" class="anchor">PublishDiagnostics Notification (:arrow_left:)</a>
 
-The hover request is sent from the client to the server to request hover information at a given text document position.
+Diagnostics notification are sent from the server to the client to signal results of validation runs.
+
+Diagnostics are "owned" by the server so it is the server's responsibility to clear them if necessary. The following rule is used for VS Code servers that generate diagnostics:
+
+* if a language is single file only (for example HTML) then diagnostics are cleared by the server when the file is closed. Please note that open / close events don't necessarily reflect what the user sees in the user interface. These events are ownership events. So with the current version of the specification it is possible that problems are not cleared although the file is not visible in the user interface since the client has not closed the file yet.
+* if a language has a project system (for example C#) diagnostics are not cleared when a file closes. When a project is opened all diagnostics for all files are recomputed (or read from a cache).
+
+When a file changes it is the server's responsibility to re-compute diagnostics and push them to the client. If the computed set is empty it has to push the empty array to clear former diagnostics. Newly pushed diagnostics always replace previously pushed diagnostics. There is no merging that happens on the client side.
+
+See also the [Diagnostic](#diagnostic) section.
 
 _Client Capability_:
-* property name (optional): `textDocument.hover`
-* property type: `HoverClientCapabilities` defined as follows:
+* property name (optional): `textDocument.publishDiagnostics`
+* property type: `PublishDiagnosticsClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#publishDiagnosticsClientCapabilities" name="publishDiagnosticsClientCapabilities" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface HoverClientCapabilities {
+export interface PublishDiagnosticsClientCapabilities {
 	/**
-	 * Whether hover supports dynamic registration.
+	 * Whether the clients accepts diagnostics with related information.
+	 */
+	relatedInformation?: boolean;
+
+	/**
+	 * Client supports the tag property to provide meta data about a diagnostic.
+	 * Clients supporting tags have to handle unknown tags gracefully.
+	 *
+	 * @since 3.15.0
+	 */
+	tagSupport?: {
+		/**
+		 * The tags supported by the client.
+		 */
+		valueSet: DiagnosticTag[];
+	};
+
+	/**
+	 * Whether the client interprets the version property of the
+	 * `textDocument/publishDiagnostics` notification's parameter.
+	 *
+	 * @since 3.15.0
+	 */
+	versionSupport?: boolean;
+
+	/**
+	 * Client supports a codeDescription property
+	 *
+	 * @since 3.16.0
+	 */
+	codeDescriptionSupport?: boolean;
+
+	/**
+	 * Whether code action supports the `data` property which is
+	 * preserved between a `textDocument/publishDiagnostics` and
+	 * `textDocument/codeAction` request.
+	 *
+	 * @since 3.16.0
+	 */
+	dataSupport?: boolean;
+}
+```
+
+_Notification_:
+* method: `textDocument/publishDiagnostics`
+* params: `PublishDiagnosticsParams` defined as follows:
+
+<div class="anchorHolder"><a href="#publishDiagnosticsParams" name="publishDiagnosticsParams" class="linkableAnchor"></a></div>
+
+```typescript
+interface PublishDiagnosticsParams {
+	/**
+	 * The URI for which diagnostic information is reported.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * Optional the version number of the document the diagnostics are published
+	 * for.
+	 *
+	 * @since 3.15.0
+	 */
+	version?: integer;
+
+	/**
+	 * An array of diagnostic information items.
+	 */
+	diagnostics: Diagnostic[];
+}
+```
+
+#### <a href="#textDocument_pullDiagnostics" name="textDocument_pullDiagnostics" class="anchor">Pull Diagnostics</a>
+
+Diagnostics are currently published by the server to the client using a notification. This model has the advantage that for workspace wide diagnostics the server has the freedom to compute them at a server preferred point in time. On the other hand the approach has the disadvantage that the server can't prioritize the computation for the file in which the user types or which are visible in the editor. Inferring the client's UI state from the `textDocument/didOpen` and `textDocument/didChange` notifications might lead to false positives since these notifications are ownership transfer notifications.
+
+The specification therefore introduces the concept of diagnostic pull requests to give a client more control over the documents for which diagnostics should be computed and at which point in time.
+
+_Client Capability_:
+* property name (optional): `textDocument.diagnostic`
+* property type: `DiagnosticClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#diagnosticClientCapabilities" name="diagnosticClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Client capabilities specific to diagnostic pull requests.
+ *
+ * @since 3.17.0
+ */
+export interface DiagnosticClientCapabilities {
+	/**
+	 * Whether implementation supports dynamic registration. If this is set to
+	 * `true` the client supports the new
+	 * `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+	 * return value for the corresponding server capability as well.
 	 */
 	dynamicRegistration?: boolean;
 
 	/**
-	 * Client supports the following content formats if the content
-	 * property refers to a `literal of type MarkupContent`.
-	 * The order describes the preferred format of the client.
+	 * Whether the clients supports related documents for document diagnostic
+	 * pulls.
 	 */
-	contentFormat?: MarkupKind[];
+	relatedDocumentSupport?: boolean;
 }
 ```
 
 _Server Capability_:
-* property name (optional): `hoverProvider`
-* property type: `boolean | HoverOptions` where `HoverOptions` is defined as follows:
+* property name (optional): `diagnosticProvider`
+* property type: `DiagnosticOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#diagnosticOptions" name="diagnosticOptions" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface HoverOptions extends WorkDoneProgressOptions {
+/**
+ * Diagnostic options.
+ *
+ * @since 3.17.0
+ */
+export interface DiagnosticOptions extends WorkDoneProgressOptions {
+	/**
+	 * An optional identifier under which the diagnostics are
+	 * managed by the client.
+	 */
+	identifier?: string;
+
+	/**
+	 * Whether the language has inter file dependencies meaning that
+	 * editing code in one file can result in a different diagnostic
+	 * set in another file. Inter file dependencies are common for
+	 * most programming languages and typically uncommon for linters.
+	 */
+	interFileDependencies: boolean;
+
+	/**
+	 * The server provides support for workspace diagnostics as well.
+	 */
+	workspaceDiagnostics: boolean;
 }
 ```
 
-_Registration Options_: `HoverRegistrationOptions` defined as follows:
+_Registration Options_: `DiagnosticRegistrationOptions` options defined as follows:
+
+<div class="anchorHolder"><a href="#diagnosticRegistrationOptions" name="diagnosticRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
-export interface HoverRegistrationOptions
-	extends TextDocumentRegistrationOptions, HoverOptions {
+/**
+ * Diagnostic registration options.
+ *
+ * @since 3.17.0
+ */
+export interface DiagnosticRegistrationOptions extends
+	TextDocumentRegistrationOptions, DiagnosticOptions,
+	StaticRegistrationOptions {
 }
 ```
 
+##### <a href="#textDocument_diagnostic" name="textDocument_diagnostic" class="anchor">Document Diagnostics(:leftwards_arrow_with_hook:)</a>
+
+The text document diagnostic request is sent from the client to the server to ask the server to compute the diagnostics for a given document. As with other pull requests the server is asked to compute the diagnostics for the currently synced version of the document.
+
 _Request_:
-* method: 'textDocument/hover'
-* params: `HoverParams` defined as follows:
+* method: 'textDocument/diagnostic'.
+* params: `DocumentDiagnosticParams` defined as follows:
+
+<div class="anchorHolder"><a href="#documentDiagnosticParams" name="documentDiagnosticParams" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface HoverParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams {
+/**
+ * Parameters of the document diagnostic request.
+ *
+ * @since 3.17.0
+ */
+export interface DocumentDiagnosticParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The additional identifier  provided during registration.
+	 */
+	identifier?: string;
+
+	/**
+	 * The result id of a previous response if provided.
+	 */
+	previousResultId?: string;
 }
 ```
 
 _Response_:
-* result: `Hover` \| `null` defined as follows:
+* result: `DocumentDiagnosticReport` defined as follows:
+
+<div class="anchorHolder"><a href="#documentDiagnosticReport" name="documentDiagnosticReport" class="linkableAnchor"></a></div>
 
 ```typescript
 /**
- * The result of a hover request.
+ * The result of a document diagnostic pull request. A report can
+ * either be a full report containing all diagnostics for the
+ * requested document or a unchanged report indicating that nothing
+ * has changed in terms of diagnostics in comparison to the last
+ * pull request.
+ *
+ * @since 3.17.0
  */
-export interface Hover {
+export type DocumentDiagnosticReport = RelatedFullDocumentDiagnosticReport
+	| RelatedUnchangedDocumentDiagnosticReport;
+```
+
+<div class="anchorHolder"><a href="#documentDiagnosticReportKind" name="documentDiagnosticReportKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The document diagnostic report kinds.
+ *
+ * @since 3.17.0
+ */
+export namespace DocumentDiagnosticReportKind {
 	/**
-	 * The hover's content
+	 * A diagnostic report with a full
+	 * set of problems.
 	 */
-	contents: MarkedString | MarkedString[] | MarkupContent;
+	export const Full = 'full';
 
 	/**
-	 * An optional range is a range inside a text document
-	 * that is used to visualize a hover, e.g. by changing the background color.
+	 * A report indicating that the last
+	 * returned report is still accurate.
 	 */
-	range?: Range;
+	export const Unchanged = 'unchanged';
+}
+
+export type DocumentDiagnosticReportKind = 'full' | 'unchanged';
+```
+
+<div class="anchorHolder"><a href="#fullDocumentDiagnosticReport" name="fullDocumentDiagnosticReport" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A diagnostic report with a full set of problems.
+ *
+ * @since 3.17.0
+ */
+export interface FullDocumentDiagnosticReport {
+	/**
+	 * A full document diagnostic report.
+	 */
+	kind: 'full';
+
+	/**
+	 * An optional result id. If provided it will
+	 * be sent on the next diagnostic request for the
+	 * same document.
+	 */
+	resultId?: string;
+
+	/**
+	 * The actual items.
+	 */
+	items: Diagnostic[];
 }
 ```
 
-Where `MarkedString` is defined as follows:
+<div class="anchorHolder"><a href="#unchangedDocumentDiagnosticReport" name="unchangedDocumentDiagnosticReport" class="linkableAnchor"></a></div>
 
 ```typescript
 /**
- * MarkedString can be used to render human readable text. It is either a
- * markdown string or a code-block that provides a language and a code snippet.
- * The language identifier is semantically equal to the optional language
- * identifier in fenced code blocks in GitHub issues.
+ * A diagnostic report indicating that the last returned
+ * report is still accurate.
  *
- * The pair of a language and a value is an equivalent to markdown:
- * ```${language}
- * ${value}
- * ```
- *
- * Note that markdown strings will be sanitized - that means html will be
- * escaped.
- *
- * @deprecated use MarkupContent instead.
+ * @since 3.17.0
  */
-type MarkedString = string | { language: string; value: string };
+export interface UnchangedDocumentDiagnosticReport {
+	/**
+	 * A document diagnostic report indicating
+	 * no changes to the last result. A server can
+	 * only return `unchanged` if result ids are
+	 * provided.
+	 */
+	kind: 'unchanged';
+
+	/**
+	 * A result id which will be sent on the next
+	 * diagnostic request for the same document.
+	 */
+	resultId: string;
+}
 ```
 
-* error: code and message set in case an exception happens during the hover request.
+<div class="anchorHolder"><a href="#relatedFullDocumentDiagnosticReport" name="relatedFullDocumentDiagnosticReport" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A full diagnostic report with a set of related documents.
+ *
+ * @since 3.17.0
+ */
+export interface RelatedFullDocumentDiagnosticReport extends
+	FullDocumentDiagnosticReport {
+	/**
+	 * Diagnostics of related documents. This information is useful
+	 * in programming languages where code in a file A can generate
+	 * diagnostics in a file B which A depends on. An example of
+	 * such a language is C/C++ where marco definitions in a file
+	 * a.cpp and result in errors in a header file b.hpp.
+	 *
+	 * @since 3.17.0
+	 */
+	relatedDocuments?: {
+		[uri: string /** DocumentUri */]:
+			FullDocumentDiagnosticReport | UnchangedDocumentDiagnosticReport;
+	};
+}
+```
+
+<div class="anchorHolder"><a href="#relatedUnchangedDocumentDiagnosticReport" name="relatedUnchangedDocumentDiagnosticReport" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * An unchanged diagnostic report with a set of related documents.
+ *
+ * @since 3.17.0
+ */
+export interface RelatedUnchangedDocumentDiagnosticReport extends
+	UnchangedDocumentDiagnosticReport {
+	/**
+	 * Diagnostics of related documents. This information is useful
+	 * in programming languages where code in a file A can generate
+	 * diagnostics in a file B which A depends on. An example of
+	 * such a language is C/C++ where marco definitions in a file
+	 * a.cpp and result in errors in a header file b.hpp.
+	 *
+	 * @since 3.17.0
+	 */
+	relatedDocuments?: {
+		[uri: string /** DocumentUri */]:
+			FullDocumentDiagnosticReport | UnchangedDocumentDiagnosticReport;
+	};
+}
+```
+* partial result: The first literal send need to be a `DocumentDiagnosticReport` followed by n `DocumentDiagnosticReportPartialResult` literals defined as follows:
+
+<div class="anchorHolder"><a href="#documentDiagnosticReportPartialResult" name="documentDiagnosticReportPartialResult" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A partial result for a document diagnostic report.
+ *
+ * @since 3.17.0
+ */
+export interface DocumentDiagnosticReportPartialResult {
+	relatedDocuments: {
+		[uri: string /** DocumentUri */]:
+			FullDocumentDiagnosticReport | UnchangedDocumentDiagnosticReport;
+	};
+}
+```
+* error: code and message set in case an exception happens during the diagnostic request. A server is also allowed to return an error with code `ServerCancelled` indicating that the server can't compute the result right now. A server can return a `DiagnosticServerCancellationData` data to indicate whether the client should re-trigger the request. If no data is provided it defaults to `{ retriggerRequest: true }`:
+
+<div class="anchorHolder"><a href="#diagnosticServerCancellationData" name="diagnosticServerCancellationData" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Cancellation data returned from a diagnostic request.
+ *
+ * @since 3.17.0
+ */
+export interface DiagnosticServerCancellationData {
+	retriggerRequest: boolean;
+}
+```
+
+##### <a href="#workspace_diagnostic" name="workspace_diagnostic" class="anchor">Workspace Diagnostics(:leftwards_arrow_with_hook:)</a>
+
+The workspace diagnostic request is sent from the client to the server to ask the server to compute workspace wide diagnostics which previously where pushed from the server to the client. In contrast to the document diagnostic request the workspace request can be long running and is not bound to a specific workspace or document state. If the client supports streaming for the workspace diagnostic pull it is legal to provide a document diagnostic report multiple times for the same document URI. The last one reported will win over previous reports.
+
+If a client receives a diagnostic report for a document in a workspace diagnostic request for which the client also issues individual document diagnostic pull requests the client needs to decide which diagnostics win and should be presented. In general:
+
+- diagnostics for a higher document version should win over those from a lower document version (e.g. note that document versions are steadily increasing)
+- diagnostics from a document pull should win over diagnostics form a workspace pull if no version information is provided.
+
+_Request_:
+* method: 'workspace/diagnostic'.
+* params: `WorkspaceDiagnosticParams` defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceDiagnosticParams" name="workspaceDiagnosticParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Parameters of the workspace diagnostic request.
+ *
+ * @since 3.17.0
+ */
+export interface WorkspaceDiagnosticParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * The additional identifier provided during registration.
+	 */
+	identifier?: string;
+
+	/**
+	 * The currently known diagnostic reports with their
+	 * previous result ids.
+	 */
+	previousResultIds: PreviousResultId[];
+}
+```
+
+<div class="anchorHolder"><a href="#previousResultId" name="previousResultId" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A previous result id in a workspace pull request.
+ *
+ * @since 3.17.0
+ */
+export interface PreviousResultId {
+	/**
+	 * The URI for which the client knowns a
+	 * result id.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * The value of the previous result id.
+	 */
+	value: string;
+}
+```
+
+_Response_:
+* result: `WorkspaceDiagnosticReport` defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceDiagnosticReport" name="workspaceDiagnosticReport" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A workspace diagnostic report.
+ *
+ * @since 3.17.0
+ */
+export interface WorkspaceDiagnosticReport {
+	items: WorkspaceDocumentDiagnosticReport[];
+}
+```
+
+<div class="anchorHolder"><a href="#workspaceFullDocumentDiagnosticReport" name="workspaceFullDocumentDiagnosticReport" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A full document diagnostic report for a workspace diagnostic result.
+ *
+ * @since 3.17.0
+ */
+export interface WorkspaceFullDocumentDiagnosticReport extends
+	FullDocumentDiagnosticReport {
+
+	/**
+	 * The URI for which diagnostic information is reported.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * The version number for which the diagnostics are reported.
+	 * If the document is not marked as open `null` can be provided.
+	 */
+	version: integer | null;
+}
+```
+
+<div class="anchorHolder"><a href="#workspaceUnchangedDocumentDiagnosticReport" name="workspaceUnchangedDocumentDiagnosticReport" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * An unchanged document diagnostic report for a workspace diagnostic result.
+ *
+ * @since 3.17.0
+ */
+export interface WorkspaceUnchangedDocumentDiagnosticReport extends
+	UnchangedDocumentDiagnosticReport {
+
+	/**
+	 * The URI for which diagnostic information is reported.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * The version number for which the diagnostics are reported.
+	 * If the document is not marked as open `null` can be provided.
+	 */
+	version: integer | null;
+};
+```
+
+<div class="anchorHolder"><a href="#workspaceDocumentDiagnosticReport" name="workspaceDocumentDiagnosticReport" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A workspace diagnostic document report.
+ *
+ * @since 3.17.0
+ */
+export type WorkspaceDocumentDiagnosticReport =
+	WorkspaceFullDocumentDiagnosticReport
+	| WorkspaceUnchangedDocumentDiagnosticReport;
+```
+
+* partial result: The first literal send need to be a `WorkspaceDiagnosticReport` followed by n `DocumentDiagnosticReportPartialResult` literals defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceDiagnosticReportPartialResult" name="workspaceDiagnosticReportPartialResult" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A partial result for a workspace diagnostic report.
+ *
+ * @since 3.17.0
+ */
+export interface WorkspaceDiagnosticReportPartialResult {
+	items: WorkspaceDocumentDiagnosticReport[];
+}
+```
+
+* error: code and message set in case an exception happens during the diagnostic request. A server is also allowed to return and error with code `ServerCancelled` indicating that the server can't compute the result right now. A server can return a `DiagnosticServerCancellationData` data to indicate whether the client should re-trigger the request. If no data is provided it defaults to `{ retriggerRequest: true }`:
+
+##### <a href="#diagnostic_refresh" name="diagnostic_refresh" class="anchor">Diagnostics Refresh(:arrow_right_hook:)</a>
+
+The `workspace/diagnostic/refresh` request is sent from the server to the client. Servers can use it to ask clients to refresh all needed document and workspace diagnostics. This is useful if a server detects a project wide configuration change which requires a re-calculation of all diagnostics.
+
+_Client Capability_:
+
+* property name (optional): `workspace.diagnostics`
+* property type: `DiagnosticWorkspaceClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#diagnosticWorkspaceClientCapabilities" name="diagnosticWorkspaceClientCapabilities" class="linkableAnchor"></a></div>
+
+
+```typescript
+/**
+ * Workspace client capabilities specific to diagnostic pull requests.
+ *
+ * @since 3.17.0
+ */
+export interface DiagnosticWorkspaceClientCapabilities {
+	/**
+	 * Whether the client implementation supports a refresh request sent from
+	 * the server to the client.
+	 *
+	 * Note that this event is global and will force the client to refresh all
+	 * pulled diagnostics currently shown. It should be used with absolute care
+	 * and is useful for situation where a server for example detects a project
+	 * wide change that requires such a calculation.
+	 */
+	refreshSupport?: boolean;
+}
+```
+
+_Request_:
+* method: `workspace/diagnostic/refresh`
+* params: none
+
+_Response_:
+
+* result: void
+* error: code and message set in case an exception happens during the 'workspace/diagnostic/refresh' request
+
+
+##### Implementation Considerations
+
+Generally the language server specification doesn't enforce any specific client implementation since those usually depend on how the client UI behaves. However since diagnostics can be provided on a document and workspace level here are some tips:
+
+- a client should pull actively for the document the users types in.
+- if the server signals inter file dependencies a client should also pull for visible documents to ensure accurate diagnostics. However the pull should happen less frequently.
+- if the server signals workspace pull support a client should also pull for workspace diagnostics. It is recommended for clients to implement partial result progress for the workspace pull to allow servers to keep the request open for a long time. If a server closes a workspace diagnostic pull request the client should re-trigger the request.
 
 #### <a href="#textDocument_signatureHelp" name="textDocument_signatureHelp" class="anchor">Signature Help Request (:leftwards_arrow_with_hook:)</a>
 
@@ -4995,6 +8658,8 @@
 * property name (optional): `textDocument.signatureHelp`
 * property type: `SignatureHelpClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#signatureHelpClientCapabilities" name="signatureHelpClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface SignatureHelpClientCapabilities {
 	/**
@@ -5008,7 +8673,7 @@
 	 */
 	signatureInformation?: {
 		/**
-		 * Client supports the following content formats for the documentation
+		 * Client supports the follow content formats for the documentation
 		 * property. The order describes the preferred format of the client.
 		 */
 		documentationFormat?: MarkupKind[];
@@ -5051,6 +8716,8 @@
 * property name (optional): `signatureHelpProvider`
 * property type: `SignatureHelpOptions` defined as follows:
 
+<div class="anchorHolder"><a href="#signatureHelpOptions" name="signatureHelpOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface SignatureHelpOptions extends WorkDoneProgressOptions {
 	/**
@@ -5073,6 +8740,9 @@
 ```
 
 _Registration Options_: `SignatureHelpRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#signatureHelpRegistrationOptions" name="signatureHelpRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface SignatureHelpRegistrationOptions
 	extends TextDocumentRegistrationOptions, SignatureHelpOptions {
@@ -5080,9 +8750,11 @@
 ```
 
 _Request_:
-* method: 'textDocument/signatureHelp'
+* method: `textDocument/signatureHelp`
 * params: `SignatureHelpParams` defined as follows:
 
+<div class="anchorHolder"><a href="#signatureHelpParams" name="signatureHelpParams" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface SignatureHelpParams extends TextDocumentPositionParams,
 	WorkDoneProgressParams {
@@ -5095,7 +8767,11 @@
 	 */
 	context?: SignatureHelpContext;
 }
+```
 
+<div class="anchorHolder"><a href="#signatureHelpTriggerKind" name="signatureHelpTriggerKind" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * How a signature help was triggered.
  *
@@ -5117,7 +8793,11 @@
 	export const ContentChange: 3 = 3;
 }
 export type SignatureHelpTriggerKind = 1 | 2 | 3;
+```
 
+<div class="anchorHolder"><a href="#signatureHelpContext" name="signatureHelpContext" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Additional information about the context in which a signature help request
  * was triggered.
@@ -5160,6 +8840,8 @@
 _Response_:
 * result: `SignatureHelp` \| `null` defined as follows:
 
+<div class="anchorHolder"><a href="#signatureHelp" name="signatureHelp" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Signature help represents the signature of something
@@ -5175,8 +8857,8 @@
 
 	/**
 	 * The active signature. If omitted or the value lies outside the
-	 * range of `signatures` the value defaults to zero or is ignored if
-	 * the `SignatureHelp` has no signatures.
+	 * range of `signatures` the value defaults to zero or is ignore if
+	 * the `SignatureHelp` as no signatures.
 	 *
 	 * Whenever possible implementors should make an active decision about
 	 * the active signature and shouldn't rely on a default value.
@@ -5197,7 +8879,11 @@
 	 */
 	activeParameter?: uinteger;
 }
+```
 
+<div class="anchorHolder"><a href="#signatureInformation" name="signatureInformation" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Represents the signature of something callable. A signature
  * can have a label, like a function-name, a doc-comment, and
@@ -5230,7 +8916,11 @@
 	 */
 	activeParameter?: uinteger;
 }
+```
 
+<div class="anchorHolder"><a href="#parameterInformation" name="parameterInformation" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Represents a parameter of a callable-signature. A parameter can
  * have a label and a doc-comment.
@@ -5261,665 +8951,6 @@
 
 * error: code and message set in case an exception happens during the signature help request.
 
-#### <a href="#textDocument_declaration" name="textDocument_declaration" class="anchor">Goto Declaration Request (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.14.0*
-
-The go to declaration request is sent from the client to the server to resolve the declaration location of a symbol at a given text document position.
-
-The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.declaration.linkSupport`.
-
-_Client Capability_:
-* property name (optional): `textDocument.declaration`
-* property type: `DeclarationClientCapabilities` defined as follows:
-
-```typescript
-export interface DeclarationClientCapabilities {
-	/**
-	 * Whether declaration supports dynamic registration. If this is set to
-	 * `true` the client supports the new `DeclarationRegistrationOptions`
-	 * return value for the corresponding server capability as well.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * The client supports additional metadata in the form of declaration links.
-	 */
-	linkSupport?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `declarationProvider`
-* property type: `boolean | DeclarationOptions | DeclarationRegistrationOptions` where `DeclarationOptions` is defined as follows:
-
-```typescript
-export interface DeclarationOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `DeclarationRegistrationOptions` defined as follows:
-```typescript
-export interface DeclarationRegistrationOptions extends DeclarationOptions,
-	TextDocumentRegistrationOptions, StaticRegistrationOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/declaration'
-* params: `DeclarationParams` defined as follows:
-
-```typescript
-export interface DeclarationParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams, PartialResultParams {
-}
-```
-
-_Response_:
-* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \|`null`
-* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
-* error: code and message set in case an exception happens during the declaration request.
-
-#### <a href="#textDocument_definition" name="textDocument_definition" class="anchor">Goto Definition Request (:leftwards_arrow_with_hook:)</a>
-
-The go to definition request is sent from the client to the server to resolve the definition location of a symbol at a given text document position.
-
-The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.definition.linkSupport`.
-
-_Client Capability_:
-* property name (optional): `textDocument.definition`
-* property type: `DefinitionClientCapabilities` defined as follows:
-
-```typescript
-export interface DefinitionClientCapabilities {
-	/**
-	 * Whether definition supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * The client supports additional metadata in the form of definition links.
-	 *
-	 * @since 3.14.0
-	 */
-	linkSupport?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `definitionProvider`
-* property type: `boolean | DefinitionOptions` where `DefinitionOptions` is defined as follows:
-
-```typescript
-export interface DefinitionOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `DefinitionRegistrationOptions` defined as follows:
-```typescript
-export interface DefinitionRegistrationOptions extends
-	TextDocumentRegistrationOptions, DefinitionOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/definition'
-* params: `DefinitionParams` defined as follows:
-
-```typescript
-export interface DefinitionParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams, PartialResultParams {
-}
-```
-
-_Response_:
-* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \| `null`
-* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
-* error: code and message set in case an exception happens during the definition request.
-
-#### <a href="#textDocument_typeDefinition" name="textDocument_typeDefinition" class="anchor">Goto Type Definition Request (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.6.0*
-
-The go to type definition request is sent from the client to the server to resolve the type definition location of a symbol at a given text document position.
-
-The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.typeDefinition.linkSupport`.
-
-_Client Capability_:
-* property name (optional): `textDocument.typeDefinition`
-* property type: `TypeDefinitionClientCapabilities` defined as follows:
-
-```typescript
-export interface TypeDefinitionClientCapabilities {
-	/**
-	 * Whether implementation supports dynamic registration. If this is set to
-	 * `true` the client supports the new `TypeDefinitionRegistrationOptions`
-	 * return value for the corresponding server capability as well.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * The client supports additional metadata in the form of definition links.
-	 *
-	 * @since 3.14.0
-	 */
-	linkSupport?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `typeDefinitionProvider`
-* property type: `boolean | TypeDefinitionOptions | TypeDefinitionRegistrationOptions` where `TypeDefinitionOptions` is defined as follows:
-
-```typescript
-export interface TypeDefinitionOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `TypeDefinitionRegistrationOptions` defined as follows:
-```typescript
-export interface TypeDefinitionRegistrationOptions extends
-	TextDocumentRegistrationOptions, TypeDefinitionOptions,
-	StaticRegistrationOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/typeDefinition'
-* params: `TypeDefinitionParams` defined as follows:
-
-```typescript
-export interface TypeDefinitionParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams, PartialResultParams {
-}
-```
-
-_Response_:
-* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \| `null`
-* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
-* error: code and message set in case an exception happens during the definition request.
-
-#### <a href="#textDocument_implementation" name="textDocument_implementation" class="anchor">Goto Implementation Request (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.6.0*
-
-The go to implementation request is sent from the client to the server to resolve the implementation location of a symbol at a given text document position.
-
-The result type [`LocationLink`](#locationLink)[] got introduced with version 3.14.0 and depends on the corresponding client capability `textDocument.implementation.linkSupport`.
-
-_Client Capability_:
-* property name (optional): `textDocument.implementation`
-* property type: `ImplementationClientCapabilities` defined as follows:
-
-```typescript
-export interface ImplementationClientCapabilities {
-	/**
-	 * Whether implementation supports dynamic registration. If this is set to
-	 * `true` the client supports the new `ImplementationRegistrationOptions`
-	 * return value for the corresponding server capability as well.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * The client supports additional metadata in the form of definition links.
-	 *
-	 * @since 3.14.0
-	 */
-	linkSupport?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `implementationProvider`
-* property type: `boolean | ImplementationOptions | ImplementationRegistrationOptions` where `ImplementationOptions` is defined as follows:
-
-```typescript
-export interface ImplementationOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `ImplementationRegistrationOptions` defined as follows:
-```typescript
-export interface ImplementationRegistrationOptions extends
-	TextDocumentRegistrationOptions, ImplementationOptions,
-	StaticRegistrationOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/implementation'
-* params: `ImplementationParams` defined as follows:
-
-```typescript
-export interface ImplementationParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams, PartialResultParams {
-}
-```
-
-_Response_:
-* result: [`Location`](#location) \| [`Location`](#location)[] \| [`LocationLink`](#locationLink)[] \| `null`
-* partial result: [`Location`](#location)[] \| [`LocationLink`](#locationLink)[]
-* error: code and message set in case an exception happens during the definition request.
-
-#### <a href="#textDocument_references" name="textDocument_references" class="anchor">Find References Request (:leftwards_arrow_with_hook:)</a>
-
-The references request is sent from the client to the server to resolve project-wide references for the symbol denoted by the given text document position.
-
-_Client Capability_:
-* property name (optional): `textDocument.references`
-* property type: `ReferenceClientCapabilities` defined as follows:
-
-```typescript
-export interface ReferenceClientCapabilities {
-	/**
-	 * Whether references supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `referencesProvider`
-* property type: `boolean | ReferenceOptions` where `ReferenceOptions` is defined as follows:
-
-```typescript
-export interface ReferenceOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `ReferenceRegistrationOptions` defined as follows:
-```typescript
-export interface ReferenceRegistrationOptions extends
-	TextDocumentRegistrationOptions, ReferenceOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/references'
-* params: `ReferenceParams` defined as follows:
-
-```typescript
-export interface ReferenceParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams, PartialResultParams {
-	context: ReferenceContext;
-}
-
-export interface ReferenceContext {
-	/**
-	 * Include the declaration of the current symbol.
-	 */
-	includeDeclaration: boolean;
-}
-```
-_Response_:
-* result: [`Location`](#location)[] \| `null`
-* partial result: [`Location`](#location)[]
-* error: code and message set in case an exception happens during the reference request.
-
-#### <a href="#textDocument_documentHighlight" name="textDocument_documentHighlight" class="anchor">Document Highlights Request (:leftwards_arrow_with_hook:)</a>
-
-The document highlight request is sent from the client to the server to resolve a document highlights for a given text document position.
-For programming languages this usually highlights all references to the symbol scoped to this file. However we kept 'textDocument/documentHighlight'
-and 'textDocument/references' separate requests since the first one is allowed to be more fuzzy. Symbol matches usually have a `DocumentHighlightKind`
-of `Read` or `Write` whereas fuzzy or textual matches use `Text`as the kind.
-
-_Client Capability_:
-* property name (optional): `textDocument.documentHighlight`
-* property type: `DocumentHighlightClientCapabilities` defined as follows:
-
-```typescript
-export interface DocumentHighlightClientCapabilities {
-	/**
-	 * Whether document highlight supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `documentHighlightProvider`
-* property type: `boolean | DocumentHighlightOptions` where `DocumentHighlightOptions` is defined as follows:
-
-```typescript
-export interface DocumentHighlightOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `DocumentHighlightRegistrationOptions` defined as follows:
-```typescript
-export interface DocumentHighlightRegistrationOptions extends
-	TextDocumentRegistrationOptions, DocumentHighlightOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/documentHighlight'
-* params: `DocumentHighlightParams` defined as follows:
-
-```typescript
-export interface DocumentHighlightParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams, PartialResultParams {
-}
-```
-
-_Response_:
-* result: `DocumentHighlight[]` \| `null` defined as follows:
-
-```typescript
-/**
- * A document highlight is a range inside a text document which deserves
- * special attention. Usually a document highlight is visualized by changing
- * the background color of its range.
- *
- */
-export interface DocumentHighlight {
-	/**
-	 * The range this highlight applies to.
-	 */
-	range: Range;
-
-	/**
-	 * The highlight kind, default is DocumentHighlightKind.Text.
-	 */
-	kind?: DocumentHighlightKind;
-}
-
-/**
- * A document highlight kind.
- */
-export namespace DocumentHighlightKind {
-	/**
-	 * A textual occurrence.
-	 */
-	export const Text = 1;
-
-	/**
-	 * Read-access of a symbol, like reading a variable.
-	 */
-	export const Read = 2;
-
-	/**
-	 * Write-access of a symbol, like writing to a variable.
-	 */
-	export const Write = 3;
-}
-
-export type DocumentHighlightKind = 1 | 2 | 3;
-```
-
-* partial result: `DocumentHighlight[]`
-* error: code and message set in case an exception happens during the document highlight request.
-
-#### <a href="#textDocument_documentSymbol" name="textDocument_documentSymbol" class="anchor">Document Symbols Request (:leftwards_arrow_with_hook:)</a>
-
-The document symbol request is sent from the client to the server. The returned result is either
-
-- `SymbolInformation[]` which is a flat list of all symbols found in a given text document. Then neither the symbol's location range nor the symbol's container name should be used to infer a hierarchy.
-- `DocumentSymbol[]` which is a hierarchy of symbols found in a given text document.
-
-Servers should whenever possible return `DocumentSymbol` since it is the richer data structure.
-
-_Client Capability_:
-* property name (optional): `textDocument.documentSymbol`
-* property type: `DocumentSymbolClientCapabilities` defined as follows:
-
-```typescript
-export interface DocumentSymbolClientCapabilities {
-	/**
-	 * Whether document symbol supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * Specific capabilities for the `SymbolKind` in the
-	 * `textDocument/documentSymbol` request.
-	 */
-	symbolKind?: {
-		/**
-		 * The symbol 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.
-		 *
-		 * If this property is not present the client only supports
-		 * the symbol kinds from `File` to `Array` as defined in
-		 * the initial version of the protocol.
-		 */
-		valueSet?: SymbolKind[];
-	};
-
-	/**
-	 * The client supports hierarchical document symbols.
-	 */
-	hierarchicalDocumentSymbolSupport?: boolean;
-
-	/**
-	 * The client supports tags on `SymbolInformation`. Tags are supported on
-	 * `DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true.
-	 * Clients supporting tags have to handle unknown tags gracefully.
-	 *
-	 * @since 3.16.0
-	 */
-	tagSupport?: {
-		/**
-		 * The tags supported by the client.
-		 */
-		valueSet: SymbolTag[];
-	};
-
-	/**
-	 * The client supports an additional label presented in the UI when
-	 * registering a document symbol provider.
-	 *
-	 * @since 3.16.0
-	 */
-	labelSupport?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `documentSymbolProvider`
-* property type: `boolean | DocumentSymbolOptions` where `DocumentSymbolOptions` is defined as follows:
-
-```typescript
-export interface DocumentSymbolOptions extends WorkDoneProgressOptions {
-	/**
-	 * A human-readable string that is shown when multiple outlines trees
-	 * are shown for the same document.
-	 *
-	 * @since 3.16.0
-	 */
-	label?: string;
-}
-```
-
-_Registration Options_: `DocumentSymbolRegistrationOptions` defined as follows:
-```typescript
-export interface DocumentSymbolRegistrationOptions extends
-	TextDocumentRegistrationOptions, DocumentSymbolOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/documentSymbol'
-* params: `DocumentSymbolParams` defined as follows:
-
-```typescript
-export interface DocumentSymbolParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * The text document.
-	 */
-	textDocument: TextDocumentIdentifier;
-}
-```
-
-_Response_:
-* result: `DocumentSymbol[]` \| `SymbolInformation[]` \| `null` defined as follows:
-
-```typescript
-/**
- * A symbol kind.
- */
-export namespace SymbolKind {
-	export const File = 1;
-	export const Module = 2;
-	export const Namespace = 3;
-	export const Package = 4;
-	export const Class = 5;
-	export const Method = 6;
-	export const Property = 7;
-	export const Field = 8;
-	export const Constructor = 9;
-	export const Enum = 10;
-	export const Interface = 11;
-	export const Function = 12;
-	export const Variable = 13;
-	export const Constant = 14;
-	export const String = 15;
-	export const Number = 16;
-	export const Boolean = 17;
-	export const Array = 18;
-	export const Object = 19;
-	export const Key = 20;
-	export const Null = 21;
-	export const EnumMember = 22;
-	export const Struct = 23;
-	export const Event = 24;
-	export const Operator = 25;
-	export const TypeParameter = 26;
-}
-
-/**
- * Symbol tags are extra annotations that tweak the rendering of a symbol.
- *
- * @since 3.16.0
- */
-export namespace SymbolTag {
-
-	/**
-	 * Render a symbol as obsolete, usually using a strike-out.
-	 */
-	export const Deprecated: 1 = 1;
-}
-
-export type SymbolTag = 1;
-
-
-/**
- * Represents programming constructs like variables, classes, interfaces etc.
- * that appear in a document. Document symbols can be hierarchical and they
- * have two ranges: one that encloses its definition and one that points to its
- * most interesting range, e.g. the range of an identifier.
- */
-export interface DocumentSymbol {
-
-	/**
-	 * The name of this symbol. Will be displayed in the user interface and
-	 * therefore must not be an empty string or a string only consisting of
-	 * white spaces.
-	 */
-	name: string;
-
-	/**
-	 * More detail for this symbol, e.g the signature of a function.
-	 */
-	detail?: string;
-
-	/**
-	 * The kind of this symbol.
-	 */
-	kind: SymbolKind;
-
-	/**
-	 * Tags for this document symbol.
-	 *
-	 * @since 3.16.0
-	 */
-	tags?: SymbolTag[];
-
-	/**
-	 * Indicates if this symbol is deprecated.
-	 *
-	 * @deprecated Use tags instead
-	 */
-	deprecated?: boolean;
-
-	/**
-	 * The range enclosing this symbol not including leading/trailing whitespace
-	 * but everything else like comments. This information is typically used to
-	 * determine if the clients cursor is inside the symbol to reveal in the
-	 * symbol in the UI.
-	 */
-	range: Range;
-
-	/**
-	 * The range that should be selected and revealed when this symbol is being
-	 * picked, e.g. the name of a function. Must be contained by the `range`.
-	 */
-	selectionRange: Range;
-
-	/**
-	 * Children of this symbol, e.g. properties of a class.
-	 */
-	children?: DocumentSymbol[];
-}
-
-/**
- * Represents information about programming constructs like variables, classes,
- * interfaces etc.
- */
-export interface SymbolInformation {
-	/**
-	 * The name of this symbol.
-	 */
-	name: string;
-
-	/**
-	 * The kind of this symbol.
-	 */
-	kind: SymbolKind;
-
-	/**
-	 * Tags for this symbol.
-	 *
-	 * @since 3.16.0
-	 */
-	tags?: SymbolTag[];
-
-	/**
-	 * Indicates if this symbol is deprecated.
-	 *
-	 * @deprecated Use tags instead
-	 */
-	deprecated?: boolean;
-
-	/**
-	 * The location of this symbol. The location's range is used by a tool
-	 * to reveal the location in the editor. If the symbol is selected in the
-	 * tool the range's start information is used to position the cursor. So
-	 * the range usually spans more then the actual symbol's name and does
-	 * normally include things like visibility modifiers.
-	 *
-	 * The range doesn't have to denote a node range in the sense of a abstract
-	 * syntax tree. It can therefore not be used to re-construct a hierarchy of
-	 * the symbols.
-	 */
-	location: Location;
-
-	/**
-	 * The name of the symbol containing this symbol. This information is for
-	 * user interface purposes (e.g. to render a qualifier in the user interface
-	 * if necessary). It can't be used to re-infer a hierarchy for the document
-	 * symbols.
-	 */
-	containerName?: string;
-}
-```
-
-* partial result: `DocumentSymbol[]` \| `SymbolInformation[]`. `DocumentSymbol[]` and `SymbolInformation[]` can not be mixed. That means the first chunk defines the type of all the other chunks.
-* error: code and message set in case an exception happens during the document symbol request.
-
 #### <a href="#textDocument_codeAction" name="textDocument_codeAction" class="anchor">Code Action Request (:leftwards_arrow_with_hook:)</a>
 
 The code action request is sent from the client to the server to compute commands for a given text document and range. These commands are typically code fixes to either fix problems or to beautify/refactor code. The result of a `textDocument/codeAction` request is an array of `Command` literals which are typically presented in the user interface. To ensure that a server is useful in many clients the commands specified in a code actions should be handled by the server and not by the client (see `workspace/executeCommand` and `ServerCapabilities.executeCommandProvider`). If the client supports providing edits with a code action then that mode should be used.
@@ -5939,6 +8970,8 @@
 * property name (optional): `textDocument.codeAction`
 * property type: `CodeActionClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#codeActionClientCapabilities" name="codeActionClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface CodeActionClientCapabilities {
 	/**
@@ -6023,6 +9056,8 @@
 * property name (optional): `codeActionProvider`
 * property type: `boolean | CodeActionOptions` where `CodeActionOptions` is defined as follows:
 
+<div class="anchorHolder"><a href="#codeActionOptions" name="codeActionOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface CodeActionOptions extends WorkDoneProgressOptions {
 	/**
@@ -6044,6 +9079,9 @@
 ```
 
 _Registration Options_: `CodeActionRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#codeActionRegistrationOptions" name="codeActionRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface CodeActionRegistrationOptions extends
 	TextDocumentRegistrationOptions, CodeActionOptions {
@@ -6051,9 +9089,11 @@
 ```
 
 _Request_:
-* method: 'textDocument/codeAction'
+* method: `textDocument/codeAction`
 * params: `CodeActionParams` defined as follows:
 
+<div class="anchorHolder"><a href="#codeActionParams" name="codeActionParams" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * Params for the CodeActionRequest
@@ -6075,7 +9115,11 @@
 	 */
 	context: CodeActionContext;
 }
+```
 
+<div class="anchorHolder"><a href="#codeActionKind" name="codeActionKind" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * The kind of a code action.
  *
@@ -6159,8 +9203,23 @@
 	 */
 	export const SourceOrganizeImports: CodeActionKind =
 		'source.organizeImports';
-}
 
+	/**
+	 * Base kind for a 'fix all' source action: `source.fixAll`.
+	 *
+	 * 'Fix all' actions automatically fix errors that have a clear fix that
+	 * do not require user input. They should not suppress errors or perform
+	 * unsafe fixes such as generating new types or classes.
+	 *
+	 * @since 3.17.0
+	 */
+	export const SourceFixAll: CodeActionKind = 'source.fixAll';
+}
+```
+
+<div class="anchorHolder"><a href="#codeActionContext" name="codeActionContext" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Contains additional diagnostic information about the context in which
  * a code action is run.
@@ -6183,12 +9242,47 @@
 	 * shown. So servers can omit computing them.
 	 */
 	only?: CodeActionKind[];
+
+	/**
+	 * The reason why code actions were requested.
+	 *
+	 * @since 3.17.0
+	 */
+	triggerKind?: CodeActionTriggerKind;
 }
 ```
 
+<div class="anchorHolder"><a href="#codeActionTriggerKind" name="codeActionTriggerKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The reason why code actions were requested.
+ *
+ * @since 3.17.0
+ */
+export namespace CodeActionTriggerKind {
+	/**
+	 * Code actions were explicitly requested by the user or by an extension.
+	 */
+	export const Invoked: 1 = 1;
+
+	/**
+	 * Code actions were requested automatically.
+	 *
+	 * This typically happens when current selection in a file changes, but can
+	 * also be triggered when file content changes.
+	 */
+	export const Automatic: 2 = 2;
+}
+
+export type CodeActionTriggerKind = 1 | 2;
+```
+
 _Response_:
 * result: `(Command | CodeAction)[]` \| `null` where `CodeAction` is defined as follows:
 
+<div class="anchorHolder"><a href="#codeAction" name="codeAction" class="linkableAnchor"></a></div>
+
 ```typescript
 /**
  * A code action represents a change that can be performed in code, e.g. to fix
@@ -6276,7 +9370,7 @@
 	 *
 	 * @since 3.16.0
 	 */
-	data?: any;
+	data?: LSPAny;
 }
 ```
 * partial result: `(Command | CodeAction)[]`
@@ -6310,256 +9404,13 @@
 * property type: `{ properties: string[]; }`
 
 _Request_:
-* method: 'codeAction/resolve'
+* method: `codeAction/resolve`
 * params: `CodeAction`
 
 _Response_:
 * result: `CodeAction`
 * error: code and message set in case an exception happens during the completion resolve request.
 
-#### <a href="#textDocument_codeLens" name="textDocument_codeLens" class="anchor">Code Lens Request (:leftwards_arrow_with_hook:)</a>
-
-The code lens request is sent from the client to the server to compute code lenses for a given text document.
-
-_Client Capability_:
-* property name (optional): `textDocument.codeLens`
-* property type: `CodeLensClientCapabilities` defined as follows:
-
-```typescript
-export interface CodeLensClientCapabilities {
-	/**
-	 * Whether code lens supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `codeLensProvider`
-* property type: `CodeLensOptions` defined as follows:
-
-```typescript
-export interface CodeLensOptions extends WorkDoneProgressOptions {
-	/**
-	 * Code lens has a resolve provider as well.
-	 */
-	resolveProvider?: boolean;
-}
-```
-
-_Registration Options_: `CodeLensRegistrationOptions` defined as follows:
-```typescript
-export interface CodeLensRegistrationOptions extends
-	TextDocumentRegistrationOptions, CodeLensOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/codeLens'
-* params: `CodeLensParams` defined as follows:
-
-```typescript
-interface CodeLensParams extends WorkDoneProgressParams, PartialResultParams {
-	/**
-	 * The document to request code lens for.
-	 */
-	textDocument: TextDocumentIdentifier;
-}
-```
-
-_Response_:
-* result: `CodeLens[]` \| `null` defined as follows:
-
-```typescript
-/**
- * A code lens represents a command that should be shown along with
- * source text, like the number of references, a way to run tests, etc.
- *
- * A code lens is _unresolved_ when no command is associated to it. For
- * performance reasons the creation of a code lens and resolving should be done
- * in two stages.
- */
-interface CodeLens {
-	/**
-	 * The range in which this code lens is valid. Should only span a single
-	 * line.
-	 */
-	range: Range;
-
-	/**
-	 * The command this code lens represents.
-	 */
-	command?: Command;
-
-	/**
-	 * A data entry field that is preserved on a code lens item between
-	 * a code lens and a code lens resolve request.
-	 */
-	data?: any;
-}
-```
-* partial result: `CodeLens[]`
-* error: code and message set in case an exception happens during the code lens request.
-
-#### <a href="#codeLens_resolve" name="codeLens_resolve" class="anchor">Code Lens Resolve Request (:leftwards_arrow_with_hook:)</a>
-
-The code lens resolve request is sent from the client to the server to resolve the command for a given code lens item.
-
-_Request_:
-* method: 'codeLens/resolve'
-* params: `CodeLens`
-
-_Response_:
-* result: `CodeLens`
-* error: code and message set in case an exception happens during the code lens resolve request.
-
-#### <a href="#codeLens_refresh" name="codeLens_refresh" class="anchor">Code Lens Refresh Request (:arrow_right_hook:)</a>
-
-> *Since version 3.16.0*
-
-The `workspace/codeLens/refresh` request is sent from the server to the client. Servers can use it to ask clients to refresh the code lenses currently shown in editors. As a result the client should ask the server to recompute the code lenses for these editors. This is useful if a server detects a configuration change which requires a re-calculation of all code lenses. Note that the client still has the freedom to delay the re-calculation of the code lenses if for example an editor is currently not visible.
-
-_Client Capability_:
-
-* property name (optional): `workspace.codeLens`
-* property type: `CodeLensWorkspaceClientCapabilities` defined as follows:
-
-```typescript
-export interface CodeLensWorkspaceClientCapabilities {
-	/**
-	 * Whether the client implementation supports a refresh request sent from the
-	 * server to the client.
-	 *
-	 * Note that this event is global and will force the client to refresh all
-	 * code lenses currently shown. It should be used with absolute care and is
-	 * useful for situation where a server for example detect a project wide
-	 * change that requires such a calculation.
-	 */
-	refreshSupport?: boolean;
-}
-```
-
-_Request_:
-
-* method: `workspace/codeLens/refresh`
-* params: none
-
-_Response_:
-
-* result: void
-* error: code and message set in case an exception happens during the 'workspace/codeLens/refresh' request
-
-#### <a href="#textDocument_documentLink" name="textDocument_documentLink" class="anchor">Document Link Request (:leftwards_arrow_with_hook:)</a>
-
-The document links request is sent from the client to the server to request the location of links in a document.
-
-_Client Capability_:
-* property name (optional): `textDocument.documentLink`
-* property type: `DocumentLinkClientCapabilities` defined as follows:
-
-```typescript
-export interface DocumentLinkClientCapabilities {
-	/**
-	 * Whether document link supports dynamic registration.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * Whether the client supports the `tooltip` property on `DocumentLink`.
-	 *
-	 * @since 3.15.0
-	 */
-	tooltipSupport?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `documentLinkProvider`
-* property type: `DocumentLinkOptions` defined as follows:
-
-```typescript
-export interface DocumentLinkOptions extends WorkDoneProgressOptions {
-	/**
-	 * Document links have a resolve provider as well.
-	 */
-	resolveProvider?: boolean;
-}
-```
-
-_Registration Options_: `DocumentLinkRegistrationOptions` defined as follows:
-```typescript
-export interface DocumentLinkRegistrationOptions extends
-	TextDocumentRegistrationOptions, DocumentLinkOptions {
-}
-```
-
-_Request_:
-* method: 'textDocument/documentLink'
-* params: `DocumentLinkParams` defined as follows:
-
-```typescript
-interface DocumentLinkParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * The document to provide document links for.
-	 */
-	textDocument: TextDocumentIdentifier;
-}
-```
-
-_Response_:
-* result: `DocumentLink[]` \| `null`.
-
-```typescript
-/**
- * A document link is a range in a text document that links to an internal or
- * external resource, like another text document or a web site.
- */
-interface DocumentLink {
-	/**
-	 * The range this link applies to.
-	 */
-	range: Range;
-
-	/**
-	 * The uri this link points to. If missing a resolve request is sent later.
-	 */
-	target?: DocumentUri;
-
-	/**
-	 * The tooltip text when you hover over this link.
-	 *
-	 * If a tooltip is provided, is will be displayed in a string that includes
-	 * instructions on how to trigger the link, such as `{0} (ctrl + click)`.
-	 * The specific instructions vary depending on OS, user settings, and
-	 * localization.
-	 *
-	 * @since 3.15.0
-	 */
-	tooltip?: string;
-
-	/**
-	 * A data entry field that is preserved on a document link between a
-	 * DocumentLinkRequest and a DocumentLinkResolveRequest.
-	 */
-	data?: any;
-}
-```
-* partial result: `DocumentLink[]`
-* error: code and message set in case an exception happens during the document link request.
-
-#### <a href="#documentLink_resolve" name="documentLink_resolve" class="anchor">Document Link Resolve Request (:leftwards_arrow_with_hook:)</a>
-
-The document link resolve request is sent from the client to the server to resolve the target of a given document link.
-
-_Request_:
-* method: 'documentLink/resolve'
-* params: `DocumentLink`
-
-_Response_:
-* result: `DocumentLink`
-* error: code and message set in case an exception happens during the document link resolve request.
-
 #### <a href="#textDocument_documentColor" name="textDocument_documentColor" class="anchor">Document Color Request (:leftwards_arrow_with_hook:)</a>
 
 > *Since version 3.6.0*
@@ -6574,6 +9425,8 @@
 * property name (optional): `textDocument.colorProvider`
 * property type: `DocumentColorClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#documentColorClientCapabilities" name="documentColorClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentColorClientCapabilities {
 	/**
@@ -6587,12 +9440,17 @@
 * property name (optional): `colorProvider`
 * property type: `boolean | DocumentColorOptions | DocumentColorRegistrationOptions` where `DocumentColorOptions` is defined as follows:
 
+<div class="anchorHolder"><a href="#documentColorOptions" name="documentColorOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentColorOptions extends WorkDoneProgressOptions {
 }
 ```
 
 _Registration Options_: `DocumentColorRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentColorRegistrationOptions" name="documentColorRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentColorRegistrationOptions extends
 	TextDocumentRegistrationOptions, StaticRegistrationOptions,
@@ -6602,9 +9460,11 @@
 
 _Request_:
 
-* method: 'textDocument/documentColor'
+* method: `textDocument/documentColor`
 * params: `DocumentColorParams` defined as follows
 
+<div class="anchorHolder"><a href="#documentColorParams" name="documentColorParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface DocumentColorParams extends WorkDoneProgressParams,
 	PartialResultParams {
@@ -6618,6 +9478,8 @@
 _Response_:
 * result: `ColorInformation[]` defined as follows:
 
+<div class="anchorHolder"><a href="#colorInformation" name="colorInformation" class="linkableAnchor"></a></div>
+
 ```typescript
 interface ColorInformation {
 	/**
@@ -6630,7 +9492,11 @@
 	 */
 	color: Color;
 }
+```
 
+<div class="anchorHolder"><a href="#color" name="color" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Represents a color in RGBA space.
  */
@@ -6672,9 +9538,11 @@
 
 _Request_:
 
-* method: 'textDocument/colorPresentation'
+* method: `textDocument/colorPresentation`
 * params: `ColorPresentationParams` defined as follows
 
+<div class="anchorHolder"><a href="#colorPresentationParams" name="colorPresentationParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface ColorPresentationParams extends WorkDoneProgressParams,
 	PartialResultParams {
@@ -6698,6 +9566,8 @@
 _Response_:
 * result: `ColorPresentation[]` defined as follows:
 
+<div class="anchorHolder"><a href="#colorPresentation" name="colorPresentation" class="linkableAnchor"></a></div>
+
 ```typescript
 interface ColorPresentation {
 	/**
@@ -6732,6 +9602,8 @@
 * property name (optional): `textDocument.formatting`
 * property type: `DocumentFormattingClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#documentFormattingClientCapabilities" name="documentFormattingClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentFormattingClientCapabilities {
 	/**
@@ -6745,12 +9617,17 @@
 * property name (optional): `documentFormattingProvider`
 * property type: `boolean | DocumentFormattingOptions` where `DocumentFormattingOptions` is defined as follows:
 
+<div class="anchorHolder"><a href="#documentFormattingOptions" name="documentFormattingOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentFormattingOptions extends WorkDoneProgressOptions {
 }
 ```
 
 _Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentFormattingRegistrationOptions" name="documentFormattingRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentFormattingRegistrationOptions extends
 	TextDocumentRegistrationOptions, DocumentFormattingOptions {
@@ -6758,9 +9635,11 @@
 ```
 
 _Request_:
-* method: 'textDocument/formatting'
+* method: `textDocument/formatting`
 * params: `DocumentFormattingParams` defined as follows
 
+<div class="anchorHolder"><a href="#documentFormattingParams" name="documentFormattingParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface DocumentFormattingParams extends WorkDoneProgressParams {
 	/**
@@ -6773,7 +9652,11 @@
 	 */
 	options: FormattingOptions;
 }
+```
 
+<div class="anchorHolder"><a href="#formattingOptions" name="formattingOptions" class="linkableAnchor"></a></div>
+
+```typescript
 /**
  * Value-object describing what options formatting should use.
  */
@@ -6828,6 +9711,8 @@
 * property name (optional): `textDocument.rangeFormatting`
 * property type: `DocumentRangeFormattingClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#documentRangeFormattingClientCapabilities" name="documentRangeFormattingClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentRangeFormattingClientCapabilities {
 	/**
@@ -6841,6 +9726,8 @@
 * property name (optional): `documentRangeFormattingProvider`
 * property type: `boolean | DocumentRangeFormattingOptions` where `DocumentRangeFormattingOptions` is defined as follows:
 
+<div class="anchorHolder"><a href="#documentRangeFormattingOptions" name="documentRangeFormattingOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentRangeFormattingOptions extends
 	WorkDoneProgressOptions {
@@ -6848,6 +9735,9 @@
 ```
 
 _Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentRangeFormattingRegistrationOptions" name="documentRangeFormattingRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentRangeFormattingRegistrationOptions extends
 	TextDocumentRegistrationOptions, DocumentRangeFormattingOptions {
@@ -6855,9 +9745,11 @@
 ```
 
 _Request_:
-* method: 'textDocument/rangeFormatting',
+* method: `textDocument/rangeFormatting`,
 * params: `DocumentRangeFormattingParams` defined as follows:
 
+<div class="anchorHolder"><a href="#documentRangeFormattingParams" name="documentRangeFormattingParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface DocumentRangeFormattingParams extends WorkDoneProgressParams {
 	/**
@@ -6889,6 +9781,8 @@
 * property name (optional): `textDocument.onTypeFormatting`
 * property type: `DocumentOnTypeFormattingClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#documentOnTypeFormattingClientCapabilities" name="documentOnTypeFormattingClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentOnTypeFormattingClientCapabilities {
 	/**
@@ -6902,10 +9796,12 @@
 * property name (optional): `documentOnTypeFormattingProvider`
 * property type: `DocumentOnTypeFormattingOptions` defined as follows:
 
+<div class="anchorHolder"><a href="#documentOnTypeFormattingOptions" name="documentOnTypeFormattingOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentOnTypeFormattingOptions {
 	/**
-	 * A character on which formatting should be triggered, like `}`.
+	 * A character on which formatting should be triggered, like `{`.
 	 */
 	firstTriggerCharacter: string;
 
@@ -6917,6 +9813,9 @@
 ```
 
 _Registration Options_: `DocumentOnTypeFormattingRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#documentOnTypeFormattingRegistrationOptions" name="documentOnTypeFormattingRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface DocumentOnTypeFormattingRegistrationOptions extends
 	TextDocumentRegistrationOptions, DocumentOnTypeFormattingOptions {
@@ -6924,18 +9823,36 @@
 ```
 
 _Request_:
-* method: 'textDocument/onTypeFormatting'
+* method: `textDocument/onTypeFormatting`
 * params: `DocumentOnTypeFormattingParams` defined as follows:
 
+<div class="anchorHolder"><a href="#documentOnTypeFormattingParams" name="documentOnTypeFormattingParams" class="linkableAnchor"></a></div>
+
 ```typescript
-interface DocumentOnTypeFormattingParams extends TextDocumentPositionParams {
+interface DocumentOnTypeFormattingParams {
+
 	/**
-	 * The character that has been typed.
+	 * The document to format.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The position around which the on type formatting should happen.
+	 * This is not necessarily the exact position where the character denoted
+	 * by the property `ch` got typed.
+	 */
+	position: Position;
+
+	/**
+	 * The character that has been typed that triggered the formatting
+	 * on type request. That is not necessarily the last character that
+	 * got inserted into the document since the client could auto insert
+	 * characters as well (e.g. like automatic brace completion).
 	 */
 	ch: string;
 
 	/**
-	 * The format options.
+	 * The formatting options.
 	 */
 	options: FormattingOptions;
 }
@@ -6953,6 +9870,8 @@
 * property name (optional): `textDocument.rename`
 * property type: `RenameClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#prepareSupportDefaultBehavior" name="prepareSupportDefaultBehavior" class="linkableAnchor"></a></div>
+
 ```typescript
 export namespace PrepareSupportDefaultBehavior {
 	/**
@@ -6961,6 +9880,11 @@
 	 */
 	 export const Identifier: 1 = 1;
 }
+```
+
+<div class="anchorHolder"><a href="#renameClientCapabilities" name="renameClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
 export interface RenameClientCapabilities {
 	/**
 	 * Whether rename supports dynamic registration.
@@ -6971,7 +9895,7 @@
 	 * Client supports testing for validity of rename operations
 	 * before execution.
 	 *
-	 * @since 3.12.0
+	 * @since version 3.12.0
 	 */
 	prepareSupport?: boolean;
 
@@ -6982,12 +9906,12 @@
 	 * The value indicates the default behavior used by the
 	 * client.
 	 *
-	 * @since 3.16.0
+	 * @since version 3.16.0
 	 */
 	prepareSupportDefaultBehavior?: PrepareSupportDefaultBehavior;
 
 	/**
-	 * Whether the client honors the change annotations in
+	 * Whether th client honors the change annotations in
 	 * text edits and resource operations returned via the
 	 * rename request's workspace edit by for example presenting
 	 * the workspace edit in the user interface and asking
@@ -7005,6 +9929,8 @@
 
 `RenameOptions` may only be specified if the client states that it supports `prepareSupport` in its initial `initialize` request.
 
+<div class="anchorHolder"><a href="#renameOptions" name="renameOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface RenameOptions extends WorkDoneProgressOptions {
 	/**
@@ -7015,6 +9941,9 @@
 ```
 
 _Registration Options_: `RenameRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#renameRegistrationOptions" name="renameRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface RenameRegistrationOptions extends
 	TextDocumentRegistrationOptions, RenameOptions {
@@ -7022,9 +9951,11 @@
 ```
 
 _Request_:
-* method: 'textDocument/rename'
+* method: `textDocument/rename`
 * params: `RenameParams` defined as follows
 
+<div class="anchorHolder"><a href="#renameParams" name="renameParams" class="linkableAnchor"></a></div>
+
 ```typescript
 interface RenameParams extends TextDocumentPositionParams,
 	WorkDoneProgressParams {
@@ -7038,8 +9969,8 @@
 ```
 
 _Response_:
-* result: [`WorkspaceEdit`](#workspaceedit) \| `null` describing the modification to the workspace.
-* error: code and message set in case an exception happens during the rename request.
+* result: [`WorkspaceEdit`](#workspaceedit) \| `null` describing the modification to the workspace. `null` should be treated the same was as [`WorkspaceEdit`](#workspaceedit) with no changes (no change was required).
+* error: code and message set in case when rename could not be performed for any reason. Examples include: there is nothing at given `position` to rename (like a space), given symbol does not support renaming by the server or the code is invalid (e.g. does not compile).
 
 #### <a href="#textDocument_prepareRename" name="textDocument_prepareRename" class="anchor">Prepare Rename Request (:leftwards_arrow_with_hook:)</a>
 
@@ -7048,8 +9979,11 @@
 The prepare rename request is sent from the client to the server to setup and test the validity of a rename operation at a given location.
 
 _Request_:
-* method: 'textDocument/prepareRename'
+* method: `textDocument/prepareRename`
 * params: `PrepareRenameParams` defined as follows:
+
+<div class="anchorHolder"><a href="#prepareRenameParams" name="prepareRenameParams" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface PrepareRenameParams extends TextDocumentPositionParams {
 }
@@ -7059,876 +9993,6 @@
 * result: `Range | { range: Range, placeholder: string } | { defaultBehavior: boolean } | null` describing a [`Range`](#range) of the string to rename and optionally a placeholder text of the string content to be renamed. If `{ defaultBehavior: boolean }` is returned (since 3.16) the rename position is valid and the client should use its default behavior to compute the rename range. If `null` is returned then it is deemed that a 'textDocument/rename' request is not valid at the given position.
 * error: code and message set in case the element can't be renamed. Clients should show the information in their user interface.
 
-#### <a href="#textDocument_foldingRange" name="textDocument_foldingRange" class="anchor">Folding Range Request (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.10.0*
-
-The folding range request is sent from the client to the server to return all folding ranges found in a given text document.
-
-_Client Capability_:
-* property name (optional): `textDocument.foldingRange`
-* property type: `FoldingRangeClientCapabilities` defined as follows:
-
-```typescript
-export interface FoldingRangeClientCapabilities {
-	/**
-	 * Whether implementation supports dynamic registration for folding range
-	 * providers. If this is set to `true` the client supports the new
-	 * `FoldingRangeRegistrationOptions` return value for the corresponding
-	 * server capability as well.
-	 */
-	dynamicRegistration?: boolean;
-	/**
-	 * The maximum number of folding ranges that the client prefers to receive
-	 * per document. The value serves as a hint, servers are free to follow the
-	 * limit.
-	 */
-	rangeLimit?: uinteger;
-	/**
-	 * If set, the client signals that it only supports folding complete lines.
-	 * If set, client will ignore specified `startCharacter` and `endCharacter`
-	 * properties in a FoldingRange.
-	 */
-	lineFoldingOnly?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `foldingRangeProvider`
-* property type: `boolean | FoldingRangeOptions | FoldingRangeRegistrationOptions` where `FoldingRangeOptions` is defined as follows:
-
-```typescript
-export interface FoldingRangeOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `FoldingRangeRegistrationOptions` defined as follows:
-```typescript
-export interface FoldingRangeRegistrationOptions extends
-	TextDocumentRegistrationOptions, FoldingRangeOptions,
-	StaticRegistrationOptions {
-}
-```
-
-_Request_:
-
-* method: 'textDocument/foldingRange'
-* params: `FoldingRangeParams` defined as follows
-
-```typescript
-export interface FoldingRangeParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * The text document.
-	 */
-	textDocument: TextDocumentIdentifier;
-}
-```
-
-_Response_:
-* result: `FoldingRange[] | null` defined as follows:
-
-```typescript
-/**
- * Enum of known range kinds
- */
-export enum FoldingRangeKind {
-	/**
-	 * Folding range for a comment
-	 */
-	Comment = 'comment',
-	/**
-	 * Folding range for a imports or includes
-	 */
-	Imports = 'imports',
-	/**
-	 * Folding range for a region (e.g. `#region`)
-	 */
-	Region = 'region'
-}
-
-/**
- * Represents a folding range. To be valid, start and end line must be bigger
- * than zero and smaller than the number of lines in the document. Clients
- * are free to ignore invalid ranges.
- */
-export interface FoldingRange {
-
-	/**
-	 * The zero-based start line of the range to fold. The folded area starts
-	 * after the line's last character. To be valid, the end must be zero or
-	 * larger and smaller than the number of lines in the document.
-	 */
-	startLine: uinteger;
-
-	/**
-	 * The zero-based character offset from where the folded range starts. If
-	 * not defined, defaults to the length of the start line.
-	 */
-	startCharacter?: uinteger;
-
-	/**
-	 * The zero-based end line of the range to fold. The folded area ends with
-	 * the line's last character. To be valid, the end must be zero or larger
-	 * and smaller than the number of lines in the document.
-	 */
-	endLine: uinteger;
-
-	/**
-	 * The zero-based character offset before the folded range ends. If not
-	 * defined, defaults to the length of the end line.
-	 */
-	endCharacter?: uinteger;
-
-	/**
-	 * Describes the kind of the folding range such as `comment` or `region`.
-	 * The kind is used to categorize folding ranges and used by commands like
-	 * 'Fold all comments'. See [FoldingRangeKind](#FoldingRangeKind) for an
-	 * enumeration of standardized kinds.
-	 */
-	kind?: string;
-}
-```
-
-* partial result: `FoldingRange[]`
-* error: code and message set in case an exception happens during the 'textDocument/foldingRange' request
-
-#### <a href="#textDocument_selectionRange" name="textDocument_selectionRange" class="anchor">Selection Range Request (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.15.0*
-
-The selection range request is sent from the client to the server to return suggested selection ranges at an array of given positions. A selection range is a range around the cursor position which the user might be interested in selecting.
-
-A selection range in the return array is for the position in the provided parameters at the same index. Therefore positions[i] must be contained in result[i].range. To allow for results where some positions have selection ranges and others do not, result[i].range is allowed to be the empty range at positions[i].
-
-Typically, but not necessary, selection ranges correspond to the nodes of the syntax tree.
-
-_Client Capability_:
-* property name (optional): `textDocument.selectionRange`
-* property type: `SelectionRangeClientCapabilities` defined as follows:
-
-```typescript
-export interface SelectionRangeClientCapabilities {
-	/**
-	 * Whether implementation supports dynamic registration for selection range
-	 * providers. If this is set to `true` the client supports the new
-	 * `SelectionRangeRegistrationOptions` return value for the corresponding
-	 * server capability as well.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
-
-_Server Capability_:
-* property name (optional): `selectionRangeProvider`
-* property type: `boolean | SelectionRangeOptions | SelectionRangeRegistrationOptions` where `SelectionRangeOptions` is defined as follows:
-
-```typescript
-export interface SelectionRangeOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `SelectionRangeRegistrationOptions` defined as follows:
-```typescript
-export interface SelectionRangeRegistrationOptions extends
-	SelectionRangeOptions, TextDocumentRegistrationOptions,
-	StaticRegistrationOptions {
-}
-```
-
-_Request_:
-
-* method: 'textDocument/selectionRange'
-* params: `SelectionRangeParams` defined as follows:
-
-```typescript
-export interface SelectionRangeParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * The text document.
-	 */
-	textDocument: TextDocumentIdentifier;
-
-	/**
-	 * The positions inside the text document.
-	 */
-	positions: Position[];
-}
-```
-
-_Response_:
-
-* result: `SelectionRange[] | null` defined as follows:
-
-```typescript
-export interface SelectionRange {
-	/**
-	 * The [range](#Range) of this selection range.
-	 */
-	range: Range;
-	/**
-	 * The parent selection range containing this range. Therefore
-	 * `parent.range` must contain `this.range`.
-	 */
-	parent?: SelectionRange;
-}
-```
-
-* partial result: `SelectionRange[]`
-* error: code and message set in case an exception happens during the 'textDocument/selectionRange' request
-
-#### <a href="#textDocument_prepareCallHierarchy" name="textDocument_prepareCallHierarchy" class="anchor">Prepare Call Hierarchy Request (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.16.0*
-
-The call hierarchy request is sent from the client to the server to return a call hierarchy for the language element of given text document positions. The call hierarchy requests are executed in two steps:
-
-  1. first a call hierarchy item is resolved for the given text document position
-  1. for a call hierarchy item the incoming or outgoing call hierarchy items are resolved.
-
-_Client Capability_:
-
-* property name (optional): `textDocument.callHierarchy`
-* property type: `CallHierarchyClientCapabilities` defined as follows:
-
-```typescript
-interface CallHierarchyClientCapabilities {
-	/**
-	 * Whether implementation supports dynamic registration. If this is set to
-	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
-	 * StaticRegistrationOptions)` return value for the corresponding server
-	 * capability as well.
-	 */
-	dynamicRegistration?: boolean;
-}
-```
-
-_Server Capability_:
-
-* property name (optional): `callHierarchyProvider`
-* property type: `boolean | CallHierarchyOptions | CallHierarchyRegistrationOptions` where `CallHierarchyOptions` is defined as follows:
-
-```typescript
-export interface CallHierarchyOptions extends WorkDoneProgressOptions {
-}
-```
-
-_Registration Options_: `CallHierarchyRegistrationOptions` defined as follows:
-
-```typescript
-export interface CallHierarchyRegistrationOptions extends
-	TextDocumentRegistrationOptions, CallHierarchyOptions,
-	StaticRegistrationOptions {
-}
-```
-
-_Request_:
-
-* method: 'textDocument/prepareCallHierarchy'
-* params: `CallHierarchyPrepareParams` defined as follows:
-
-```typescript
-export interface CallHierarchyPrepareParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams {
-}
-```
-
-_Response_:
-
-* result: `CallHierarchyItem[] | null` defined as follows:
-
-```typescript
-export interface CallHierarchyItem {
-	/**
-	 * The name of this item.
-	 */
-	name: string;
-
-	/**
-	 * The kind of this item.
-	 */
-	kind: SymbolKind;
-
-	/**
-	 * Tags for this item.
-	 */
-	tags?: SymbolTag[];
-
-	/**
-	 * More detail for this item, e.g. the signature of a function.
-	 */
-	detail?: string;
-
-	/**
-	 * The resource identifier of this item.
-	 */
-	uri: DocumentUri;
-
-	/**
-	 * The range enclosing this symbol not including leading/trailing whitespace
-	 * but everything else, e.g. comments and code.
-	 */
-	range: Range;
-
-	/**
-	 * The range that should be selected and revealed when this symbol is being
-	 * picked, e.g. the name of a function. Must be contained by the
-	 * [`range`](#CallHierarchyItem.range).
-	 */
-	selectionRange: Range;
-
-	/**
-	 * A data entry field that is preserved between a call hierarchy prepare and
-	 * incoming calls or outgoing calls requests.
-	 */
-	data?: unknown;
-}
-```
-
-* error: code and message set in case an exception happens during the 'textDocument/prepareCallHierarchy' request
-
-#### <a href="#callHierarchy_incomingCalls" name="callHierarchy_incomingCalls" class="anchor">Call Hierarchy Incoming Calls (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.16.0*
-
-The request is sent from the client to the server to resolve incoming calls for a given call hierarchy item. The request doesn't define its own client and server capabilities. It is only issued if a server registers for the [`textDocument/prepareCallHierarchy` request](#textDocument_prepareCallHierarchy).
-
-_Request_:
-
-* method: 'callHierarchy/incomingCalls'
-* params: `CallHierarchyIncomingCallsParams` defined as follows:
-
-```typescript
-export interface CallHierarchyIncomingCallsParams extends
-	WorkDoneProgressParams, PartialResultParams {
-	item: CallHierarchyItem;
-}
-```
-
-_Response_:
-
-* result: `CallHierarchyIncomingCall[] | null` defined as follows:
-
-```typescript
-export interface CallHierarchyIncomingCall {
-
-	/**
-	 * The item that makes the call.
-	 */
-	from: CallHierarchyItem;
-
-	/**
-	 * The ranges at which the calls appear. This is relative to the caller
-	 * denoted by [`this.from`](#CallHierarchyIncomingCall.from).
-	 */
-	fromRanges: Range[];
-}
-```
-
-* partial result: `CallHierarchyIncomingCall[]`
-* error: code and message set in case an exception happens during the 'callHierarchy/incomingCalls' request
-
-#### <a href="#callHierarchy_outgoingCalls" name="callHierarchy_outgoingCalls" class="anchor">Call Hierarchy Outgoing Calls (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.16.0*
-
-The request is sent from the client to the server to resolve outgoing calls for a given call hierarchy item. The request doesn't define its own client and server capabilities. It is only issued if a server registers for the [`textDocument/prepareCallHierarchy` request](#textDocument_prepareCallHierarchy).
-
-_Request_:
-
-* method: 'callHierarchy/outgoingCalls'
-* params: `CallHierarchyOutgoingCallsParams` defined as follows:
-
-```typescript
-export interface CallHierarchyOutgoingCallsParams extends
-	WorkDoneProgressParams, PartialResultParams {
-	item: CallHierarchyItem;
-}
-```
-
-_Response_:
-
-* result: `CallHierarchyOutgoingCall[] | null` defined as follows:
-
-```typescript
-export interface CallHierarchyOutgoingCall {
-
-	/**
-	 * The item that is called.
-	 */
-	to: CallHierarchyItem;
-
-	/**
-	 * The range at which this item is called. This is the range relative to
-	 * the caller, e.g the item passed to `callHierarchy/outgoingCalls` request.
-	 */
-	fromRanges: Range[];
-}
-```
-
-* partial result: `CallHierarchyOutgoingCall[]`
-* error: code and message set in case an exception happens during the 'callHierarchy/outgoingCalls' request
-
-#### <a href="#textDocument_semanticTokens" name="textDocument_semanticTokens" class="anchor">Semantic Tokens (:leftwards_arrow_with_hook:)</a>
-
-> *Since version 3.16.0*
-
-The request is sent from the client to the server to resolve semantic tokens for a given file. Semantic tokens are used to add additional color information to a file that depends on language specific symbol information. A semantic token request usually produces a large result. The protocol therefore supports encoding tokens with numbers. In addition optional support for deltas is available.
-
-_General Concepts_
-
-Tokens are represented using one token type combined with n token modifiers. A token type is something like `class` or `function` and token modifiers are like `static` or `async`. The protocol defines a set of token types and modifiers but clients are allowed to extend these and announce the values they support in the corresponding client capability. The predefined values are:
-
-```typescript
-export enum SemanticTokenTypes {
-	namespace = 'namespace',
-	/**
-	 * Represents a generic type. Acts as a fallback for types which
-	 * can't be mapped to a specific type like class or enum.
-	 */
-	type = 'type',
-	class = 'class',
-	enum = 'enum',
-	interface = 'interface',
-	struct = 'struct',
-	typeParameter = 'typeParameter',
-	parameter = 'parameter',
-	variable = 'variable',
-	property = 'property',
-	enumMember = 'enumMember',
-	event = 'event',
-	function = 'function',
-	method = 'method',
-	macro = 'macro',
-	keyword = 'keyword',
-	modifier = 'modifier',
-	comment = 'comment',
-	string = 'string',
-	number = 'number',
-	regexp = 'regexp',
-	operator = 'operator'
-}
-
-export enum SemanticTokenModifiers {
-	declaration = 'declaration',
-	definition = 'definition',
-	readonly = 'readonly',
-	static = 'static',
-	deprecated = 'deprecated',
-	abstract = 'abstract',
-	async = 'async',
-	modification = 'modification',
-	documentation = 'documentation',
-	defaultLibrary = 'defaultLibrary'
-}
-```
-
-The protocol defines an additional token format capability to allow future extensions of the format. The only format that is currently specified is `relative` expressing that the tokens are described using relative positions (see Integer Encoding for Tokens below).
-
-```typescript
-export namespace TokenFormat {
-	export const Relative: 'relative' = 'relative';
-}
-
-export type TokenFormat = 'relative';
-```
-
-_Integer Encoding for Tokens_
-
-On the capability level types and modifiers are defined using strings. However the real encoding happens using numbers. The server therefore needs to let the client know which numbers it is using for which types and modifiers. They do so using a legend, which is defined as follows:
-
-```typescript
-export interface SemanticTokensLegend {
-	/**
-	 * The token types a server uses.
-	 */
-	tokenTypes: string[];
-
-	/**
-	 * The token modifiers a server uses.
-	 */
-	tokenModifiers: string[];
-}
-```
-
-Token types are looked up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Since a token type can have n modifiers, multiple token modifiers can be set by using bit flags,
-so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because bits 0 and 1 are set.
-
-There are different ways how the position of a token can be expressed in a file. Absolute positions or relative positions. The protocol for the token format `relative` uses relative positions, because most tokens remain stable relative to each other when edits are made in a file. This simplifies the computation of a delta if a server supports it. So each token is represented using 5 integers. A specific token `i` in the file consists of the following array indices:
-
-- at index `5*i`   - `deltaLine`: token line number, relative to the previous token
-- at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line)
-- at index `5*i+2` - `length`: the length of the token.
-- at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536.
-- at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
-
-Whether a token can span multiple lines is defined by the client capability `multilineTokenSupport`. If multiline tokens are not supported and a tokens length takes it past the end of the line, it should be treated as if the token ends at the end of the line and will not wrap onto the next line.
-
-The client capability `overlappingTokenSupport` defines whether tokens can overlap each other.
-
-Lets look at a concrete example which uses single line tokens without overlaps for encoding a file with 3 tokens in a number array. We start with absolute positions to demonstrate how they can easily be transformed into relative positions:
-
-```typescript
-{ line: 2, startChar:  5, length: 3, tokenType: "property",
-	tokenModifiers: ["private", "static"]
-},
-{ line: 2, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] },
-{ line: 5, startChar:  2, length: 7, tokenType: "class", tokenModifiers: [] }
-```
-
-First of all, a legend must be devised. This legend must be provided up-front on registration and capture all possible token types and modifiers. For the example we use this legend:
-
-```typescript
-{
-   tokenTypes: ['property', 'type', 'class'],
-   tokenModifiers: ['private', 'static']
-}
-```
-
-The first transformation step is to encode `tokenType` and `tokenModifiers` as integers using the legend. As said, token types are looked up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Multiple token modifiers can be set by using bit flags, so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because bits 0 and 1 are set. Using this legend, the tokens now are:
-
-```typescript
-{ line: 2, startChar:  5, length: 3, tokenType: 0, tokenModifiers: 3 },
-{ line: 2, startChar: 10, length: 4, tokenType: 1, tokenModifiers: 0 },
-{ line: 5, startChar:  2, length: 7, tokenType: 2, tokenModifiers: 0 }
-```
-
-The next step is to represent each token relative to the previous token in the file. In this case, the second token is on the same line as the first token, so the `startChar` of the second token is made relative to the `startChar` of the first token, so it will be `10 - 5`. The third token is on a different line than the second token, so the `startChar` of the third token will not be altered:
-
-```typescript
-{ deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 },
-{ deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 },
-{ deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 }
-```
-
-Finally, the last step is to inline each of the 5 fields for a token in a single array, which is a memory friendly representation:
-
-```typescript
-// 1st token,  2nd token,  3rd token
-[  2,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0 ]
-```
-
-Now assume that the user types a new empty line at the beginning of the file which results in the following tokens in the file:
-
-```typescript
-{ line: 3, startChar:  5, length: 3, tokenType: "property",
-	tokenModifiers: ["private", "static"]
-},
-{ line: 3, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] },
-{ line: 6, startChar:  2, length: 7, tokenType: "class", tokenModifiers: [] }
-```
-
-Running the same transformations as above will result in the following number array:
-
-```typescript
-// 1st token,  2nd token,  3rd token
-[  3,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0]
-```
-
-The delta is now expressed on these number arrays without any form of interpretation what these numbers mean. This is comparable to the text document edits send from the server to the client to modify the content of a file. Those are character based and don't make any assumption about the meaning of the characters. So `[  2,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0 ]` can be transformed into `[  3,5,3,0,3,  0,5,4,1,0,  3,2,7,2,0]` using the following edit description: `{ start:  0, deleteCount: 1, data: [3] }` which tells the client to simply replace the first number (e.g. `2`) in the array with `3`.
-
-Semantic token edits behave conceptually like [text edits](#textEditArray) on documents: if an edit description consists of n edits all n edits are based on the same state Sm of the number array. They will move the number array from state Sm to Sm+1. A client applying the edits must not assume that they are sorted. An easy algorithm to apply them to the number array is to sort the edits and apply them from the back to the front of the number array.
-
-
-_Client Capability_:
-
-The following client capabilities are defined for semantic token requests sent from the client to the server:
-
-* property name (optional): `textDocument.semanticTokens`
-* property type: `SemanticTokensClientCapabilities` defined as follows:
-
-```typescript
-interface SemanticTokensClientCapabilities {
-	/**
-	 * Whether implementation supports dynamic registration. If this is set to
-	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
-	 * StaticRegistrationOptions)` return value for the corresponding server
-	 * capability as well.
-	 */
-	dynamicRegistration?: boolean;
-
-	/**
-	 * Which requests the client supports and might send to the server
-	 * depending on the server's capability. Please note that clients might not
-	 * show semantic tokens or degrade some of the user experience if a range
-	 * or full request is advertised by the client but not provided by the
-	 * server. If for example the client capability `requests.full` and
-	 * `request.range` are both set to true but the server only provides a
-	 * range provider the client might not render a minimap correctly or might
-	 * even decide to not show any semantic tokens at all.
-	 */
-	requests: {
-		/**
-		 * The client will send the `textDocument/semanticTokens/range` request
-		 * if the server provides a corresponding handler.
-		 */
-		range?: boolean | {
-		};
-
-		/**
-		 * The client will send the `textDocument/semanticTokens/full` request
-		 * if the server provides a corresponding handler.
-		 */
-		full?: boolean | {
-			/**
-			 * The client will send the `textDocument/semanticTokens/full/delta`
-			 * request if the server provides a corresponding handler.
-			 */
-			delta?: boolean;
-		};
-	};
-
-	/**
-	 * The token types that the client supports.
-	 */
-	tokenTypes: string[];
-
-	/**
-	 * The token modifiers that the client supports.
-	 */
-	tokenModifiers: string[];
-
-	/**
-	 * The formats the clients supports.
-	 */
-	formats: TokenFormat[];
-
-	/**
-	 * Whether the client supports tokens that can overlap each other.
-	 */
-	overlappingTokenSupport?: boolean;
-
-	/**
-	 * Whether the client supports tokens that can span multiple lines.
-	 */
-	multilineTokenSupport?: boolean;
-}
-```
-
-_Server Capability_:
-
-The following server capabilities are defined for semantic tokens:
-
-* property name (optional): `semanticTokensProvider`
-* property type: `SemanticTokensOptions | SemanticTokensRegistrationOptions` where `SemanticTokensOptions` is defined as follows:
-
-```typescript
-export interface SemanticTokensOptions extends WorkDoneProgressOptions {
-	/**
-	 * The legend used by the server
-	 */
-	legend: SemanticTokensLegend;
-
-	/**
-	 * Server supports providing semantic tokens for a specific range
-	 * of a document.
-	 */
-	range?: boolean | {
-	};
-
-	/**
-	 * Server supports providing semantic tokens for a full document.
-	 */
-	full?: boolean | {
-		/**
-		 * The server supports deltas for full documents.
-		 */
-		delta?: boolean;
-	};
-}
-```
-
-_Registration Options_: `SemanticTokensRegistrationOptions` defined as follows:
-
-```typescript
-export interface SemanticTokensRegistrationOptions extends
-	TextDocumentRegistrationOptions, SemanticTokensOptions,
-	StaticRegistrationOptions {
-}
-```
-
-Since the registration option handles range, full and delta requests the method used to register for semantic tokens requests is `textDocument/semanticTokens` and not one of the specific methods described below.
-
-**Requesting semantic tokens for a whole file**
-
-_Request_:
-
-* method: `textDocument/semanticTokens/full`
-* params: `SemanticTokensParams` defined as follows:
-
-```typescript
-export interface SemanticTokensParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * The text document.
-	 */
-	textDocument: TextDocumentIdentifier;
-}
-```
-
-_Response_:
-
-* result: `SemanticTokens | null` where `SemanticTokens` is defined as follows:
-
-```typescript
-export interface SemanticTokens {
-	/**
-	 * An optional result id. If provided and clients support delta updating
-	 * the client will include the result id in the next semantic token request.
-	 * A server can then instead of computing all semantic tokens again simply
-	 * send a delta.
-	 */
-	resultId?: string;
-
-	/**
-	 * The actual tokens.
-	 */
-	data: uinteger[];
-}
-```
-
-* partial result: `SemanticTokensPartialResult` defines as follows:
-
-```typescript
-export interface SemanticTokensPartialResult {
-	data: uinteger[];
-}
-```
-
-* error: code and message set in case an exception happens during the 'textDocument/semanticTokens/full' request
-
-**Requesting semantic token delta for a whole file**
-
-_Request_:
-
-* method: `textDocument/semanticTokens/full/delta`
-* params: `SemanticTokensDeltaParams` defined as follows:
-
-```typescript
-export interface SemanticTokensDeltaParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * The text document.
-	 */
-	textDocument: TextDocumentIdentifier;
-
-	/**
-	 * The result id of a previous response. The result Id can either point to
-	 * a full response or a delta response depending on what was received last.
-	 */
-	previousResultId: string;
-}
-```
-
-_Response_:
-
-* result: `SemanticTokens | SemanticTokensDelta | null` where `SemanticTokensDelta` is defined as follows:
-
-```typescript
-export interface SemanticTokensDelta {
-	readonly resultId?: string;
-	/**
-	 * The semantic token edits to transform a previous result into a new
-	 * result.
-	 */
-	edits: SemanticTokensEdit[];
-}
-
-export interface SemanticTokensEdit {
-	/**
-	 * The start offset of the edit.
-	 */
-	start: uinteger;
-
-	/**
-	 * The count of elements to remove.
-	 */
-	deleteCount: uinteger;
-
-	/**
-	 * The elements to insert.
-	 */
-	data?: uinteger[];
-}
-```
-
-* partial result: `SemanticTokensDeltaPartialResult` defines as follows:
-
-```typescript
-export interface SemanticTokensDeltaPartialResult {
-	edits: SemanticTokensEdit[];
-}
-```
-
-* error: code and message set in case an exception happens during the 'textDocument/semanticTokens/full/delta' request
-
-**Requesting semantic tokens for a range**
-
-There are two uses cases where it can be beneficial to only compute semantic tokens for a visible range:
-
-- for faster rendering of the tokens in the user interface when a user opens a file. In this use cases servers should also implement the `textDocument/semanticTokens/full` request as well to allow for flicker free scrolling and semantic coloring of a minimap.
-- if computing semantic tokens for a full document is too expensive servers can only provide a range call. In this case the client might not render a minimap correctly or might even decide to not show any semantic tokens at all.
-
-_Request_:
-
-* method: `textDocument/semanticTokens/range`
-* params: `SemanticTokensRangeParams` defined as follows:
-
-```typescript
-export interface SemanticTokensRangeParams extends WorkDoneProgressParams,
-	PartialResultParams {
-	/**
-	 * The text document.
-	 */
-	textDocument: TextDocumentIdentifier;
-
-	/**
-	 * The range the semantic tokens are requested for.
-	 */
-	range: Range;
-}
-```
-
-_Response_:
-
-* result: `SemanticTokens | null`
-* partial result: `SemanticTokensPartialResult`
-* error: code and message set in case an exception happens during the 'textDocument/semanticTokens/range' request
-
-**Requesting a refresh of all semantic tokens**
-
-The `workspace/semanticTokens/refresh` request is sent from the server to the client. Servers can use it to ask clients to refresh the editors for which this server provides semantic tokens. As a result the client should ask the server to recompute the semantic tokens for these editors. This is useful if a server detects a project wide configuration change which requires a re-calculation of all semantic tokens. Note that the client still has the freedom to delay the re-calculation of the semantic tokens if for example an editor is currently not visible.
-
-_Client Capability_:
-
-* property name (optional): `workspace.semanticTokens`
-* property type: `SemanticTokensWorkspaceClientCapabilities` defined as follows:
-
-```typescript
-export interface SemanticTokensWorkspaceClientCapabilities {
-	/**
-	 * Whether the client implementation supports a refresh request sent from
-	 * the server to the client.
-	 *
-	 * Note that this event is global and will force the client to refresh all
-	 * semantic tokens currently shown. It should be used with absolute care
-	 * and is useful for situation where a server for example detect a project
-	 * wide change that requires such a calculation.
-	 */
-	refreshSupport?: boolean;
-}
-```
-
-_Request_:
-
-* method: `workspace/semanticTokens/refresh`
-* params: none
-
-_Response_:
-
-* result: void
-* error: code and message set in case an exception happens during the 'workspace/semanticTokens/refresh' request
-
 #### <a href="#textDocument_linkedEditingRange" name="textDocument_linkedEditingRange" class="anchor">Linked Editing Range(:leftwards_arrow_with_hook:)</a>
 
 > *Since version 3.16.0*
@@ -7940,6 +10004,8 @@
 * property name (optional): `textDocument.linkedEditingRange`
 * property type: `LinkedEditingRangeClientCapabilities` defined as follows:
 
+<div class="anchorHolder"><a href="#linkedEditingRangeClientCapabilities" name="linkedEditingRangeClientCapabilities" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface LinkedEditingRangeClientCapabilities {
 	/**
@@ -7957,6 +10023,8 @@
 * property name (optional): `linkedEditingRangeProvider`
 * property type: `boolean` \| `LinkedEditingRangeOptions` \| `LinkedEditingRangeRegistrationOptions` defined as follows:
 
+<div class="anchorHolder"><a href="#linkedEditingRangeOptions" name="linkedEditingRangeOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface LinkedEditingRangeOptions extends WorkDoneProgressOptions {
 }
@@ -7964,6 +10032,8 @@
 
 _Registration Options_: `LinkedEditingRangeRegistrationOptions` defined as follows:
 
+<div class="anchorHolder"><a href="#linkedEditingRangeRegistrationOptions" name="linkedEditingRangeRegistrationOptions" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface LinkedEditingRangeRegistrationOptions extends
 	TextDocumentRegistrationOptions, LinkedEditingRangeOptions,
@@ -7976,6 +10046,8 @@
 * method: `textDocument/linkedEditingRange`
 * params: `LinkedEditingRangeParams` defined as follows:
 
+<div class="anchorHolder"><a href="#linkedEditingRangeParams" name="linkedEditingRangeParams" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface LinkedEditingRangeParams extends TextDocumentPositionParams,
 	WorkDoneProgressParams {
@@ -7986,170 +10058,1390 @@
 
 * result: `LinkedEditingRanges` \| `null` defined as follows:
 
+<div class="anchorHolder"><a href="#linkedEditingRanges" name="linkedEditingRanges" class="linkableAnchor"></a></div>
+
 ```typescript
 export interface LinkedEditingRanges {
 	/**
 	 * A list of ranges that can be renamed together. The ranges must have
-	 * identical length and contain identical text content. The ranges cannot overlap.
+	 * identical length and contain identical text content. The ranges cannot
+	 * overlap.
 	 */
 	ranges: Range[];
 
 	/**
-	 * An optional word pattern (regular expression) that describes valid contents for
-	 * the given ranges. If no pattern is provided, the client configuration's word
-	 * pattern will be used.
+	 * An optional word pattern (regular expression) that describes valid
+	 * contents for the given ranges. If no pattern is provided, the client
+	 * configuration's word pattern will be used.
 	 */
 	wordPattern?: string;
 }
 ```
 * error: code and message set in case an exception happens during the 'textDocument/linkedEditingRange' request
 
-#### <a href="#textDocument_moniker" name="textDocument_moniker" class="anchor">Monikers (:leftwards_arrow_with_hook:)</a>
 
-> *Since version 3.16.0*
+### <a href="#workspaceFeatures" name="workspaceFeatures" class="anchor">Workspace Features</a>
 
-Language Server Index Format (LSIF) introduced the concept of symbol monikers to help associate symbols across different indexes. This request adds capability for LSP server implementations to provide the same symbol moniker information given a text document position. Clients can utilize this method to get the moniker at the current location in a file user is editing and do further code navigation queries in other services that rely on LSIF indexes and link symbols together.
+#### <a href="#workspace_symbol" name="workspace_symbol" class="anchor">Workspace Symbols Request (:leftwards_arrow_with_hook:)</a>
 
-The `textDocument/moniker` request is sent from the client to the server to get the symbol monikers for a given text document position. An array of Moniker types is returned as response to indicate possible monikers at the given location. If no monikers can be calculated, an empty array or `null` should be returned.
+The workspace symbol request is sent from the client to the server to list project-wide symbols matching the query string. Since 3.17.0 servers can also provider a handler for `workspaceSymbol/resolve` requests. This allows servers to return workspace symbols without a range for a `workspace/symbol` request. Clients then need to resolve the range when necessary using the `workspaceSymbol/resolve` request. Servers can only use this new model if clients advertise support for it via the `workspace.symbol.resolveSupport` capability.
 
-_Client Capabilities_:
-
-* property name (optional): `textDocument.moniker`
-* property type: `MonikerClientCapabilities` defined as follows:
+_Client Capability_:
+* property path (optional): `workspace.symbol`
+* property type: `WorkspaceSymbolClientCapabilities` defined as follows:
 
 ```typescript
-interface MonikerClientCapabilities {
+interface WorkspaceSymbolClientCapabilities {
 	/**
-	 * Whether implementation supports dynamic registration. If this is set to
-	 * `true` the client supports the new `(TextDocumentRegistrationOptions &
-	 * StaticRegistrationOptions)` return value for the corresponding server
-	 * capability as well.
+	 * Symbol request supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * Specific capabilities for the `SymbolKind` in the `workspace/symbol`
+	 * request.
+	 */
+	symbolKind?: {
+		/**
+		 * The symbol 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.
+		 *
+		 * If this property is not present the client only supports
+		 * the symbol kinds from `File` to `Array` as defined in
+		 * the initial version of the protocol.
+		 */
+		valueSet?: SymbolKind[];
+	};
+
+	/**
+	 * The client supports tags on `SymbolInformation` and `WorkspaceSymbol`.
+	 * Clients supporting tags have to handle unknown tags gracefully.
+	 *
+	 * @since 3.16.0
+	 */
+	tagSupport?: {
+		/**
+		 * The tags supported by the client.
+		 */
+		valueSet: SymbolTag[];
+	};
+
+	/**
+	 * The client support partial workspace symbols. The client will send the
+	 * request `workspaceSymbol/resolve` to the server to resolve additional
+	 * properties.
+	 *
+	 * @since 3.17.0 - proposedState
+	 */
+	resolveSupport?: {
+		/**
+		 * The properties that a client can resolve lazily. Usually
+		 * `location.range`
+		 */
+		properties: string[];
+	};
+}
+```
+
+_Server Capability_:
+* property path (optional): `workspaceSymbolProvider`
+* property type: `boolean | WorkspaceSymbolOptions` where `WorkspaceSymbolOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceSymbolOptions" name="workspaceSymbolOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface WorkspaceSymbolOptions extends WorkDoneProgressOptions {
+	/**
+	 * The server provides support to resolve additional
+	 * information for a workspace symbol.
+	 *
+	 * @since 3.17.0
+	 */
+	resolveProvider?: boolean;
+}
+```
+
+_Registration Options_: `WorkspaceSymbolRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceSymbolRegistrationOptions" name="workspaceSymbolRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+export interface WorkspaceSymbolRegistrationOptions
+	extends WorkspaceSymbolOptions {
+}
+```
+
+_Request_:
+* method: 'workspace/symbol'
+* params: `WorkspaceSymbolParams` defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceSymbolParams" name="workspaceSymbolParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The parameters of a Workspace Symbol Request.
+ */
+interface WorkspaceSymbolParams extends WorkDoneProgressParams,
+	PartialResultParams {
+	/**
+	 * A query string to filter symbols by. Clients may send an empty
+	 * string here to request all symbols.
+	 */
+	query: string;
+}
+```
+
+_Response_:
+* result: `SymbolInformation[]` \| `WorkspaceSymbol[]` \| `null`. See above for the definition of `SymbolInformation`. It is recommended that you use the new `WorkspaceSymbol`. However whether the workspace symbol can return a location without a range depends on the client capability `workspace.symbol.resolveSupport`. `WorkspaceSymbol`which is defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceSymbol" name="workspaceSymbol" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A special workspace symbol that supports locations without a range
+ *
+ * @since 3.17.0
+ */
+export interface WorkspaceSymbol {
+	/**
+	 * The name of this symbol.
+	 */
+	name: string;
+
+	/**
+	 * The kind of this symbol.
+	 */
+	kind: SymbolKind;
+
+	/**
+	 * Tags for this completion item.
+	 */
+	tags?: SymbolTag[];
+
+	/**
+	 * The location of this symbol. Whether a server is allowed to
+	 * return a location without a range depends on the client
+	 * capability `workspace.symbol.resolveSupport`.
+	 *
+	 * See also `SymbolInformation.location`.
+	 */
+	location: Location | { uri: DocumentUri };
+
+	/**
+	 * The name of the symbol containing this symbol. This information is for
+	 * user interface purposes (e.g. to render a qualifier in the user interface
+	 * if necessary). It can't be used to re-infer a hierarchy for the document
+	 * symbols.
+	 */
+	containerName?: string;
+}
+```
+* partial result: `SymbolInformation[]` \| `WorkspaceSymbol[]` as defined above.
+* error: code and message set in case an exception happens during the workspace symbol request.
+
+#### <a href="#workspace_symbolResolve" name="workspace_symbolResolve" class="anchor">Workspace Symbol Resolve Request (:leftwards_arrow_with_hook:)</a>
+
+The request is sent from the client to the server to resolve additional information for a given workspace symbol.
+
+_Request_:
+* method: 'workspaceSymbol/resolve'
+* params: `WorkspaceSymbol`
+
+_Response_:
+* result: `WorkspaceSymbol`
+* error: code and message set in case an exception happens during the workspace symbol resolve request.
+
+#### <a href="#workspace_configuration" name="workspace_configuration" class="anchor">Configuration Request (:arrow_right_hook:)</a>
+
+> *Since version 3.6.0*
+
+The `workspace/configuration` request is sent from the server to the client to fetch configuration settings from the client. The request can fetch several configuration settings in one roundtrip. The order of the returned configuration settings correspond to the order of the passed `ConfigurationItems` (e.g. the first item in the response is the result for the first configuration item in the params).
+
+A `ConfigurationItem` consists of the configuration section to ask for and an additional scope URI. The configuration section asked for is defined by the server and doesn't necessarily need to correspond to the configuration store used by the client. So a server might ask for a configuration `cpp.formatterOptions` but the client stores the configuration in an XML store layout differently. It is up to the client to do the necessary conversion. If a scope URI is provided the client should return the setting scoped to the provided resource. If the client for example uses [EditorConfig](http://editorconfig.org/) to manage its settings the configuration should be returned for the passed resource URI. If the client can't provide a configuration setting for a given scope then `null` needs to be present in the returned array.
+
+_Client Capability_:
+* property path (optional): `workspace.configuration`
+* property type: `boolean`
+
+_Request_:
+* method: 'workspace/configuration'
+* params: `ConfigurationParams` defined as follows
+
+<div class="anchorHolder"><a href="#configurationParams" name="configurationParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ConfigurationParams {
+	items: ConfigurationItem[];
+}
+```
+
+<div class="anchorHolder"><a href="#configurationItem" name="configurationItem" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ConfigurationItem {
+	/**
+	 * The scope to get the configuration section for.
+	 */
+	scopeUri?: DocumentUri;
+
+	/**
+	 * The configuration section asked for.
+	 */
+	section?: string;
+}
+```
+
+_Response_:
+* result: LSPAny[]
+* error: code and message set in case an exception happens during the 'workspace/configuration' request
+
+#### <a href="#workspace_didChangeConfiguration" name="workspace_didChangeConfiguration" class="anchor">DidChangeConfiguration Notification (:arrow_right:)</a>
+
+A notification sent from the client to the server to signal the change of configuration settings.
+
+_Client Capability_:
+* property path (optional): `workspace.didChangeConfiguration`
+* property type: `DidChangeConfigurationClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#didChangeConfigurationClientCapabilities" name="didChangeConfigurationClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DidChangeConfigurationClientCapabilities {
+	/**
+	 * Did change configuration notification supports dynamic registration.
+	 */
+	dynamicRegistration?: boolean;
+}
+```
+
+_Notification_:
+* method: 'workspace/didChangeConfiguration',
+* params: `DidChangeConfigurationParams` defined as follows:
+
+<div class="anchorHolder"><a href="#didChangeConfigurationParams" name="didChangeConfigurationParams" class="linkableAnchor"></a></div>
+
+```typescript
+interface DidChangeConfigurationParams {
+	/**
+	 * The actual changed settings
+	 */
+	settings: LSPAny;
+}
+```
+
+#### <a href="#workspace_workspaceFolders" name="workspace_workspaceFolders" class="anchor">Workspace folders request (:arrow_right_hook:)</a>
+
+> *Since version 3.6.0*
+
+Many tools support more than one root folder per workspace. Examples for this are VS Code's multi-root support, Atom's project folder support or Sublime's project support. If a client workspace consists of multiple roots then a server typically needs to know about this. The protocol up to now assumes one root folder which is announced to the server by the `rootUri` property of the `InitializeParams`. If the client supports workspace folders and announces them via the corresponding `workspaceFolders` client capability, the `InitializeParams` contain an additional property `workspaceFolders` with the configured workspace folders when the server starts.
+
+The `workspace/workspaceFolders` request is sent from the server to the client to fetch the current open list of workspace folders. Returns `null` in the response if only a single file is open in the tool. Returns an empty array if a workspace is open but no folders are configured.
+
+_Client Capability_:
+* property path (optional): `workspace.workspaceFolders`
+* property type: `boolean`
+
+_Server Capability_:
+* property path (optional): `workspace.workspaceFolders`
+* property type: `WorkspaceFoldersServerCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceFoldersServerCapabilities" name="workspaceFoldersServerCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface WorkspaceFoldersServerCapabilities {
+	/**
+	 * The server has support for workspace folders
+	 */
+	supported?: boolean;
+
+	/**
+	 * Whether the server wants to receive workspace folder
+	 * change notifications.
+	 *
+	 * If a string is provided, the string is treated as an ID
+	 * under which the notification is registered on the client
+	 * side. The ID can be used to unregister for these events
+	 * using the `client/unregisterCapability` request.
+	 */
+	changeNotifications?: string | boolean;
+}
+```
+
+_Request_:
+* method: `workspace/workspaceFolders`
+* params: none
+
+_Response_:
+* result: `WorkspaceFolder[] | null` defined as follows:
+
+<div class="anchorHolder"><a href="#workspaceFolder" name="workspaceFolder" class="linkableAnchor"></a></div>
+
+```typescript
+export interface WorkspaceFolder {
+	/**
+	 * The associated URI for this workspace folder.
+	 */
+	uri: DocumentUri;
+
+	/**
+	 * The name of the workspace folder. Used to refer to this
+	 * workspace folder in the user interface.
+	 */
+	name: string;
+}
+```
+* error: code and message set in case an exception happens during the 'workspace/workspaceFolders' request
+
+#### <a href="#workspace_didChangeWorkspaceFolders" name="workspace_didChangeWorkspaceFolders" class="anchor">DidChangeWorkspaceFolders Notification (:arrow_right:)</a>
+
+> *Since version 3.6.0*
+
+The `workspace/didChangeWorkspaceFolders` notification is sent from the client to the server to inform the server about workspace folder configuration changes. The notification is sent by default if both _client capability_ `workspace.workspaceFolders` and the _server capability_ `workspace.workspaceFolders.supported` are true; or if the server has registered itself to receive this notification. To register for the `workspace/didChangeWorkspaceFolders` send a `client/registerCapability` request from the server to the client. The registration parameter must have a `registrations` item of the following form, where `id` is a unique id used to unregister the capability (the example uses a UUID):
+```ts
+{
+	id: "28c6150c-bd7b-11e7-abc4-cec278b6b50a",
+	method: "workspace/didChangeWorkspaceFolders"
+}
+```
+
+_Notification_:
+* method: 'workspace/didChangeWorkspaceFolders'
+* params: `DidChangeWorkspaceFoldersParams` defined as follows:
+
+<div class="anchorHolder"><a href="#didChangeWorkspaceFoldersParams" name="didChangeWorkspaceFoldersParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DidChangeWorkspaceFoldersParams {
+	/**
+	 * The actual workspace folder change event.
+	 */
+	event: WorkspaceFoldersChangeEvent;
+}
+```
+
+<div class="anchorHolder"><a href="#workspaceFoldersChangeEvent" name="workspaceFoldersChangeEvent" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The workspace folder change event.
+ */
+export interface WorkspaceFoldersChangeEvent {
+	/**
+	 * The array of added workspace folders
+	 */
+	added: WorkspaceFolder[];
+
+	/**
+	 * The array of the removed workspace folders
+	 */
+	removed: WorkspaceFolder[];
+}
+```
+
+#### <a href="#workspace_willCreateFiles" name="workspace_willCreateFiles" class="anchor">WillCreateFiles Request (:leftwards_arrow_with_hook:)</a>
+
+The will create files request is sent from the client to the server before files are actually created as long as the creation is triggered from within the client either by a user action or by applying a workspace edit. The request can return a WorkspaceEdit which will be applied to workspace before the files are created. Please note that clients might drop results if computing the edit took too long or if a server constantly fails on this request. This is done to keep creates fast and reliable.
+
+_Client Capability_:
+* property name (optional): `workspace.fileOperations.willCreate`
+* property type: `boolean`
+
+The capability indicates that the client supports sending `workspace/willCreateFiles` requests.
+
+_Server Capability_:
+* property name (optional): `workspace.fileOperations.willCreate`
+* property type: `FileOperationRegistrationOptions` where `FileOperationRegistrationOptions` is defined as follows:
+
+<div class="anchorHolder"><a href="#fileOperationRegistrationOptions" name="fileOperationRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The options to register for file operations.
+ *
+ * @since 3.16.0
+ */
+interface FileOperationRegistrationOptions {
+	/**
+	 * The actual filters.
+	 */
+	filters: FileOperationFilter[];
+}
+```
+
+<div class="anchorHolder"><a href="#fileOperationPatternKind" name="fileOperationPatternKind" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A pattern kind describing if a glob pattern matches a file a folder or
+ * both.
+ *
+ * @since 3.16.0
+ */
+export namespace FileOperationPatternKind {
+	/**
+	 * The pattern matches a file only.
+	 */
+	export const file: 'file' = 'file';
+
+	/**
+	 * The pattern matches a folder only.
+	 */
+	export const folder: 'folder' = 'folder';
+}
+
+export type FileOperationPatternKind = 'file' | 'folder';
+```
+
+<div class="anchorHolder"><a href="#fileOperationPatternOptions" name="fileOperationPatternOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Matching options for the file operation pattern.
+ *
+ * @since 3.16.0
+ */
+export interface FileOperationPatternOptions {
+
+	/**
+	 * The pattern should be matched ignoring casing.
+	 */
+	ignoreCase?: boolean;
+}
+```
+
+<div class="anchorHolder"><a href="#fileOperationPattern" name="fileOperationPattern" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A pattern to describe in which file operation requests or notifications
+ * the server is interested in.
+ *
+ * @since 3.16.0
+ */
+interface FileOperationPattern {
+	/**
+	 * The glob pattern to match. Glob patterns can have the following syntax:
+	 * - `*` to match one or more characters in a path segment
+	 * - `?` to match on one character in a path segment
+	 * - `**` to match any number of path segments, including none
+	 * - `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}`
+	 *   matches all TypeScript and JavaScript files)
+	 * - `[]` to declare a range of characters to match in a path segment
+	 *   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+	 * - `[!...]` to negate a range of characters to match in a path segment
+	 *   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
+	 *   not `example.0`)
+	 */
+	glob: string;
+
+	/**
+	 * Whether to match files or folders with this pattern.
+	 *
+	 * Matches both if undefined.
+	 */
+	matches?: FileOperationPatternKind;
+
+	/**
+	 * Additional options used during matching.
+	 */
+	options?: FileOperationPatternOptions;
+}
+```
+
+<div class="anchorHolder"><a href="#fileOperationFilter" name="fileOperationFilter" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A filter to describe in which file operation requests or notifications
+ * the server is interested in.
+ *
+ * @since 3.16.0
+ */
+export interface FileOperationFilter {
+
+	/**
+	 * A Uri like `file` or `untitled`.
+	 */
+	scheme?: string;
+
+	/**
+	 * The actual file operation pattern.
+	 */
+	pattern: FileOperationPattern;
+}
+```
+
+The capability indicates that the server is interested in receiving `workspace/willCreateFiles` requests.
+
+_Registration Options_: none
+
+_Request_:
+* method: 'workspace/willCreateFiles'
+* params: `CreateFilesParams` defined as follows:
+
+<div class="anchorHolder"><a href="#createFilesParams" name="createFilesParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The parameters sent in notifications/requests for user-initiated creation
+ * of files.
+ *
+ * @since 3.16.0
+ */
+export interface CreateFilesParams {
+
+	/**
+	 * An array of all files/folders created in this operation.
+	 */
+	files: FileCreate[];
+}
+```
+
+<div class="anchorHolder"><a href="#fileCreate" name="fileCreate" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Represents information on a file/folder create.
+ *
+ * @since 3.16.0
+ */
+export interface FileCreate {
+
+	/**
+	 * A file:// URI for the location of the file/folder being created.
+	 */
+	uri: string;
+}
+```
+
+_Response_:
+* result:`WorkspaceEdit` \| `null`
+* error: code and message set in case an exception happens during the `willCreateFiles` request.
+
+#### <a href="#workspace_didCreateFiles" name="workspace_didCreateFiles" class="anchor">DidCreateFiles Notification (:arrow_right:)</a>
+
+The did create files notification is sent from the client to the server when files were created from within the client.
+
+_Client Capability_:
+* property name (optional): `workspace.fileOperations.didCreate`
+* property type: `boolean`
+
+The capability indicates that the client supports sending `workspace/didCreateFiles` notifications.
+
+_Server Capability_:
+* property name (optional): `workspace.fileOperations.didCreate`
+* property type: `FileOperationRegistrationOptions`
+
+The capability indicates that the server is interested in receiving `workspace/didCreateFiles` notifications.
+
+_Notification_:
+* method: 'workspace/didCreateFiles'
+* params: `CreateFilesParams`
+
+#### <a href="#workspace_willRenameFiles" name="workspace_willRenameFiles" class="anchor">WillRenameFiles Request (:leftwards_arrow_with_hook:)</a>
+
+The will rename files request is sent from the client to the server before files are actually renamed as long as the rename is triggered from within the client either by a user action or by applying a workspace edit. The request can return a WorkspaceEdit which will be applied to workspace before the files are renamed. Please note that clients might drop results if computing the edit took too long or if a server constantly fails on this request. This is done to keep renames fast and reliable.
+
+_Client Capability_:
+* property name (optional): `workspace.fileOperations.willRename`
+* property type: `boolean`
+
+The capability indicates that the client supports sending `workspace/willRenameFiles` requests.
+
+_Server Capability_:
+* property name (optional): `workspace.fileOperations.willRename`
+* property type: `FileOperationRegistrationOptions`
+
+The capability indicates that the server is interested in receiving `workspace/willRenameFiles` requests.
+
+_Registration Options_: none
+
+_Request_:
+* method: 'workspace/willRenameFiles'
+* params: `RenameFilesParams` defined as follows:
+
+<div class="anchorHolder"><a href="#renameFilesParams" name="renameFilesParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The parameters sent in notifications/requests for user-initiated renames
+ * of files.
+ *
+ * @since 3.16.0
+ */
+export interface RenameFilesParams {
+
+	/**
+	 * An array of all files/folders renamed in this operation. When a folder
+	 * is renamed, only the folder will be included, and not its children.
+	 */
+	files: FileRename[];
+}
+```
+
+<div class="anchorHolder"><a href="#fileRename" name="fileRename" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Represents information on a file/folder rename.
+ *
+ * @since 3.16.0
+ */
+export interface FileRename {
+
+	/**
+	 * A file:// URI for the original location of the file/folder being renamed.
+	 */
+	oldUri: string;
+
+	/**
+	 * A file:// URI for the new location of the file/folder being renamed.
+	 */
+	newUri: string;
+}
+```
+
+_Response_:
+* result:`WorkspaceEdit` \| `null`
+* error: code and message set in case an exception happens during the `workspace/willRenameFiles` request.
+
+#### <a href="#workspace_didRenameFiles" name="workspace_didRenameFiles" class="anchor">DidRenameFiles Notification (:arrow_right:)</a>
+
+The did rename files notification is sent from the client to the server when files were renamed from within the client.
+
+_Client Capability_:
+* property name (optional): `workspace.fileOperations.didRename`
+* property type: `boolean`
+
+The capability indicates that the client supports sending `workspace/didRenameFiles` notifications.
+
+_Server Capability_:
+* property name (optional): `workspace.fileOperations.didRename`
+* property type: `FileOperationRegistrationOptions`
+
+The capability indicates that the server is interested in receiving `workspace/didRenameFiles` notifications.
+
+_Notification_:
+* method: 'workspace/didRenameFiles'
+* params: `RenameFilesParams`
+
+#### <a href="#workspace_willDeleteFiles" name="workspace_willDeleteFiles" class="anchor">WillDeleteFiles Request (:leftwards_arrow_with_hook:)</a>
+
+The will delete files request is sent from the client to the server before files are actually deleted as long as the deletion is triggered from within the client either by a user action or by applying a workspace edit. The request can return a WorkspaceEdit which will be applied to workspace before the files are deleted. Please note that clients might drop results if computing the edit took too long or if a server constantly fails on this request. This is done to keep deletes fast and reliable.
+
+_Client Capability_:
+* property name (optional): `workspace.fileOperations.willDelete`
+* property type: `boolean`
+
+The capability indicates that the client supports sending `workspace/willDeleteFiles` requests.
+
+_Server Capability_:
+* property name (optional): `workspace.fileOperations.willDelete`
+* property type: `FileOperationRegistrationOptions`
+
+The capability indicates that the server is interested in receiving `workspace/willDeleteFiles` requests.
+
+_Registration Options_: none
+
+_Request_:
+* method: `workspace/willDeleteFiles`
+* params: `DeleteFilesParams` defined as follows:
+
+<div class="anchorHolder"><a href="#deleteFilesParams" name="deleteFilesParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The parameters sent in notifications/requests for user-initiated deletes
+ * of files.
+ *
+ * @since 3.16.0
+ */
+export interface DeleteFilesParams {
+
+	/**
+	 * An array of all files/folders deleted in this operation.
+	 */
+	files: FileDelete[];
+}
+```
+
+<div class="anchorHolder"><a href="#fileDelete" name="fileDelete" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Represents information on a file/folder delete.
+ *
+ * @since 3.16.0
+ */
+export interface FileDelete {
+
+	/**
+	 * A file:// URI for the location of the file/folder being deleted.
+	 */
+	uri: string;
+}
+```
+
+_Response_:
+* result:`WorkspaceEdit` \| `null`
+* error: code and message set in case an exception happens during the `workspace/willDeleteFiles` request.
+
+#### <a href="#workspace_didDeleteFiles" name="workspace_didDeleteFiles" class="anchor">DidDeleteFiles Notification (:arrow_right:)</a>
+
+The did delete files notification is sent from the client to the server when files were deleted from within the client.
+
+_Client Capability_:
+* property name (optional): `workspace.fileOperations.didDelete`
+* property type: `boolean`
+
+The capability indicates that the client supports sending `workspace/didDeleteFiles` notifications.
+
+_Server Capability_:
+* property name (optional): `workspace.fileOperations.didDelete`
+* property type: `FileOperationRegistrationOptions`
+
+The capability indicates that the server is interested in receiving `workspace/didDeleteFiles` notifications.
+
+_Notification_:
+* method: 'workspace/didDeleteFiles'
+* params: `DeleteFilesParams`
+
+#### <a href="#workspace_didChangeWatchedFiles" name="workspace_didChangeWatchedFiles" class="anchor">DidChangeWatchedFiles Notification (:arrow_right:)</a>
+
+The watched files notification is sent from the client to the server when the client detects changes to files and folders watched by the language client (note although the name suggest that only file events are sent it is about file system events which include folders as well). It is recommended that servers register for these file system events using the registration mechanism. In former implementations clients pushed file events without the server actively asking for it.
+
+Servers are allowed to run their own file system watching mechanism and not rely on clients to provide file system events. However this is not recommended due to the following reasons:
+
+- to our experience getting file system watching on disk right is challenging, especially if it needs to be supported across multiple OSes.
+- file system watching is not for free especially if the implementation uses some sort of polling and keeps a file system tree in memory to compare time stamps (as for example some node modules do)
+- a client usually starts more than one server. If every server runs its own file system watching it can become a CPU or memory problem.
+- in general there are more server than client implementations. So this problem is better solved on the client side.
+
+_Client Capability_:
+* property path (optional): `workspace.didChangeWatchedFiles`
+* property type: `DidChangeWatchedFilesClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#didChangeWatchedFilesClientCapabilities" name="didChangeWatchedFilesClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface DidChangeWatchedFilesClientCapabilities {
+	/**
+	 * Did change watched files notification supports dynamic registration.
+	 * Please note that the current protocol doesn't support static
+	 * configuration for file changes from the server side.
+	 */
+	dynamicRegistration?: boolean;
+
+	/**
+	 * Whether the client has support for relative patterns
+	 * or not.
+	 *
+	 * @since 3.17.0
+	 */
+	relativePatternSupport?: boolean;
+}
+```
+
+_Registration Options_: `DidChangeWatchedFilesRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#didChangeWatchedFilesRegistrationOptions" name="didChangeWatchedFilesRegistrationOptions" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Describe options to be used when registering for file system change events.
+ */
+export interface DidChangeWatchedFilesRegistrationOptions {
+	/**
+	 * The watchers to register.
+	 */
+	watchers: FileSystemWatcher[];
+}
+```
+
+<div class="anchorHolder"><a href="#pattern" name="pattern" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The glob pattern to watch relative to the base path. Glob patterns can have
+ * the following syntax:
+ * - `*` to match one or more characters in a path segment
+ * - `?` to match on one character in a path segment
+ * - `**` to match any number of path segments, including none
+ * - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript
+ *   and JavaScript files)
+ * - `[]` to declare a range of characters to match in a path segment
+ *   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+ * - `[!...]` to negate a range of characters to match in a path segment
+ *   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`,
+ *   but not `example.0`)
+ *
+ * @since 3.17.0
+ */
+export type Pattern = string;
+```
+
+<div class="anchorHolder"><a href="#relativePattern" name="relativePattern" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * A relative pattern is a helper to construct glob patterns that are matched
+ * relatively to a base URI. The common value for a `baseUri` is a workspace
+ * folder root, but it can be another absolute URI as well.
+ *
+ * @since 3.17.0
+ */
+export interface RelativePattern {
+	/**
+	 * A workspace folder or a base URI to which this pattern will be matched
+	 * against relatively.
+	 */
+	baseUri: WorkspaceFolder | URI;
+
+	/**
+	 * The actual glob pattern;
+	 */
+	pattern: Pattern;
+}
+```
+
+<div class="anchorHolder"><a href="#globPattern" name="globPattern" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The glob pattern. Either a string pattern or a relative pattern.
+ *
+ * @since 3.17.0
+ */
+export type GlobPattern = Pattern | RelativePattern;
+```
+
+<div class="anchorHolder"><a href="#fileSystemWatcher" name="fileSystemWatcher" class="linkableAnchor"></a></div>
+
+```typescript
+export interface FileSystemWatcher {
+	/**
+	 * The glob pattern to watch. See {@link GlobPattern glob pattern}
+	 * for more detail.
+	 *
+ 	 * @since 3.17.0 support for relative patterns.
+	 */
+	globPattern: GlobPattern;
+
+	/**
+	 * The kind of events of interest. If omitted it defaults
+	 * to WatchKind.Create | WatchKind.Change | WatchKind.Delete
+	 * which is 7.
+	 */
+	kind?: WatchKind;
+}
+```
+
+<div class="anchorHolder"><a href="#watchKind" name="watchKind" class="linkableAnchor"></a></div>
+
+```typescript
+export namespace WatchKind {
+	/**
+	 * Interested in create events.
+	 */
+	export const Create = 1;
+
+	/**
+	 * Interested in change events
+	 */
+	export const Change = 2;
+
+	/**
+	 * Interested in delete events
+	 */
+	export const Delete = 4;
+}
+export type WatchKind = uinteger;
+```
+
+_Notification_:
+* method: 'workspace/didChangeWatchedFiles'
+* params: `DidChangeWatchedFilesParams` defined as follows:
+
+<div class="anchorHolder"><a href="#didChangeWatchedFilesParams" name="didChangeWatchedFilesParams" class="linkableAnchor"></a></div>
+
+```typescript
+interface DidChangeWatchedFilesParams {
+	/**
+	 * The actual file events.
+	 */
+	changes: FileEvent[];
+}
+```
+
+Where FileEvents are described as follows:
+
+<div class="anchorHolder"><a href="#fileEvent" name="fileEvent" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * An event describing a file change.
+ */
+interface FileEvent {
+	/**
+	 * The file's URI.
+	 */
+	uri: DocumentUri;
+	/**
+	 * The change type.
+	 */
+	type: uinteger;
+}
+```
+
+<div class="anchorHolder"><a href="#fileChangeType" name="fileChangeType" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * The file event type.
+ */
+export namespace FileChangeType {
+	/**
+	 * The file got created.
+	 */
+	export const Created = 1;
+	/**
+	 * The file got changed.
+	 */
+	export const Changed = 2;
+	/**
+	 * The file got deleted.
+	 */
+	export const Deleted = 3;
+}
+```
+
+#### <a href="#workspace_executeCommand" name="workspace_executeCommand" class="anchor">Execute a command (:leftwards_arrow_with_hook:)</a>
+
+The `workspace/executeCommand` request is sent from the client to the server to trigger command execution on the server. In most cases the server creates a `WorkspaceEdit` structure and applies the changes to the workspace using the request `workspace/applyEdit` which is sent from the server to the client.
+
+_Client Capability_:
+* property path (optional): `workspace.executeCommand`
+* property type: `ExecuteCommandClientCapabilities` defined as follows:
+
+<div class="anchorHolder"><a href="#executeCommandClientCapabilities" name="executeCommandClientCapabilities" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ExecuteCommandClientCapabilities {
+	/**
+	 * Execute command supports dynamic registration.
 	 */
 	dynamicRegistration?: boolean;
 }
 ```
 
 _Server Capability_:
+* property path (optional): `executeCommandProvider`
+* property type: `ExecuteCommandOptions` defined as follows:
 
-* property name (optional): `monikerProvider`
-* property type: `boolean | MonikerOptions | MonikerRegistrationOptions` is defined as follows:
+<div class="anchorHolder"><a href="#executeCommandOptions" name="executeCommandOptions" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface MonikerOptions extends WorkDoneProgressOptions {
+export interface ExecuteCommandOptions extends WorkDoneProgressOptions {
+	/**
+	 * The commands to be executed on the server
+	 */
+	commands: string[];
 }
 ```
 
-_Registration Options_: `MonikerRegistrationOptions` defined as follows:
+_Registration Options_: `ExecuteCommandRegistrationOptions` defined as follows:
+
+<div class="anchorHolder"><a href="#executeCommandRegistrationOptions" name="executeCommandRegistrationOptions" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface MonikerRegistrationOptions extends
-	TextDocumentRegistrationOptions, MonikerOptions {
+/**
+ * Execute command registration options.
+ */
+export interface ExecuteCommandRegistrationOptions
+	extends ExecuteCommandOptions {
 }
 ```
 
 _Request_:
+* method: 'workspace/executeCommand'
+* params: `ExecuteCommandParams` defined as follows:
 
-* method: `textDocument/moniker`
-* params: `MonikerParams` defined as follows:
+<div class="anchorHolder"><a href="#executeCommandParams" name="executeCommandParams" class="linkableAnchor"></a></div>
 
 ```typescript
-export interface MonikerParams extends TextDocumentPositionParams,
-	WorkDoneProgressParams, PartialResultParams {
+export interface ExecuteCommandParams extends WorkDoneProgressParams {
+
+	/**
+	 * The identifier of the actual command handler.
+	 */
+	command: string;
+	/**
+	 * Arguments that the command should be invoked with.
+	 */
+	arguments?: LSPAny[];
+}
+```
+
+The arguments are typically specified when a command is returned from the server to the client. Example requests that return a command are `textDocument/codeAction` or `textDocument/codeLens`.
+
+_Response_:
+* result: `LSPAny` \| `null`
+* error: code and message set in case an exception happens during the request.
+
+#### <a href="#workspace_applyEdit" name="workspace_applyEdit" class="anchor">Applies a WorkspaceEdit (:arrow_right_hook:)</a>
+
+The `workspace/applyEdit` request is sent from the server to the client to modify resource on the client side.
+
+_Client Capability_:
+* property path (optional): `workspace.applyEdit`
+* property type: `boolean`
+
+See also the [WorkspaceEditClientCapabilities](#workspaceEditClientCapabilities) for the supported capabilities of a workspace edit.
+
+_Request_:
+* method: 'workspace/applyEdit'
+* params: `ApplyWorkspaceEditParams` defined as follows:
+
+<div class="anchorHolder"><a href="#applyWorkspaceEditParams" name="applyWorkspaceEditParams" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ApplyWorkspaceEditParams {
+	/**
+	 * An optional label of the workspace edit. This label is
+	 * presented in the user interface for example on an undo
+	 * stack to undo the workspace edit.
+	 */
+	label?: string;
+
+	/**
+	 * The edits to apply.
+	 */
+	edit: WorkspaceEdit;
+}
+```
+
+_Response_:
+* result: `ApplyWorkspaceEditResult` defined as follows:
+
+<div class="anchorHolder"><a href="#applyWorkspaceEditResult" name="applyWorkspaceEditResult" class="linkableAnchor"></a></div>
+
+```typescript
+export interface ApplyWorkspaceEditResult {
+	/**
+	 * Indicates whether the edit was applied or not.
+	 */
+	applied: boolean;
+
+	/**
+	 * An optional textual description for why the edit was not applied.
+	 * This may be used by the server for diagnostic logging or to provide
+	 * a suitable error for a request that triggered the edit.
+	 */
+	failureReason?: string;
+
+	/**
+	 * Depending on the client's failure handling strategy `failedChange`
+	 * might contain the index of the change that failed. This property is
+	 * only available if the client signals a `failureHandling` strategy
+	 * in its client capabilities.
+	 */
+	failedChange?: uinteger;
+}
+```
+* error: code and message set in case an exception happens during the request.
+
+
+### <a href="#windowFeatures" name="windowFeatures" class="anchor">Window Features</a>
+
+#### <a href="#window_showMessage" name="window_showMessage" class="anchor">ShowMessage Notification (:arrow_left:)</a>
+
+The show message notification is sent from a server to a client to ask the client to display a particular message in the user interface.
+
+_Notification_:
+* method: 'window/showMessage'
+* params: `ShowMessageParams` defined as follows:
+
+```typescript
+interface ShowMessageParams {
+	/**
+	 * The message type. See {@link MessageType}.
+	 */
+	type: MessageType;
+
+	/**
+	 * The actual message.
+	 */
+	message: string;
+}
+```
+
+Where the type is defined as follows:
+
+<div class="anchorHolder"><a href="#messageType" name="messageType" class="linkableAnchor"></a></div>
+
+```typescript
+export namespace MessageType {
+	/**
+	 * An error message.
+	 */
+	export const Error = 1;
+	/**
+	 * A warning message.
+	 */
+	export const Warning = 2;
+	/**
+	 * An information message.
+	 */
+	export const Info = 3;
+	/**
+	 * A log message.
+	 */
+	export const Log = 4;
+}
+
+export type MessageType = 1 | 2 | 3 | 4;
+```
+
+#### <a href="#window_showMessageRequest" name="window_showMessageRequest" class="anchor">ShowMessage Request (:arrow_right_hook:)</a>
+
+The show message request is sent from a server to a client to ask the client to display a particular message in the user interface. In addition to the show message notification the request allows to pass actions and to wait for an answer from the client.
+
+_Client Capability_:
+* property path (optional): `window.showMessage`
+* property type: `ShowMessageRequestClientCapabilities` defined as follows:
+
+```typescript
+/**
+ * Show message request client capabilities
+ */
+export interface ShowMessageRequestClientCapabilities {
+	/**
+	 * Capabilities specific to the `MessageActionItem` type.
+	 */
+	messageActionItem?: {
+		/**
+		 * Whether the client supports additional attributes which
+		 * are preserved and sent back to the server in the
+		 * request's response.
+		 */
+		additionalPropertiesSupport?: boolean;
+	};
+}
+```
+
+_Request_:
+* method: 'window/showMessageRequest'
+* params: `ShowMessageRequestParams` defined as follows:
+
+<div class="anchorHolder"><a href="#showMessageRequestParams" name="showMessageRequestParams" class="linkableAnchor"></a></div>
+
+```typescript
+interface ShowMessageRequestParams {
+	/**
+	 * The message type. See {@link MessageType}
+	 */
+	type: MessageType;
+
+	/**
+	 * The actual message
+	 */
+	message: string;
+
+	/**
+	 * The message action items to present.
+	 */
+	actions?: MessageActionItem[];
+}
+```
+
+Where the `MessageActionItem` is defined as follows:
+
+<div class="anchorHolder"><a href="#messageActionItem" name="messageActionItem" class="linkableAnchor"></a></div>
+
+```typescript
+interface MessageActionItem {
+	/**
+	 * A short title like 'Retry', 'Open Log' etc.
+	 */
+	title: string;
+}
+```
+
+_Response_:
+* result: the selected `MessageActionItem` \| `null` if none got selected.
+* error: code and message set in case an exception happens during showing a message.
+
+#### <a href="#window_showDocument" name="window_showDocument" class="anchor">Show Document Request (:arrow_right_hook:)</a>
+
+> New in version 3.16.0
+
+The show document request is sent from a server to a client to ask the client to display a particular document in the user interface.
+
+_Client Capability_:
+* property path (optional): `window.showDocument`
+* property type: `ShowDocumentClientCapabilities` defined as follows:
+
+```typescript
+/**
+ * Client capabilities for the show document request.
+ *
+ * @since 3.16.0
+ */
+export interface ShowDocumentClientCapabilities {
+	/**
+	 * The client has support for the show document
+	 * request.
+	 */
+	support: boolean;
+}
+```
+
+_Request_:
+* method: 'window/showDocument'
+* params: `ShowDocumentParams` defined as follows:
+
+<div class="anchorHolder"><a href="#showDocumentParams" name="showDocumentParams" class="linkableAnchor"></a></div>
+
+```typescript
+/**
+ * Params to show a document.
+ *
+ * @since 3.16.0
+ */
+export interface ShowDocumentParams {
+	/**
+	 * The document uri to show.
+	 */
+	uri: URI;
+
+	/**
+	 * Indicates to show the resource in an external program.
+	 * To show for example `https://code.visualstudio.com/`
+	 * in the default WEB browser set `external` to `true`.
+	 */
+	external?: boolean;
+
+	/**
+	 * An optional property to indicate whether the editor
+	 * showing the document should take focus or not.
+	 * Clients might ignore this property if an external
+	 * program is started.
+	 */
+	takeFocus?: boolean;
+
+	/**
+	 * An optional selection range if the document is a text
+	 * document. Clients might ignore the property if an
+	 * external program is started or the file is not a text
+	 * file.
+	 */
+	selection?: Range;
 }
 ```
 
 _Response_:
 
-* result: `Moniker[] | null`
-* partial result: `Moniker[]`
-* error: code and message set in case an exception happens during the 'textDocument/moniker' request
+* result: `ShowDocumentResult` defined as follows:
 
-`Moniker` is defined as follows:
+<div class="anchorHolder"><a href="#showDocumentResult" name="showDocumentResult" class="linkableAnchor"></a></div>
 
 ```typescript
 /**
- * Moniker uniqueness level to define scope of the moniker.
+ * The result of an show document request.
+ *
+ * @since 3.16.0
  */
-export enum UniquenessLevel {
+export interface ShowDocumentResult {
 	/**
-	 * The moniker is only unique inside a document
+	 * A boolean indicating if the show was successful.
 	 */
-	document = 'document',
-
-	/**
-	 * The moniker is unique inside a project for which a dump got created
-	 */
-	project = 'project',
-
-	/**
-	 * The moniker is unique inside the group to which a project belongs
-	 */
-	group = 'group',
-
-	/**
-	 * The moniker is unique inside the moniker scheme.
-	 */
-	scheme = 'scheme',
-
-	/**
-	 * The moniker is globally unique
-	 */
-	global = 'global'
+	success: boolean;
 }
+```
+* error: code and message set in case an exception happens during showing a document.
 
-/**
- * The moniker kind.
- */
-export enum MonikerKind {
+#### <a href="#window_logMessage" name="window_logMessage" class="anchor">LogMessage Notification (:arrow_left:)</a>
+
+The log message notification is sent from the server to the client to ask the client to log a particular message.
+
+_Notification_:
+* method: 'window/logMessage'
+* params: `LogMessageParams` defined as follows:
+
+<div class="anchorHolder"><a href="#logMessageParams" name="logMessageParams" class="linkableAnchor"></a></div>
+
+```typescript
+interface LogMessageParams {
 	/**
-	 * The moniker represent a symbol that is imported into a project
+	 * The message type. See {@link MessageType}
 	 */
-	import = 'import',
+	type: MessageType;
 
 	/**
-	 * The moniker represents a symbol that is exported from a project
+	 * The actual message
 	 */
-	export = 'export',
-
-	/**
-	 * The moniker represents a symbol that is local to a project (e.g. a local
-	 * variable of a function, a class not visible outside the project, ...)
-	 */
-	local = 'local'
-}
-
-/**
- * Moniker definition to match LSIF 0.5 moniker definition.
- */
-export interface Moniker {
-	/**
-	 * The scheme of the moniker. For example tsc or .Net
-	 */
-	scheme: string;
-
-	/**
-	 * The identifier of the moniker. The value is opaque in LSIF however
-	 * schema owners are allowed to define the structure if they want.
-	 */
-	identifier: string;
-
-	/**
-	 * The scope in which the moniker is unique
-	 */
-	unique: UniquenessLevel;
-
-	/**
-	 * The moniker kind if known.
-	 */
-	kind?: MonikerKind;
+	message: string;
 }
 ```
 
-##### Notes
+#### <a href="#window_workDoneProgress_create" name="window_workDoneProgress_create" class="anchor"> Create Work Done Progress (:arrow_right_hook:)</a>
 
-Server implementations of this method should ensure that the moniker calculation matches to those used in the corresponding LSIF implementation to ensure symbols can be associated correctly across IDE sessions and LSIF indexes.
+The `window/workDoneProgress/create` request is sent from the server to the client to ask the client to create a work done progress.
 
-### <a href="#implementationConsiderations" name="implementationConsiderations" class="anchor">Implementation Considerations</a>
+_Client Capability_:
+* property name (optional): `window.workDoneProgress`
+* property type: `boolean`
+
+_Request_:
+
+* method: 'window/workDoneProgress/create'
+* params: `WorkDoneProgressCreateParams` defined as follows:
+
+```typescript
+export interface WorkDoneProgressCreateParams {
+	/**
+	 * The token to be used to report progress.
+	 */
+	token: ProgressToken;
+}
+```
+
+_Response_:
+
+* result: void
+* error: code and message set in case an exception happens during the 'window/workDoneProgress/create' request. In case an error occurs a server must not send any progress notification using the token provided in the `WorkDoneProgressCreateParams`.
+
+#### <a href="#window_workDoneProgress_cancel" name="window_workDoneProgress_cancel" class="anchor"> Cancel a Work Done Progress (:arrow_right:)</a>
+
+The `window/workDoneProgress/cancel` notification is sent from the client to the server to cancel a progress initiated on the server side using the `window/workDoneProgress/create`. The progress need not be marked as `cancellable` to be cancelled and a client may cancel a progress for any number of reasons: in case of error, reloading a workspace etc.
+
+_Notification_:
+
+* method: 'window/workDoneProgress/cancel'
+* params: `WorkDoneProgressCancelParams` defined as follows:
+
+```typescript
+export interface WorkDoneProgressCancelParams {
+	/**
+	 * The token to be used to report progress.
+	 */
+	token: ProgressToken;
+}
+```
+#### <a href="#telemetry_event" name="telemetry_event" class="anchor">Telemetry Notification (:arrow_left:)</a>
+
+The telemetry notification is sent from the server to the client to ask the client to log a telemetry event. The protocol doesn't specify the payload since no interpretation of the data happens in the protocol. Most clients even don't handle the event directly but forward them to the extensions owing the corresponding server issuing the event.
+
+_Notification_:
+* method: 'telemetry/event'
+* params: 'object' \| 'number' \| 'boolean' \| 'string';
+
+
+#### <a href="#miscellaneous" name="miscellaneous" class="anchor">Miscellaneous</a>
+
+#### <a href="#implementationConsiderations" name="implementationConsiderations" class="anchor">Implementation Considerations</a>
 
 Language servers usually run in a separate process and client communicate with them in an asynchronous fashion. Additionally clients usually allow users to interact with the source code even if request results are pending. We recommend the following implementation pattern to avoid that clients apply outdated response results:
 
@@ -8158,7 +11450,6 @@
   - keep the request running if the client can still make use of the result by for example transforming it to a new result by applying the state change to the result.
 - servers should therefore not decide by themselves to cancel requests simply due to that fact that a state change notification is detected in the queue. As said the result could still be useful for the client.
 - if a server detects an internal state change (for example a project context changed) that invalidates the result of a request in execution the server can error these requests with `ContentModified`. If clients receive a `ContentModified` error, it generally should not show it in the UI for the end-user. Clients can resend the request if they know how to do so. It should be noted that for all position based requests it might be especially hard for clients to re-craft a request.
-- if servers end up in an inconsistent state they should log this to the client using the `window/logMessage` request. If they can't recover from this the best they can do right now is to exit themselves. We are considering an [extension to the protocol](https://github.com/Microsoft/language-server-protocol/issues/646) that allows servers to request a restart on the client side.
 - if a client notices that a server exits unexpectedly, it should try to restart the server. However clients should be careful not to restart a crashing server endlessly. VS Code, for example, doesn't restart a server which has crashed 5 times in the last 180 seconds.
 
 Servers usually support different communication channels (e.g. stdio, pipes, ...). To ease the usage of servers in different clients it is highly recommended that a server implementation supports the following command line arguments to pick the communication channel:
@@ -8168,8 +11459,40 @@
 - **socket**: uses a socket as the communication channel. The port is passed as next arg or with `--port=`.
 - **node-ipc**: use node IPC communication between the client and the server. This is only support if both client and server run under node.
 
+To support the case that the editor starting a server crashes an editor should also pass its process id to the server. This allows the server to monitor the editor process and to shutdown itself if the editor process dies. The process id pass on the command line should be the same as the one passed in the initialize parameters. The command line argument to use is `--clientProcessId`.
+
+#### <a href="#metaModel" name="metaModel" class="anchor">Meta Model</a>
+
+Since 3.17 there is a meta model describing the LSP protocol:
+
+- [metaModel.json](../metaModel/metaModel.json): The actual meta model for the LSP 3.17 specification
+- [metaModel.ts](../metaModel/metaModel.ts): A TypeScript file defining the data types that make up the meta model.
+- [metaModel.schema.json](../metaModel/metaModel.schema.json): A JSON schema file defining the data types that make up the meta model. Can be used to generate code to read the meta model JSON file.
+
 ### <a href="#changeLog" name="changeLog" class="anchor">Change Log</a>
 
+#### <a href="#version_3_17_0" name="version_3_17_0" class="anchor">3.17.0 (05/10/2022)</a>
+
+* Specify how clients will handle stale requests.
+* Add support for a completion item label details.
+* Add support for workspace symbol resolve request.
+* Add support for label details and insert text mode on completion items.
+* Add support for shared values on CompletionItemList.
+* Add support for HTML tags in Markdown.
+* Add support for collapsed text in folding.
+* Add support for trigger kinds on code action requests.
+* Add the following support to semantic tokens:
+  - server cancelable
+  - augmentation of syntax tokens
+* Add support to negotiate the position encoding.
+* Add support for HTML tags in markdown.
+* Add support for relative patterns in file watchers.
+* Add support for type hierarchies
+* Add support for inline values.
+* Add support for inlay hints.
+* Add support for notebook documents.
+* Add support for diagnostic pull model.
+
 #### <a href="#version_3_16_0" name="version_3_16_0" class="anchor">3.16.0 (12/14/2020)</a>
 
 * Add support for tracing.
diff --git a/pkg/analysis_server/tool/lsp_spec/markdown.dart b/pkg/analysis_server/tool/lsp_spec/markdown.dart
index cf56d33..530ee49 100644
--- a/pkg/analysis_server/tool/lsp_spec/markdown.dart
+++ b/pkg/analysis_server/tool/lsp_spec/markdown.dart
@@ -2,9 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-final _methodNamesPattern = RegExp(
-    r'''_(?:Notification|Request):?_:?(?:\r?\n)+\* method: ['`](.*?)[`'],?\r?\n''',
-    multiLine: true);
+final _methodNamesPattern =
+    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 82ac9c2..44e6f02 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript.dart
@@ -145,7 +145,7 @@
 
 /// Removes types that are in the spec that we don't want to emit.
 bool includeTypeDefinitionInOutput(AstNode node) {
-  // These types are not used for v3.0 (Feb 2017) and by dropping them we don't
+  // InitializeError is not used for v3.0 (Feb 2017) and by dropping it we don't
   // have to handle any cases where both a namespace and interfaces are declared
   // with the same name.
   return node.name != 'InitializeError' &&
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
index 032cd2f..57c9bb3 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
@@ -27,7 +27,11 @@
 final _validIdentifierCharacters = RegExp('[a-zA-Z0-9_]');
 
 bool isAnyType(TypeBase t) =>
-    t is Type && (t.name == 'any' || t.name == 'object');
+    t is Type &&
+    (t.name == 'any' ||
+        t.name == 'LSPAny' ||
+        t.name == 'object' ||
+        t.name == 'LSPObject');
 
 bool isLiteralType(TypeBase t) => t is LiteralType;
 
@@ -251,6 +255,8 @@
     if (_nodes.isEmpty) {
       while (!_isAtEnd) {
         _nodes.add(_topLevel());
+        // Consume any trailing semicolons.
+        _match([TokenType.SEMI_COLON]);
       }
     }
     return _nodes;
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
index 2f30335..719f82a 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -154,6 +154,29 @@
     expect(context.canBeConst(node), expectedResult);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/3389')
+  void test_deferred_argument() async {
+    await resolveFileCode('$testPackageLibPath/a.dart', r'''
+class A {
+  const A();
+}
+
+const aa = A();
+''');
+    await resolve(r'''
+import 'a.dart' deferred as a;
+
+class B {
+  const B(Object a);
+}
+
+main() {
+  print(B(a.aa));
+}
+''');
+    assertCanBeConst('B(a.aa)', false);
+  }
+
   void test_false_argument_invocation() async {
     await resolve('''
 class A {}
diff --git a/pkg/analyzer_cli/test/data/embedder_client/_packages b/pkg/analyzer_cli/test/data/embedder_client/_packages
index 59fa328..1f92f66 100644
--- a/pkg/analyzer_cli/test/data/embedder_client/_packages
+++ b/pkg/analyzer_cli/test/data/embedder_client/_packages
@@ -1 +1,10 @@
-sky_engine:../sky_engine/lib/
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "sky_engine",
+      "rootUri": "../sky_engine",
+      "packageUri": "lib/"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/pkg/analyzer_cli/test/data/flutter_analysis_options/packagelist b/pkg/analyzer_cli/test/data/flutter_analysis_options/packagelist
index a222807..fdd02fe 100644
--- a/pkg/analyzer_cli/test/data/flutter_analysis_options/packagelist
+++ b/pkg/analyzer_cli/test/data/flutter_analysis_options/packagelist
@@ -1,2 +1,15 @@
-flutter:somepkgs/flutter/lib/
-meta:somepkgs/meta/lib/
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "flutter",
+      "rootUri": "somepkgs/flutter/",
+      "packageUri": "lib/"
+    },
+    {
+      "name": "meta",
+      "rootUri": "somepkgs/meta/",
+      "packageUri": "lib/"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/_packages b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/_packages
index 574bcbd..b95c76a 100644
--- a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/_packages
+++ b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/_packages
@@ -1,3 +1,15 @@
-# Generated by pub on 2016-11-30 13:02:00.280796.
-foo:pkg/foo/lib/
-options_include_directive_tests_project:lib/
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "foo",
+      "rootUri": "pkg/foo/",
+      "packageUri": "lib/"
+    },
+    {
+      "name": "options_include_directive_tests_project",
+      "rootUri": ".",
+      "packageUri": "lib/"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/pkg/analyzer_cli/test/data/package_prefix/packagelist b/pkg/analyzer_cli/test/data/package_prefix/packagelist
index 85a25f7..0c6c2bb 100644
--- a/pkg/analyzer_cli/test/data/package_prefix/packagelist
+++ b/pkg/analyzer_cli/test/data/package_prefix/packagelist
@@ -1,2 +1,13 @@
-bar:pkg/bar/
-foo:pkg/foo/
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "foo",
+      "rootUri": "pkg/foo/"
+    },
+    {
+      "name": "bar",
+      "rootUri": "pkg/bar/"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index acbb3fc..468a20f 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -34,11 +34,11 @@
 import 'environment.dart';
 import 'inferrer/abstract_value_domain.dart' show AbstractValueStrategy;
 import 'inferrer/trivial.dart' show TrivialAbstractValueStrategy;
-import 'inferrer/powersets/wrapped.dart' show WrappedAbstractValueStrategy;
 import 'inferrer/powersets/powersets.dart' show PowersetStrategy;
 import 'inferrer/typemasks/masks.dart' show TypeMaskStrategy;
 import 'inferrer/types.dart'
     show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
+import 'inferrer/wrapped.dart' show WrappedAbstractValueStrategy;
 import 'ir/modular.dart';
 import 'js_backend/backend.dart' show CodegenInputs;
 import 'js_backend/enqueuer.dart';
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder.dart
similarity index 99%
rename from pkg/compiler/lib/src/inferrer/builder_kernel.dart
rename to pkg/compiler/lib/src/inferrer/builder.dart
index a1c9da3..5f0c796 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder.dart
@@ -28,7 +28,7 @@
 import '../universe/selector.dart';
 import '../universe/side_effects.dart';
 import '../util/util.dart';
-import 'inferrer_engine.dart';
+import 'engine.dart';
 import 'locals_handler.dart';
 import 'type_graph_nodes.dart';
 import 'type_system.dart';
diff --git a/pkg/compiler/lib/src/inferrer/closure_tracer.dart b/pkg/compiler/lib/src/inferrer/closure_tracer.dart
index 67c4476..d1b8542 100644
--- a/pkg/compiler/lib/src/inferrer/closure_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/closure_tracer.dart
@@ -10,7 +10,7 @@
 import '../elements/entities.dart';
 import '../universe/selector.dart' show Selector;
 import 'debug.dart' as debug;
-import 'inferrer_engine.dart';
+import 'engine.dart';
 import 'node_tracer.dart';
 import 'type_graph_nodes.dart';
 
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/engine.dart
similarity index 99%
rename from pkg/compiler/lib/src/inferrer/inferrer_engine.dart
rename to pkg/compiler/lib/src/inferrer/engine.dart
index 39ee49c..bf20e92 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/engine.dart
@@ -30,7 +30,7 @@
 import '../universe/side_effects.dart';
 import '../world.dart';
 import 'abstract_value_domain.dart';
-import 'builder_kernel.dart';
+import 'builder.dart';
 import 'closure_tracer.dart';
 import 'debug.dart' as debug;
 import 'locals_handler.dart';
diff --git a/pkg/compiler/lib/src/inferrer/locals_handler.dart b/pkg/compiler/lib/src/inferrer/locals_handler.dart
index d32de95..69f77f5 100644
--- a/pkg/compiler/lib/src/inferrer/locals_handler.dart
+++ b/pkg/compiler/lib/src/inferrer/locals_handler.dart
@@ -11,7 +11,7 @@
 import '../elements/entities.dart';
 import '../ir/util.dart';
 import '../util/util.dart';
-import 'inferrer_engine.dart';
+import 'engine.dart';
 import 'type_graph_nodes.dart';
 
 /// A variable scope holds types for variables. It has a link to a
diff --git a/pkg/compiler/lib/src/inferrer/node_tracer.dart b/pkg/compiler/lib/src/inferrer/node_tracer.dart
index 594a533..29db789 100644
--- a/pkg/compiler/lib/src/inferrer/node_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/node_tracer.dart
@@ -11,7 +11,7 @@
 import '../util/util.dart' show Setlet;
 import 'abstract_value_domain.dart';
 import 'debug.dart' as debug;
-import 'inferrer_engine.dart';
+import 'engine.dart';
 import 'type_graph_nodes.dart';
 
 // A set of selectors we know do not escape the elements inside the
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index 408c76c..2847cfb 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -10,7 +10,7 @@
 import '../elements/entities.dart';
 import '../elements/entity_utils.dart' as utils;
 import 'abstract_value_domain.dart';
-import 'inferrer_engine.dart';
+import 'engine.dart';
 import 'type_graph_nodes.dart';
 import 'debug.dart';
 
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index 0e14604..9e62daa 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -18,7 +18,7 @@
 import '../js_model/locals.dart';
 import '../world.dart';
 import 'abstract_value_domain.dart';
-import 'inferrer_engine.dart';
+import 'engine.dart';
 import 'type_graph_nodes.dart';
 import 'types.dart';
 
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index cd09b81..87345f4 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -20,7 +20,7 @@
 import 'abstract_value_domain.dart';
 import 'debug.dart' as debug;
 import 'locals_handler.dart' show ArgumentsTypes;
-import 'inferrer_engine.dart';
+import 'engine.dart';
 import 'type_system.dart';
 
 /// Common class for all nodes in the graph. The current nodes are:
diff --git a/pkg/compiler/lib/src/inferrer/types.dart b/pkg/compiler/lib/src/inferrer/types.dart
index f5a6405..e065188 100644
--- a/pkg/compiler/lib/src/inferrer/types.dart
+++ b/pkg/compiler/lib/src/inferrer/types.dart
@@ -13,16 +13,16 @@
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
 import '../elements/entities.dart';
+import '../inferrer/engine.dart';
+import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
 import '../js_backend/inferred_data.dart';
 import '../js_model/element_map.dart';
 import '../js_model/js_world.dart';
 import '../js_model/locals.dart';
-import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
 import '../serialization/serialization.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
 import 'abstract_value_domain.dart';
-import '../inferrer/inferrer_engine.dart';
 
 /// Results about a single element (e.g. a method, parameter, or field)
 /// produced by the global type-inference algorithm.
diff --git a/pkg/compiler/lib/src/inferrer/powersets/wrapped.dart b/pkg/compiler/lib/src/inferrer/wrapped.dart
similarity index 97%
rename from pkg/compiler/lib/src/inferrer/powersets/wrapped.dart
rename to pkg/compiler/lib/src/inferrer/wrapped.dart
index f468a23..e69cee9 100644
--- a/pkg/compiler/lib/src/inferrer/powersets/wrapped.dart
+++ b/pkg/compiler/lib/src/inferrer/wrapped.dart
@@ -4,17 +4,17 @@
 
 // @dart = 2.10
 
-import '../../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
-import '../../elements/entities.dart';
-import '../../elements/names.dart';
-import '../../elements/types.dart' show DartType;
-import '../../ir/static_type.dart';
-import '../../serialization/serialization.dart';
-import '../../universe/selector.dart';
-import '../../universe/world_builder.dart';
-import '../../universe/use.dart';
-import '../../world.dart';
-import '../abstract_value_domain.dart';
+import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
+import '../elements/entities.dart';
+import '../elements/names.dart';
+import '../elements/types.dart' show DartType;
+import '../ir/static_type.dart';
+import '../serialization/serialization.dart';
+import '../universe/selector.dart';
+import '../universe/world_builder.dart';
+import '../universe/use.dart';
+import '../world.dart';
+import 'abstract_value_domain.dart';
 
 class WrappedAbstractValue implements AbstractValue {
   final AbstractValue _abstractValue;
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index effb47c..f53a620 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -48,7 +48,7 @@
 import '../native/enqueue.dart';
 import '../options.dart';
 import '../serialization/serialization.dart';
-import '../ssa/builder_kernel.dart';
+import '../ssa/builder.dart';
 import '../ssa/nodes.dart';
 import '../ssa/ssa.dart';
 import '../ssa/types.dart';
diff --git a/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart b/pkg/compiler/lib/src/ssa/branch_builder.dart
similarity index 99%
rename from pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
rename to pkg/compiler/lib/src/ssa/branch_builder.dart
index a3b5095..eeade19 100644
--- a/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
+++ b/pkg/compiler/lib/src/ssa/branch_builder.dart
@@ -8,7 +8,7 @@
 import '../inferrer/abstract_value_domain.dart';
 import '../io/source_information.dart';
 
-import 'builder_kernel.dart';
+import 'builder.dart';
 import 'locals_handler.dart';
 import 'nodes.dart';
 
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder.dart
similarity index 99%
rename from pkg/compiler/lib/src/ssa/builder_kernel.dart
rename to pkg/compiler/lib/src/ssa/builder.dart
index b44fc3c..015ead4 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -53,12 +53,12 @@
 import '../universe/target_checks.dart' show TargetChecks;
 import '../universe/use.dart' show ConstantUse, StaticUse, TypeUse;
 import '../world.dart';
+import 'branch_builder.dart';
 import 'jump_handler.dart';
-import 'kernel_string_builder.dart';
 import 'locals_handler.dart';
 import 'loop_handler.dart';
 import 'nodes.dart';
-import 'ssa_branch_builder.dart';
+import 'string_builder.dart';
 import 'switch_continue_analysis.dart';
 import 'type_builder.dart';
 
diff --git a/pkg/compiler/lib/src/ssa/jump_handler.dart b/pkg/compiler/lib/src/ssa/jump_handler.dart
index f246ab0..43689fa 100644
--- a/pkg/compiler/lib/src/ssa/jump_handler.dart
+++ b/pkg/compiler/lib/src/ssa/jump_handler.dart
@@ -9,7 +9,7 @@
 import '../inferrer/abstract_value_domain.dart';
 import '../io/source_information.dart';
 
-import 'builder_kernel.dart';
+import 'builder.dart';
 import 'locals_handler.dart';
 import 'nodes.dart';
 
diff --git a/pkg/compiler/lib/src/ssa/locals_handler.dart b/pkg/compiler/lib/src/ssa/locals_handler.dart
index 62bbe2b..295aaac 100644
--- a/pkg/compiler/lib/src/ssa/locals_handler.dart
+++ b/pkg/compiler/lib/src/ssa/locals_handler.dart
@@ -19,7 +19,7 @@
 import '../js_model/locals.dart' show GlobalLocalsMap, JLocal;
 import '../world.dart' show JClosedWorld;
 
-import 'builder_kernel.dart';
+import 'builder.dart';
 import 'nodes.dart';
 import 'types.dart';
 
diff --git a/pkg/compiler/lib/src/ssa/loop_handler.dart b/pkg/compiler/lib/src/ssa/loop_handler.dart
index 6b68e63..f215df2 100644
--- a/pkg/compiler/lib/src/ssa/loop_handler.dart
+++ b/pkg/compiler/lib/src/ssa/loop_handler.dart
@@ -11,7 +11,7 @@
 import '../inferrer/abstract_value_domain.dart';
 import '../io/source_information.dart';
 
-import 'builder_kernel.dart';
+import 'builder.dart';
 import 'jump_handler.dart';
 import 'locals_handler.dart';
 import 'nodes.dart';
diff --git a/pkg/compiler/lib/src/ssa/kernel_string_builder.dart b/pkg/compiler/lib/src/ssa/string_builder.dart
similarity index 98%
rename from pkg/compiler/lib/src/ssa/kernel_string_builder.dart
rename to pkg/compiler/lib/src/ssa/string_builder.dart
index 6e5c643..c9937b1 100644
--- a/pkg/compiler/lib/src/ssa/kernel_string_builder.dart
+++ b/pkg/compiler/lib/src/ssa/string_builder.dart
@@ -8,7 +8,7 @@
 
 import '../common.dart';
 import '../inferrer/abstract_value_domain.dart';
-import 'builder_kernel.dart';
+import 'builder.dart';
 import 'nodes.dart';
 
 /// Visits and concatenates the expressions in a string concatenation.
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/tracer.dart
similarity index 100%
rename from pkg/compiler/lib/src/ssa/ssa_tracer.dart
rename to pkg/compiler/lib/src/ssa/tracer.dart
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index a70a154..86f3504 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.10
 
-import 'builder_kernel.dart';
+import 'builder.dart';
 import 'nodes.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index 217adb5..e57fb44 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -11,7 +11,7 @@
 import '../compiler_api.dart' as api;
 import 'options.dart' show CompilerOptions;
 import 'ssa/nodes.dart' as ssa show HGraph;
-import 'ssa/ssa_tracer.dart' show HTracer;
+import 'ssa/tracer.dart' show HTracer;
 import 'world.dart' show JClosedWorld;
 
 String TRACE_FILTER_PATTERN_FOR_TEST;
diff --git a/pkg/compiler/test/inference/data/late_field.dart b/pkg/compiler/test/inference/data/late_field.dart
new file mode 100644
index 0000000..678b890
--- /dev/null
+++ b/pkg/compiler/test/inference/data/late_field.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:compiler/src/util/testing.dart';
+
+/*member: Foo.:[exact=Foo]*/
+class Foo {
+  /*member: Foo._#Foo#x:[sentinel|exact=JSUInt31]*/
+  /*member: Foo.x:[exact=JSUInt31]*/
+  late int /*[exact=Foo]*/ /*update: [exact=Foo]*/ x = 42;
+}
+
+/*member: main:[null]*/
+void main() {
+  makeLive(test(Foo()));
+}
+
+@pragma('dart2js:noInline')
+/*member: test:[exact=JSUInt31]*/
+int test(Foo /*[exact=Foo]*/ foo) => foo. /*[exact=Foo]*/ x;
diff --git a/pkg/compiler/test/inlining/inlining_test.dart b/pkg/compiler/test/inlining/inlining_test.dart
index 77b1501..5ad203a 100644
--- a/pkg/compiler/test/inlining/inlining_test.dart
+++ b/pkg/compiler/test/inlining/inlining_test.dart
@@ -13,7 +13,7 @@
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/js_model/js_world.dart';
-import 'package:compiler/src/ssa/builder_kernel.dart';
+import 'package:compiler/src/ssa/builder.dart';
 import 'package:compiler/src/universe/world_impact.dart';
 import 'package:compiler/src/universe/use.dart';
 import 'package:kernel/ast.dart' as ir;
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index 02472f7..e97cd33 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -95,6 +95,9 @@
 
   final bool soundNullSafety;
 
+  /// A canary feature that enables a new runtime type representation.
+  final bool newRuntimeTypes;
+
   SharedCompilerOptions(
       {this.sourceMap = true,
       this.inlineSourceMap = false,
@@ -110,7 +113,10 @@
       this.multiRootScheme,
       this.multiRootOutputPath,
       this.experiments = const {},
-      this.soundNullSafety = false});
+      this.soundNullSafety = false,
+      bool canaryFeatures = false})
+      : // Current canary features.
+        newRuntimeTypes = canaryFeatures;
 
   SharedCompilerOptions.fromArguments(ArgResults args)
       : this(
@@ -131,7 +137,8 @@
             multiRootOutputPath: args['multi-root-output-path'] as String,
             experiments: parseExperimentalArguments(
                 args['enable-experiment'] as List<String>),
-            soundNullSafety: args['sound-null-safety'] as bool);
+            soundNullSafety: args['sound-null-safety'] as bool,
+            canaryFeatures: args['canary'] as bool);
 
   SharedCompilerOptions.fromSdkRequiredArguments(ArgResults args)
       : this(
@@ -145,7 +152,8 @@
             multiRootOutputPath: args['multi-root-output-path'] as String,
             experiments: parseExperimentalArguments(
                 args['enable-experiment'] as List<String>),
-            soundNullSafety: args['sound-null-safety'] as bool);
+            soundNullSafety: args['sound-null-safety'] as bool,
+            canaryFeatures: args['canary'] as bool);
 
   static void addArguments(ArgParser parser, {bool hide = true}) {
     addSdkRequiredArguments(parser, hide: hide);
@@ -213,7 +221,14 @@
       ..addFlag('sound-null-safety',
           help: 'Compile for sound null safety at runtime.',
           negatable: true,
-          defaultsTo: false);
+          defaultsTo: false)
+      ..addFlag('canary',
+          help: 'Enable all compiler features under active development. '
+              'This option is intended for compiler development only. '
+              'Canary features are likely to be unstable and can be removed '
+              'without warning.',
+          defaultsTo: false,
+          hide: true);
   }
 
   static String _getModuleName(ArgResults args) {
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index a44b20b..5f3a651 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -69,6 +69,9 @@
         negatable: true)
     ..addFlag('weak-null-safety-errors',
         help: 'Treat weak null safety warnings as errors.', defaultsTo: false)
+    ..addFlag('canary',
+        help: 'Enable all compiler features under active development.',
+        defaultsTo: false)
     ..addFlag('observe',
         help:
             'Run the compiler in the Dart VM with --observe. Implies --debug.',
@@ -128,6 +131,7 @@
   var nonNullAsserts = options['null-assertions'] as bool;
   var nativeNonNullAsserts = options['native-null-assertions'] as bool;
   var weakNullSafetyErrors = options['weak-null-safety-errors'] as bool;
+  var canaryFeatures = options['canary'] as bool;
   var entry = p.canonicalize(options.rest.first);
   var out = (options['out'] as String) ?? p.setExtension(entry, '.js');
   var libRoot = p.dirname(entry);
@@ -240,6 +244,7 @@
       if (soundNullSafety) '--sound-null-safety',
       if (options['packages'] != null) '--packages=${options['packages']}',
       if (emitDebugSymbols) '--emit-debug-symbols',
+      if (canaryFeatures) '--canary',
       '-o',
       out,
       entry
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 52f6a07..799d777 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 8.3.0
+- Update to version `3.57` of the spec.
+- Added optional `libraryFilters` parameter to `getSourceReport` RPC.
+
 ## 8.2.2+1
 - Documentation update for `FieldRef` and `FuncRef`.
 
@@ -11,7 +15,7 @@
 
 ## 8.2.1
 - Changed type of `UriList.uris` from `dynamic` to `List<String?>?`.
-- Remove `example/vm_service_asserts.dart'
+- Remove `example/vm_service_asserts.dart'`
 
 ## 8.2.0
 - Update to version `3.56` of the spec.
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index 1c8ad22..3e17349 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.56
+version=3.57
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 0f80275..b859add 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -26,7 +26,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.56.0';
+const String vmServiceVersion = '3.57.0';
 
 /// @optional
 const String optional = 'optional';
@@ -830,6 +830,12 @@
   /// numbers. If this parameter is not provided, it is considered to have the
   /// value `false`.
   ///
+  /// The `libraryFilters` parameter is intended to be used when gathering
+  /// coverage for the whole isolate. If it is provided, the `SourceReport` will
+  /// only contain results from scripts with URIs that start with one of the
+  /// filter strings. For example, pass `["package:foo/"]` to only include
+  /// scripts from the foo package.
+  ///
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
@@ -845,6 +851,7 @@
     int? endTokenPos,
     bool? forceCompile,
     bool? reportLines,
+    List<String>? libraryFilters,
   });
 
   /// The `getVersion` RPC is used to determine what version of the Service
@@ -1510,6 +1517,7 @@
             endTokenPos: params['endTokenPos'],
             forceCompile: params['forceCompile'],
             reportLines: params['reportLines'],
+            libraryFilters: params['libraryFilters'],
           );
           break;
         case 'getVersion':
@@ -2036,6 +2044,7 @@
     int? endTokenPos,
     bool? forceCompile,
     bool? reportLines,
+    List<String>? libraryFilters,
   }) =>
       _call('getSourceReport', {
         'isolateId': isolateId,
@@ -2045,6 +2054,7 @@
         if (endTokenPos != null) 'endTokenPos': endTokenPos,
         if (forceCompile != null) 'forceCompile': forceCompile,
         if (reportLines != null) 'reportLines': reportLines,
+        if (libraryFilters != null) 'libraryFilters': libraryFilters,
       });
 
   @override
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 8d8a774..59c815c 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -1,8 +1,9 @@
 name: vm_service
-version: 8.2.2+1
+version: 8.3.0
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
+
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/vm_service
 
 environment:
diff --git a/pkg/vm_service/test/source_report_package_filters_test.dart b/pkg/vm_service/test/source_report_package_filters_test.dart
new file mode 100644
index 0000000..d174524
--- /dev/null
+++ b/pkg/vm_service/test/source_report_package_filters_test.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:developer';
+import 'dart:math';
+import 'package:test/test.dart';
+import 'package:test_package/has_part.dart';
+import 'package:vm_service/vm_service.dart';
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+void testFunction() {
+  // Use functions from various packages, so we can get coverage for them.
+  print(sqrt(123)); // dart:math
+  print(anything); // package:test/test.dart
+  print(decodeBase64("SGkh")); // package:vm_service/vm_service.dart
+  print(removeAdjacentDuplicates([])); // common/service_test_common.dart
+  foo(); // package:test_package/has_part.dart
+
+  debugger();
+}
+
+IsolateTest filterTestImpl(List<String> filters, Function(Set<String>) check) {
+  return (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+
+    final report = await service.getSourceReport(
+      isolateId,
+      [SourceReportKind.kCoverage],
+      forceCompile: true,
+      libraryFilters: filters,
+    );
+    check(Set.of(report.scripts!.map((s) => s.uri!)));
+  };
+}
+
+IsolateTest filterTestExactlyMatches(
+        List<String> filters, List<String> expectedScripts) =>
+    filterTestImpl(filters, (Set<String> scripts) {
+      expect(scripts, unorderedEquals(expectedScripts));
+    });
+
+IsolateTest filterTestContains(
+        List<String> filters, List<String> expectedScripts) =>
+    filterTestImpl(filters, (Set<String> scripts) {
+      expect(scripts, containsAll(expectedScripts));
+    });
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  filterTestExactlyMatches(
+    ['package:test_pack'],
+    [
+      'package:test_package/has_part.dart',
+      'package:test_package/the_part.dart',
+      'package:test_package/the_part_2.dart',
+    ],
+  ),
+  filterTestExactlyMatches(
+    ['package:test_package/'],
+    [
+      'package:test_package/has_part.dart',
+      'package:test_package/the_part.dart',
+      'package:test_package/the_part_2.dart',
+    ],
+  ),
+  filterTestExactlyMatches(
+    ['zzzzzzzzzzz'],
+    [],
+  ),
+  filterTestContains(
+    ['dart:math'],
+    ['dart:math'],
+  ),
+  filterTestContains(
+    ['package:test/', 'package:vm'],
+    ['package:test/test.dart', 'package:vm_service/vm_service.dart'],
+  ),
+  resumeIsolate,
+];
+
+main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'source_report_package_filters_test.dart',
+      testeeConcurrent: testFunction,
+    );
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index d9e8b70..2e89731 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], 'Version');
     expect(result['major'], 3);
-    expect(result['minor'], 56);
+    expect(result['minor'], 57);
     expect(result['_privateMajor'], 0);
     expect(result['_privateMinor'], 0);
   },
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index 4e398bd..451c93e 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(56));
+    expect(result['minor'], equals(57));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index dac6e38..aa43b50 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -1541,10 +1541,6 @@
   }
 }
 
-intptr_t Assembler::FindImmediate(int32_t imm) {
-  return object_pool_builder().FindImmediate(imm);
-}
-
 // Uses a code sequence that can easily be decoded.
 void Assembler::LoadWordFromPoolIndex(Register rd,
                                       intptr_t index,
@@ -2840,7 +2836,15 @@
                                Condition cond) {
   ASSERT(scratch != PC);
   ASSERT(scratch != IP);
-  if (!vmovd(dd, value, cond)) {
+  if (vmovd(dd, value, cond)) return;
+
+  int64_t imm64 = bit_cast<int64_t, double>(value);
+  if (constant_pool_allowed()) {
+    intptr_t index = object_pool_builder().FindImmediate64(imm64);
+    intptr_t offset =
+        target::ObjectPool::element_offset(index) - kHeapObjectTag;
+    LoadDFromOffset(dd, PP, offset, cond);
+  } else {
     // A scratch register and IP are needed to load an arbitrary double.
     ASSERT(scratch != kNoRegister);
     int64_t imm64 = bit_cast<int64_t, double>(value);
@@ -2850,6 +2854,13 @@
   }
 }
 
+void Assembler::LoadQImmediate(QRegister qd, simd128_value_t value) {
+  ASSERT(constant_pool_allowed());
+  intptr_t index = object_pool_builder().FindImmediate128(value);
+  intptr_t offset = target::ObjectPool::element_offset(index) - kHeapObjectTag;
+  LoadMultipleDFromOffset(EvenDRegisterOf(qd), 2, PP, offset);
+}
+
 void Assembler::LoadFromOffset(Register reg,
                                const Address& address,
                                OperandSize size,
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index ff2af91..419dca2 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -874,6 +874,7 @@
                       double value,
                       Register scratch,
                       Condition cond = AL);
+  void LoadQImmediate(QRegister dd, simd128_value_t value);
 
   void MarkExceptionHandler(Label* label);
 
@@ -985,7 +986,6 @@
                                Register scratch,
                                bool can_be_null = false) override;
 
-  intptr_t FindImmediate(int32_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
   void LoadFromOffset(Register reg,
                       const Address& address,
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index ade3a3e..9a3c611 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -476,10 +476,6 @@
   }
 }
 
-intptr_t Assembler::FindImmediate(int64_t imm) {
-  return object_pool_builder().FindImmediate(imm);
-}
-
 bool Assembler::CanLoadFromObjectPool(const Object& object) const {
   ASSERT(IsOriginalObject(object));
   if (!constant_pool_allowed()) {
@@ -643,7 +639,7 @@
 
   // Use constant pool if allowed, unless we can load imm with 2 instructions.
   if ((w1 != 0) && constant_pool_allowed()) {
-    const intptr_t index = FindImmediate(imm);
+    const intptr_t index = object_pool_builder().FindImmediate(imm);
     LoadWordFromPoolIndex(reg, index);
     return;
   }
@@ -679,13 +675,26 @@
 }
 
 void Assembler::LoadDImmediate(VRegister vd, double immd) {
-  if (!fmovdi(vd, immd)) {
-    int64_t imm = bit_cast<int64_t, double>(immd);
-    LoadImmediate(TMP, imm);
+  if (fmovdi(vd, immd)) return;
+
+  int64_t imm64 = bit_cast<int64_t, double>(immd);
+  if (constant_pool_allowed()) {
+    intptr_t index = object_pool_builder().FindImmediate64(imm64);
+    intptr_t offset = target::ObjectPool::element_offset(index);
+    LoadDFromOffset(vd, PP, offset);
+  } else {
+    LoadImmediate(TMP, imm64);
     fmovdr(vd, TMP);
   }
 }
 
+void Assembler::LoadQImmediate(VRegister vd, simd128_value_t immq) {
+  ASSERT(constant_pool_allowed());
+  intptr_t index = object_pool_builder().FindImmediate128(immq);
+  intptr_t offset = target::ObjectPool::element_offset(index);
+  LoadQFromOffset(vd, PP, offset);
+}
+
 void Assembler::Branch(const Code& target,
                        Register pp,
                        ObjectPoolBuilderEntry::Patchability patchable) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 0429fc0..e11ed94 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -2041,7 +2041,6 @@
   compiler::LRState lr_state() const { return lr_state_; }
   void set_lr_state(compiler::LRState state) { lr_state_ = state; }
 
-  intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
   void LoadNativeEntry(Register dst,
                        const ExternalLabel* label,
@@ -2057,6 +2056,7 @@
   void LoadImmediate(Register reg, int64_t imm);
 
   void LoadDImmediate(VRegister reg, double immd);
+  void LoadQImmediate(VRegister reg, simd128_value_t immq);
 
   // Load word from pool from the given offset using encoding that
   // InstructionPattern::DecodeLoadWordFromPool can decode.
diff --git a/runtime/vm/compiler/assembler/assembler_base.cc b/runtime/vm/compiler/assembler/assembler_base.cc
index 07d7285..a09e96a 100644
--- a/runtime/vm/compiler/assembler/assembler_base.cc
+++ b/runtime/vm/compiler/assembler/assembler_base.cc
@@ -309,11 +309,25 @@
 }
 
 uword ObjIndexPair::Hash(Key key) {
-  if (key.type() != ObjectPoolBuilderEntry::kTaggedObject) {
-    return key.raw_value_;
+  switch (key.type()) {
+    case ObjectPoolBuilderEntry::kImmediate128:
+      return key.imm128_.int_storage[0] ^ key.imm128_.int_storage[1] ^
+             key.imm128_.int_storage[2] ^ key.imm128_.int_storage[3];
+
+#if defined(TARGET_ARCH_IS_32_BIT)
+    case ObjectPoolBuilderEntry::kImmediate64:
+      return key.imm64_;
+#endif
+    case ObjectPoolBuilderEntry::kImmediate:
+    case ObjectPoolBuilderEntry::kNativeFunction:
+    case ObjectPoolBuilderEntry::kSwitchableCallMissEntryPoint:
+    case ObjectPoolBuilderEntry::kMegamorphicCallEntryPoint:
+      return key.imm_;
+    case ObjectPoolBuilderEntry::kTaggedObject:
+      return ObjectHash(*key.obj_);
   }
 
-  return ObjectHash(*key.obj_);
+  UNREACHABLE();
 }
 
 void ObjectPoolBuilder::Reset() {
@@ -342,6 +356,22 @@
                              ObjectPoolBuilderEntry::kNotPatchable));
 }
 
+intptr_t ObjectPoolBuilder::AddImmediate64(uint64_t imm) {
+#if defined(TARGET_ARCH_IS_32_BIT)
+  return AddObject(
+      ObjectPoolBuilderEntry(imm, ObjectPoolBuilderEntry::kImmediate64,
+                             ObjectPoolBuilderEntry::kNotPatchable));
+#else
+  return AddImmediate(imm);
+#endif
+}
+
+intptr_t ObjectPoolBuilder::AddImmediate128(simd128_value_t imm) {
+  return AddObject(
+      ObjectPoolBuilderEntry(imm, ObjectPoolBuilderEntry::kImmediate128,
+                             ObjectPoolBuilderEntry::kNotPatchable));
+}
+
 intptr_t ObjectPoolBuilder::AddObject(ObjectPoolBuilderEntry entry) {
   ASSERT((entry.type() != ObjectPoolBuilderEntry::kTaggedObject) ||
          (IsNotTemporaryScopedHandle(*entry.obj_) &&
@@ -359,6 +389,38 @@
     }
   }
 
+#if defined(TARGET_ARCH_IS_32_BIT)
+  if (entry.type() == ObjectPoolBuilderEntry::kImmediate64) {
+    ASSERT(entry.patchable() == ObjectPoolBuilderEntry::kNotPatchable);
+    uint64_t imm = entry.imm64_;
+    intptr_t idx = AddImmediate(Utils::Low32Bits(imm));
+    AddImmediate(Utils::High32Bits(imm));
+    object_pool_index_table_.Insert(ObjIndexPair(entry, idx));
+    return idx;
+  }
+  if (entry.type() == ObjectPoolBuilderEntry::kImmediate128) {
+    ASSERT(entry.patchable() == ObjectPoolBuilderEntry::kNotPatchable);
+    intptr_t idx = AddImmediate(entry.imm128_.int_storage[0]);
+    AddImmediate(entry.imm128_.int_storage[1]);
+    AddImmediate(entry.imm128_.int_storage[2]);
+    AddImmediate(entry.imm128_.int_storage[3]);
+    object_pool_index_table_.Insert(ObjIndexPair(entry, idx));
+    return idx;
+  }
+#else
+  if (entry.type() == ObjectPoolBuilderEntry::kImmediate128) {
+    ASSERT(entry.patchable() == ObjectPoolBuilderEntry::kNotPatchable);
+    uword lo64 = static_cast<uword>(entry.imm128_.int_storage[0]) |
+                 (static_cast<uword>(entry.imm128_.int_storage[1]) << 32);
+    uword hi64 = static_cast<uword>(entry.imm128_.int_storage[2]) |
+                 (static_cast<uword>(entry.imm128_.int_storage[3]) << 32);
+    intptr_t idx = AddImmediate(lo64);
+    AddImmediate(hi64);
+    object_pool_index_table_.Insert(ObjIndexPair(entry, idx));
+    return idx;
+  }
+#endif
+
   const intptr_t idx = base_index_ + object_pool_.length();
   object_pool_.Add(entry);
   if (entry.patchable() == ObjectPoolBuilderEntry::kNotPatchable) {
@@ -407,6 +469,22 @@
                              ObjectPoolBuilderEntry::kNotPatchable));
 }
 
+intptr_t ObjectPoolBuilder::FindImmediate64(uint64_t imm) {
+#if defined(TARGET_ARCH_IS_32_BIT)
+  return FindObject(
+      ObjectPoolBuilderEntry(imm, ObjectPoolBuilderEntry::kImmediate64,
+                             ObjectPoolBuilderEntry::kNotPatchable));
+#else
+  return FindImmediate(imm);
+#endif
+}
+
+intptr_t ObjectPoolBuilder::FindImmediate128(simd128_value_t imm) {
+  return FindObject(
+      ObjectPoolBuilderEntry(imm, ObjectPoolBuilderEntry::kImmediate128,
+                             ObjectPoolBuilderEntry::kNotPatchable));
+}
+
 intptr_t ObjectPoolBuilder::FindNativeFunction(
     const ExternalLabel* label,
     ObjectPoolBuilderEntry::Patchability patchable) {
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.cc b/runtime/vm/compiler/assembler/assembler_riscv.cc
index c87a472..643bb80 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.cc
+++ b/runtime/vm/compiler/assembler/assembler_riscv.cc
@@ -3269,9 +3269,6 @@
   set_constant_pool_allowed(pp == PP);
 }
 
-intptr_t Assembler::FindImmediate(int64_t imm) {
-  UNIMPLEMENTED();
-}
 bool Assembler::CanLoadFromObjectPool(const Object& object) const {
   ASSERT(IsOriginalObject(object));
   if (!constant_pool_allowed()) {
@@ -3336,21 +3333,16 @@
 #endif
   } else {
     ASSERT(constant_pool_allowed());
-#if XLEN >= 64
-    intptr_t index = object_pool_builder().FindImmediate(imm);
+    intptr_t index = object_pool_builder().FindImmediate64(imm);
     intptr_t offset = target::ObjectPool::element_offset(index);
-#else
-    intptr_t lo_index =
-        object_pool_builder().AddImmediate(Utils::Low32Bits(imm));
-    intptr_t hi_index =
-        object_pool_builder().AddImmediate(Utils::High32Bits(imm));
-    ASSERT(lo_index + 1 == hi_index);
-    intptr_t offset = target::ObjectPool::element_offset(lo_index);
-#endif
     LoadDFromOffset(reg, PP, offset);
   }
 }
 
+void Assembler::LoadQImmediate(FRegister reg, simd128_value_t immq) {
+  UNREACHABLE();  // F registers cannot represent SIMD128.
+}
+
 // Load word from pool from the given offset using encoding that
 // InstructionPattern::DecodeLoadWordFromPool can decode.
 //
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.h b/runtime/vm/compiler/assembler/assembler_riscv.h
index 9ae181f..dfb57fe 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.h
+++ b/runtime/vm/compiler/assembler/assembler_riscv.h
@@ -1160,7 +1160,6 @@
   bool constant_pool_allowed() const { return constant_pool_allowed_; }
   void set_constant_pool_allowed(bool b) { constant_pool_allowed_ = b; }
 
-  intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
   void LoadNativeEntry(Register dst,
                        const ExternalLabel* label,
@@ -1180,6 +1179,7 @@
   void LoadImmediate(Register reg, intx_t imm);
 
   void LoadDImmediate(FRegister reg, double immd);
+  void LoadQImmediate(FRegister reg, simd128_value_t immq);
 
   // Load word from pool from the given offset using encoding that
   // InstructionPattern::DecodeLoadWordFromPool can decode.
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 38a6af8..f4f0dd4 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1381,17 +1381,13 @@
   }
 }
 
-intptr_t Assembler::FindImmediate(int64_t imm) {
-  return object_pool_builder().FindImmediate(imm);
-}
-
 void Assembler::LoadImmediate(Register reg, const Immediate& imm) {
   if (imm.value() == 0) {
     xorl(reg, reg);
   } else if (imm.is_int32() || !constant_pool_allowed()) {
     movq(reg, imm);
   } else {
-    const intptr_t idx = FindImmediate(imm.value());
+    const intptr_t idx = object_pool_builder().FindImmediate(imm.value());
     LoadWordFromPoolIndex(reg, idx);
   }
 }
@@ -1410,12 +1406,18 @@
   if (bits == 0) {
     xorps(dst, dst);
   } else {
-    intptr_t index = FindImmediate(bits);
+    intptr_t index = object_pool_builder().FindImmediate64(bits);
     LoadUnboxedDouble(
         dst, PP, target::ObjectPool::element_offset(index) - kHeapObjectTag);
   }
 }
 
+void Assembler::LoadQImmediate(FpuRegister dst, simd128_value_t immediate) {
+  intptr_t index = object_pool_builder().FindImmediate128(immediate);
+  movups(dst, Address(PP, target::ObjectPool::element_offset(index) -
+                              kHeapObjectTag));
+}
+
 void Assembler::LoadCompressed(Register dest, const Address& slot) {
 #if !defined(DART_COMPRESSED_POINTERS)
   movq(dest, slot);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index b906f6e..6680a77 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -781,6 +781,7 @@
     LoadImmediate(reg, Immediate(immediate));
   }
   void LoadDImmediate(FpuRegister dst, double immediate);
+  void LoadQImmediate(FpuRegister dst, simd128_value_t immediate);
 
   void LoadIsolate(Register dst);
   void LoadIsolateGroup(Register dst);
@@ -1316,7 +1317,6 @@
  private:
   bool constant_pool_allowed_;
 
-  intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
   void LoadWordFromPoolIndex(Register dst, intptr_t index);
diff --git a/runtime/vm/compiler/assembler/object_pool_builder.h b/runtime/vm/compiler/assembler/object_pool_builder.h
index 7ceb222..5db42e4 100644
--- a/runtime/vm/compiler/assembler/object_pool_builder.h
+++ b/runtime/vm/compiler/assembler/object_pool_builder.h
@@ -37,6 +37,13 @@
     // values which become known only at run time.
     kSwitchableCallMissEntryPoint,
     kMegamorphicCallEntryPoint,
+
+  // Used only during object pool building to find duplicates. Become multiple
+  // kImmediate in the final pool.
+#if defined(TARGET_ARCH_IS_32_BIT)
+    kImmediate64,
+#endif
+    kImmediate128,
   };
 
   using TypeBits = BitField<uint8_t, EntryType, 0, 7>;
@@ -46,7 +53,7 @@
     return TypeBits::encode(type) | PatchableBit::encode(patchable);
   }
 
-  ObjectPoolBuilderEntry() : raw_value_(), entry_bits_(0), equivalence_() {}
+  ObjectPoolBuilderEntry() : imm128_(), entry_bits_(0), equivalence_() {}
   ObjectPoolBuilderEntry(const Object* obj, Patchability patchable)
       : ObjectPoolBuilderEntry(obj, obj, patchable) {}
   ObjectPoolBuilderEntry(const Object* obj,
@@ -56,7 +63,19 @@
         entry_bits_(EncodeTraits(kTaggedObject, patchable)),
         equivalence_(eqv) {}
   ObjectPoolBuilderEntry(uword value, EntryType info, Patchability patchable)
-      : raw_value_(value),
+      : imm_(value),
+        entry_bits_(EncodeTraits(info, patchable)),
+        equivalence_() {}
+#if defined(ARCH_IS_32_BIT)
+  ObjectPoolBuilderEntry(uint64_t value, EntryType info, Patchability patchable)
+      : imm64_(value),
+        entry_bits_(EncodeTraits(info, patchable)),
+        equivalence_() {}
+#endif
+  ObjectPoolBuilderEntry(simd128_value_t value,
+                         EntryType info,
+                         Patchability patchable)
+      : imm128_(value),
         entry_bits_(EncodeTraits(info, patchable)),
         equivalence_() {}
 
@@ -66,7 +85,9 @@
 
   union {
     const Object* obj_;
-    uword raw_value_;
+    uword imm_;
+    uint64_t imm64_;
+    simd128_value_t imm128_;
   };
   uint8_t entry_bits_;
   const Object* equivalence_;
@@ -93,8 +114,14 @@
     if (key.type() == ObjectPoolBuilderEntry::kTaggedObject) {
       key_.obj_ = key.obj_;
       key_.equivalence_ = key.equivalence_;
+    } else if (key.type() == ObjectPoolBuilderEntry::kImmediate128) {
+      key_.imm128_ = key.imm128_;
+#if defined(TARGET_ARCH_IS_32_BIT)
+    } else if (key.type() == ObjectPoolBuilderEntry::kImmediate64) {
+      key_.imm64_ = key.imm64_;
+#endif
     } else {
-      key_.raw_value_ = key.raw_value_;
+      key_.imm_ = key.imm_;
     }
   }
 
@@ -110,7 +137,18 @@
       return IsSameObject(*kv.key_.obj_, *key.obj_) &&
              IsSameObject(*kv.key_.equivalence_, *key.equivalence_);
     }
-    return kv.key_.raw_value_ == key.raw_value_;
+    if (kv.key_.type() == ObjectPoolBuilderEntry::kImmediate128) {
+      return (kv.key_.imm128_.int_storage[0] == key.imm128_.int_storage[0]) &&
+             (kv.key_.imm128_.int_storage[1] == key.imm128_.int_storage[1]) &&
+             (kv.key_.imm128_.int_storage[2] == key.imm128_.int_storage[2]) &&
+             (kv.key_.imm128_.int_storage[3] == key.imm128_.int_storage[3]);
+    }
+#if defined(TARGET_ARCH_IS_32_BIT)
+    if (kv.key_.type() == ObjectPoolBuilderEntry::kImmediate64) {
+      return kv.key_.imm64_ == key.imm64_;
+    }
+#endif
+    return kv.key_.imm_ == key.imm_;
   }
 
  private:
@@ -157,12 +195,16 @@
                      ObjectPoolBuilderEntry::Patchability patchable =
                          ObjectPoolBuilderEntry::kNotPatchable);
   intptr_t AddImmediate(uword imm);
+  intptr_t AddImmediate64(uint64_t imm);
+  intptr_t AddImmediate128(simd128_value_t imm);
 
   intptr_t FindObject(const Object& obj,
                       ObjectPoolBuilderEntry::Patchability patchable =
                           ObjectPoolBuilderEntry::kNotPatchable);
   intptr_t FindObject(const Object& obj, const Object& equivalence);
   intptr_t FindImmediate(uword imm);
+  intptr_t FindImmediate64(uint64_t imm);
+  intptr_t FindImmediate128(simd128_value_t imm);
   intptr_t FindNativeFunction(const ExternalLabel* label,
                               ObjectPoolBuilderEntry::Patchability patchable);
 
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 4a8bc6c..a6b8720 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -6506,6 +6506,11 @@
 
 Representation FfiCallInstr::RequiredInputRepresentation(intptr_t idx) const {
   if (idx < TargetAddressIndex()) {
+    // All input handles are passed as Tagged values on the stack to
+    // FfiCallInstr, which passes "handles", i.e. pointers, to these.
+    if (marshaller_.IsHandle(marshaller_.ArgumentIndex(idx))) {
+      return kTagged;
+    }
     return marshaller_.RepInFfiCall(idx);
   } else if (idx == TargetAddressIndex()) {
     return kUnboxedFfiIntPtr;
@@ -6621,6 +6626,28 @@
         // http://dartbug.com/45055), which means all incomming arguments
         // originate from parameters and thus are non-constant.
         UNREACHABLE();
+      }
+
+      // Handles are passed into FfiCalls as Tagged values on the stack, and
+      // then we pass pointers to these handles to the native function here.
+      if (marshaller_.IsHandle(arg_index)) {
+        ASSERT(compiler::target::LocalHandle::ptr_offset() == 0);
+        ASSERT(compiler::target::LocalHandle::InstanceSize() ==
+               compiler::target::kWordSize);
+        ASSERT(num_defs == 1);
+        ASSERT(origin.IsStackSlot());
+        if (def_target.IsRegisters()) {
+          __ AddImmediate(def_target.AsLocation().reg(), origin.base_reg(),
+                          origin.stack_index() * compiler::target::kWordSize);
+        } else {
+          ASSERT(def_target.IsStack());
+          const auto& target_stack = def_target.AsStack();
+          __ AddImmediate(temp0, origin.base_reg(),
+                          origin.stack_index() * compiler::target::kWordSize);
+          __ StoreToOffset(temp0,
+                           compiler::Address(target_stack.base_register(),
+                                             target_stack.offset_in_bytes()));
+        }
       } else {
 #if defined(INCLUDE_IL_PRINTER)
         __ Comment("def_target %s <- origin %s %s", def_target.ToCString(),
diff --git a/runtime/vm/compiler/ffi/marshaller.cc b/runtime/vm/compiler/ffi/marshaller.cc
index 91497a7..19f83db 100644
--- a/runtime/vm/compiler/ffi/marshaller.cc
+++ b/runtime/vm/compiler/ffi/marshaller.cc
@@ -389,6 +389,15 @@
     return loc.AsLocation();
   }
 
+  // Force all handles to be Stack locations.
+  // Since non-leaf calls block all registers, Any locations effectively mean
+  // Stack.
+  // TODO(dartbug.com/38985): Once we start inlining FFI trampolines, the inputs
+  // can be constants as well.
+  if (IsHandle(arg_index)) {
+    return Location::Any();
+  }
+
   if (loc.IsMultiple()) {
     const intptr_t def_index_in_arg =
         def_index_global - FirstDefinitionIndex(arg_index);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 86576be..d516d3f 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -4007,15 +4007,10 @@
   return Fragment(instr);
 }
 
-Fragment FlowGraphBuilder::AllocateHandle(LocalVariable* api_local_scope) {
+Fragment FlowGraphBuilder::AllocateHandle() {
   Fragment code;
-  if (api_local_scope != nullptr) {
-    // Use the reference the scope we created in the trampoline.
-    code += LoadLocal(api_local_scope);
-  } else {
-    // Or get a reference to the top handle scope.
-    code += GetTopHandleScope();
-  }
+  // Get a reference to the top handle scope.
+  code += GetTopHandleScope();
   Value* api_local_scope_value = Pop();
   auto* instr = new (Z) AllocateHandleInstr(api_local_scope_value);
   Push(instr);
@@ -4039,10 +4034,10 @@
   return code;
 }
 
-Fragment FlowGraphBuilder::WrapHandle(LocalVariable* api_local_scope) {
+Fragment FlowGraphBuilder::WrapHandle() {
   Fragment code;
   LocalVariable* object = MakeTemporary();
-  code += AllocateHandle(api_local_scope);
+  code += AllocateHandle();
 
   code += LoadLocal(MakeTemporary());  // Duplicate handle pointer.
   code += ConvertUnboxedToUntagged(kUnboxedIntPtr);
@@ -4528,8 +4523,7 @@
 
 Fragment FlowGraphBuilder::FfiConvertPrimitiveToNative(
     const compiler::ffi::BaseMarshaller& marshaller,
-    intptr_t arg_index,
-    LocalVariable* api_local_scope) {
+    intptr_t arg_index) {
   ASSERT(!marshaller.IsCompound(arg_index));
 
   Fragment body;
@@ -4538,7 +4532,7 @@
     body += LoadUntagged(compiler::target::PointerBase::data_offset());
     body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
   } else if (marshaller.IsHandle(arg_index)) {
-    body += WrapHandle(api_local_scope);
+    body += WrapHandle();
   } else {
     if (marshaller.IsBool(arg_index)) {
       body += BoolToInt();
@@ -4621,16 +4615,17 @@
 
   Fragment body;
   intptr_t try_handler_index = -1;
-  LocalVariable* api_local_scope = nullptr;
   if (signature_contains_handles) {
     // Wrap in Try catch to transition from Native to Generated on a throw from
     // the dart_api.
     try_handler_index = AllocateTryIndex();
     body += TryCatch(try_handler_index);
     ++try_depth_;
-
+    // TODO(dartbug.com/48989): Remove scope for calls where we don't actually
+    // need it.
+    // We no longer need the scope for passing in Handle arguments, but the
+    // native function might for instance be relying on this scope for Dart API.
     body += EnterHandleScope();
-    api_local_scope = MakeTemporary("api_local_scope");
   }
 
   // Allocate typed data before FfiCall and pass it in to ffi call if needed.
@@ -4652,7 +4647,12 @@
     } else {
       body += LoadLocal(parsed_function_->ParameterVariable(
           kFirstArgumentParameterOffset + i));
-      body += FfiConvertPrimitiveToNative(marshaller, i, api_local_scope);
+      // FfiCallInstr specifies all handle locations as Stack, and will pass a
+      // pointer to the stack slot as the native handle argument.
+      // Therefore we do not need to wrap handles.
+      if (!marshaller.IsHandle(i)) {
+        body += FfiConvertPrimitiveToNative(marshaller, i);
+      }
     }
   }
 
@@ -4703,6 +4703,8 @@
   }
 
   if (signature_contains_handles) {
+    // TODO(dartbug.com/48989): Remove scope for calls where we don't actually
+    // need it.
     body += DropTempsPreserveTop(1);  // Drop api_local_scope.
     body += ExitHandleScope();
   }
@@ -4721,6 +4723,8 @@
         CatchBlockEntry(Array::empty_array(), try_handler_index,
                         /*needs_stacktrace=*/true, /*is_synthesized=*/true);
 
+    // TODO(dartbug.com/48989): Remove scope for calls where we don't actually
+    // need it.
     // TODO(41984): If we want to pass in the handle scope, move it out
     // of the try catch.
     catch_body += ExitHandleScope();
@@ -4805,8 +4809,8 @@
     body += FfiCallbackConvertCompoundReturnToNative(
         marshaller, compiler::ffi::kResultIndex);
   } else {
-    body += FfiConvertPrimitiveToNative(marshaller, compiler::ffi::kResultIndex,
-                                        /*api_local_scope=*/nullptr);
+    body +=
+        FfiConvertPrimitiveToNative(marshaller, compiler::ffi::kResultIndex);
   }
 
   body += NativeReturn(marshaller);
@@ -4830,8 +4834,7 @@
   } else if (marshaller.IsHandle(compiler::ffi::kResultIndex)) {
     catch_body += UnhandledException();
     catch_body +=
-        FfiConvertPrimitiveToNative(marshaller, compiler::ffi::kResultIndex,
-                                    /*api_local_scope=*/nullptr);
+        FfiConvertPrimitiveToNative(marshaller, compiler::ffi::kResultIndex);
 
   } else if (marshaller.IsCompound(compiler::ffi::kResultIndex)) {
     ASSERT(function.FfiCallbackExceptionalReturn() == Object::null());
@@ -4853,8 +4856,7 @@
     catch_body += Constant(
         Instance::ZoneHandle(Z, function.FfiCallbackExceptionalReturn()));
     catch_body +=
-        FfiConvertPrimitiveToNative(marshaller, compiler::ffi::kResultIndex,
-                                    /*api_local_scope=*/nullptr);
+        FfiConvertPrimitiveToNative(marshaller, compiler::ffi::kResultIndex);
   }
 
   catch_body += NativeReturn(marshaller);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index c7f7478..4a4966f 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -305,8 +305,7 @@
   // Works for FFI call arguments, and FFI callback return values.
   Fragment FfiConvertPrimitiveToNative(
       const compiler::ffi::BaseMarshaller& marshaller,
-      intptr_t arg_index,
-      LocalVariable* api_local_scope);
+      intptr_t arg_index);
 
   // Pops an unboxed native value, and pushes a Dart object, according to the
   // semantics of FFI argument translation.
@@ -388,7 +387,7 @@
   Fragment ExitHandleScope();
 
   // Leaves a `LocalHandle` on the stack.
-  Fragment AllocateHandle(LocalVariable* api_local_scope);
+  Fragment AllocateHandle();
 
   // Loads a tagged value from an untagged base + offset from outside the heap.
   Fragment RawLoadField(int32_t offset);
@@ -399,7 +398,7 @@
   Fragment RawStoreField(int32_t offset);
 
   // Wraps an `Object` from the stack and leaves a `LocalHandle` on the stack.
-  Fragment WrapHandle(LocalVariable* api_local_scope);
+  Fragment WrapHandle();
 
   // Unwraps a `LocalHandle` from the stack and leaves the object on the stack.
   Fragment UnwrapHandle();
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 22befb9..39752bc 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -667,6 +667,7 @@
 class LocalHandle : public AllStatic {
  public:
   static word ptr_offset();
+  static word InstanceSize();
 };
 
 class Pointer : public AllStatic {
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 1a4718e..39650ff 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -588,6 +588,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 88;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 28;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     24;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -1214,6 +1215,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 168;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 56;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -1828,6 +1830,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 88;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 28;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     24;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -2455,6 +2458,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 168;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 56;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -3079,6 +3083,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 112;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 32;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -3704,6 +3709,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 112;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 32;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -4323,6 +4329,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 88;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 28;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     24;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -4950,6 +4957,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 168;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 56;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -5563,6 +5571,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 88;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 28;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     24;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -6183,6 +6192,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 168;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 56;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -6791,6 +6801,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 88;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 28;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     24;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -7412,6 +7423,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 168;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 56;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -8030,6 +8042,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 112;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 32;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -8649,6 +8662,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 112;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 24;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 32;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -9262,6 +9276,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 88;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 28;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     24;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -9883,6 +9898,7 @@
 static constexpr dart::compiler::target::word Library_InstanceSize = 168;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
 static constexpr dart::compiler::target::word LinkedHashBase_InstanceSize = 56;
+static constexpr dart::compiler::target::word LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word MegamorphicCache_InstanceSize =
     48;
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
@@ -10572,6 +10588,7 @@
     20;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     28;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -11270,6 +11287,7 @@
     40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     56;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -11972,6 +11990,7 @@
     40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     56;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -12669,6 +12688,7 @@
     24;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     32;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -13367,6 +13387,7 @@
     24;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     32;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -14063,6 +14084,7 @@
     20;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     28;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -14762,6 +14784,7 @@
     40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     56;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -15451,6 +15474,7 @@
     20;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     28;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -16142,6 +16166,7 @@
     40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     56;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -16837,6 +16862,7 @@
     40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     56;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -17527,6 +17553,7 @@
     24;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     32;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -18218,6 +18245,7 @@
     24;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     32;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -18907,6 +18935,7 @@
     20;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     28;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 4;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
@@ -19599,6 +19628,7 @@
     40;
 static constexpr dart::compiler::target::word AOT_LinkedHashBase_InstanceSize =
     56;
+static constexpr dart::compiler::target::word AOT_LocalHandle_InstanceSize = 8;
 static constexpr dart::compiler::target::word
     AOT_MegamorphicCache_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Mint_InstanceSize = 16;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 2e7c90f..b631b58 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -411,6 +411,7 @@
   SIZEOF(Library, InstanceSize, UntaggedLibrary)                               \
   SIZEOF(LibraryPrefix, InstanceSize, UntaggedLibraryPrefix)                   \
   SIZEOF(LinkedHashBase, InstanceSize, UntaggedLinkedHashBase)                 \
+  SIZEOF(LocalHandle, InstanceSize, LocalHandle)                               \
   SIZEOF(MegamorphicCache, InstanceSize, UntaggedMegamorphicCache)             \
   SIZEOF(Mint, InstanceSize, UntaggedMint)                                     \
   SIZEOF(MirrorReference, InstanceSize, UntaggedMirrorReference)               \
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 86e583b..278ebda 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -14871,7 +14871,11 @@
     if (type == EntryType::kTaggedObject) {
       result.SetObjectAt(i, *entry.obj_);
     } else {
-      result.SetRawValueAt(i, entry.raw_value_);
+#if defined(TARGET_ARCH_IS_32_BIT)
+      ASSERT(type != EntryType::kImmediate64);
+#endif
+      ASSERT(type != EntryType::kImmediate128);
+      result.SetRawValueAt(i, entry.imm_);
     }
   }
   return result.ptr();
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 4d3fa4d..c056360 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3568,6 +3568,35 @@
   instances.PrintJSON(js, /* as_ref */ true);
 }
 
+static intptr_t ParseJSONArray(Thread* thread,
+                               const char* str,
+                               const GrowableObjectArray& elements) {
+  ASSERT(str != nullptr);
+  ASSERT(thread != nullptr);
+  Zone* zone = thread->zone();
+  intptr_t n = strlen(str);
+  if (n < 2) {
+    return -1;
+  }
+  intptr_t start = 1;
+  while (start < n) {
+    intptr_t end = start;
+    while ((str[end + 1] != ',') && (str[end + 1] != ']')) {
+      end++;
+    }
+    if (end == start) {
+      // Empty element
+      break;
+    }
+    String& element = String::Handle(
+        zone, String::FromUTF8(reinterpret_cast<const uint8_t*>(&str[start]),
+                               end - start + 1));
+    elements.Add(element);
+    start = end + 3;
+  }
+  return 0;
+}
+
 static const MethodParameter* const get_ports_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
     NULL,
@@ -3684,7 +3713,20 @@
       return;
     }
   }
-  SourceReport report(report_set, compile_mode, report_lines);
+
+  const char* library_filters_param = js->LookupParam("libraryFilters");
+  GrowableObjectArray& library_filters = GrowableObjectArray::Handle();
+  if (library_filters_param != nullptr) {
+    library_filters = GrowableObjectArray::New();
+    intptr_t library_filters_length =
+        ParseJSONArray(thread, library_filters_param, library_filters);
+    if (library_filters_length < 0) {
+      PrintInvalidParamError(js, "library_filters");
+      return;
+    }
+  }
+
+  SourceReport report(report_set, library_filters, compile_mode, report_lines);
   report.PrintJSON(js, script, TokenPosition::Deserialize(start_pos),
                    TokenPosition::Deserialize(end_pos));
 #endif  // !DART_PRECOMPILED_RUNTIME
@@ -5185,35 +5227,6 @@
   Service::PrintJSONForVM(js, false);
 }
 
-static intptr_t ParseJSONArray(Thread* thread,
-                               const char* str,
-                               const GrowableObjectArray& elements) {
-  ASSERT(str != nullptr);
-  ASSERT(thread != nullptr);
-  Zone* zone = thread->zone();
-  intptr_t n = strlen(str);
-  if (n < 2) {
-    return -1;
-  }
-  intptr_t start = 1;
-  while (start < n) {
-    intptr_t end = start;
-    while ((str[end + 1] != ',') && (str[end + 1] != ']')) {
-      end++;
-    }
-    if (end == start) {
-      // Empty element
-      break;
-    }
-    String& element = String::Handle(
-        zone, String::FromUTF8(reinterpret_cast<const uint8_t*>(&str[start]),
-                               end - start + 1));
-    elements.Add(element);
-    start = end + 3;
-  }
-  return 0;
-}
-
 class UriMappingTraits {
  public:
   static const char* Name() { return "UriMappingTraits"; }
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 7dc4d45..b8e3124 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -17,7 +17,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 56
+#define SERVICE_PROTOCOL_MINOR_VERSION 57
 
 class Array;
 class EmbedderServiceHandler;
@@ -71,12 +71,12 @@
 class StreamInfo {
  public:
   explicit StreamInfo(const char* id)
-      : id_(id), enabled_(false), include_private_members_(false) {}
+      : id_(id), enabled_(0), include_private_members_(false) {}
 
   const char* id() const { return id_; }
 
   void set_enabled(bool value) { enabled_ = value ? 1 : 0; }
-  bool enabled() const { return !!enabled_; }
+  bool enabled() const { return enabled_ != 0; }
 
   void set_include_private_members(bool value) {
     include_private_members_ = value;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 90ebf99..fc2f766 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.56
+# Dart VM Service Protocol 3.57
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.56_ of the Dart VM Service Protocol. This
+This document describes of _version 3.57_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -1065,7 +1065,8 @@
                                       int tokenPos [optional],
                                       int endTokenPos [optional],
                                       bool forceCompile [optional],
-                                      bool reportLines [optional])
+                                      bool reportLines [optional],
+                                      string[] libraryFilters [optional])
 ```
 
 The _getSourceReport_ RPC is used to generate a set of reports tied to
@@ -1107,6 +1108,11 @@
 in the case that the client is only interested in line numbers. If this
 parameter is not provided, it is considered to have the value _false_.
 
+The _libraryFilters_ parameter is intended to be used when gathering coverage
+for the whole isolate. If it is provided, the _SourceReport_ will only contain
+results from scripts with URIs that start with one of the filter strings. For
+example, pass `["package:foo/"]` to only include scripts from the foo package.
+
 If _isolateId_ refers to an isolate which has exited, then the
 _Collected_ [Sentinel](#sentinel) is returned.
 
@@ -4362,5 +4368,6 @@
 3.54 | Added `CpuSamplesEvent`, updated `cpuSamples` property on `Event` to have type `CpuSamplesEvent`.
 3.55 | Added `streamCpuSamplesWithUserTag` RPC.
 3.56 | Added optional `line` and `column` properties to `SourceLocation`. Added a new `SourceReportKind`, `BranchCoverage`, which reports branch level coverage information.
+3.57 | Added optional `libraryFilters` parameter to `getSourceReport` RPC.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 295226f..b5eb2c6 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -29,6 +29,21 @@
     : report_set_(report_set),
       compile_mode_(compile_mode),
       report_lines_(report_lines),
+      library_filters_(GrowableObjectArray::Handle()),
+      thread_(NULL),
+      script_(NULL),
+      start_pos_(TokenPosition::kMinSource),
+      end_pos_(TokenPosition::kMaxSource),
+      next_script_index_(0) {}
+
+SourceReport::SourceReport(intptr_t report_set,
+                           const GrowableObjectArray& library_filters,
+                           CompileMode compile_mode,
+                           bool report_lines)
+    : report_set_(report_set),
+      compile_mode_(compile_mode),
+      report_lines_(report_lines),
+      library_filters_(library_filters),
       thread_(NULL),
       script_(NULL),
       start_pos_(TokenPosition::kMinSource),
@@ -169,7 +184,8 @@
   return false;
 }
 
-intptr_t SourceReport::GetScriptIndex(const Script& script) {
+intptr_t SourceReport::GetScriptIndex(const Script& script,
+                                      bool bypass_filters) {
   ScriptTableEntry wrapper;
   const String& url = String::Handle(zone(), script.url());
   wrapper.key = &url;
@@ -178,6 +194,9 @@
   if (pair != NULL) {
     return pair->index;
   }
+  if (!library_filters_.IsNull() && !bypass_filters) {
+    return -1;
+  }
   ScriptTableEntry* tmp = new ScriptTableEntry();
   tmp->key = &url;
   tmp->index = next_script_index_++;
@@ -493,6 +512,11 @@
   const TokenPosition begin_pos = func.token_pos();
   const TokenPosition end_pos = func.end_token_pos();
 
+  const intptr_t script_index = GetScriptIndex(script);
+  if (script_index < 0) {
+    return;
+  }
+
   Code& code = Code::Handle(zone(), func.unoptimized_code());
   if (code.IsNull()) {
     if (func.HasCode() || (compile_mode_ == kForceCompile)) {
@@ -501,7 +525,7 @@
       if (!err.IsNull()) {
         // Emit an uncompiled range for this function with error information.
         JSONObject range(jsarr);
-        range.AddProperty("scriptIndex", GetScriptIndex(script));
+        range.AddProperty("scriptIndex", script_index);
         range.AddProperty("startPos", begin_pos);
         range.AddProperty("endPos", end_pos);
         range.AddProperty("compiled", false);
@@ -512,7 +536,7 @@
     } else {
       // This function has not been compiled yet.
       JSONObject range(jsarr);
-      range.AddProperty("scriptIndex", GetScriptIndex(script));
+      range.AddProperty("scriptIndex", script_index);
       range.AddProperty("startPos", begin_pos);
       range.AddProperty("endPos", end_pos);
       range.AddProperty("compiled", false);
@@ -527,7 +551,7 @@
   if (!func.IsAsyncFunction() && !func.IsAsyncGenerator() &&
       !func.IsSyncGenerator()) {
     JSONObject range(jsarr);
-    range.AddProperty("scriptIndex", GetScriptIndex(script));
+    range.AddProperty("scriptIndex", script_index);
     range.AddProperty("startPos", begin_pos);
     range.AddProperty("endPos", end_pos);
     range.AddProperty("compiled", true);
@@ -577,7 +601,11 @@
           // Emit an uncompiled range for this class with error information.
           JSONObject range(jsarr);
           script = cls.script();
-          range.AddProperty("scriptIndex", GetScriptIndex(script));
+          const intptr_t script_index = GetScriptIndex(script);
+          if (script_index < 0) {
+            continue;
+          }
+          range.AddProperty("scriptIndex", script_index);
           range.AddProperty("startPos", cls.token_pos());
           range.AddProperty("endPos", cls.end_token_pos());
           range.AddProperty("compiled", false);
@@ -590,7 +618,11 @@
         // Emit one range for the whole uncompiled class.
         JSONObject range(jsarr);
         script = cls.script();
-        range.AddProperty("scriptIndex", GetScriptIndex(script));
+        const intptr_t script_index = GetScriptIndex(script);
+        if (script_index < 0) {
+          continue;
+        }
+        range.AddProperty("scriptIndex", script_index);
         range.AddProperty("startPos", cls.token_pos());
         range.AddProperty("endPos", cls.end_token_pos());
         range.AddProperty("compiled", false);
@@ -626,6 +658,19 @@
   });
 }
 
+bool SourceReport::LibraryMatchesFilters(const Library& lib) {
+  const String& url = String::Handle(zone(), lib.url());
+  String& filter = String::Handle(zone());
+  const intptr_t num_filters = library_filters_.Length();
+  for (intptr_t i = 0; i < num_filters; ++i) {
+    filter ^= library_filters_.At(i);
+    if (url.StartsWith(filter)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 void SourceReport::PrintJSON(JSONStream* js,
                              const Script& script,
                              TokenPosition start_pos,
@@ -640,9 +685,25 @@
     const GrowableObjectArray& libs = GrowableObjectArray::Handle(
         zone(), thread()->isolate_group()->object_store()->libraries());
 
-    // We only visit the libraries which actually load the specified script.
     Library& lib = Library::Handle(zone());
-    for (int i = 0; i < libs.Length(); i++) {
+    if (!library_filters_.IsNull()) {
+      // If we have library filters, pre-fill GetScriptIndex with all the
+      // scripts from the libraries that pass the filters. Later calls to
+      // GetScriptIndex will ignore any scripts that are missing.
+      for (intptr_t i = 0; i < libs.Length(); i++) {
+        lib ^= libs.At(i);
+        if (LibraryMatchesFilters(lib)) {
+          Script& script = Script::Handle(zone());
+          const Array& scripts = Array::Handle(zone(), lib.LoadedScripts());
+          for (intptr_t j = 0; j < scripts.Length(); j++) {
+            script ^= scripts.At(j);
+            GetScriptIndex(script, true /* bypass_filters */);
+          }
+        }
+      }
+    }
+    // We only visit the libraries which actually load the specified script.
+    for (intptr_t i = 0; i < libs.Length(); i++) {
       lib ^= libs.At(i);
       if (script.IsNull() || ScriptIsLoadedByLibrary(script, lib)) {
         VisitLibrary(&ranges, lib);
@@ -737,11 +798,15 @@
           continue;
         }
         scriptRef ^= constructor.script();
+        const intptr_t script_index = GetScriptIndex(scriptRef);
+        if (script_index < 0) {
+          continue;
+        }
         code ^= constructor.unoptimized_code();
         const TokenPosition begin_pos = constructor.token_pos();
         const TokenPosition end_pos = constructor.end_token_pos();
         JSONObject range(ranges);
-        range.AddProperty("scriptIndex", GetScriptIndex(scriptRef));
+        range.AddProperty("scriptIndex", script_index);
         range.AddProperty("compiled",
                           !code.IsNull());  // Does this make a difference?
         range.AddProperty("startPos", begin_pos);
diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h
index 729008e..4b75b45 100644
--- a/runtime/vm/source_report.h
+++ b/runtime/vm/source_report.h
@@ -40,9 +40,16 @@
 
   // report_set is a bitvector indicating which reports to generate
   // (e.g. kCallSites | kCoverage).
+  //
+  // If library_filters is not null, then the report will only include libraries
+  // whose URIs start with one of the filter strings.
   explicit SourceReport(intptr_t report_set,
                         CompileMode compile = kNoCompile,
                         bool report_lines = false);
+  explicit SourceReport(intptr_t report_set,
+                        const GrowableObjectArray& library_filters,
+                        CompileMode compile = kNoCompile,
+                        bool report_lines = false);
   ~SourceReport();
 
   // Generate a source report for (some subrange of) a script.
@@ -69,10 +76,11 @@
   bool ShouldSkipFunction(const Function& func);
   bool ShouldSkipField(const Field& field);
   bool ShouldCoverageSkipCallSite(const ICData* ic_data);
-  intptr_t GetScriptIndex(const Script& script);
+  intptr_t GetScriptIndex(const Script& script, bool bypass_filters = false);
   bool ScriptIsLoadedByLibrary(const Script& script, const Library& lib);
   intptr_t GetTokenPosOrLine(const Script& script,
                              const TokenPosition& token_pos);
+  bool LibraryMatchesFilters(const Library& lib);
 
   void PrintCallSitesData(JSONObject* jsobj,
                           const Function& func,
@@ -135,6 +143,7 @@
   intptr_t report_set_;
   CompileMode compile_mode_;
   bool report_lines_;
+  const GrowableObjectArray& library_filters_;
   Thread* thread_;
   const Script* script_;
   TokenPosition start_pos_;
diff --git a/tests/web/late_no_inlining_test.dart b/tests/web/late_no_inlining_test.dart
new file mode 100644
index 0000000..d6814f4
--- /dev/null
+++ b/tests/web/late_no_inlining_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--disable-inlining
+
+import 'package:expect/expect.dart';
+
+// Tests to ensure that narrowing type information does not discard late
+// sentinel values unintentionally.
+
+class Foo {
+  late int bar = 42;
+  late final int baz = 1729;
+}
+
+void main() {
+  final foo = Foo();
+  Expect.equals(42, foo.bar);
+  Expect.equals(1729, foo.baz);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 2d8ba76..a3b581e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 103
+PRERELEASE 104
 PRERELEASE_PATCH 0
\ No newline at end of file
