Version 2.18.0-104.0.dev

Merge commit '4258a597893ec9e6434aa5d0557c24343a5e238d' into 'dev'
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